SWM341_usbd.h 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127
  1. #ifndef __SWM341_USBD_H__
  2. #define __SWM341_USBD_H__
  3. #include <stdint.h>
  4. #include <stdbool.h>
  5. typedef void (*USBD_ClassRequest_Callback)(USB_Setup_Packet_t * pSetup);
  6. typedef void (*USBD_VendorRequest_Callback)(USB_Setup_Packet_t * pSetup);
  7. typedef struct {
  8. uint8_t Mode; // USBD_MODE_DEV、USBD_MODE_OTG
  9. uint8_t Speed; // USBD_SPEED_LS、USBD_SPEED_FS
  10. uint8_t CtrlPkSiz; // Control Endpoint Packet Size
  11. uint8_t *DescDevice;
  12. uint8_t *DescConfig;
  13. uint8_t **DescString;
  14. USBD_ClassRequest_Callback pClassRequest_Callback;
  15. USBD_VendorRequest_Callback pVendorRequest_Callback;
  16. uint8_t *DescBOS; // BOS descriptor
  17. /* HID */
  18. uint16_t *DescHIDOffset; // HID描述符在DescConfig中的偏移
  19. uint8_t **DescHIDReport; // HID报告描述符
  20. /* WINUSB */
  21. uint8_t *DescOSString; // Microsoft OS String Descriptor
  22. } USBD_Info_t;
  23. extern USBD_Info_t USBD_Info;
  24. #define USBD_MODE_DEV 3 // Device only
  25. #define USBD_MODE_OTG 0 // OTG, 主机模式还是从机模式由USB ID线决定
  26. #define USBD_SPEED_LS 2
  27. #define USBD_SPEED_FS 3
  28. extern USB_Setup_Packet_t * pUSB_Setup;
  29. static __INLINE void USBD_RxReady(uint8_t epnr)
  30. {
  31. USBD->OUTEP[epnr].RXCR = USBD_RXCR_FLUSHFF_Msk;
  32. USBD->OUTEP[epnr].RXCR = USBD_RXCR_FFRDY_Msk;
  33. }
  34. static __INLINE void USBD_TxStall(uint8_t epnr)
  35. {
  36. USBD->INEP[epnr &= 0x0F].TXCR |= (1 << USBD_TXCR_SNDSTALL_Pos);
  37. }
  38. static __INLINE void USBD_RxStall(uint8_t epnr)
  39. {
  40. USBD->OUTEP[epnr &= 0x0F].RXCR |= (1 << USBD_RXCR_SNDSTALL_Pos);
  41. }
  42. static __INLINE void USBD_Stall0(void)
  43. {
  44. USBD_TxStall(0);
  45. USBD_RxStall(0);
  46. }
  47. /* 注意:因为要读 TXSR.DATSNT 位,因此必须在 USBD_TxIntClr() 之前调用 */
  48. static __INLINE bool USBD_TxSuccess(uint8_t epnr)
  49. {
  50. uint32_t sr = USBD->INEP[epnr].TXSR;
  51. return (sr & USBD_TXSR_DATSNT_Msk) && (sr & USBD_TXSR_SUCC_Msk);
  52. }
  53. static __INLINE bool USBD_TxNAKSent(uint8_t epnr)
  54. {
  55. return (USBD->INEP[epnr].TXSR & USBD_TXSR_NAKSNT_Msk);
  56. }
  57. static __INLINE void USBD_TxIntClr(uint8_t epnr)
  58. {
  59. USBD->INEP[epnr].TXSR = USBD_TXSR_NAKSNT_Msk |
  60. USBD_TXSR_DATSNT_Msk;
  61. }
  62. static __INLINE bool USBD_RxSuccess(void)
  63. {
  64. return (USBD->RXSR & USBD_RXSR_SUCC_Msk);
  65. }
  66. static __INLINE void USBD_RxIntClr(void)
  67. {
  68. USBD->RXSR = USBD_RXSR_DONE_Msk;
  69. }
  70. static __INLINE void USBD_PullUp_Enable(void)
  71. {
  72. SYS->USBPHYCR &= ~SYS_USBPHYCR_OPMODE_Msk;
  73. SYS->USBPHYCR |= (0 << SYS_USBPHYCR_OPMODE_Pos); //Normal Operation
  74. }
  75. static __INLINE void USBD_PullUp_Disable(void)
  76. {
  77. SYS->USBPHYCR &= ~SYS_USBPHYCR_OPMODE_Msk;
  78. SYS->USBPHYCR |= (1 << SYS_USBPHYCR_OPMODE_Pos); //Non-Driving, DP Pull-Up disable
  79. }
  80. void USBD_Init(void);
  81. void USBD_Open(void);
  82. void USBD_Close(void);
  83. void USBD_ProcessSetupPacket(void);
  84. void USBD_PrepareCtrlIn(uint8_t buf[], uint32_t size);
  85. void USBD_CtrlIn(void);
  86. void USBD_PrepareCtrlOut(uint8_t *buf, uint32_t size);
  87. void USBD_CtrlOut(void);
  88. void USBD_EPConfig(uint8_t ep_reg, uint8_t ep_nbr, uint8_t ep_dir, uint8_t ep_type, uint16_t ep_pksz, uint8_t cfg, uint8_t intf, uint8_t alt);
  89. void USBD_TxWrite(uint8_t epnr, uint8_t *data, uint16_t size);
  90. uint16_t USBD_RxRead(uint8_t *buff, uint16_t size);
  91. void USBD_memcpy(uint8_t *destin, uint8_t *source, uint32_t nByte);
  92. #endif //__SWM341_USBD_H__