32 #define __INCLUDE_FROM_USB_DRIVER
33 #include "../../USBMode.h"
35 #if defined(USB_CAN_BE_DEVICE)
37 #if defined(USB_DEVICE_ROM_DRIVER) && !(defined(__LPC11U2X_3X__)||defined(__LPC13UXX__))
38 #include "../../../Class/AudioClass.h"
39 #include "usbd_adcuser.h"
42 #define AUDIO_MAX_SAMPLE_FREQ 48000
45 #define VOLUME_MIN 0x0000
46 #define VOLUME_MAX 0x003F
47 #define VOLUME_RES 0x0001
57 static uint8_t ISOEndpointNumber;
58 static uint8_t StreamInterfaceNumber;
59 static uint8_t ControlInterfaceNumber;
60 static uint8_t USBPort;
69 static INLINE DeviceQueueHead* Usbd_GetEpQH(USB_CORE_CTRL_T* pCtrl, uint8_t ep)
71 DeviceQueueHead* ep_QH = (DeviceQueueHead*)(*((
uint32_t*)pCtrl->hw_data));
77 return &ep_QH[ep_idx];
81 static INLINE uint32_t Usbd_GetTransferSize(USB_CORE_CTRL_T *pCtrl, uint8_t ep)
83 DeviceQueueHead *ep_QH = Usbd_GetEpQH(pCtrl, ep);
84 return ep_QH->TransferCount - ep_QH->overlay.TotalBytes;
87 static void UsbdDcdDataTransfer(uint8_t EPNum, uint8_t *pData,
uint32_t length)
89 uint8_t PhyEP = (EPNum<<1) | (EPNum>>7);
90 DeviceQueueHead* ep_QH = Usbd_GetEpQH((USB_CORE_CTRL_T*) UsbHandle, EPNum);
91 DeviceTransferDescriptor* pDTD = (DeviceTransferDescriptor*) &Rom_dTD;
95 while ( USB_Reg->
ENDPTSTAT & _BIT( EP_Physical2BitPosition(PhyEP) ) )
100 memset((
void*)pDTD, 0,
sizeof(DeviceTransferDescriptor));
118 pDTD->TotalBytes = length;
119 pDTD->IntOnComplete = 1;
121 pDTD->MultiplierOverride = 1;
123 pDTD->BufferPage[0] = (
uint32_t) pData;
124 pDTD->BufferPage[1] = ((
uint32_t) pData + 0x1000) & 0xfffff000;
125 pDTD->BufferPage[2] = ((
uint32_t) pData + 0x2000) & 0xfffff000;
126 pDTD->BufferPage[3] = ((
uint32_t) pData + 0x3000) & 0xfffff000;
127 pDTD->BufferPage[4] = ((
uint32_t) pData + 0x4000) & 0xfffff000;
130 ep_QH->MaxPacketSize = 512;
131 ep_QH->overlay.NextTD = (
uint32_t) pDTD;
132 ep_QH->TransferCount = length;
135 USB_Reg->
ENDPTPRIME |= _BIT( EP_Physical2BitPosition(PhyEP) ) ;
142 USBD_API->hw->ForceFullSpeed(UsbHandle,1);
154 ep_indx = ((ISOEndpointNumber & 0x0F) << 1);
160 ep_indx = ((ISOEndpointNumber & 0x0F) << 1) + 1;
170 ErrorCode_t ADC_IF_GetRequest (USB_CORE_CTRL_T* pCtrl)
182 if (pCtrl->SetupPacket.wIndex.W == 0x0200) {
184 if (pCtrl->SetupPacket.wValue.WB.L == 0) {
186 switch (pCtrl->SetupPacket.wValue.WB.H) {
195 switch (pCtrl->SetupPacket.bRequest) {
197 *((uint16_t *)pCtrl->EP0Buf) = curr_vol;
201 *((uint16_t *)pCtrl->EP0Buf) = VOLUME_MIN;
205 *((uint16_t *)pCtrl->EP0Buf) = VOLUME_MAX;
209 *((uint16_t *)pCtrl->EP0Buf) = VOLUME_RES;
226 ErrorCode_t ADC_IF_SetRequest (USB_CORE_CTRL_T* pCtrl)
237 if (pCtrl->SetupPacket.wIndex.W == 0x0200) {
239 if ((pCtrl->SetupPacket.wValue.WB.L == 0) &&
242 switch (pCtrl->SetupPacket.wValue.WB.H) {
244 if (pCtrl->EP0Buf[0])
253 curr_vol = *((uint16_t *)pCtrl->EP0Buf);
268 ErrorCode_t ADC_EP_GetRequest (USB_CORE_CTRL_T* pCtrl)
278 if((pCtrl->SetupPacket.wIndex.W & 0x7F) == ISOEndpointNumber) {
280 if (pCtrl->SetupPacket.wValue.WB.L == 0) {
299 ErrorCode_t ADC_EP_SetRequest (USB_CORE_CTRL_T* pCtrl)
311 if((pCtrl->SetupPacket.wIndex.W & 0x7F) == ISOEndpointNumber) {
313 if (pCtrl->SetupPacket.wValue.WB.L == 0) {
316 rate = pCtrl->EP0Buf[0] | (pCtrl->EP0Buf[1] << 8) | (pCtrl->EP0Buf[2] << 16);
336 USB_CORE_CTRL_T* pCtrl = (USB_CORE_CTRL_T*)hUsb;
337 uint16_t
wIndex = pCtrl->SetupPacket.wIndex.W;
338 uint16_t
wValue = pCtrl->SetupPacket.wValue.W;
342 if (wIndex == StreamInterfaceNumber) {
343 if((wValue == 0x0001)){
360 #if defined(__ICCARM__)
363 volatile uint8_t Event_store[128];
371 USB_CORE_CTRL_T* pCtrl = (USB_CORE_CTRL_T*)hUsb;
374 #if defined(__ICCARM__)
376 Event_store[TransferDelayidx] =
event;
379 if (pCtrl->SetupPacket.bmRequestType.BM.Type ==
REQUEST_CLASS) {
383 ((pCtrl->SetupPacket.wIndex.WB.L == ControlInterfaceNumber) ||
384 (pCtrl->SetupPacket.wIndex.WB.L == StreamInterfaceNumber)) ) {
385 switch (pCtrl->SetupPacket.bRequest) {
391 ret = ADC_IF_GetRequest(pCtrl);
393 pCtrl->EP0Data.pData = pCtrl->EP0Buf;
401 pCtrl->EP0Data.pData = pCtrl->EP0Buf;
408 switch (pCtrl->SetupPacket.bRequest) {
413 ret = ADC_EP_GetRequest(pCtrl);
415 pCtrl->EP0Data.pData = pCtrl->EP0Buf;
423 pCtrl->EP0Data.pData = pCtrl->EP0Buf;
431 ((pCtrl->SetupPacket.wIndex.WB.L == ControlInterfaceNumber) ||
432 (pCtrl->SetupPacket.wIndex.WB.L == StreamInterfaceNumber)) ) {
433 switch (pCtrl->SetupPacket.bRequest) {
438 ret = ADC_IF_SetRequest(pCtrl);
440 USBD_API->core->StatusInStage(pCtrl);
445 switch (pCtrl->SetupPacket.bRequest) {
450 ret = ADC_EP_SetRequest(pCtrl);
452 USBD_API->core->StatusInStage(pCtrl);
476 if(ISO_buffer_address != 0)
477 UsbdDcdDataTransfer(
USB_ENDPOINT_IN(ISOEndpointNumber), (uint8_t*)ISO_buffer_address, ISO_packet_size);
480 if(ISO_buffer_address != 0)
481 UsbdDcdDataTransfer(ISOEndpointNumber, (uint8_t*)ISO_buffer_address, 512);
492 USBD_API->hw->ResetEP(UsbHandle, ISOEndpointNumber);
505 ISO_packet_size = Usbd_GetTransferSize((USB_CORE_CTRL_T *) hUsb, ISOEndpointNumber);
506 if (ISO_packet_size != 0) {
507 ISO_packet_size = ISO_packet_size;
511 UsbdDcdDataTransfer(ISOEndpointNumber, (uint8_t *) ISO_buffer_address, 512);
518 UsbdDcdDataTransfer(
USB_ENDPOINT_IN(ISOEndpointNumber), (uint8_t*)ISO_buffer_address, ISO_packet_size);