14#define DBG_PRINTF printf
16#define DBG_PRINTF(...)
44static volatile uint8_t *g_usbd_CtrlInPointer = 0;
45static volatile uint32_t g_usbd_CtrlInSize = 0;
46static volatile uint8_t *g_usbd_CtrlOutPointer = 0;
47static volatile uint32_t g_usbd_CtrlOutSize = 0;
48static volatile uint32_t g_usbd_CtrlOutSizeLimit = 0;
49static volatile uint32_t g_usbd_UsbAddr = 0;
50static volatile uint32_t g_usbd_UsbConfig = 0;
51static volatile uint32_t g_usbd_CtrlMaxPktSize = 8;
52static volatile uint32_t g_usbd_UsbAltInterface = 0;
53static volatile uint32_t g_usbd_CtrlOutToggle = 0;
54static volatile uint8_t g_usbd_CtrlInZeroFlag = 0ul;
142 g_usbd_CtrlOutToggle = 0;
193 g_usbd_CtrlInZeroFlag = (uint8_t)0ul;
214 uint32_t u32TotalLen;
219 if (u32Len > u32TotalLen)
221 u32Len = u32TotalLen;
222 if ((u32Len % g_usbd_CtrlMaxPktSize) == 0ul)
224 g_usbd_CtrlInZeroFlag = (uint8_t)1ul;
236 uint32_t u32ConfigDescOffset;
251 if ((u32Len % g_usbd_CtrlMaxPktSize) == 0ul)
253 g_usbd_CtrlInZeroFlag = (uint8_t)1ul;
268 if ((u32Len % g_usbd_CtrlMaxPktSize) == 0ul)
270 g_usbd_CtrlInZeroFlag = (uint8_t)1ul;
294 DBG_PRINTF(
"Unsupported get desc type. stall ctrl pipe\n");
314 g_usbd_CtrlInPointer = 0;
315 g_usbd_CtrlInSize = 0;
397 DBG_PRINTF(
"Unknown request. stall ctrl pipe.\n");
421 USBD->EP[i].CFGP &= ~USBD_CFGP_SSTALL_Msk;
422 USBD->EP[i].CFG &= ~USBD_CFG_DSQSYNC_Msk;
441 DBG_PRINTF(
"Set addr to %d\n", g_usbd_UsbAddr);
462 DBG_PRINTF(
"Set config to %d\n", g_usbd_UsbConfig);
476 DBG_PRINTF(
"Set feature. enable remote wakeup\n");
496 DBG_PRINTF(
"Set interface to %d\n", g_usbd_UsbAltInterface);
506 DBG_PRINTF(
"Unsupported request. stall ctrl pipe.\n");
528 if(u32Size > g_usbd_CtrlMaxPktSize)
531 g_usbd_CtrlInPointer = pu8Buf + g_usbd_CtrlMaxPktSize;
532 g_usbd_CtrlInSize = u32Size - g_usbd_CtrlMaxPktSize;
540 g_usbd_CtrlInPointer = 0;
541 g_usbd_CtrlInSize = 0;
560 DBG_PRINTF(
"Ctrl In Ack. residue %d\n", g_usbd_CtrlInSize);
561 if(g_usbd_CtrlInSize)
564 if(g_usbd_CtrlInSize > g_usbd_CtrlMaxPktSize)
569 g_usbd_CtrlInPointer += g_usbd_CtrlMaxPktSize;
570 g_usbd_CtrlInSize -= g_usbd_CtrlMaxPktSize;
577 g_usbd_CtrlInPointer = 0;
578 g_usbd_CtrlInSize = 0;
593 if(g_usbd_CtrlInZeroFlag)
596 g_usbd_CtrlInZeroFlag = (uint8_t)0ul;
617 g_usbd_CtrlOutPointer = pu8Buf;
618 g_usbd_CtrlOutSize = 0;
619 g_usbd_CtrlOutSizeLimit = u32Size;
637 DBG_PRINTF(
"Ctrl Out Ack %d\n", g_usbd_CtrlOutSize);
642 if(g_usbd_CtrlOutSize < g_usbd_CtrlOutSizeLimit)
646 g_usbd_CtrlOutPointer += u32Size;
647 g_usbd_CtrlOutSize += u32Size;
649 if(g_usbd_CtrlOutSize < g_usbd_CtrlOutSizeLimit)
674 g_usbd_CtrlInPointer = 0;
675 g_usbd_CtrlInSize = 0;
676 g_usbd_CtrlOutPointer = 0;
677 g_usbd_CtrlOutSize = 0;
678 g_usbd_CtrlOutSizeLimit = 0;
#define USBD_EPSTS_EPSTS1_Msk
#define USBD_CFG_DSQSYNC_Msk
NuMicro peripheral access layer header file.
__STATIC_INLINE uint32_t CLK_SysTickDelay(uint32_t us)
This function execute delay function.
#define SET_CONFIGURATION
#define FEATURE_DEVICE_REMOTE_WAKEUP
#define GET_CONFIGURATION
#define FEATURE_ENDPOINT_HALT
void USBD_Open(const S_USBD_INFO_T *param, CLASS_REQ pfnClassReq, SET_INTERFACE_REQ pfnSetInterface)
This function makes USBD module to be ready to use.
#define USBD_GET_EP_BUF_ADDR(ep)
Get the offset of the specified USB endpoint buffer.
void USBD_LockEpStall(uint32_t u32EpBitmap)
EP stall lock function to avoid stall clear by USB SET FEATURE request.
void USBD_StandardRequest(void)
Process standard request.
const uint32_t * gu32ConfigHidDescIdx
#define USBD_SET_SE0()
Enable SE0. Force USB PHY transceiver to drive SE0.
#define USBD_GET_PAYLOAD_LEN(ep)
Get USB payload size (OUT data)
#define USBD_SET_DATA1(ep)
Set USB DATA1 PID for the specified endpoint ID.
CLASS_REQ g_usbd_pfnClassRequest
volatile uint8_t g_usbd_RemoteWakeupEn
void USBD_PrepareCtrlOut(uint8_t *pu8Buf, uint32_t u32Size)
Prepare the first Control OUT pipe.
static __INLINE void USBD_SetStall(uint8_t epnum)
Set USB endpoint stall state.
#define USBD_GET_ADDR()
Get USB device address.
static __INLINE uint32_t USBD_GetStall(uint8_t epnum)
Get USB endpoint stall state.
void USBD_GetDescriptor(void)
Process GetDescriptor request.
#define USBD_SET_ADDR(addr)
Set USB device address.
void USBD_GetSetupPacket(uint8_t *buf)
Get the received SETUP packet.
SET_INTERFACE_REQ g_usbd_pfnSetInterface
#define USBD_CLR_SE0()
Disable SE0.
void USBD_Start(void)
This function makes USB host to recognize the device.
void USBD_SwReset(void)
Reset software flags.
void USBD_PrepareCtrlIn(uint8_t *pu8Buf, uint32_t u32Size)
Prepare the first Control IN pipe.
void USBD_CtrlIn(void)
Repeat Control IN pipe.
uint32_t g_u32EpStallLock
uint8_t g_usbd_SetupPacket[8]
#define Minimum(a, b)
Compare two input numbers and return minimum one.
void USBD_SetConfigCallback(SET_CONFIG_CB pfnSetConfigCallback)
The callback function which called when get SET CONFIGURATION request.
static __INLINE void USBD_MemCopy(uint8_t *dest, uint8_t *src, int32_t size)
To support byte access between USB SRAM and system SRAM.
const S_USBD_INFO_T * g_usbd_sInfo
#define USBD_SET_EP_STALL(ep)
Set USB endpoint stall state.
void USBD_SetVendorRequest(VENDOR_REQ pfnVendorReq)
USBD Set Vendor Request.
void USBD_ProcessSetupPacket(void)
Process SETUP packet.
#define USBD_CLR_INT_FLAG(flag)
Clear USB interrupt flag.
SET_CONFIG_CB g_usbd_pfnSetConfigCallback
void(* SET_INTERFACE_REQ)(void)
const uint8_t * gu8ConfigDesc
const uint8_t * gu8DevDesc
const uint32_t * gu32HidReportSize
void(* SET_CONFIG_CB)(void)
const uint8_t ** gu8HidReportDesc
void USBD_CtrlOut(void)
Repeat Control OUT pipe.
const uint8_t ** gu8StringDesc
#define USBD_ENABLE_INT(intr)
Enable USB interrupt function.
VENDOR_REQ g_usbd_pfnVendorRequest
#define USBD_SET_PAYLOAD_LEN(ep, size)
Set USB payload size (IN data)