32 #define __INCLUDE_FROM_USB_DRIVER
33 #include "../AudioInput.h"
35 #if defined(USB_DEVICE_ROM_DRIVER)
37 #include "usbd_adcuser.h"
40 #define AUDIO_MAX_SAMPLE_FREQ 48000
43 #define USB_ADC_CIF_NUM 0
45 #define USB_ADC_SIF1_NUM 1
47 #define VOLUME_MIN 0x0000
48 #define VOLUME_MAX 0x003F
49 #define VOLUME_RES 0x0001
65 static INLINE DeviceQueueHead* Usbd_GetEpQH(USB_CORE_CTRL_T* pCtrl, uint8_t ep)
67 DeviceQueueHead* ep_QH = (DeviceQueueHead*)(*((
uint32_t*)pCtrl->hw_data));
73 return &ep_QH[ep_idx];
77 static INLINE uint32_t Usbd_GetTransferSize(USB_CORE_CTRL_T* pCtrl, uint8_t ep)
79 DeviceQueueHead* ep_QH = Usbd_GetEpQH(pCtrl, ep);
80 return (ep_QH->TransferCount - ep_QH->overlay.TotalBytes);
91 void UsbdDcdDataTransfer(uint8_t EPNum, uint8_t *pData,
uint32_t length)
93 uint8_t PhyEP = (EPNum<<1) | (EPNum>>7);
94 DeviceQueueHead* ep_QH = Usbd_GetEpQH((USB_CORE_CTRL_T*) UsbHandle, EPNum);
95 DeviceTransferDescriptor* pDTD = (DeviceTransferDescriptor*) &Rom_dTD;
97 while (
LPC_USB0->ENDPTSTAT & _BIT( EP_Physical2BitPosition(PhyEP) ) )
102 memset((
void*)pDTD, 0,
sizeof(DeviceTransferDescriptor));
114 pDTD->TotalBytes = length;
115 pDTD->IntOnComplete = 1;
117 pDTD->MultiplierOverride = 1;
119 pDTD->BufferPage[0] = (
uint32_t) pData;
120 pDTD->BufferPage[1] = ((
uint32_t) pData + 0x1000) & 0xfffff000;
121 pDTD->BufferPage[2] = ((
uint32_t) pData + 0x2000) & 0xfffff000;
122 pDTD->BufferPage[3] = ((
uint32_t) pData + 0x3000) & 0xfffff000;
123 pDTD->BufferPage[4] = ((
uint32_t) pData + 0x4000) & 0xfffff000;
126 ep_QH->MaxPacketSize = 512;
127 ep_QH->overlay.NextTD = (
uint32_t) pDTD;
128 ep_QH->TransferCount = length;
131 LPC_USB0->ENDPTPRIME |= _BIT( EP_Physical2BitPosition(PhyEP) ) ;
139 USBD_API->hw->ForceFullSpeed(UsbHandle,1);
155 ErrorCode_t ADC_IF_GetRequest (USB_CORE_CTRL_T* pCtrl)
167 if (pCtrl->SetupPacket.wIndex.W == 0x0200) {
169 if (pCtrl->SetupPacket.wValue.WB.L == 0) {
171 switch (pCtrl->SetupPacket.wValue.WB.H) {
180 switch (pCtrl->SetupPacket.bRequest) {
182 *((
ATTR_PACKED uint16_t *)pCtrl->EP0Buf) = curr_vol;
186 *((
ATTR_PACKED uint16_t *)pCtrl->EP0Buf) = VOLUME_MIN;
190 *((
ATTR_PACKED uint16_t *)pCtrl->EP0Buf) = VOLUME_MAX;
194 *((
ATTR_PACKED uint16_t *)pCtrl->EP0Buf) = VOLUME_RES;
211 ErrorCode_t ADC_IF_SetRequest (USB_CORE_CTRL_T* pCtrl)
222 if (pCtrl->SetupPacket.wIndex.W == 0x0200) {
224 if ((pCtrl->SetupPacket.wValue.WB.L == 0) &&
227 switch (pCtrl->SetupPacket.wValue.WB.H) {
229 if (pCtrl->EP0Buf[0])
238 curr_vol = *((
ATTR_PACKED uint16_t *)pCtrl->EP0Buf);
253 ErrorCode_t ADC_EP_GetRequest (USB_CORE_CTRL_T* pCtrl)
263 switch(pCtrl->SetupPacket.wIndex.W) {
266 if (pCtrl->SetupPacket.wValue.WB.L == 0) {
288 ErrorCode_t ADC_EP_SetRequest (USB_CORE_CTRL_T* pCtrl)
300 switch(pCtrl->SetupPacket.wIndex.W) {
303 if (pCtrl->SetupPacket.wValue.WB.L == 0) {
306 rate = pCtrl->EP0Buf[0] | (pCtrl->EP0Buf[1] << 8) | (pCtrl->EP0Buf[2] << 16);
329 USB_CORE_CTRL_T* pCtrl = (USB_CORE_CTRL_T*)hUsb;
330 uint16_t
wIndex = pCtrl->SetupPacket.wIndex.W;
331 uint16_t
wValue = pCtrl->SetupPacket.wValue.W;
335 if (wIndex == USB_ADC_SIF1_NUM) {
336 if((wValue == 0x0001)){
357 USB_CORE_CTRL_T* pCtrl = (USB_CORE_CTRL_T*)hUsb;
360 if (pCtrl->SetupPacket.bmRequestType.BM.Type ==
REQUEST_CLASS) {
364 ((pCtrl->SetupPacket.wIndex.WB.L == USB_ADC_CIF_NUM) ||
365 (pCtrl->SetupPacket.wIndex.WB.L == USB_ADC_SIF1_NUM)) ) {
366 switch (pCtrl->SetupPacket.bRequest) {
372 ret = ADC_IF_GetRequest(pCtrl);
374 pCtrl->EP0Data.pData = pCtrl->EP0Buf;
382 pCtrl->EP0Data.pData = pCtrl->EP0Buf;
388 switch (pCtrl->SetupPacket.bRequest) {
393 ret = ADC_EP_GetRequest(pCtrl);
395 pCtrl->EP0Data.pData = pCtrl->EP0Buf;
403 pCtrl->EP0Data.pData = pCtrl->EP0Buf;
411 ((pCtrl->SetupPacket.wIndex.WB.L == USB_ADC_CIF_NUM) ||
412 (pCtrl->SetupPacket.wIndex.WB.L == USB_ADC_SIF1_NUM)) ) {
413 switch (pCtrl->SetupPacket.bRequest) {
418 ret = ADC_IF_SetRequest(pCtrl);
420 USBD_API->core->StatusInStage(pCtrl);
425 switch (pCtrl->SetupPacket.bRequest) {
430 ret = ADC_EP_SetRequest(pCtrl);
432 USBD_API->core->StatusInStage(pCtrl);
479 if(ISO_packet_size !=0)
480 ISO_packet_size = ISO_packet_size;