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