33uint32_t g_u32HsEpStallLock = 0ul;
35static uint8_t *g_hsusbd_CtrlInPointer = 0;
36static uint32_t g_hsusbd_CtrlMaxPktSize = 64ul;
37static uint8_t g_hsusbd_UsbConfig = 0ul;
38static uint8_t g_hsusbd_UsbAltInterface = 0ul;
39static uint8_t g_hsusbd_EnableTestMode = 0ul;
40static uint8_t g_hsusbd_TestSelector = 0ul;
42uint8_t
volatile g_hsusbd_RemoteWakeupEn = 0ul;
45#pragma data_alignment=4
46static uint8_t g_hsusbd_buf[12];
51uint8_t
volatile g_hsusbd_Configured = 0ul;
52uint8_t g_hsusbd_CtrlZero = 0ul;
53uint8_t g_hsusbd_UsbAddr = 0ul;
54uint8_t g_hsusbd_ShortPacket = 0ul;
55uint32_t
volatile g_hsusbd_DmaDone = 0ul;
56uint32_t g_hsusbd_CtrlInSize = 0ul;
72 g_hsusbd_sInfo = param;
73 g_hsusbd_pfnClassRequest = pfnClassReq;
74 g_hsusbd_pfnSetInterface = pfnSetInterface;
77 g_hsusbd_CtrlMaxPktSize = g_hsusbd_sInfo->
gu8DevDesc[7];
85 HSUSBD->EP[EPA].EPMPS = 0x20ul;
86 if (
HSUSBD->EP[EPA].EPMPS == 0x20ul)
88 HSUSBD->EP[EPA].EPMPS = 0x0ul;
92 HSUSBD->OPER &= ~HSUSBD_OPER_HISPDEN_Msk;
138 if (g_hsusbd_pfnClassRequest !=
NULL)
140 g_hsusbd_pfnClassRequest();
146 if (g_hsusbd_pfnVendorRequest !=
NULL)
148 g_hsusbd_pfnVendorRequest();
176 g_hsusbd_CtrlZero = (uint8_t)0ul;
178 switch ((gUsbCmd.
wValue & 0xff00ul) >> 8)
183 u32Len = Minimum(u32Len, LEN_DEVICE);
190 uint32_t u32TotalLen;
191 if ((
HSUSBD->OPER & 0x04ul) == 0x04ul)
194 u32TotalLen = g_hsusbd_sInfo->
gu8ConfigDesc[2] + (u32TotalLen << 8);
196 if (u32Len > u32TotalLen)
198 u32Len = u32TotalLen;
199 if ((u32Len % g_hsusbd_CtrlMaxPktSize) == 0ul)
201 g_hsusbd_CtrlZero = (uint8_t)1ul;
211 if (u32Len > u32TotalLen)
213 u32Len = u32TotalLen;
214 if ((u32Len % g_hsusbd_CtrlMaxPktSize) == 0ul)
216 g_hsusbd_CtrlZero = (uint8_t)1ul;
227 u32Len = Minimum(u32Len, LEN_QUALIFIER);
232 case DESC_OTHERSPEED:
234 uint32_t u32TotalLen;
235 if ((
HSUSBD->OPER & 0x04ul) == 0x04ul)
240 if (u32Len > u32TotalLen)
242 u32Len = u32TotalLen;
243 if ((u32Len % g_hsusbd_CtrlMaxPktSize) == 0ul)
245 g_hsusbd_CtrlZero = (uint8_t)1ul;
255 if (u32Len > u32TotalLen)
257 u32Len = u32TotalLen;
258 if ((u32Len % g_hsusbd_CtrlMaxPktSize) == 0ul)
260 g_hsusbd_CtrlZero = (uint8_t)1ul;
271 uint32_t u32ConfigDescOffset;
272 u32Len = Minimum(u32Len, LEN_HID);
283 if ((u32Len % g_hsusbd_CtrlMaxPktSize) == 0ul)
285 g_hsusbd_CtrlZero = (uint8_t)1ul;
294 if((gUsbCmd.
wValue & 0xfful) < 8ul)
299 if ((u32Len % g_hsusbd_CtrlMaxPktSize) == 0ul)
301 g_hsusbd_CtrlZero = (uint8_t)1ul;
335 g_hsusbd_CtrlInPointer = 0;
336 g_hsusbd_CtrlInSize = 0ul;
343 case GET_CONFIGURATION:
377 u8Tmp = (uint8_t)0ul;
379 u8Tmp |= (uint8_t)1ul;
382 u8Tmp |= (uint8_t)(g_hsusbd_RemoteWakeupEn << 1ul);
384 g_hsusbd_buf[0] = u8Tmp;
389 g_hsusbd_buf[0] = (uint8_t)0ul;
394 uint8_t ep = (uint8_t)(gUsbCmd.
wIndex & 0xFul);
395 g_hsusbd_buf[0] = (uint8_t)
HSUSBD_GetStall((uint32_t)ep)? (uint8_t)1 : (uint8_t)0;
397 g_hsusbd_buf[1] = (uint8_t)0ul;
418 if ((gUsbCmd.
wValue & 0xfful) == FEATURE_ENDPOINT_HALT)
424 epNum = (uint32_t)(gUsbCmd.
wIndex & 0xFul);
425 for (i=0ul; i<HSUSBD_MAX_EP; i++)
427 if ((((
HSUSBD->EP[i].EPCFG & 0xf0ul) >> 4) == epNum) && ((g_u32HsEpStallLock & (1ul << i)) == 0ul))
433 else if ((gUsbCmd.
wValue & 0xfful) == FEATURE_DEVICE_REMOTE_WAKEUP)
435 g_hsusbd_RemoteWakeupEn = (uint8_t)0;
445 g_hsusbd_UsbAddr = (uint8_t)gUsbCmd.
wValue;
452 case SET_CONFIGURATION:
454 g_hsusbd_UsbConfig = (uint8_t)gUsbCmd.
wValue;
455 g_hsusbd_Configured = (uint8_t)1ul;
464 if ((gUsbCmd.
wValue & 0x3ul) == 2ul)
466 g_hsusbd_EnableTestMode = (uint8_t)1ul;
467 g_hsusbd_TestSelector = (uint8_t)(gUsbCmd.
wIndex >> 8);
469 if ((gUsbCmd.
wValue & 0x3ul) == 3ul)
473 if ((gUsbCmd.
wValue & FEATURE_DEVICE_REMOTE_WAKEUP) == FEATURE_DEVICE_REMOTE_WAKEUP)
475 g_hsusbd_RemoteWakeupEn = (uint8_t)1ul;
486 g_hsusbd_UsbAltInterface = (uint8_t)gUsbCmd.
wValue;
487 if (g_hsusbd_pfnSetInterface !=
NULL)
489 g_hsusbd_pfnSetInterface((uint32_t)g_hsusbd_UsbAltInterface);
519#define TEST_SE0_NAK 0x03ul
520#define TEST_PACKET 0x04ul
521#define TEST_FORCE_ENABLE 0x05ul
533 case SET_CONFIGURATION:
535 if (g_hsusbd_UsbConfig == 0ul)
539 for (i=0ul; i<HSUSBD_MAX_EP; i++)
541 if ((
HSUSBD->EP[i].EPCFG & 0x1ul) == 0x1ul)
551 if (gUsbCmd.
wValue == FEATURE_ENDPOINT_HALT)
554 idx = (uint32_t)(gUsbCmd.
wIndex & 0xFul);
557 else if (g_hsusbd_EnableTestMode)
559 g_hsusbd_EnableTestMode = (uint8_t)0ul;
560 if (g_hsusbd_TestSelector == TEST_J)
564 else if (g_hsusbd_TestSelector == TEST_K)
568 else if (g_hsusbd_TestSelector == TEST_SE0_NAK)
570 HSUSBD->TEST = TEST_SE0_NAK;
572 else if (g_hsusbd_TestSelector == TEST_PACKET)
574 HSUSBD->TEST = TEST_PACKET;
576 else if (g_hsusbd_TestSelector == TEST_FORCE_ENABLE)
578 HSUSBD->TEST = TEST_FORCE_ENABLE;
581 if ((gUsbCmd.
wValue & FEATURE_DEVICE_REMOTE_WAKEUP) == FEATURE_DEVICE_REMOTE_WAKEUP)
583 g_hsusbd_RemoteWakeupEn = (uint8_t)1ul;
589 if(gUsbCmd.
wValue == FEATURE_ENDPOINT_HALT)
592 idx = (uint32_t)(gUsbCmd.
wIndex & 0xFul);
595 else if(gUsbCmd.
wValue == FEATURE_DEVICE_REMOTE_WAKEUP)
597 g_hsusbd_RemoteWakeupEn = (uint8_t)0;
619 g_hsusbd_CtrlInPointer = pu8Buf;
620 g_hsusbd_CtrlInSize = u32Size;
636 uint32_t
volatile i, cnt;
638 if(g_hsusbd_CtrlInSize >= g_hsusbd_CtrlMaxPktSize)
641 cnt = g_hsusbd_CtrlMaxPktSize >> 2;
642 for (i=0ul; i<cnt; i++)
644 HSUSBD->CEPDAT = *(uint32_t *)g_hsusbd_CtrlInPointer;
645 g_hsusbd_CtrlInPointer = (uint8_t *)(g_hsusbd_CtrlInPointer + 4ul);
648 g_hsusbd_CtrlInSize -= g_hsusbd_CtrlMaxPktSize;
653 cnt = g_hsusbd_CtrlInSize;
654 for (i=0ul; i<cnt; i++)
656 u8Value = *(uint8_t *)(g_hsusbd_CtrlInPointer+i);
661 g_hsusbd_CtrlInPointer = 0;
662 g_hsusbd_CtrlInSize = 0ul;
683 for (i=0ul; i<u32Size; i++)
705 g_hsusbd_UsbAddr = (uint8_t)0ul;
706 g_hsusbd_DmaDone = 0ul;
707 g_hsusbd_ShortPacket = (uint8_t)0ul;
708 g_hsusbd_Configured = (uint8_t)0ul;
725 g_hsusbd_pfnVendorRequest = pfnVendorReq;
void *__dso_handle __attribute__((weak))
NuMicro peripheral access layer header file.
#define HSUSBD_EP_RSPCTL_TOGGLE
#define HSUSBD_CEPCTL_NAKCLR
uint8_t * gu8FSOtherConfigDesc
void(* HSUSBD_CLASS_REQ)(void)
void HSUSBD_PrepareCtrlIn(uint8_t pu8Buf[], uint32_t u32Size)
Prepare Control IN transaction.
#define HSUSBD_CLR_CEP_INT_FLAG(flag)
#define HSUSBD_ENABLE_CEP_INT(intr)
void HSUSBD_ProcessSetupPacket(void)
Process Setup Packet.
#define HSUSBD_SET_ADDR(addr)
void HSUSBD_Start(void)
HSUSBD Start.
__STATIC_INLINE void HSUSBD_ClearStall(uint32_t u32EpNum)
Clear USB endpoint stall state.
__STATIC_INLINE uint32_t HSUSBD_GetStall(uint32_t u32EpNum)
Get USB endpoint stall state.
uint32_t * gu32ConfigHidDescIdx
void HSUSBD_Open(S_HSUSBD_INFO_T *param, HSUSBD_CLASS_REQ pfnClassReq, HSUSBD_SET_INTERFACE_REQ pfnSetInterface)
HSUSBD Initial.
int HSUSBD_GetDescriptor(void)
Get Descriptor request.
void HSUSBD_StandardRequest(void)
Process USB standard request.
uint8_t * gu8FullConfigDesc
__STATIC_INLINE void HSUSBD_SetStall(uint32_t u32EpNum)
Set USB endpoint stall state.
void(* HSUSBD_SET_INTERFACE_REQ)(uint32_t u32AltInterface)
void HSUSBD_CtrlOut(uint8_t pu8Buf[], uint32_t u32Size)
Start Control OUT transaction.
uint8_t ** gu8HidReportDesc
void HSUSBD_SwReset(void)
Clear all software flags.
uint8_t * gu8HSOtherConfigDesc
#define HSUSBD_SET_CEP_STATE(flag)
void HSUSBD_SetVendorRequest(HSUSBD_VENDOR_REQ pfnVendorReq)
HSUSBD Set Vendor Request.
uint32_t * gu32HidReportSize
#define HSUSBD_START_CEP_IN(size)
void(* HSUSBD_VENDOR_REQ)(void)
#define HSUSBD_ENABLE_PHY()
void HSUSBD_CtrlIn(void)
Start Control IN transfer.
void HSUSBD_UpdateDeviceState(void)
Update Device State.
#define inpb(port)
Get a 8-bit unsigned value from specified I/O port.
#define outpb(port, value)
Set a 8-bit unsigned value to specified I/O port.
#define NULL
NULL pointer.
#define HSUSBD_CEPINTEN_INTKIEN_Msk
#define HSUSBD_CEPCTL_STALLEN_Msk
#define HSOTG_CTL_HNPREQEN_Msk
#define HSUSBD_OPER_HISPDEN_Msk
#define HSUSBD_CEPINTSTS_RXPKIF_Msk
#define HSOTG_CTL_BUSREQ_Msk
#define HSUSBD_CEPINTSTS_INTKIF_Msk
#define HSUSBD_CEPINTEN_STSDONEIEN_Msk
#define HSUSBD_CEPINTSTS_STSDONEIF_Msk