35uint32_t g_u32EpStallLock = 0;
37static uint8_t *g_usbd_CtrlInPointer = 0;
38static uint32_t g_usbd_CtrlMaxPktSize = 64;
39static uint8_t g_usbd_UsbConfig = 0;
40static uint8_t g_usbd_UsbAltInterface = 0;
41static uint8_t g_usbd_EnableTestMode = 0;
42static uint8_t g_usbd_TestSelector = 0;
45#pragma data_alignment=4
46static uint8_t g_usbd_buf[12];
52uint8_t g_usbd_Configured = 0;
53uint8_t g_usbd_CtrlZero = 0;
54uint8_t g_usbd_UsbAddr = 0;
55uint8_t g_usbd_ShortPacket = 0;
56uint32_t
volatile g_usbd_DmaDone = 0;
57uint32_t g_usbd_CtrlInSize = 0;
73 g_usbd_pfnClassRequest = pfnClassReq;
74 g_usbd_pfnSetInterface = pfnSetInterface;
77 g_usbd_CtrlMaxPktSize = g_usbd_sInfo->
gu8DevDesc[7];
85 USBD->EP[EPA].EPMPS = 0x20;
86 if (
USBD->EP[EPA].EPMPS == 0x20)
120 gUsbCmd.
bRequest = (int8_t)(
USBD->SETUP1_0 >> 8) & 0xff;
135 if (g_usbd_pfnClassRequest !=
NULL)
137 g_usbd_pfnClassRequest();
143 if (g_usbd_pfnVendorRequest !=
NULL)
145 g_usbd_pfnVendorRequest();
174 switch ((gUsbCmd.
wValue & 0xff00) >> 8)
179 u32Len = Minimum(u32Len, LEN_DEVICE);
186 uint32_t u32TotalLen;
189 u32TotalLen = g_usbd_sInfo->
gu8ConfigDesc[2] + (u32TotalLen << 8);
191 u32Len = Minimum(u32Len, u32TotalLen);
192 if ((u32Len % g_usbd_CtrlMaxPktSize) == 0)
201 u32Len = Minimum(u32Len, LEN_QUALIFIER);
206 case DESC_OTHERSPEED:
208 uint32_t u32TotalLen;
213 u32Len = Minimum(u32Len, u32TotalLen);
214 if ((u32Len % g_usbd_CtrlMaxPktSize) == 0)
223 u32Len = Minimum(u32Len, LEN_HID);
231 if ((u32Len % g_usbd_CtrlMaxPktSize) == 0)
242 if((gUsbCmd.
wValue & 0xff) < 4)
245 if ((u32Len % g_usbd_CtrlMaxPktSize) == 0)
277 g_usbd_CtrlInPointer = 0;
278 g_usbd_CtrlInSize = 0;
285 case GET_CONFIGURATION:
328 uint8_t ep = gUsbCmd.
wIndex & 0xF;
352 if((gUsbCmd.
wValue & 0xff) == FEATURE_ENDPOINT_HALT)
359 epNum = gUsbCmd.
wIndex & 0xF;
360 for (i=0; i<USBD_MAX_EP; i++)
362 if ((((
USBD->EP[i].EPCFG & 0xf0) >> 4) == epNum) && ((g_u32EpStallLock & (1 << i)) == 0))
376 g_usbd_UsbAddr = (uint8_t)gUsbCmd.
wValue;
385 case SET_CONFIGURATION:
387 g_usbd_UsbConfig = (uint8_t)gUsbCmd.
wValue;
388 g_usbd_Configured = 1;
398 if ((gUsbCmd.
wValue & 0x3) == 2)
400 g_usbd_EnableTestMode = 1;
401 g_usbd_TestSelector = gUsbCmd.
wIndex >> 8;
411 g_usbd_UsbAltInterface = (uint8_t)gUsbCmd.
wValue;
412 if (g_usbd_pfnSetInterface !=
NULL)
413 g_usbd_pfnSetInterface(g_usbd_UsbAltInterface);
442#define TEST_SE0_NAK 0x03
443#define TEST_PACKET 0x04
444#define TEST_FORCE_ENABLE 0x05
455 case SET_CONFIGURATION:
457 if (g_usbd_UsbConfig == 0)
461 for (i=0; i<USBD_MAX_EP; i++)
463 if (
USBD->EP[i].EPCFG & 0x1)
473 if(gUsbCmd.
wValue == FEATURE_ENDPOINT_HALT)
475 else if (g_usbd_EnableTestMode)
477 g_usbd_EnableTestMode = 0;
478 if (g_usbd_TestSelector == TEST_J)
480 else if (g_usbd_TestSelector == TEST_K)
482 else if (g_usbd_TestSelector == TEST_SE0_NAK)
483 USBD->TEST = TEST_SE0_NAK;
484 else if (g_usbd_TestSelector == TEST_PACKET)
485 USBD->TEST = TEST_PACKET;
486 else if (g_usbd_TestSelector == TEST_FORCE_ENABLE)
487 USBD->TEST = TEST_FORCE_ENABLE;
493 if(gUsbCmd.
wValue == FEATURE_ENDPOINT_HALT)
515 g_usbd_CtrlInPointer = pu8Buf;
516 g_usbd_CtrlInSize = u32Size;
533 uint32_t
volatile count;
536 if(g_usbd_CtrlInSize >= g_usbd_CtrlMaxPktSize)
539 for (i=0; i<(g_usbd_CtrlMaxPktSize >> 2); i++, g_usbd_CtrlInPointer+=4)
540 USBD->CEPDAT = *(uint32_t *)g_usbd_CtrlInPointer;
542 g_usbd_CtrlInSize -= g_usbd_CtrlMaxPktSize;
547 for (i=0; i<(g_usbd_CtrlInSize >> 2); i++, g_usbd_CtrlInPointer+=4)
548 USBD->CEPDAT = *(uint32_t *)g_usbd_CtrlInPointer;
550 count = g_usbd_CtrlInSize % 4;
551 for (i=0; i<count; i++)
552 USBD->CEPDAT_BYTE = *(uint8_t *)(g_usbd_CtrlInPointer + i);
555 g_usbd_CtrlInPointer = 0;
556 g_usbd_CtrlInSize = 0;
578 for (i=0; i<u32Size; i++)
579 *(uint8_t *)(pu8Buf + i) =
USBD->CEPDAT_BYTE;
600 g_usbd_ShortPacket = 0;
601 g_usbd_Configured = 0;
618 g_usbd_pfnVendorRequest = pfnVendorReq;
void *__dso_handle __attribute__((weak))
NUC472/NUC442 peripheral access layer header file. This file contains all the peripheral register's d...
#define USBD_CEPINTSTS_RXPKIF_Msk
#define USBD_CEPCTL_STALLEN_Msk
#define USBD_CEPINTSTS_INTKIF_Msk
#define USBD_CEPINTEN_STSDONEIEN_Msk
#define USBD_CEPINTSTS_STSDONEIF_Msk
#define USBD_CEPINTEN_INTKIEN_Msk
#define USB_CEPCTL_NAKCLR
#define USB_EP_RSPCTL_TOGGLE
static __INLINE void USBD_ClearStall(uint32_t u32EpNum)
Clear USB endpoint stall state.
void USBD_StandardRequest(void)
Process USB standard request.
void USBD_UpdateDeviceState(void)
Update Device State.
uint8_t ** gu8HidReportDesc
uint32_t * gu32HidReportSize
static __INLINE uint32_t USBD_GetStall(uint32_t u32EpNum)
Get USB endpoint stall state.
uint8_t * gu8OtherConfigDesc
void USBD_Start(void)
USBD Start.
void USBD_SwReset(void)
Clear all software flags.
static __INLINE void USBD_MemCopy(uint8_t *u8Dst, uint8_t *u8Src, int32_t i32Size)
USBD_memcpy, Copy bytes hardware limitation.
void USBD_PrepareCtrlIn(uint8_t *pu8Buf, uint32_t u32Size)
Prepare Control IN transaction.
void USBD_CtrlIn(void)
Start Control IN transfer.
static __INLINE void USBD_SetStall(uint32_t u32EpNum)
Set USB endpoint stall state.
void USBD_SetVendorRequest(VENDOR_REQ pfnVendorReq)
USBD Set Vendor Request.
void USBD_ProcessSetupPacket(void)
Process Setup Packet.
void USBD_Open(S_USBD_INFO_T *param, CLASS_REQ pfnClassReq, SET_INTERFACE_REQ pfnSetInterface)
USBD Initial.
void USBD_CtrlOut(uint8_t *pu8Buf, uint32_t u32Size)
Start Control OUT transaction.
void(* SET_INTERFACE_REQ)(uint32_t u32AltInterface)
int USBD_GetDescriptor(void)
Get Descriptor request.
#define USBD_ENABLE_CEP_INT(intr)
#define USBD_START_CEP_IN(size)
#define USBD_SET_ADDR(addr)
#define USBD_ENABLE_PHY()
#define USBD_SET_CEP_STATE(flag)
#define USBD_CLR_CEP_INT_FLAG(flag)
#define NULL
NULL pointer.