32 #define __INCLUDE_FROM_USB_DRIVER
33 #include "../AudioOutput.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
69 static INLINE DeviceQueueHead *Usbd_GetEpQH(USB_CORE_CTRL_T *pCtrl, uint8_t ep)
71 DeviceQueueHead *ep_QH = (DeviceQueueHead *) (*((
uint32_t *) pCtrl->hw_data));
78 return &ep_QH[ep_idx];
82 static INLINE uint32_t Usbd_GetTransferSize(USB_CORE_CTRL_T *pCtrl, uint8_t ep)
84 DeviceQueueHead *ep_QH = Usbd_GetEpQH(pCtrl, ep);
85 return ep_QH->TransferCount - ep_QH->overlay.TotalBytes;
88 void UsbdDcdDataTransfer(uint8_t EPNum, uint8_t *pData,
uint32_t length)
90 uint8_t PhyEP = (EPNum << 1) | (EPNum >> 7);
91 DeviceQueueHead *ep_QH = Usbd_GetEpQH((USB_CORE_CTRL_T *) UsbHandle, EPNum);
92 DeviceTransferDescriptor *pDTD = (DeviceTransferDescriptor *) &Rom_dTD;
94 while (
LPC_USB0->ENDPTSTAT & _BIT(EP_Physical2BitPosition(PhyEP) ) ) {
98 memset((
void *) pDTD, 0,
sizeof(DeviceTransferDescriptor));
108 pDTD->TotalBytes = length;
109 pDTD->IntOnComplete = 1;
111 pDTD->MultiplierOverride = 1;
113 pDTD->BufferPage[0] = (
uint32_t) pData;
114 pDTD->BufferPage[1] = ((
uint32_t) pData + 0x1000) & 0xfffff000;
115 pDTD->BufferPage[2] = ((
uint32_t) pData + 0x2000) & 0xfffff000;
116 pDTD->BufferPage[3] = ((
uint32_t) pData + 0x3000) & 0xfffff000;
117 pDTD->BufferPage[4] = ((
uint32_t) pData + 0x4000) & 0xfffff000;
120 ep_QH->MaxPacketSize = 512;
121 ep_QH->overlay.NextTD = (
uint32_t) pDTD;
122 ep_QH->TransferCount = length;
125 LPC_USB0->ENDPTPRIME |= _BIT(EP_Physical2BitPosition(PhyEP) );
132 USBD_API->hw->ForceFullSpeed(UsbHandle, 1);
147 ErrorCode_t ADC_IF_GetRequest(USB_CORE_CTRL_T *pCtrl)
159 if (pCtrl->SetupPacket.wIndex.W == 0x0200) {
161 if (pCtrl->SetupPacket.wValue.WB.L == 0) {
163 switch (pCtrl->SetupPacket.wValue.WB.H) {
173 switch (pCtrl->SetupPacket.bRequest) {
175 *((
ATTR_PACKED uint16_t *) pCtrl->EP0Buf) = curr_vol;
180 *((
ATTR_PACKED uint16_t *) pCtrl->EP0Buf) = VOLUME_MIN;
185 *((
ATTR_PACKED uint16_t *) pCtrl->EP0Buf) = VOLUME_MAX;
190 *((
ATTR_PACKED uint16_t *) pCtrl->EP0Buf) = VOLUME_RES;
206 ErrorCode_t ADC_IF_SetRequest(USB_CORE_CTRL_T *pCtrl)
217 if (pCtrl->SetupPacket.wIndex.W == 0x0200) {
219 if ((pCtrl->SetupPacket.wValue.WB.L == 0) &&
222 switch (pCtrl->SetupPacket.wValue.WB.H) {
224 if (pCtrl->EP0Buf[0]) {
233 curr_vol = *((
ATTR_PACKED uint16_t *) pCtrl->EP0Buf);
247 ErrorCode_t ADC_EP_GetRequest(USB_CORE_CTRL_T *pCtrl)
257 switch (pCtrl->SetupPacket.wIndex.W) {
260 if (pCtrl->SetupPacket.wValue.WB.L == 0) {
282 ErrorCode_t ADC_EP_SetRequest(USB_CORE_CTRL_T *pCtrl)
294 switch (pCtrl->SetupPacket.wIndex.W) {
297 if (pCtrl->SetupPacket.wValue.WB.L == 0) {
300 rate = pCtrl->EP0Buf[0] | (pCtrl->EP0Buf[1] << 8) | (pCtrl->EP0Buf[2] << 16);
323 USB_CORE_CTRL_T *pCtrl = (USB_CORE_CTRL_T *) hUsb;
324 uint16_t
wIndex = pCtrl->SetupPacket.wIndex.W;
325 uint16_t
wValue = pCtrl->SetupPacket.wValue.W;
329 if (wIndex == USB_ADC_SIF1_NUM) {
330 if ((wValue == 0x0001)) {
353 USB_CORE_CTRL_T *pCtrl = (USB_CORE_CTRL_T *) hUsb;
356 if (pCtrl->SetupPacket.bmRequestType.BM.Type ==
REQUEST_CLASS) {
360 ((pCtrl->SetupPacket.wIndex.WB.L == USB_ADC_CIF_NUM) ||
361 (pCtrl->SetupPacket.wIndex.WB.L == USB_ADC_SIF1_NUM)) ) {
362 switch (pCtrl->SetupPacket.bRequest) {
368 ret = ADC_IF_GetRequest(pCtrl);
370 pCtrl->EP0Data.pData = pCtrl->EP0Buf;
379 pCtrl->EP0Data.pData = pCtrl->EP0Buf;
386 switch (pCtrl->SetupPacket.bRequest) {
391 ret = ADC_EP_GetRequest(pCtrl);
393 pCtrl->EP0Data.pData = pCtrl->EP0Buf;
402 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);
426 switch (pCtrl->SetupPacket.bRequest) {
431 ret = ADC_EP_SetRequest(pCtrl);
433 USBD_API->core->StatusInStage(pCtrl);
478 if (ISO_packet_size != 0) {
479 ISO_packet_size = ISO_packet_size;