stm32g0xx_ll_usb.h 32 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914
  1. /**
  2. ******************************************************************************
  3. * @file stm32g0xx_ll_usb.h
  4. * @author MCD Application Team
  5. * @brief Header file of USB Low Layer HAL module.
  6. ******************************************************************************
  7. * @attention
  8. *
  9. * Copyright (c) 2018 STMicroelectronics.
  10. * All rights reserved.
  11. *
  12. * This software is licensed under terms that can be found in the LICENSE file
  13. * in the root directory of this software component.
  14. * If no LICENSE file comes with this software, it is provided AS-IS.
  15. *
  16. ******************************************************************************
  17. */
  18. /* Define to prevent recursive inclusion -------------------------------------*/
  19. #ifndef STM32G0xx_LL_USB_H
  20. #define STM32G0xx_LL_USB_H
  21. #ifdef __cplusplus
  22. extern "C" {
  23. #endif /* __cplusplus */
  24. /* Includes ------------------------------------------------------------------*/
  25. #include "stm32g0xx_hal_def.h"
  26. #if defined (USB_DRD_FS)
  27. /** @addtogroup STM32G0xx_HAL_Driver
  28. * @{
  29. */
  30. /** @addtogroup USB_LL
  31. * @{
  32. */
  33. /* Exported types ------------------------------------------------------------*/
  34. #ifndef HAL_USB_TIMEOUT
  35. #define HAL_USB_TIMEOUT 0xF000000U
  36. #endif /* define HAL_USB_TIMEOUT */
  37. /**
  38. * @brief USB Mode definition
  39. */
  40. typedef enum
  41. {
  42. USB_DEVICE_MODE = 0,
  43. USB_HOST_MODE = 1
  44. } USB_ModeTypeDef;
  45. /**
  46. * @brief URB States definition
  47. */
  48. typedef enum
  49. {
  50. URB_IDLE = 0,
  51. URB_DONE,
  52. URB_NOTREADY,
  53. URB_NYET,
  54. URB_ERROR,
  55. URB_STALL
  56. } USB_URBStateTypeDef;
  57. /**
  58. * @brief Host channel States definition
  59. */
  60. typedef enum
  61. {
  62. HC_IDLE = 0,
  63. HC_XFRC,
  64. HC_HALTED,
  65. HC_ACK,
  66. HC_NAK,
  67. HC_NYET,
  68. HC_STALL,
  69. HC_XACTERR,
  70. HC_BBLERR,
  71. HC_DATATGLERR
  72. } USB_HCStateTypeDef;
  73. /**
  74. * @brief USB Instance Initialization Structure definition
  75. */
  76. typedef struct
  77. {
  78. uint8_t dev_endpoints; /*!< Device Endpoints number.
  79. This parameter depends on the used USB core.
  80. This parameter must be a number between Min_Data = 1 and Max_Data = 15 */
  81. uint8_t Host_channels; /*!< Host Channels number.
  82. This parameter Depends on the used USB core.
  83. This parameter must be a number between Min_Data = 1 and Max_Data = 15 */
  84. uint8_t dma_enable; /*!< USB DMA state.
  85. If DMA is not supported this parameter shall be set by default to zero */
  86. uint8_t speed; /*!< USB Core speed.
  87. This parameter can be any value of @ref PCD_Speed/HCD_Speed
  88. (HCD_SPEED_xxx, HCD_SPEED_xxx) */
  89. uint8_t ep0_mps; /*!< Set the Endpoint 0 Max Packet size. */
  90. uint8_t phy_itface; /*!< Select the used PHY interface.
  91. This parameter can be any value of @ref PCD_PHY_Module/HCD_PHY_Module */
  92. uint8_t Sof_enable; /*!< Enable or disable the output of the SOF signal. */
  93. uint8_t low_power_enable; /*!< Enable or disable the low Power Mode. */
  94. uint8_t lpm_enable; /*!< Enable or disable Link Power Management. */
  95. uint8_t battery_charging_enable; /*!< Enable or disable Battery charging. */
  96. uint8_t vbus_sensing_enable; /*!< Enable or disable the VBUS Sensing feature. */
  97. uint8_t bulk_doublebuffer_enable; /*!< Enable or disable the double buffer mode on bulk EP */
  98. uint8_t iso_singlebuffer_enable; /*!< Enable or disable the Single buffer mode on Isochronous EP */
  99. } USB_CfgTypeDef;
  100. typedef struct
  101. {
  102. uint8_t num; /*!< Endpoint number
  103. This parameter must be a number between Min_Data = 1 and Max_Data = 15 */
  104. uint8_t is_in; /*!< Endpoint direction
  105. This parameter must be a number between Min_Data = 0 and Max_Data = 1 */
  106. uint8_t is_stall; /*!< Endpoint stall condition
  107. This parameter must be a number between Min_Data = 0 and Max_Data = 1 */
  108. uint8_t type; /*!< Endpoint type
  109. This parameter can be any value of @ref USB_LL_EP_Type */
  110. uint8_t data_pid_start; /*!< Initial data PID
  111. This parameter must be a number between Min_Data = 0 and Max_Data = 1 */
  112. uint16_t pmaadress; /*!< PMA Address
  113. This parameter can be any value between Min_addr = 0 and Max_addr = 1K */
  114. uint16_t pmaaddr0; /*!< PMA Address0
  115. This parameter can be any value between Min_addr = 0 and Max_addr = 1K */
  116. uint16_t pmaaddr1; /*!< PMA Address1
  117. This parameter can be any value between Min_addr = 0 and Max_addr = 1K */
  118. uint8_t doublebuffer; /*!< Double buffer enable
  119. This parameter can be 0 or 1 */
  120. uint32_t maxpacket; /*!< Endpoint Max packet size
  121. This parameter must be a number between Min_Data = 0 and Max_Data = 64KB */
  122. uint8_t *xfer_buff; /*!< Pointer to transfer buffer */
  123. uint32_t xfer_len; /*!< Current transfer length */
  124. uint32_t xfer_count; /*!< Partial transfer length in case of multi packet transfer */
  125. uint32_t xfer_len_db; /*!< double buffer transfer length used with bulk double buffer in */
  126. uint8_t xfer_fill_db; /*!< double buffer Need to Fill new buffer used with bulk_in */
  127. } USB_EPTypeDef;
  128. typedef struct
  129. {
  130. uint8_t dev_addr; /*!< USB device address.
  131. This parameter must be a number between Min_Data = 1 and Max_Data = 255 */
  132. uint8_t phy_ch_num; /*!< Host channel number.
  133. This parameter must be a number between Min_Data = 1 and Max_Data = 15 */
  134. uint8_t ep_num; /*!< Endpoint number.
  135. This parameter must be a number between Min_Data = 1 and Max_Data = 15 */
  136. uint8_t ch_dir; /*!< channel direction
  137. This parameter store the physical channel direction IN/OUT/BIDIR */
  138. uint8_t speed; /*!< USB Host Channel speed.
  139. This parameter can be any value of @ref HCD_Device_Speed:
  140. (HCD_DEVICE_SPEED_xxx) */
  141. uint8_t hub_port_nbr; /*!< USB HUB port number */
  142. uint8_t hub_addr; /*!< USB HUB address */
  143. uint8_t ep_type; /*!< Endpoint Type.
  144. This parameter can be any value of @ref USB_LL_EP_Type */
  145. uint16_t max_packet; /*!< Endpoint Max packet size.
  146. This parameter must be a number between Min_Data = 0 and Max_Data = 64KB */
  147. uint8_t data_pid; /*!< Initial data PID.
  148. This parameter must be a number between Min_Data = 0 and Max_Data = 1 */
  149. uint8_t *xfer_buff; /*!< Pointer to transfer buffer. */
  150. uint32_t xfer_len; /*!< Current transfer length. */
  151. uint32_t xfer_len_db; /*!< Current transfer length used in double buffer mode. */
  152. uint32_t xfer_count; /*!< Partial transfer length in case of multi packet transfer. */
  153. uint8_t toggle_in; /*!< IN transfer current toggle flag.
  154. This parameter must be a number between Min_Data = 0 and Max_Data = 1 */
  155. uint8_t toggle_out; /*!< OUT transfer current toggle flag
  156. This parameter must be a number between Min_Data = 0 and Max_Data = 1 */
  157. uint32_t ErrCnt; /*!< Host channel error count. */
  158. uint16_t pmaadress; /*!< PMA Address
  159. This parameter can be any value between Min_addr = 0 and Max_addr = 1K */
  160. uint16_t pmaaddr0; /*!< PMA Address0
  161. This parameter can be any value between Min_addr = 0 and Max_addr = 1K */
  162. uint16_t pmaaddr1; /*!< PMA Address1
  163. This parameter can be any value between Min_addr = 0 and Max_addr = 1K */
  164. uint8_t doublebuffer; /*!< Double buffer enable
  165. This parameter can be 0 or 1 */
  166. USB_URBStateTypeDef urb_state; /*!< URB state.
  167. This parameter can be any value of @ref USB_URBStateTypeDef */
  168. USB_HCStateTypeDef state; /*!< Host Channel state.
  169. This parameter can be any value of @ref USB_HCStateTypeDef */
  170. } USB_HCTypeDef;
  171. typedef USB_ModeTypeDef USB_DRD_ModeTypeDef;
  172. typedef USB_CfgTypeDef USB_DRD_CfgTypeDef;
  173. typedef USB_EPTypeDef USB_DRD_EPTypeDef;
  174. typedef USB_URBStateTypeDef USB_DRD_URBStateTypeDef;
  175. typedef USB_HCStateTypeDef USB_DRD_HCStateTypeDef;
  176. typedef USB_HCTypeDef USB_DRD_HCTypeDef;
  177. /* Exported constants --------------------------------------------------------*/
  178. /** @defgroup PCD_Exported_Constants PCD Exported Constants
  179. * @{
  180. */
  181. /** @defgroup USB_LL_EP0_MPS USB Low Layer EP0 MPS
  182. * @{
  183. */
  184. #define EP_MPS_64 0U
  185. #define EP_MPS_32 1U
  186. #define EP_MPS_16 2U
  187. #define EP_MPS_8 3U
  188. /**
  189. * @}
  190. */
  191. /** @defgroup USB_LL_EP_Type USB Low Layer EP Type
  192. * @{
  193. */
  194. #define EP_TYPE_CTRL 0U
  195. #define EP_TYPE_ISOC 1U
  196. #define EP_TYPE_BULK 2U
  197. #define EP_TYPE_INTR 3U
  198. #define EP_TYPE_MSK 3U
  199. /**
  200. * @}
  201. */
  202. /** @defgroup USB_LL_EP_Speed USB Low Layer EP Speed
  203. * @{
  204. */
  205. #define EP_SPEED_LOW 0U
  206. #define EP_SPEED_FULL 1U
  207. #define EP_SPEED_HIGH 2U
  208. /**
  209. * @}
  210. */
  211. /** @defgroup USB_LL_CH_PID_Type USB Low Layer Channel PID Type
  212. * @{
  213. */
  214. #define HC_PID_DATA0 0U
  215. #define HC_PID_DATA2 1U
  216. #define HC_PID_DATA1 2U
  217. #define HC_PID_SETUP 3U
  218. /**
  219. * @}
  220. */
  221. /** @defgroup USB_LL Device Speed
  222. * @{
  223. */
  224. #define USBD_FS_SPEED 2U
  225. #define USBH_FSLS_SPEED 1U
  226. /**
  227. * @}
  228. */
  229. #define EP_ADDR_MSK 0x7U
  230. #ifndef USE_USB_DOUBLE_BUFFER
  231. #define USE_USB_DOUBLE_BUFFER 1U
  232. #endif /* USE_USB_DOUBLE_BUFFER */
  233. #define USB_EMBEDDED_PHY 2U
  234. /*!< USB Speed */
  235. #define USB_DRD_SPEED_FS 1U
  236. #define USB_DRD_SPEED_LS 2U
  237. #define USB_DRD_SPEED_LSFS 3U
  238. /*!< Channel Direction */
  239. #define CH_IN_DIR 1U
  240. #define CH_OUT_DIR 0U
  241. /*!< Number of used channels in the Application */
  242. #ifndef USB_DRD_USED_CHANNELS
  243. #define USB_DRD_USED_CHANNELS 8U
  244. #endif /* USB_DRD_USED_CHANNELS */
  245. /**
  246. * used for USB_HC_DoubleBuffer API
  247. */
  248. #define USB_DRD_BULK_DBUFF_ENBALE 1U
  249. #define USB_DRD_BULK_DBUFF_DISABLE 2U
  250. #define USB_DRD_ISOC_DBUFF_ENBALE 3U
  251. #define USB_DRD_ISOC_DBUFF_DISABLE 4U
  252. /* First available address in PMA */
  253. #define PMA_START_ADDR (0x10U + (8U *(USB_DRD_USED_CHANNELS - 2U)))
  254. #define PMA_END_ADDR USB_DRD_PMA_SIZE
  255. /* Exported macro ------------------------------------------------------------*/
  256. /**
  257. * @}
  258. */
  259. /******************** Bit definition for USB_COUNTn_RX register *************/
  260. #define USB_CNTRX_NBLK_MSK (0x1FU << 26)
  261. #define USB_CNTRX_BLSIZE (0x1U << 31)
  262. /*Set Channel/Endpoint to the USB Register */
  263. #define USB_DRD_SET_CHEP(USBx, bEpChNum, wRegValue) (*(__IO uint32_t *)\
  264. (&(USBx)->CHEP0R + (bEpChNum)) = (uint32_t)(wRegValue))
  265. /*Get Channel/Endpoint from the USB Register */
  266. #define USB_DRD_GET_CHEP(USBx, bEpChNum) (*(__IO uint32_t *)(&(USBx)->CHEP0R + (bEpChNum)))
  267. /**
  268. * @brief free buffer used from the application realizing it to the line
  269. * toggles bit SW_BUF in the double buffered endpoint register
  270. * @param USBx USB device.
  271. * @param bEpChNum, bDir
  272. * @retval None
  273. */
  274. #define USB_DRD_FREE_USER_BUFFER(USBx, bEpChNum, bDir) \
  275. do { \
  276. if ((bDir) == 0U) \
  277. { \
  278. /* OUT double buffered endpoint */ \
  279. USB_DRD_TX_DTOG((USBx), (bEpChNum)); \
  280. } \
  281. else if ((bDir) == 1U) \
  282. { \
  283. /* IN double buffered endpoint */ \
  284. USB_DRD_RX_DTOG((USBx), (bEpChNum)); \
  285. } \
  286. } while(0)
  287. /**
  288. * @brief Set the Setup bit in the corresponding channel, when a Setup
  289. transaction is needed.
  290. * @param USBx USB device.
  291. * @param bEpChNum
  292. * @retval None
  293. */
  294. #define USB_DRD_CHEP_TX_SETUP(USBx, bEpChNum) \
  295. do { \
  296. uint32_t _wRegVal; \
  297. \
  298. _wRegVal = USB_DRD_GET_CHEP((USBx), (bEpChNum)) ; \
  299. \
  300. /* Set Setup bit */ \
  301. USB_DRD_SET_CHEP((USBx), (bEpChNum), (_wRegVal | USB_CHEP_SETUP)); \
  302. } while(0)
  303. /**
  304. * @brief Clears bit ERR_RX in the Channel register
  305. * @param USBx USB peripheral instance register address.
  306. * @param bChNum Endpoint Number.
  307. * @retval None
  308. */
  309. #define USB_DRD_CLEAR_CHEP_RX_ERR(USBx, bChNum) \
  310. do { \
  311. uint32_t _wRegVal; \
  312. \
  313. _wRegVal = USB_DRD_GET_CHEP((USBx), (bChNum)); \
  314. _wRegVal = (_wRegVal & USB_CHEP_REG_MASK & (~USB_CHEP_ERRRX) & (~USB_CHEP_VTRX)) | \
  315. (USB_CHEP_VTTX | USB_CHEP_ERRTX); \
  316. \
  317. USB_DRD_SET_CHEP((USBx), (bChNum), _wRegVal); \
  318. } while(0) /* USB_DRD_CLEAR_CHEP_RX_ERR */
  319. /**
  320. * @brief Clears bit ERR_TX in the Channel register
  321. * @param USBx USB peripheral instance register address.
  322. * @param bChNum Endpoint Number.
  323. * @retval None
  324. */
  325. #define USB_DRD_CLEAR_CHEP_TX_ERR(USBx, bChNum) \
  326. do { \
  327. uint32_t _wRegVal; \
  328. \
  329. _wRegVal = USB_DRD_GET_CHEP((USBx), (bChNum)); \
  330. _wRegVal = (_wRegVal & USB_CHEP_REG_MASK & (~USB_CHEP_ERRTX) & (~USB_CHEP_VTTX)) | \
  331. (USB_CHEP_VTRX|USB_CHEP_ERRRX); \
  332. \
  333. USB_DRD_SET_CHEP((USBx), (bChNum), _wRegVal); \
  334. } while(0) /* USB_DRD_CLEAR_CHEP_TX_ERR */
  335. /**
  336. * @brief sets the status for tx transfer (bits STAT_TX[1:0]).
  337. * @param USBx USB peripheral instance register address.
  338. * @param bEpChNum Endpoint Number.
  339. * @param wState new state
  340. * @retval None
  341. */
  342. #define USB_DRD_SET_CHEP_TX_STATUS(USBx, bEpChNum, wState) \
  343. do { \
  344. uint32_t _wRegVal; \
  345. \
  346. _wRegVal = USB_DRD_GET_CHEP((USBx), (bEpChNum)) & USB_CHEP_TX_DTOGMASK; \
  347. /* toggle first bit ? */ \
  348. if ((USB_CHEP_TX_DTOG1 & (wState)) != 0U) \
  349. { \
  350. _wRegVal ^= USB_CHEP_TX_DTOG1; \
  351. } \
  352. /* toggle second bit ? */ \
  353. if ((USB_CHEP_TX_DTOG2 & (wState)) != 0U) \
  354. { \
  355. _wRegVal ^= USB_CHEP_TX_DTOG2; \
  356. } \
  357. USB_DRD_SET_CHEP((USBx), (bEpChNum), (_wRegVal | USB_CHEP_VTRX| USB_CHEP_VTTX)); \
  358. } while(0) /* USB_DRD_SET_CHEP_TX_STATUS */
  359. /**
  360. * @brief sets the status for rx transfer (bits STAT_TX[1:0])
  361. * @param USBx USB peripheral instance register address.
  362. * @param bEpChNum Endpoint Number.
  363. * @param wState new state
  364. * @retval None
  365. */
  366. #define USB_DRD_SET_CHEP_RX_STATUS(USBx, bEpChNum, wState) \
  367. do { \
  368. uint32_t _wRegVal; \
  369. \
  370. _wRegVal = USB_DRD_GET_CHEP((USBx), (bEpChNum)) & USB_CHEP_RX_DTOGMASK; \
  371. /* toggle first bit ? */ \
  372. if ((USB_CHEP_RX_DTOG1 & (wState)) != 0U) \
  373. { \
  374. _wRegVal ^= USB_CHEP_RX_DTOG1; \
  375. } \
  376. /* toggle second bit ? */ \
  377. if ((USB_CHEP_RX_DTOG2 & (wState)) != 0U) \
  378. { \
  379. _wRegVal ^= USB_CHEP_RX_DTOG2; \
  380. } \
  381. USB_DRD_SET_CHEP((USBx), (bEpChNum), (_wRegVal | USB_CHEP_VTRX | USB_CHEP_VTTX)); \
  382. } while(0) /* USB_DRD_SET_CHEP_RX_STATUS */
  383. /**
  384. * @brief gets the status for tx/rx transfer (bits STAT_TX[1:0]
  385. * /STAT_RX[1:0])
  386. * @param USBx USB peripheral instance register address.
  387. * @param bEpChNum Endpoint Number.
  388. * @retval status
  389. */
  390. #define USB_DRD_GET_CHEP_TX_STATUS(USBx, bEpChNum) \
  391. ((uint16_t)USB_DRD_GET_CHEP((USBx), (bEpChNum)) & USB_DRD_CHEP_TX_STTX)
  392. #define USB_DRD_GET_CHEP_RX_STATUS(USBx, bEpChNum) \
  393. ((uint16_t)USB_DRD_GET_CHEP((USBx), (bEpChNum)) & USB_DRD_CHEP_RX_STRX)
  394. /**
  395. * @brief set EP_KIND bit.
  396. * @param USBx USB peripheral instance register address.
  397. * @param bEpChNum Endpoint Number.
  398. * @retval None
  399. */
  400. #define USB_DRD_SET_CHEP_KIND(USBx, bEpChNum) \
  401. do { \
  402. uint32_t _wRegVal; \
  403. \
  404. _wRegVal = USB_DRD_GET_CHEP((USBx), (bEpChNum)) & USB_CHEP_REG_MASK; \
  405. \
  406. USB_DRD_SET_CHEP((USBx), (bEpChNum), (_wRegVal | USB_CHEP_VTRX | USB_CHEP_VTTX | USB_CHEP_KIND)); \
  407. } while(0) /* USB_DRD_SET_CHEP_KIND */
  408. /**
  409. * @brief clear EP_KIND bit.
  410. * @param USBx USB peripheral instance register address.
  411. * @param bEpChNum Endpoint Number.
  412. * @retval None
  413. */
  414. #define USB_DRD_CLEAR_CHEP_KIND(USBx, bEpChNum) \
  415. do { \
  416. uint32_t _wRegVal; \
  417. \
  418. _wRegVal = USB_DRD_GET_CHEP((USBx), (bEpChNum)) & USB_EP_KIND_MASK; \
  419. \
  420. USB_DRD_SET_CHEP((USBx), (bEpChNum), (_wRegVal | USB_CHEP_VTRX | USB_CHEP_VTTX)); \
  421. } while(0) /* USB_DRD_CLEAR_CHEP_KIND */
  422. /**
  423. * @brief Clears bit CTR_RX / CTR_TX in the endpoint register.
  424. * @param USBx USB peripheral instance register address.
  425. * @param bEpChNum Endpoint Number.
  426. * @retval None
  427. */
  428. #define USB_DRD_CLEAR_RX_CHEP_CTR(USBx, bEpChNum) \
  429. do { \
  430. uint32_t _wRegVal; \
  431. \
  432. _wRegVal = USB_DRD_GET_CHEP((USBx), (bEpChNum)) & (0xFFFF7FFFU & USB_CHEP_REG_MASK); \
  433. \
  434. USB_DRD_SET_CHEP((USBx), (bEpChNum), (_wRegVal | USB_CHEP_VTTX)); \
  435. } while(0) /* USB_CLEAR_RX_CHEP_CTR */
  436. #define USB_DRD_CLEAR_TX_CHEP_CTR(USBx, bEpChNum) \
  437. do { \
  438. uint32_t _wRegVal; \
  439. \
  440. _wRegVal = USB_DRD_GET_CHEP((USBx), (bEpChNum)) & (0xFFFFFF7FU & USB_CHEP_REG_MASK); \
  441. \
  442. USB_DRD_SET_CHEP((USBx), (bEpChNum), (_wRegVal | USB_CHEP_VTRX)); \
  443. } while(0) /* USB_CLEAR_TX_CHEP_CTR */
  444. /**
  445. * @brief Toggles DTOG_RX / DTOG_TX bit in the endpoint register.
  446. * @param USBx USB peripheral instance register address.
  447. * @param bEpChNum Endpoint Number.
  448. * @retval None
  449. */
  450. #define USB_DRD_RX_DTOG(USBx, bEpChNum) \
  451. do { \
  452. uint32_t _wEPVal; \
  453. \
  454. _wEPVal = USB_DRD_GET_CHEP((USBx), (bEpChNum)) & USB_CHEP_REG_MASK; \
  455. \
  456. USB_DRD_SET_CHEP((USBx), (bEpChNum), (_wEPVal | USB_CHEP_VTRX | USB_CHEP_VTTX | USB_CHEP_DTOG_RX)); \
  457. } while(0) /* USB_DRD_RX_DTOG */
  458. #define USB_DRD_TX_DTOG(USBx, bEpChNum) \
  459. do { \
  460. uint32_t _wEPVal; \
  461. \
  462. _wEPVal = USB_DRD_GET_CHEP((USBx), (bEpChNum)) & USB_CHEP_REG_MASK; \
  463. \
  464. USB_DRD_SET_CHEP((USBx), (bEpChNum), (_wEPVal | USB_CHEP_VTRX | USB_CHEP_VTTX | USB_CHEP_DTOG_TX)); \
  465. } while(0) /* USB_TX_DTOG */
  466. /**
  467. * @brief Clears DTOG_RX / DTOG_TX bit in the endpoint register.
  468. * @param USBx USB peripheral instance register address.
  469. * @param bEpChNum Endpoint Number.
  470. * @retval None
  471. */
  472. #define USB_DRD_CLEAR_RX_DTOG(USBx, bEpChNum) \
  473. do { \
  474. uint32_t _wRegVal; \
  475. \
  476. _wRegVal = USB_DRD_GET_CHEP((USBx), (bEpChNum)); \
  477. \
  478. if ((_wRegVal & USB_CHEP_DTOG_RX) != 0U) \
  479. { \
  480. USB_DRD_RX_DTOG((USBx), (bEpChNum)); \
  481. } \
  482. } while(0) /* USB_DRD_CLEAR_RX_DTOG */
  483. #define USB_DRD_CLEAR_TX_DTOG(USBx, bEpChNum) \
  484. do { \
  485. uint32_t _wRegVal; \
  486. \
  487. _wRegVal = USB_DRD_GET_CHEP((USBx), (bEpChNum)); \
  488. \
  489. if ((_wRegVal & USB_CHEP_DTOG_TX) != 0U) \
  490. { \
  491. USB_DRD_TX_DTOG((USBx), (bEpChNum)); \
  492. } \
  493. } while(0) /* USB_DRD_CLEAR_TX_DTOG */
  494. /**
  495. * @brief Sets address in an endpoint register.
  496. * @param USBx USB peripheral instance register address.
  497. * @param bEpChNum Endpoint Number.
  498. * @param bAddr Address.
  499. * @retval None
  500. */
  501. #define USB_DRD_SET_CHEP_ADDRESS(USBx, bEpChNum, bAddr) \
  502. do { \
  503. uint32_t _wRegVal; \
  504. \
  505. /*Read the USB->CHEPx into _wRegVal, Reset(DTOGRX/STRX/DTOGTX/STTX) and set the EpAddress*/ \
  506. _wRegVal = (USB_DRD_GET_CHEP((USBx), (bEpChNum)) & USB_CHEP_REG_MASK) | (bAddr); \
  507. \
  508. /*Set _wRegVal in USB->CHEPx and set Transmit/Receive Valid Transfer (x=bEpChNum)*/ \
  509. USB_DRD_SET_CHEP((USBx), (bEpChNum), (_wRegVal | USB_CHEP_VTRX | USB_CHEP_VTTX)); \
  510. } while(0) /* USB_DRD_SET_CHEP_ADDRESS */
  511. /* PMA API Buffer Descriptor Management ------------------------------------------------------------*/
  512. /* Buffer Descriptor Table TXBD0/RXBD0 --- > TXBD7/RXBD7 8 possible descriptor
  513. * The buffer descriptor is located inside the packet buffer memory (USB_PMA_BUFF)
  514. * TXBD [Reserve |Countx| Address_Tx]
  515. * RXBD [BLSIEZ|NUM_Block |CounRx| Address_Rx] */
  516. /* Set TX Buffer Descriptor Address Field */
  517. #define USB_DRD_SET_CHEP_TX_ADDRESS(USBx, bEpChNum, wAddr) \
  518. do { \
  519. /* Reset old Address */ \
  520. (USB_DRD_PMA_BUFF + (bEpChNum))->TXBD &= USB_PMA_TXBD_ADDMSK; \
  521. \
  522. /* Bit0 & Bit1 should be =0 PMA must be Word aligned */ \
  523. (USB_DRD_PMA_BUFF + (bEpChNum))->TXBD |= (uint32_t)(((uint32_t)(wAddr) >> 2U) << 2U); \
  524. } while(0) /* USB_DRD_SET_CHEP_TX_ADDRESS */
  525. /* Set RX Buffer Descriptor Address Field */
  526. #define USB_DRD_SET_CHEP_RX_ADDRESS(USBx, bEpChNum, wAddr) \
  527. do { \
  528. /* Reset old Address */ \
  529. (USB_DRD_PMA_BUFF + (bEpChNum))->RXBD &= USB_PMA_RXBD_ADDMSK; \
  530. \
  531. /* Bit0 & Bit1 should be =0 PMA must be Word aligned */ \
  532. (USB_DRD_PMA_BUFF + (bEpChNum))->RXBD |= (uint32_t)(((uint32_t)(wAddr) >> 2U) << 2U); \
  533. } while(0) /* USB_SET_CHEP_RX_ADDRESS */
  534. /**
  535. * @brief Sets counter of rx buffer with no. of blocks.
  536. * @param pdwReg Register pointer
  537. * @param wCount Counter.
  538. * @param wNBlocks no. of Blocks.
  539. * @retval None
  540. */
  541. #define USB_DRD_CALC_BLK32(pdwReg, wCount, wNBlocks) \
  542. do { \
  543. /* Divide PacketSize by 32 to calculate the Nb of Block32 */ \
  544. (wNBlocks) =((uint32_t)(wCount) >> 5U); \
  545. if (((uint32_t)(wCount) % 32U) == 0U) \
  546. { \
  547. (wNBlocks)--; \
  548. } \
  549. \
  550. (pdwReg)|= (uint32_t)((((wNBlocks) << 26U)) | USB_CNTRX_BLSIZE); \
  551. } while(0) /* USB_DRD_CALC_BLK32 */
  552. #define USB_DRD_CALC_BLK2(pdwReg, wCount, wNBlocks) \
  553. do { \
  554. /* Divide PacketSize by 32 to calculate the Nb of Block32 */ \
  555. (wNBlocks) = (uint32_t)((uint32_t)(wCount) >> 1U); \
  556. if (((wCount) & 0x1U) != 0U) \
  557. { \
  558. (wNBlocks)++; \
  559. } \
  560. (pdwReg) |= (uint32_t)((wNBlocks) << 26U); \
  561. } while(0) /* USB_DRD_CALC_BLK2 */
  562. #define USB_DRD_SET_CHEP_CNT_RX_REG(pdwReg, wCount) \
  563. do { \
  564. uint32_t wNBlocks; \
  565. \
  566. (pdwReg) &= ~(USB_CNTRX_BLSIZE | USB_CNTRX_NBLK_MSK); \
  567. \
  568. if ((wCount) > 62U) \
  569. { \
  570. USB_DRD_CALC_BLK32((pdwReg), (wCount), wNBlocks); \
  571. } \
  572. else \
  573. { \
  574. if ((wCount) == 0U) \
  575. { \
  576. (pdwReg) |= USB_CNTRX_BLSIZE; \
  577. } \
  578. else \
  579. { \
  580. USB_DRD_CALC_BLK2((pdwReg), (wCount), wNBlocks); \
  581. } \
  582. } \
  583. } while(0) /* USB_DRD_SET_CHEP_CNT_RX_REG */
  584. /**
  585. * @brief sets counter for the tx/rx buffer.
  586. * @param USBx USB peripheral instance register address.
  587. * @param bEpChNum Endpoint Number.
  588. * @param wCount Counter value.
  589. * @retval None
  590. */
  591. #define USB_DRD_SET_CHEP_TX_CNT(USBx,bEpChNum, wCount) \
  592. do { \
  593. /* Reset old TX_Count value */ \
  594. (USB_DRD_PMA_BUFF + (bEpChNum))->TXBD &= USB_PMA_TXBD_COUNTMSK; \
  595. \
  596. /* Set the wCount in the dedicated EP_TXBuffer */ \
  597. (USB_DRD_PMA_BUFF + (bEpChNum))->TXBD |= (uint32_t)((uint32_t)(wCount) << 16U); \
  598. } while(0)
  599. #define USB_DRD_SET_CHEP_RX_DBUF0_CNT(USBx, bEpChNum, wCount) \
  600. USB_DRD_SET_CHEP_CNT_RX_REG(((USB_DRD_PMA_BUFF + (bEpChNum))->TXBD), (wCount))
  601. #define USB_DRD_SET_CHEP_RX_CNT(USBx, bEpChNum, wCount) \
  602. USB_DRD_SET_CHEP_CNT_RX_REG(((USB_DRD_PMA_BUFF + (bEpChNum))->RXBD), (wCount))
  603. /**
  604. * @brief gets counter of the tx buffer.
  605. * @param USBx USB peripheral instance register address.
  606. * @param bEpChNum Endpoint Number.
  607. * @retval Counter value
  608. */
  609. #define USB_DRD_GET_CHEP_TX_CNT(USBx, bEpChNum) (((USB_DRD_PMA_BUFF + (bEpChNum))->TXBD & 0x03FF0000U) >> 16U)
  610. #define USB_DRD_GET_CHEP_RX_CNT(USBx, bEpChNum) (((USB_DRD_PMA_BUFF + (bEpChNum))->RXBD & 0x03FF0000U) >> 16U)
  611. #define USB_DRD_GET_EP_TX_CNT USB_GET_CHEP_TX_CNT
  612. #define USB_DRD_GET_CH_TX_CNT USB_GET_CHEP_TX_CNT
  613. #define USB_DRD_GET_EP_RX_CNT USB_DRD_GET_CHEP_RX_CNT
  614. #define USB_DRD_GET_CH_RX_CNT USB_DRD_GET_CHEP_RX_CNT
  615. /**
  616. * @brief Sets buffer 0/1 address in a double buffer endpoint.
  617. * @param USBx USB peripheral instance register address.
  618. * @param bEpChNum Endpoint Number.
  619. * @param wBuf0Addr buffer 0 address.
  620. * @retval Counter value
  621. */
  622. #define USB_DRD_SET_CHEP_DBUF0_ADDR(USBx, bEpChNum, wBuf0Addr) \
  623. USB_DRD_SET_CHEP_TX_ADDRESS((USBx), (bEpChNum), (wBuf0Addr))
  624. #define USB_DRD_SET_CHEP_DBUF1_ADDR(USBx, bEpChNum, wBuf1Addr) \
  625. USB_DRD_SET_CHEP_RX_ADDRESS((USBx), (bEpChNum), (wBuf1Addr))
  626. /**
  627. * @brief Sets addresses in a double buffer endpoint.
  628. * @param USBx USB peripheral instance register address.
  629. * @param bEpChNum Endpoint Number.
  630. * @param wBuf0Addr: buffer 0 address.
  631. * @param wBuf1Addr = buffer 1 address.
  632. * @retval None
  633. */
  634. #define USB_DRD_SET_CHEP_DBUF_ADDR(USBx, bEpChNum, wBuf0Addr, wBuf1Addr) \
  635. do { \
  636. USB_DRD_SET_CHEP_DBUF0_ADDR((USBx), (bEpChNum), (wBuf0Addr)); \
  637. USB_DRD_SET_CHEP_DBUF1_ADDR((USBx), (bEpChNum), (wBuf1Addr)); \
  638. } while(0) /* USB_DRD_SET_CHEP_DBUF_ADDR */
  639. /**
  640. * @brief Gets buffer 0/1 address of a double buffer endpoint.
  641. * @param USBx USB peripheral instance register address.
  642. * @param bEpChNum Endpoint Number.
  643. * @param bDir endpoint dir EP_DBUF_OUT = OUT
  644. * EP_DBUF_IN = IN
  645. * @param wCount: Counter value
  646. * @retval None
  647. */
  648. #define USB_DRD_SET_CHEP_DBUF0_CNT(USBx, bEpChNum, bDir, wCount) \
  649. do { \
  650. if ((bDir) == 0U) \
  651. { \
  652. /* OUT endpoint */ \
  653. USB_DRD_SET_CHEP_RX_DBUF0_CNT((USBx), (bEpChNum), (wCount)); \
  654. } \
  655. else \
  656. { \
  657. if ((bDir) == 1U) \
  658. { \
  659. /* IN endpoint */ \
  660. USB_DRD_SET_CHEP_TX_CNT((USBx), (bEpChNum), (wCount)); \
  661. } \
  662. } \
  663. } while(0) /* USB_DRD_SET_CHEP_DBUF0_CNT */
  664. #define USB_DRD_SET_CHEP_DBUF1_CNT(USBx, bEpChNum, bDir, wCount) \
  665. do { \
  666. if ((bDir) == 0U) \
  667. { \
  668. /* OUT endpoint */ \
  669. USB_DRD_SET_CHEP_RX_CNT((USBx), (bEpChNum), (wCount)); \
  670. } \
  671. else \
  672. { \
  673. if ((bDir) == 1U) \
  674. { \
  675. /* IN endpoint */ \
  676. (USB_DRD_PMA_BUFF + (bEpChNum))->RXBD &= USB_PMA_TXBD_COUNTMSK; \
  677. (USB_DRD_PMA_BUFF + (bEpChNum))->RXBD |= (uint32_t)((uint32_t)(wCount) << 16U); \
  678. } \
  679. } \
  680. } while(0) /* USB_DRD_SET_CHEP_DBUF1_CNT */
  681. #define USB_DRD_SET_CHEP_DBUF_CNT(USBx, bEpChNum, bDir, wCount) \
  682. do { \
  683. USB_DRD_SET_CHEP_DBUF0_CNT((USBx), (bEpChNum), (bDir), (wCount)); \
  684. USB_DRD_SET_CHEP_DBUF1_CNT((USBx), (bEpChNum), (bDir), (wCount)); \
  685. } while(0) /* USB_DRD_SET_EPCH_DBUF_CNT */
  686. /**
  687. * @brief Gets buffer 0/1 rx/tx counter for double buffering.
  688. * @param USBx USB peripheral instance register address.
  689. * @param bEpChNum Endpoint Number.
  690. * @retval None
  691. */
  692. #define USB_DRD_GET_CHEP_DBUF0_CNT(USBx, bEpChNum) (USB_DRD_GET_CHEP_TX_CNT((USBx), (bEpChNum)))
  693. #define USB_DRD_GET_CHEP_DBUF1_CNT(USBx, bEpChNum) (USB_DRD_GET_CHEP_RX_CNT((USBx), (bEpChNum)))
  694. /**
  695. * @}
  696. */
  697. /* Exported macro ------------------------------------------------------------*/
  698. /**
  699. * @}
  700. */
  701. /* Exported functions --------------------------------------------------------*/
  702. /** @addtogroup USB_LL_Exported_Functions USB Low Layer Exported Functions
  703. * @{
  704. */
  705. HAL_StatusTypeDef USB_CoreInit(USB_DRD_TypeDef *USBx, USB_DRD_CfgTypeDef cfg);
  706. HAL_StatusTypeDef USB_DevInit(USB_DRD_TypeDef *USBx, USB_DRD_CfgTypeDef cfg);
  707. HAL_StatusTypeDef USB_EnableGlobalInt(USB_DRD_TypeDef *USBx);
  708. HAL_StatusTypeDef USB_DisableGlobalInt(USB_DRD_TypeDef *USBx);
  709. HAL_StatusTypeDef USB_SetCurrentMode(USB_DRD_TypeDef *USBx, USB_DRD_ModeTypeDef mode);
  710. HAL_StatusTypeDef USB_FlushRxFifo(USB_DRD_TypeDef const *USBx);
  711. HAL_StatusTypeDef USB_FlushTxFifo(USB_DRD_TypeDef const *USBx, uint32_t num);
  712. #if defined (HAL_PCD_MODULE_ENABLED)
  713. HAL_StatusTypeDef USB_ActivateEndpoint(USB_DRD_TypeDef *USBx, USB_DRD_EPTypeDef *ep);
  714. HAL_StatusTypeDef USB_DeactivateEndpoint(USB_DRD_TypeDef *USBx, USB_DRD_EPTypeDef *ep);
  715. HAL_StatusTypeDef USB_EPStartXfer(USB_DRD_TypeDef *USBx, USB_DRD_EPTypeDef *ep);
  716. HAL_StatusTypeDef USB_EPSetStall(USB_DRD_TypeDef *USBx, USB_DRD_EPTypeDef *ep);
  717. HAL_StatusTypeDef USB_EPClearStall(USB_DRD_TypeDef *USBx, USB_DRD_EPTypeDef *ep);
  718. HAL_StatusTypeDef USB_EPStopXfer(USB_DRD_TypeDef *USBx, USB_DRD_EPTypeDef *ep);
  719. #endif /* defined (HAL_PCD_MODULE_ENABLED) */
  720. HAL_StatusTypeDef USB_SetDevAddress(USB_DRD_TypeDef *USBx, uint8_t address);
  721. HAL_StatusTypeDef USB_DevConnect(USB_DRD_TypeDef *USBx);
  722. HAL_StatusTypeDef USB_DevDisconnect(USB_DRD_TypeDef *USBx);
  723. HAL_StatusTypeDef USB_StopDevice(USB_DRD_TypeDef *USBx);
  724. uint32_t USB_ReadInterrupts(USB_DRD_TypeDef const *USBx);
  725. HAL_StatusTypeDef USB_ResetPort(USB_DRD_TypeDef *USBx);
  726. HAL_StatusTypeDef USB_HostInit(USB_DRD_TypeDef *USBx, USB_DRD_CfgTypeDef cfg);
  727. HAL_StatusTypeDef USB_HC_IN_Halt(USB_DRD_TypeDef *USBx, uint8_t phy_ch);
  728. HAL_StatusTypeDef USB_HC_OUT_Halt(USB_DRD_TypeDef *USBx, uint8_t phy_ch);
  729. HAL_StatusTypeDef USB_HC_StartXfer(USB_DRD_TypeDef *USBx, USB_DRD_HCTypeDef *hc);
  730. uint32_t USB_GetHostSpeed(USB_DRD_TypeDef const *USBx);
  731. uint32_t USB_GetCurrentFrame(USB_DRD_TypeDef const *USBx);
  732. HAL_StatusTypeDef USB_StopHost(USB_DRD_TypeDef *USBx);
  733. HAL_StatusTypeDef USB_HC_DoubleBuffer(USB_DRD_TypeDef *USBx, uint8_t phy_ch_num, uint8_t db_state);
  734. HAL_StatusTypeDef USB_HC_Init(USB_DRD_TypeDef *USBx, uint8_t phy_ch_num, uint8_t epnum,
  735. uint8_t dev_address, uint8_t speed, uint8_t ep_type, uint16_t mps);
  736. HAL_StatusTypeDef USB_ActivateRemoteWakeup(USB_DRD_TypeDef *USBx);
  737. HAL_StatusTypeDef USB_DeActivateRemoteWakeup(USB_DRD_TypeDef *USBx);
  738. void USB_WritePMA(USB_DRD_TypeDef const *USBx, uint8_t *pbUsrBuf,
  739. uint16_t wPMABufAddr, uint16_t wNBytes);
  740. void USB_ReadPMA(USB_DRD_TypeDef const *USBx, uint8_t *pbUsrBuf,
  741. uint16_t wPMABufAddr, uint16_t wNBytes);
  742. /**
  743. * @}
  744. */
  745. /**
  746. * @}
  747. */
  748. /**
  749. * @}
  750. */
  751. /**
  752. * @}
  753. */
  754. #endif /* defined (USB_DRD_FS) */
  755. #ifdef __cplusplus
  756. }
  757. #endif /* __cplusplus */
  758. #endif /* STM32G0xx_LL_USB_H */