38static uint8_t *g_usbd_CtrlInPointer = 0;
39static uint8_t *g_usbd_CtrlOutPointer = 0;
40static volatile uint32_t g_usbd_CtrlInSize = 0ul;
41static volatile uint32_t g_usbd_CtrlOutSize = 0ul;
42static volatile uint32_t g_usbd_CtrlOutSizeLimit = 0ul;
43static volatile uint32_t g_usbd_UsbAddr = 0ul;
44static volatile uint32_t g_usbd_UsbConfig = 0ul;
45static volatile uint32_t g_usbd_CtrlMaxPktSize = 8ul;
46static volatile uint32_t g_usbd_UsbAltInterface = 0ul;
47static volatile uint32_t g_usbd_CtrlOutToggle = 0;
48static volatile uint8_t g_usbd_CtrlInZeroFlag = 0ul;
100 USBD->ATTR = 0x7D0ul;
136 g_usbd_CtrlOutToggle = 0;
188 g_usbd_CtrlInZeroFlag = (uint8_t)0ul;
207 uint32_t u32TotalLen;
212 if (u32Len > u32TotalLen)
214 u32Len = u32TotalLen;
215 if ((u32Len % g_usbd_CtrlMaxPktSize) == 0ul)
217 g_usbd_CtrlInZeroFlag = (uint8_t)1ul;
245 uint32_t u32ConfigDescOffset;
258 if ((u32Len % g_usbd_CtrlMaxPktSize) == 0ul)
260 g_usbd_CtrlInZeroFlag = (uint8_t)1ul;
275 if ((u32Len % g_usbd_CtrlMaxPktSize) == 0ul)
277 g_usbd_CtrlInZeroFlag = (uint8_t)1ul;
313 g_usbd_CtrlInPointer = 0;
314 g_usbd_CtrlInSize = 0ul;
321 case GET_CONFIGURATION:
326 M8(addr) = (uint8_t)g_usbd_UsbConfig;
344 M8(addr) = (uint8_t)g_usbd_UsbAltInterface;
358 u8Tmp = (uint8_t)0ul;
361 u8Tmp |= (uint8_t)1ul;
376 M8(addr) = (uint8_t)0ul;
387 M8(addr) = (uint8_t)0ul;
422 USBD->EP[i].CFGP &= ~USBD_CFGP_SSTALL_Msk;
423 USBD->EP[i].CFG &= ~USBD_CFG_DSQSYNC_Msk;
446 case SET_CONFIGURATION:
521 if(u32Size > g_usbd_CtrlMaxPktSize)
524 g_usbd_CtrlInPointer = pu8Buf + g_usbd_CtrlMaxPktSize;
525 g_usbd_CtrlInSize = u32Size - g_usbd_CtrlMaxPktSize;
528 USBD_MemCopy((uint8_t *)addr, pu8Buf, g_usbd_CtrlMaxPktSize);
534 g_usbd_CtrlInPointer = 0;
535 g_usbd_CtrlInSize = 0ul;
557 if(g_usbd_CtrlInSize)
560 if(g_usbd_CtrlInSize > g_usbd_CtrlMaxPktSize)
564 USBD_MemCopy((uint8_t *)addr, (uint8_t *)g_usbd_CtrlInPointer, g_usbd_CtrlMaxPktSize);
566 g_usbd_CtrlInPointer += g_usbd_CtrlMaxPktSize;
567 g_usbd_CtrlInSize -= g_usbd_CtrlMaxPktSize;
573 USBD_MemCopy((uint8_t *)addr, (uint8_t *)g_usbd_CtrlInPointer, g_usbd_CtrlInSize);
575 g_usbd_CtrlInPointer = 0;
576 g_usbd_CtrlInSize = 0ul;
585 if((addr != g_usbd_UsbAddr) && (addr == 0ul))
592 if(g_usbd_CtrlInZeroFlag)
595 g_usbd_CtrlInZeroFlag = (uint8_t)0ul;
613 g_usbd_CtrlOutPointer = pu8Buf;
614 g_usbd_CtrlOutSize = 0ul;
615 g_usbd_CtrlOutSizeLimit = u32Size;
637 if (g_usbd_CtrlOutSize < g_usbd_CtrlOutSizeLimit)
641 USBD_MemCopy((uint8_t *)g_usbd_CtrlOutPointer, (uint8_t *)addr, u32Size);
642 g_usbd_CtrlOutPointer += u32Size;
643 g_usbd_CtrlOutSize += u32Size;
645 if(g_usbd_CtrlOutSize < g_usbd_CtrlOutSizeLimit)
672 g_usbd_CtrlInPointer = 0;
673 g_usbd_CtrlInSize = 0ul;
674 g_usbd_CtrlOutPointer = 0;
675 g_usbd_CtrlOutSize = 0ul;
676 g_usbd_CtrlOutSizeLimit = 0ul;
683 USBD->EP[i].CFG &= ~USBD_CFG_DSQSYNC_Msk;
NuMicro peripheral access layer header file.
#define M8(addr)
Get a 8-bit unsigned value from specified address.
#define NULL
NULL pointer.
#define OTG_CTL_HNPREQEN_Msk
#define OTG_CTL_BUSREQ_Msk
#define USBD_EPSTS0_EPSTS1_Msk
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.
#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)
uint32_t * gu32ConfigHidDescIdx
#define USBD_SET_DATA1(ep)
Set USB DATA1 PID for the specified endpoint ID.
CLASS_REQ g_usbd_pfnClassRequest
__STATIC_INLINE uint32_t USBD_GetStall(uint8_t epnum)
Get USB endpoint stall state.
volatile uint8_t g_usbd_RemoteWakeupEn
void USBD_PrepareCtrlOut(uint8_t *pu8Buf, uint32_t u32Size)
Prepare the first Control OUT pipe.
#define USBD_GET_ADDR()
Get USB device address.
uint8_t ** gu8HidReportDesc
uint32_t * gu32HidReportSize
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.
#define USBD_Minimum(a, b)
Compare two input numbers and return minimum one.
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.
__STATIC_INLINE void USBD_SetStall(uint8_t epnum)
Set USB endpoint stall state.
void USBD_CtrlIn(void)
Repeat Control IN pipe.
uint32_t g_u32EpStallLock
uint8_t g_usbd_SetupPacket[8]
void USBD_SetConfigCallback(SET_CONFIG_CB pfnSetConfigCallback)
The callback function which called when get SET CONFIGURATION request.
const S_USBD_INFO_T * g_usbd_sInfo
__STATIC_INLINE void USBD_MemCopy(uint8_t dest[], uint8_t src[], uint32_t size)
To support byte access between USB SRAM and system SRAM.
#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_CONFIG_CB)(void)
void(* SET_INTERFACE_REQ)(uint32_t u32AltInterface)
void USBD_CtrlOut(void)
Repeat Control OUT pipe.
void USBD_PrepareCtrlIn(uint8_t pu8Buf[], uint32_t u32Size)
Prepare the first Control IN pipe.
#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)