summaryrefslogtreecommitdiff
path: root/bsp/gd32303e-eval/Libraries/GD32F30x_usbd_driver/Include/usbd_regs.h
blob: 30c6737bc875f8e99efa11e42a5ebab97220eaa0 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
/*!
    \file  usbd_regs.h
    \brief USB device registers
*/

/*
    Copyright (C) 2017 GigaDevice

    2017-02-10, V1.0.0, firmware for GD32F30x
*/

#ifndef USBD_REGS_H
#define USBD_REGS_H

#include "usbd_conf.h"

/* USB device registers base address */
#define USBD                           USBD_BASE
#define USBD_RAM                       (APB1_BUS_BASE + 0x00006000U)

/* registers definitions */
/* common registers */
#define USBD_CTL                       (REG32(USBD + 0x40U))  /*!< control register */
#define USBD_INTF                      (REG32(USBD + 0x44U))  /*!< interrupt flag register */
#define USBD_STAT                      (REG32(USBD + 0x48U))  /*!< status register */
#define USBD_DADDR                     (REG32(USBD + 0x4CU))  /*!< device address register */
#define USBD_BADDR                     (REG32(USBD + 0x50U))  /*!< buffer address register */

/* endpoint control and status register */
#define USBD_EPxCS(ep_id)              (REG32(USBD + (ep_id) * 4U))  /*!< endpoint x control and status register address */

/* LPM Registers */
#define USBD_LPMCS                     (REG32(USBD + 0x54U))  /*!< USBD LPM control and status register */

/* bits definitions */
/* USBD_CTL */
#define CTL_STIE                       BIT(15)  /*!< successful transfer interrupt enable mask */
#define CTL_PMOUIE                     BIT(14)  /*!< packet memory overrun/underrun interrupt enable mask */
#define CTL_ERRIE                      BIT(13)  /*!< error interrupt enable mask */
#define CTL_WKUPIE                     BIT(12)  /*!< wakeup interrupt enable mask */
#define CTL_SPSIE                      BIT(11)  /*!< suspend state interrupt enable mask */
#define CTL_RSTIE                      BIT(10)  /*!< reset interrupt enable mask */
#define CTL_SOFIE                      BIT(9)   /*!< start of frame interrupt enable mask */
#define CTL_ESOFIE                     BIT(8)   /*!< expected start of frame interrupt enable mask */
#define CTL_L1REQIE                    BIT(7)   /*!< LPM L1 state request interrupt enable */
#define CTL_L1RSREQ                    BIT(5)   /*!< LPM L1 resume request */
#define CTL_RSREQ                      BIT(4)   /*!< resume request */
#define CTL_SETSPS                     BIT(3)   /*!< set suspend state */
#define CTL_LOWM                       BIT(2)   /*!< low-power mode at suspend state */
#define CTL_CLOSE                      BIT(1)   /*!< goes to close state */
#define CTL_SETRST                     BIT(0)   /*!< set USB reset */

/* USBD_INTF */
#define INTF_STIF                      BIT(15)     /*!< successful transfer interrupt flag (read only bit) */
#define INTF_PMOUIF                    BIT(14)     /*!< packet memory overrun/underrun interrupt flag (clear-only bit) */
#define INTF_ERRIF                     BIT(13)     /*!< error interrupt flag (clear-only bit) */
#define INTF_WKUPIF                    BIT(12)     /*!< wakeup interrupt flag (clear-only bit) */
#define INTF_SPSIF                     BIT(11)     /*!< suspend state interrupt flag (clear-only bit) */
#define INTF_RSTIF                     BIT(10)     /*!< reset interrupt flag (clear-only bit) */
#define INTF_SOFIF                     BIT(9)      /*!< start of frame interrupt flag (clear-only bit) */
#define INTF_ESOFIF                    BIT(8)      /*!< expected start of frame interrupt flag(clear-only bit) */
#define INTF_L1REQ                     BIT(7)      /*!< LPM L1 transaction is successfully received and acknowledged */
#define INTF_DIR                       BIT(4)      /*!< direction of transaction (read-only bit) */
#define INTF_EPNUM                     BITS(0, 3)  /*!< endpoint number (read-only bit)  */

/* USBD_STAT */
#define STAT_RXDP                      BIT(15)       /*!< data plus line status */
#define STAT_RXDM                      BIT(14)       /*!< data minus line status */
#define STAT_LOCK                      BIT(13)       /*!< locked the USB */
#define STAT_SOFLN                     BITS(11, 12)  /*!< SOF lost number */
#define STAT_FCNT                      BITS(0, 10)   /*!< frame number count */

/* USBD_DADDR */
#define DADDR_USBEN                    BIT(7)      /*!< USB module enable */
#define DADDR_USBDAR                   BITS(0, 6)  /*!< USB device address */

/* USBD_EPxCS */
#define EPxCS_RX_ST                    BIT(15)       /*!< endpoint reception successful transferred */
#define EPxCS_RX_DTG                   BIT(14)       /*!< endpoint reception data PID toggle */
#define EPxCS_RX_STA                   BITS(12, 13)  /*!< endpoint reception status bits */
#define EPxCS_SETUP                    BIT(11)       /*!< endpoint setup transaction completed */
#define EPxCS_CTL                      BITS(9, 10)   /*!< endpoint type control */
#define EPxCS_KCTL                     BIT(8)        /*!< endpoint kind control */
#define EPxCS_TX_ST                    BIT(7)        /*!< endpoint transmission successful transfer */
#define EPxCS_TX_DTG                   BIT(6)        /*!< endpoint transmission data toggle */
#define EPxCS_TX_STA                   BITS(4, 5)    /*!< endpoint transmission transfers status bits */
#define EPxCS_ADDR                     BITS(0, 3)    /*!< endpoint address */

/* USBD_LPMCS */
#define LPMCS_BLSTAT                   BITS(4, 7)    /*!< bLinkState value */
#define LPMCS_REMWK                    BIT(3)        /*!< bRemoteWake value */
#define LPMCS_LPMACK                   BIT(1)        /*!< LPM token acknowledge enable */
#define LPMCS_LPMEN                    BIT(0)        /*!< LPM support enable */

/* constants definitions */
/* endpoint control and status register mask (no toggle fields) */
#define EPCS_MASK                      (EPxCS_RX_ST|EPxCS_SETUP|EPxCS_CTL|EPxCS_KCTL|EPxCS_TX_ST|EPxCS_ADDR)

/* EPxCS_CTL[1:0] endpoint type control */
#define ENDP_TYPE(regval)              (EPxCS_CTL & ((regval) << 9U))

#define EP_BULK                        ENDP_TYPE(0U)  /* bulk transfers */
#define EP_CONTROL                     ENDP_TYPE(1U)  /* control transfers */
#define EP_ISO                         ENDP_TYPE(2U)  /* isochronous transfers */
#define EP_INTERRUPT                   ENDP_TYPE(3U)  /* interrupt transfers */
#define EP_CTL_MASK                    (~EPxCS_CTL & EPCS_MASK)

/* endpoint kind control mask */
#define EPKCTL_MASK                    (~EPxCS_KCTL & EPCS_MASK)

/* EPxCS_TX_STA[1:0] status for Tx transfer */
#define ENDP_TXSTAT(regval)            (EPxCS_TX_STA & ((regval) << 4U))

#define EPTX_DISABLED                  ENDP_TXSTAT(0U)  /* transmission state is disabled */
#define EPTX_STALL                     ENDP_TXSTAT(1U)  /* transmission state is STALL */
#define EPTX_NAK                       ENDP_TXSTAT(2U)  /* transmission state is NAK */
#define EPTX_VALID                     ENDP_TXSTAT(3U)  /* transmission state is enabled */
#define EPTX_DTGMASK                   (EPxCS_TX_STA | EPCS_MASK)

/* EPxCS_RX_STA[1:0] status for Rx transfer */
#define ENDP_RXSTAT(regval)            (EPxCS_RX_STA & ((regval) << 12U))

#define EPRX_DISABLED                  ENDP_RXSTAT(0U)  /* reception state is disabled */
#define EPRX_STALL                     ENDP_RXSTAT(1U)  /* reception state is STALL */
#define EPRX_NAK                       ENDP_RXSTAT(2U)  /* reception state is NAK */
#define EPRX_VALID                     ENDP_RXSTAT(3U)  /* reception state is enabled */
#define EPRX_DTGMASK                   (EPxCS_RX_STA | EPCS_MASK)

/* endpoint receive/transmission counter register bit definitions */
#define EPRCNT_BLKSIZ                  BIT(15)       /* reception data block size */
#define EPRCNT_BLKNUM                  BITS(10, 14)  /* reception data block number */
#define EPRCNT_CNT                     BITS(0, 9)    /* reception data count */

#define EPTCNT_CNT                     BITS(0, 9)    /* transmisson data count */

/* interrupt flag clear bits */
#define CLR_STIF                       (~INTF_STIF)
#define CLR_PMOUIF                     (~INTF_PMOUIF)
#define CLR_ERRIF                      (~INTF_ERRIF)
#define CLR_WKUPIF                     (~INTF_WKUPIF)
#define CLR_SPSIF                      (~INTF_SPSIF)
#define CLR_RSTIF                      (~INTF_RSTIF)
#define CLR_SOFIF                      (~INTF_SOFIF)
#define CLR_ESOFIF                     (~INTF_ESOFIF)
#define CLR_L1REQ                      (~INTF_L1REQ)

/* endpoint receive/transmission counter register bit offset */
#define BLKSIZE_OFFSET                 (0x01U)
#define BLKNUM_OFFSET                  (0x05U)
#define RXCNT_OFFSET                   (0x0AU)

#define TXCNT_OFFSET                   (0x0AU)

#define BLKSIZE32_MASK                 (0x1fU)
#define BLKSIZE2_MASK                  (0x01U)

#define BLKSIZE32_OFFSETMASK           (0x05U)
#define BLKSIZE2_OFFSETMASK            (0x01U)

/* double buffer endpoint direction */
typedef enum
{
    DBUF_EP_IN,   /* double buffer IN direction */
    DBUF_EP_OUT,  /* double buffer OUT direction */
    DBUF_EP_ERR,  /* double buffer errer direction */
}dbuf_ep_dir_enum;

/* endpoints address */
/* first bit is direction(0 for Rx and 1 for Tx) */
#define EP0_OUT                        ((uint8_t)0x00)  /* OUT endpoint 0 address */
#define EP0_IN                         ((uint8_t)0x80)  /* IN endpoint 0 address */
#define EP1_OUT                        ((uint8_t)0x01)  /* OUT endpoint 1 address */
#define EP1_IN                         ((uint8_t)0x81)  /* IN endpoint 1 address */
#define EP2_OUT                        ((uint8_t)0x02)  /* OUT endpoint 2 address */
#define EP2_IN                         ((uint8_t)0x82)  /* IN endpoint 2 address */
#define EP3_OUT                        ((uint8_t)0x03)  /* OUT endpoint 3 address */
#define EP3_IN                         ((uint8_t)0x83)  /* IN endpoint 3 address */
#define EP4_OUT                        ((uint8_t)0x04)  /* OUT endpoint 4 address */
#define EP4_IN                         ((uint8_t)0x84)  /* IN endpoint 4 address */
#define EP5_OUT                        ((uint8_t)0x05)  /* OUT endpoint 5 address */
#define EP5_IN                         ((uint8_t)0x85)  /* IN endpoint 5 address */
#define EP6_OUT                        ((uint8_t)0x06)  /* OUT endpoint 6 address */
#define EP6_IN                         ((uint8_t)0x86)  /* IN endpoint 6 address */
#define EP7_OUT                        ((uint8_t)0x07)  /* OUT endpoint 7 address */
#define EP7_IN                         ((uint8_t)0x87)  /* IN endpoint 7 address */

/* endpoints_Identifier */
#define EP0                            ((uint8_t)0)  /* endpoint 0 ID */
#define EP1                            ((uint8_t)1)  /* endpoint 1 ID */
#define EP2                            ((uint8_t)2)  /* endpoint 2 ID */
#define EP3                            ((uint8_t)3)  /* endpoint 3 ID */
#define EP4                            ((uint8_t)4)  /* endpoint 4 ID */
#define EP5                            ((uint8_t)5)  /* endpoint 5 ID */
#define EP6                            ((uint8_t)6)  /* endpoint 6 ID */
#define EP7                            ((uint8_t)7)  /* endpoint 7 ID */

/* USBD operation macros */

/* set register value */
#define USBD_REG_SET(reg, regvalue)    ((reg) = (uint16_t)(regvalue))

/* get register value */
#define USBD_REG_GET(reg)              ((uint16_t)(reg))

#define _EP_ADDR_SET(ep_num, addr)     USBD_REG_SET(USBD_EPxCS(ep_num), (USBD_REG_GET(USBD_EPxCS(ep_num)) & EPCS_MASK) | addr)

/* Tx or Rx transfer status setting (bits EPTX_STA[1:0]) */
#define USBD_ENDP_TX_STATUS_SET(ep_num, state) do {\
    register uint16_t _regval;       \
    _regval = USBD_REG_GET(USBD_EPxCS(ep_num)) & (uint16_t)EPTX_DTGMASK;\
    USBD_REG_SET(USBD_EPxCS(ep_num), ((_regval) ^ (state)));    \
} while(0)

#define USBD_ENDP_RX_STATUS_SET(ep_num, state) do {\
    register uint16_t _regval;   \
    _regval = USBD_REG_GET(USBD_EPxCS(ep_num)) & (uint16_t)EPRX_DTGMASK;\
    USBD_REG_SET(USBD_EPxCS(ep_num), ((_regval) ^ (state))); \
} while(0)

/* Tx or Rx transfer status getting (bits EPxCS_RX_STA[1:0]) */
#define USBD_ENDP_TX_STATUS_GET(ep_num) (USBD_REG_GET(USBD_EPxCS(ep_num)) & EPxCS_TX_STA)
#define USBD_ENDP_RX_STATUS_GET(ep_num) (USBD_REG_GET(USBD_EPxCS(ep_num)) & EPxCS_RX_STA)

/* Rx and Tx transfer status setting (bits EPxCS_RX_STA[1:0] & EPxCS_TX_STA[1:0]) */
#define USBD_ENDP_RX_TX_STATUS_SET(ep_num, state_rx, state_tx) do {\
    register uint16_t _regval;   \
    _regval = USBD_REG_GET(USBD_EPxCS(ep_num)) & (uint16_t)(EPRX_DTGMASK | EPxCS_TX_STA) ;\
    USBD_REG_SET(USBD_EPxCS(ep_num), (((_regval) ^ (state_rx)) ^ (state_tx)));    \
} while(0)

/* set and clear endpoint kind (bit EPxCS_KCTL) */
#define USBD_ENDP_KIND_SET(ep_num)      (USBD_REG_SET(USBD_EPxCS(ep_num), ((USBD_REG_GET(USBD_EPxCS(ep_num)) | EPxCS_KCTL) & EPCS_MASK)))
#define USBD_ENDP_KIND_CLEAR(ep_num)    (USBD_REG_SET(USBD_EPxCS(ep_num), (USBD_REG_GET(USBD_EPxCS(ep_num)) & EPKCTL_MASK)))

/* set and clear directly STATUS_OUT state of endpoint */
#define USBD_STATUS_OUT_SET(ep_num)     USBD_ENDP_KIND_SET(ep_num)
#define USBD_STATUS_OUT_CLEAR(ep_num)   USBD_ENDP_KIND_CLEAR(ep_num)

/* clear bit EPxCS_RX_ST/EPxCS_TX_ST in the endpoint control and status register */
#define USBD_ENDP_RX_STAT_CLEAR(ep_num) (USBD_REG_SET(USBD_EPxCS(ep_num), USBD_REG_GET(USBD_EPxCS(ep_num)) & 0x7FFFU & (uint16_t)EPCS_MASK))
#define USBD_ENDP_TX_STAT_CLEAR(ep_num) (USBD_REG_SET(USBD_EPxCS(ep_num), USBD_REG_GET(USBD_EPxCS(ep_num)) & 0xFF7FU & (uint16_t)EPCS_MASK))

/* toggle EPxCS_RX_DTG or EPxCS_TX_DTG bit in the endpoint control and status register */
#define USBD_DTG_RX_TOGGLE(ep_num)      (USBD_REG_SET(USBD_EPxCS(ep_num), EPxCS_RX_DTG | (USBD_REG_GET(USBD_EPxCS(ep_num)) & EPCS_MASK)))
#define USBD_DTG_TX_TOGGLE(ep_num)      (USBD_REG_SET(USBD_EPxCS(ep_num), EPxCS_TX_DTG | (USBD_REG_GET(USBD_EPxCS(ep_num)) & EPCS_MASK)))

/* clear EPxCS_RX_DTG or EPxCS_TX_DTG bit in the endpoint control and status register */
#define USBD_DTG_RX_CLEAR(ep_num)       do {\
    if ((USBD_REG_GET(USBD_EPxCS(ep_num)) & EPxCS_RX_DTG) != 0U) {\
        USBD_DTG_RX_TOGGLE(ep_num);\
    } else {\
    }\
} while(0)

#define USBD_DTG_TX_CLEAR(ep_num)       do {\
    if ((USBD_REG_GET(USBD_EPxCS(ep_num)) & EPxCS_TX_DTG) != 0U) {\
        USBD_DTG_TX_TOGGLE(ep_num);\
    } else {\
    }\
} while(0)

/* set and clear directly double buffered feature of endpoint */
#define USBD_ENDP_DOUBLE_BUF_SET(ep_num)   USBD_ENDP_KIND_SET(ep_num)
#define USBD_ENDP_DOUBLE_BUF_CLEAR(ep_num) USBD_ENDP_KIND_CLEAR(ep_num)

/* toggle SW_BUF bit in the double buffered endpoint */
#define USBD_SWBUF_TX_TOGGLE(ep_num)    USBD_DTG_RX_TOGGLE(ep_num)
#define USBD_SWBUF_RX_TOGGLE(ep_num)    USBD_DTG_TX_TOGGLE(ep_num)

#endif /* USBD_REGS_H */