usbd_regs.h 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270
  1. /*!
  2. \file usbd_regs.h
  3. \brief USB device registers
  4. */
  5. /*
  6. Copyright (C) 2017 GigaDevice
  7. 2017-02-10, V1.0.0, firmware for GD32F30x
  8. */
  9. #ifndef USBD_REGS_H
  10. #define USBD_REGS_H
  11. #include "usbd_conf.h"
  12. /* USB device registers base address */
  13. #define USBD USBD_BASE
  14. #define USBD_RAM (APB1_BUS_BASE + 0x00006000U)
  15. /* registers definitions */
  16. /* common registers */
  17. #define USBD_CTL (REG32(USBD + 0x40U)) /*!< control register */
  18. #define USBD_INTF (REG32(USBD + 0x44U)) /*!< interrupt flag register */
  19. #define USBD_STAT (REG32(USBD + 0x48U)) /*!< status register */
  20. #define USBD_DADDR (REG32(USBD + 0x4CU)) /*!< device address register */
  21. #define USBD_BADDR (REG32(USBD + 0x50U)) /*!< buffer address register */
  22. /* endpoint control and status register */
  23. #define USBD_EPxCS(ep_id) (REG32(USBD + (ep_id) * 4U)) /*!< endpoint x control and status register address */
  24. /* LPM Registers */
  25. #define USBD_LPMCS (REG32(USBD + 0x54U)) /*!< USBD LPM control and status register */
  26. /* bits definitions */
  27. /* USBD_CTL */
  28. #define CTL_STIE BIT(15) /*!< successful transfer interrupt enable mask */
  29. #define CTL_PMOUIE BIT(14) /*!< packet memory overrun/underrun interrupt enable mask */
  30. #define CTL_ERRIE BIT(13) /*!< error interrupt enable mask */
  31. #define CTL_WKUPIE BIT(12) /*!< wakeup interrupt enable mask */
  32. #define CTL_SPSIE BIT(11) /*!< suspend state interrupt enable mask */
  33. #define CTL_RSTIE BIT(10) /*!< reset interrupt enable mask */
  34. #define CTL_SOFIE BIT(9) /*!< start of frame interrupt enable mask */
  35. #define CTL_ESOFIE BIT(8) /*!< expected start of frame interrupt enable mask */
  36. #define CTL_L1REQIE BIT(7) /*!< LPM L1 state request interrupt enable */
  37. #define CTL_L1RSREQ BIT(5) /*!< LPM L1 resume request */
  38. #define CTL_RSREQ BIT(4) /*!< resume request */
  39. #define CTL_SETSPS BIT(3) /*!< set suspend state */
  40. #define CTL_LOWM BIT(2) /*!< low-power mode at suspend state */
  41. #define CTL_CLOSE BIT(1) /*!< goes to close state */
  42. #define CTL_SETRST BIT(0) /*!< set USB reset */
  43. /* USBD_INTF */
  44. #define INTF_STIF BIT(15) /*!< successful transfer interrupt flag (read only bit) */
  45. #define INTF_PMOUIF BIT(14) /*!< packet memory overrun/underrun interrupt flag (clear-only bit) */
  46. #define INTF_ERRIF BIT(13) /*!< error interrupt flag (clear-only bit) */
  47. #define INTF_WKUPIF BIT(12) /*!< wakeup interrupt flag (clear-only bit) */
  48. #define INTF_SPSIF BIT(11) /*!< suspend state interrupt flag (clear-only bit) */
  49. #define INTF_RSTIF BIT(10) /*!< reset interrupt flag (clear-only bit) */
  50. #define INTF_SOFIF BIT(9) /*!< start of frame interrupt flag (clear-only bit) */
  51. #define INTF_ESOFIF BIT(8) /*!< expected start of frame interrupt flag(clear-only bit) */
  52. #define INTF_L1REQ BIT(7) /*!< LPM L1 transaction is successfully received and acknowledged */
  53. #define INTF_DIR BIT(4) /*!< direction of transaction (read-only bit) */
  54. #define INTF_EPNUM BITS(0, 3) /*!< endpoint number (read-only bit) */
  55. /* USBD_STAT */
  56. #define STAT_RXDP BIT(15) /*!< data plus line status */
  57. #define STAT_RXDM BIT(14) /*!< data minus line status */
  58. #define STAT_LOCK BIT(13) /*!< locked the USB */
  59. #define STAT_SOFLN BITS(11, 12) /*!< SOF lost number */
  60. #define STAT_FCNT BITS(0, 10) /*!< frame number count */
  61. /* USBD_DADDR */
  62. #define DADDR_USBEN BIT(7) /*!< USB module enable */
  63. #define DADDR_USBDAR BITS(0, 6) /*!< USB device address */
  64. /* USBD_EPxCS */
  65. #define EPxCS_RX_ST BIT(15) /*!< endpoint reception successful transferred */
  66. #define EPxCS_RX_DTG BIT(14) /*!< endpoint reception data PID toggle */
  67. #define EPxCS_RX_STA BITS(12, 13) /*!< endpoint reception status bits */
  68. #define EPxCS_SETUP BIT(11) /*!< endpoint setup transaction completed */
  69. #define EPxCS_CTL BITS(9, 10) /*!< endpoint type control */
  70. #define EPxCS_KCTL BIT(8) /*!< endpoint kind control */
  71. #define EPxCS_TX_ST BIT(7) /*!< endpoint transmission successful transfer */
  72. #define EPxCS_TX_DTG BIT(6) /*!< endpoint transmission data toggle */
  73. #define EPxCS_TX_STA BITS(4, 5) /*!< endpoint transmission transfers status bits */
  74. #define EPxCS_ADDR BITS(0, 3) /*!< endpoint address */
  75. /* USBD_LPMCS */
  76. #define LPMCS_BLSTAT BITS(4, 7) /*!< bLinkState value */
  77. #define LPMCS_REMWK BIT(3) /*!< bRemoteWake value */
  78. #define LPMCS_LPMACK BIT(1) /*!< LPM token acknowledge enable */
  79. #define LPMCS_LPMEN BIT(0) /*!< LPM support enable */
  80. /* constants definitions */
  81. /* endpoint control and status register mask (no toggle fields) */
  82. #define EPCS_MASK (EPxCS_RX_ST|EPxCS_SETUP|EPxCS_CTL|EPxCS_KCTL|EPxCS_TX_ST|EPxCS_ADDR)
  83. /* EPxCS_CTL[1:0] endpoint type control */
  84. #define ENDP_TYPE(regval) (EPxCS_CTL & ((regval) << 9U))
  85. #define EP_BULK ENDP_TYPE(0U) /* bulk transfers */
  86. #define EP_CONTROL ENDP_TYPE(1U) /* control transfers */
  87. #define EP_ISO ENDP_TYPE(2U) /* isochronous transfers */
  88. #define EP_INTERRUPT ENDP_TYPE(3U) /* interrupt transfers */
  89. #define EP_CTL_MASK (~EPxCS_CTL & EPCS_MASK)
  90. /* endpoint kind control mask */
  91. #define EPKCTL_MASK (~EPxCS_KCTL & EPCS_MASK)
  92. /* EPxCS_TX_STA[1:0] status for Tx transfer */
  93. #define ENDP_TXSTAT(regval) (EPxCS_TX_STA & ((regval) << 4U))
  94. #define EPTX_DISABLED ENDP_TXSTAT(0U) /* transmission state is disabled */
  95. #define EPTX_STALL ENDP_TXSTAT(1U) /* transmission state is STALL */
  96. #define EPTX_NAK ENDP_TXSTAT(2U) /* transmission state is NAK */
  97. #define EPTX_VALID ENDP_TXSTAT(3U) /* transmission state is enabled */
  98. #define EPTX_DTGMASK (EPxCS_TX_STA | EPCS_MASK)
  99. /* EPxCS_RX_STA[1:0] status for Rx transfer */
  100. #define ENDP_RXSTAT(regval) (EPxCS_RX_STA & ((regval) << 12U))
  101. #define EPRX_DISABLED ENDP_RXSTAT(0U) /* reception state is disabled */
  102. #define EPRX_STALL ENDP_RXSTAT(1U) /* reception state is STALL */
  103. #define EPRX_NAK ENDP_RXSTAT(2U) /* reception state is NAK */
  104. #define EPRX_VALID ENDP_RXSTAT(3U) /* reception state is enabled */
  105. #define EPRX_DTGMASK (EPxCS_RX_STA | EPCS_MASK)
  106. /* endpoint receive/transmission counter register bit definitions */
  107. #define EPRCNT_BLKSIZ BIT(15) /* reception data block size */
  108. #define EPRCNT_BLKNUM BITS(10, 14) /* reception data block number */
  109. #define EPRCNT_CNT BITS(0, 9) /* reception data count */
  110. #define EPTCNT_CNT BITS(0, 9) /* transmisson data count */
  111. /* interrupt flag clear bits */
  112. #define CLR_STIF (~INTF_STIF)
  113. #define CLR_PMOUIF (~INTF_PMOUIF)
  114. #define CLR_ERRIF (~INTF_ERRIF)
  115. #define CLR_WKUPIF (~INTF_WKUPIF)
  116. #define CLR_SPSIF (~INTF_SPSIF)
  117. #define CLR_RSTIF (~INTF_RSTIF)
  118. #define CLR_SOFIF (~INTF_SOFIF)
  119. #define CLR_ESOFIF (~INTF_ESOFIF)
  120. #define CLR_L1REQ (~INTF_L1REQ)
  121. /* endpoint receive/transmission counter register bit offset */
  122. #define BLKSIZE_OFFSET (0x01U)
  123. #define BLKNUM_OFFSET (0x05U)
  124. #define RXCNT_OFFSET (0x0AU)
  125. #define TXCNT_OFFSET (0x0AU)
  126. #define BLKSIZE32_MASK (0x1fU)
  127. #define BLKSIZE2_MASK (0x01U)
  128. #define BLKSIZE32_OFFSETMASK (0x05U)
  129. #define BLKSIZE2_OFFSETMASK (0x01U)
  130. /* double buffer endpoint direction */
  131. typedef enum
  132. {
  133. DBUF_EP_IN, /* double buffer IN direction */
  134. DBUF_EP_OUT, /* double buffer OUT direction */
  135. DBUF_EP_ERR, /* double buffer errer direction */
  136. }dbuf_ep_dir_enum;
  137. /* endpoints address */
  138. /* first bit is direction(0 for Rx and 1 for Tx) */
  139. #define EP0_OUT ((uint8_t)0x00) /* OUT endpoint 0 address */
  140. #define EP0_IN ((uint8_t)0x80) /* IN endpoint 0 address */
  141. #define EP1_OUT ((uint8_t)0x01) /* OUT endpoint 1 address */
  142. #define EP1_IN ((uint8_t)0x81) /* IN endpoint 1 address */
  143. #define EP2_OUT ((uint8_t)0x02) /* OUT endpoint 2 address */
  144. #define EP2_IN ((uint8_t)0x82) /* IN endpoint 2 address */
  145. #define EP3_OUT ((uint8_t)0x03) /* OUT endpoint 3 address */
  146. #define EP3_IN ((uint8_t)0x83) /* IN endpoint 3 address */
  147. #define EP4_OUT ((uint8_t)0x04) /* OUT endpoint 4 address */
  148. #define EP4_IN ((uint8_t)0x84) /* IN endpoint 4 address */
  149. #define EP5_OUT ((uint8_t)0x05) /* OUT endpoint 5 address */
  150. #define EP5_IN ((uint8_t)0x85) /* IN endpoint 5 address */
  151. #define EP6_OUT ((uint8_t)0x06) /* OUT endpoint 6 address */
  152. #define EP6_IN ((uint8_t)0x86) /* IN endpoint 6 address */
  153. #define EP7_OUT ((uint8_t)0x07) /* OUT endpoint 7 address */
  154. #define EP7_IN ((uint8_t)0x87) /* IN endpoint 7 address */
  155. /* endpoints_Identifier */
  156. #define EP0 ((uint8_t)0) /* endpoint 0 ID */
  157. #define EP1 ((uint8_t)1) /* endpoint 1 ID */
  158. #define EP2 ((uint8_t)2) /* endpoint 2 ID */
  159. #define EP3 ((uint8_t)3) /* endpoint 3 ID */
  160. #define EP4 ((uint8_t)4) /* endpoint 4 ID */
  161. #define EP5 ((uint8_t)5) /* endpoint 5 ID */
  162. #define EP6 ((uint8_t)6) /* endpoint 6 ID */
  163. #define EP7 ((uint8_t)7) /* endpoint 7 ID */
  164. /* USBD operation macros */
  165. /* set register value */
  166. #define USBD_REG_SET(reg, regvalue) ((reg) = (uint16_t)(regvalue))
  167. /* get register value */
  168. #define USBD_REG_GET(reg) ((uint16_t)(reg))
  169. #define _EP_ADDR_SET(ep_num, addr) USBD_REG_SET(USBD_EPxCS(ep_num), (USBD_REG_GET(USBD_EPxCS(ep_num)) & EPCS_MASK) | addr)
  170. /* Tx or Rx transfer status setting (bits EPTX_STA[1:0]) */
  171. #define USBD_ENDP_TX_STATUS_SET(ep_num, state) do {\
  172. register uint16_t _regval; \
  173. _regval = USBD_REG_GET(USBD_EPxCS(ep_num)) & (uint16_t)EPTX_DTGMASK;\
  174. USBD_REG_SET(USBD_EPxCS(ep_num), ((_regval) ^ (state))); \
  175. } while(0)
  176. #define USBD_ENDP_RX_STATUS_SET(ep_num, state) do {\
  177. register uint16_t _regval; \
  178. _regval = USBD_REG_GET(USBD_EPxCS(ep_num)) & (uint16_t)EPRX_DTGMASK;\
  179. USBD_REG_SET(USBD_EPxCS(ep_num), ((_regval) ^ (state))); \
  180. } while(0)
  181. /* Tx or Rx transfer status getting (bits EPxCS_RX_STA[1:0]) */
  182. #define USBD_ENDP_TX_STATUS_GET(ep_num) (USBD_REG_GET(USBD_EPxCS(ep_num)) & EPxCS_TX_STA)
  183. #define USBD_ENDP_RX_STATUS_GET(ep_num) (USBD_REG_GET(USBD_EPxCS(ep_num)) & EPxCS_RX_STA)
  184. /* Rx and Tx transfer status setting (bits EPxCS_RX_STA[1:0] & EPxCS_TX_STA[1:0]) */
  185. #define USBD_ENDP_RX_TX_STATUS_SET(ep_num, state_rx, state_tx) do {\
  186. register uint16_t _regval; \
  187. _regval = USBD_REG_GET(USBD_EPxCS(ep_num)) & (uint16_t)(EPRX_DTGMASK | EPxCS_TX_STA) ;\
  188. USBD_REG_SET(USBD_EPxCS(ep_num), (((_regval) ^ (state_rx)) ^ (state_tx))); \
  189. } while(0)
  190. /* set and clear endpoint kind (bit EPxCS_KCTL) */
  191. #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)))
  192. #define USBD_ENDP_KIND_CLEAR(ep_num) (USBD_REG_SET(USBD_EPxCS(ep_num), (USBD_REG_GET(USBD_EPxCS(ep_num)) & EPKCTL_MASK)))
  193. /* set and clear directly STATUS_OUT state of endpoint */
  194. #define USBD_STATUS_OUT_SET(ep_num) USBD_ENDP_KIND_SET(ep_num)
  195. #define USBD_STATUS_OUT_CLEAR(ep_num) USBD_ENDP_KIND_CLEAR(ep_num)
  196. /* clear bit EPxCS_RX_ST/EPxCS_TX_ST in the endpoint control and status register */
  197. #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))
  198. #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))
  199. /* toggle EPxCS_RX_DTG or EPxCS_TX_DTG bit in the endpoint control and status register */
  200. #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)))
  201. #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)))
  202. /* clear EPxCS_RX_DTG or EPxCS_TX_DTG bit in the endpoint control and status register */
  203. #define USBD_DTG_RX_CLEAR(ep_num) do {\
  204. if ((USBD_REG_GET(USBD_EPxCS(ep_num)) & EPxCS_RX_DTG) != 0U) {\
  205. USBD_DTG_RX_TOGGLE(ep_num);\
  206. } else {\
  207. }\
  208. } while(0)
  209. #define USBD_DTG_TX_CLEAR(ep_num) do {\
  210. if ((USBD_REG_GET(USBD_EPxCS(ep_num)) & EPxCS_TX_DTG) != 0U) {\
  211. USBD_DTG_TX_TOGGLE(ep_num);\
  212. } else {\
  213. }\
  214. } while(0)
  215. /* set and clear directly double buffered feature of endpoint */
  216. #define USBD_ENDP_DOUBLE_BUF_SET(ep_num) USBD_ENDP_KIND_SET(ep_num)
  217. #define USBD_ENDP_DOUBLE_BUF_CLEAR(ep_num) USBD_ENDP_KIND_CLEAR(ep_num)
  218. /* toggle SW_BUF bit in the double buffered endpoint */
  219. #define USBD_SWBUF_TX_TOGGLE(ep_num) USBD_DTG_RX_TOGGLE(ep_num)
  220. #define USBD_SWBUF_RX_TOGGLE(ep_num) USBD_DTG_TX_TOGGLE(ep_num)
  221. #endif /* USBD_REGS_H */