usb_glue_st.c 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750
  1. /*
  2. * Copyright (c) 2024, sakumisu
  3. *
  4. * SPDX-License-Identifier: Apache-2.0
  5. */
  6. #include "usbd_core.h"
  7. #include "usbh_core.h"
  8. #include "usb_dwc2_param.h"
  9. #ifndef CONFIG_USB_DWC2_CUSTOM_PARAM
  10. #if __has_include("stm32f1xx_hal.h")
  11. #include "stm32f1xx_hal.h"
  12. const struct dwc2_user_params param_pa11_pa12 = {
  13. .phy_type = DWC2_PHY_TYPE_PARAM_FS,
  14. .device_dma_enable = false,
  15. .device_dma_desc_enable = false,
  16. .device_rx_fifo_size = (320 - 16 - 16 - 16 - 16),
  17. .device_tx_fifo_size = {
  18. [0] = 16, // 64 byte
  19. [1] = 16, // 64 byte
  20. [2] = 16, // 64 byte
  21. [3] = 16, // 64 byte
  22. [4] = 0,
  23. [5] = 0,
  24. [6] = 0,
  25. [7] = 0,
  26. [8] = 0,
  27. [9] = 0,
  28. [10] = 0,
  29. [11] = 0,
  30. [12] = 0,
  31. [13] = 0,
  32. [14] = 0,
  33. [15] = 0 },
  34. .device_gccfg = ((1 << 16) | (1 << 21)), // fs: USB_OTG_GCCFG_PWRDWN | USB_OTG_GCCFG_NOVBUSSENS
  35. .total_fifo_size = 320 // 1280 byte
  36. };
  37. const struct dwc2_user_params param_pb14_pb15 = { 0 }; // do not support
  38. #if defined(HAL_HCD_MODULE_ENABLED)
  39. #error "HAL_HCD_MODULE_ENABLED is not supported for STM32F1xx, please use HAL_PCD_MODULE_ENABLED"
  40. #endif
  41. #elif __has_include("stm32f2xx_hal.h")
  42. #include "stm32f2xx_hal.h"
  43. const struct dwc2_user_params param_pa11_pa12 = {
  44. .phy_type = DWC2_PHY_TYPE_PARAM_FS,
  45. .device_dma_enable = false,
  46. .device_dma_desc_enable = false,
  47. .device_rx_fifo_size = (320 - 16 - 16 - 16 - 16),
  48. .device_tx_fifo_size = {
  49. [0] = 16, // 64 byte
  50. [1] = 16, // 64 byte
  51. [2] = 16, // 64 byte
  52. [3] = 16, // 64 byte
  53. [4] = 0,
  54. [5] = 0,
  55. [6] = 0,
  56. [7] = 0,
  57. [8] = 0,
  58. [9] = 0,
  59. [10] = 0,
  60. [11] = 0,
  61. [12] = 0,
  62. [13] = 0,
  63. [14] = 0,
  64. [15] = 0 },
  65. .device_gccfg = ((1 << 16) | (1 << 21)), // fs: USB_OTG_GCCFG_PWRDWN | USB_OTG_GCCFG_NOVBUSSENS
  66. .total_fifo_size = 320 // 1280 byte
  67. };
  68. const struct dwc2_user_params param_pb14_pb15 = {
  69. #ifdef CONFIG_USB_HS
  70. .phy_type = DWC2_PHY_TYPE_PARAM_UTMI,
  71. #else
  72. .phy_type = DWC2_PHY_TYPE_PARAM_FS,
  73. #endif
  74. #ifdef CONFIG_USB_DWC2_DMA_ENABLE
  75. .device_dma_enable = true,
  76. #else
  77. .device_dma_enable = false,
  78. #endif
  79. .device_dma_desc_enable = false,
  80. .device_rx_fifo_size = (1012 - 16 - 256 - 128 - 128 - 128 - 128),
  81. .device_tx_fifo_size = {
  82. [0] = 16, // 64 byte
  83. [1] = 256, // 1024 byte
  84. [2] = 128, // 512 byte
  85. [3] = 128, // 512 byte
  86. [4] = 128, // 512 byte
  87. [5] = 128, // 512 byte
  88. [6] = 0,
  89. [7] = 0,
  90. [8] = 0,
  91. [9] = 0,
  92. [10] = 0,
  93. [11] = 0,
  94. [12] = 0,
  95. [13] = 0,
  96. [14] = 0,
  97. [15] = 0 },
  98. .host_dma_desc_enable = false,
  99. .host_rx_fifo_size = 628,
  100. .host_nperio_tx_fifo_size = 128, // 512 byte
  101. .host_perio_tx_fifo_size = 256, // 1024 byte
  102. #ifdef CONFIG_USB_HS
  103. .device_gccfg = 0,
  104. .host_gccfg = 0,
  105. #else
  106. .device_gccfg = ((1 << 16) | (1 << 21)), // fs: USB_OTG_GCCFG_PWRDWN | USB_OTG_GCCFG_NOVBUSSENS hs:0
  107. .host_gccfg = ((1 << 16) | (1 << 21)) // fs: USB_OTG_GCCFG_PWRDWN | USB_OTG_GCCFG_NOVBUSSENS hs:0
  108. #endif
  109. };
  110. #elif __has_include("stm32f4xx_hal.h")
  111. #include "stm32f4xx_hal.h"
  112. const struct dwc2_user_params param_pa11_pa12 = {
  113. .phy_type = DWC2_PHY_TYPE_PARAM_FS,
  114. .device_dma_enable = false,
  115. .device_dma_desc_enable = false,
  116. .device_rx_fifo_size = (320 - 16 - 16 - 16 - 16),
  117. .device_tx_fifo_size = {
  118. [0] = 16, // 64 byte
  119. [1] = 16, // 64 byte
  120. [2] = 16, // 64 byte
  121. [3] = 16, // 64 byte
  122. [4] = 0,
  123. [5] = 0,
  124. [6] = 0,
  125. [7] = 0,
  126. [8] = 0,
  127. [9] = 0,
  128. [10] = 0,
  129. [11] = 0,
  130. [12] = 0,
  131. [13] = 0,
  132. [14] = 0,
  133. [15] = 0 },
  134. #if defined(STM32F446xx) || defined(STM32F469xx) || defined(STM32F479xx) || \
  135. defined(STM32F412Zx) || defined(STM32F412Vx) || defined(STM32F412Rx) || defined(STM32F412Cx) || defined(STM32F413xx) || \
  136. defined(STM32F423xx)
  137. .device_gccfg = (1 << 16), // fs: USB_OTG_GCCFG_PWRDWN
  138. .b_session_valid_override = true,
  139. #else
  140. .device_gccfg = ((1 << 16) | (1 << 21)), // fs: USB_OTG_GCCFG_PWRDWN | USB_OTG_GCCFG_NOVBUSSENS
  141. #endif
  142. .total_fifo_size = 320 // 1280 byte
  143. };
  144. const struct dwc2_user_params param_pb14_pb15 = {
  145. #ifdef CONFIG_USB_HS
  146. .phy_type = DWC2_PHY_TYPE_PARAM_UTMI,
  147. #else
  148. .phy_type = DWC2_PHY_TYPE_PARAM_FS,
  149. #endif
  150. #ifdef CONFIG_USB_DWC2_DMA_ENABLE
  151. .device_dma_enable = true,
  152. #else
  153. .device_dma_enable = false,
  154. #endif
  155. .device_dma_desc_enable = false,
  156. .device_rx_fifo_size = (1006 - 16 - 256 - 128 - 128 - 128 - 128), // 1006/1012
  157. .device_tx_fifo_size = {
  158. [0] = 16, // 64 byte
  159. [1] = 256, // 1024 byte
  160. [2] = 128, // 512 byte
  161. [3] = 128, // 512 byte
  162. [4] = 128, // 512 byte
  163. [5] = 128, // 512 byte
  164. [6] = 0,
  165. [7] = 0,
  166. [8] = 0,
  167. [9] = 0,
  168. [10] = 0,
  169. [11] = 0,
  170. [12] = 0,
  171. [13] = 0,
  172. [14] = 0,
  173. [15] = 0 },
  174. .host_dma_desc_enable = false,
  175. .host_rx_fifo_size = 622,
  176. .host_nperio_tx_fifo_size = 128, // 512 byte
  177. .host_perio_tx_fifo_size = 256, // 1024 byte
  178. #ifdef CONFIG_USB_HS
  179. .device_gccfg = 0,
  180. .host_gccfg = 0,
  181. #else
  182. #if defined(STM32F446xx) || defined(STM32F469xx) || defined(STM32F479xx) || \
  183. defined(STM32F412Zx) || defined(STM32F412Vx) || defined(STM32F412Rx) || defined(STM32F412Cx) || defined(STM32F413xx) || \
  184. defined(STM32F423xx)
  185. .device_gccfg = (1 << 16), // fs: USB_OTG_GCCFG_PWRDWN
  186. .host_gccfg = (1 << 16), // fs: USB_OTG_GCCFG_PWRDWN
  187. .b_session_valid_override = true,
  188. #else
  189. .device_gccfg = ((1 << 16) | (1 << 21)), // fs: USB_OTG_GCCFG_PWRDWN | USB_OTG_GCCFG_NOVBUSSENS hs:0
  190. .host_gccfg = ((1 << 16) | (1 << 21)) // fs: USB_OTG_GCCFG_PWRDWN | USB_OTG_GCCFG_NOVBUSSENS hs:0
  191. #endif
  192. #endif
  193. };
  194. #elif __has_include("stm32f7xx_hal.h")
  195. #include "stm32f7xx_hal.h"
  196. const struct dwc2_user_params param_pa11_pa12 = {
  197. .phy_type = DWC2_PHY_TYPE_PARAM_FS,
  198. .device_dma_enable = false,
  199. .device_dma_desc_enable = false,
  200. .device_rx_fifo_size = (320 - 16 - 16 - 16 - 16),
  201. .device_tx_fifo_size = {
  202. [0] = 16, // 64 byte
  203. [1] = 16, // 64 byte
  204. [2] = 16, // 64 byte
  205. [3] = 16, // 64 byte
  206. [4] = 0,
  207. [5] = 0,
  208. [6] = 0,
  209. [7] = 0,
  210. [8] = 0,
  211. [9] = 0,
  212. [10] = 0,
  213. [11] = 0,
  214. [12] = 0,
  215. [13] = 0,
  216. [14] = 0,
  217. [15] = 0 },
  218. .device_gccfg = (1 << 16), // fs: USB_OTG_GCCFG_PWRDWN
  219. .host_gccfg = (1 << 16), // fs: USB_OTG_GCCFG_PWRDWN
  220. .b_session_valid_override = true,
  221. .total_fifo_size = 320 // 1280 byte
  222. };
  223. const struct dwc2_user_params param_pb14_pb15 = {
  224. #if defined(STM32F722xx) || defined(STM32F723xx) || defined(STM32F730xx) || defined(STM32F732xx) || defined(STM32F733xx)
  225. .phy_type = DWC2_PHY_TYPE_PARAM_UTMI,
  226. #else
  227. .phy_type = DWC2_PHY_TYPE_PARAM_FS,
  228. #endif
  229. #ifdef CONFIG_USB_DWC2_DMA_ENABLE
  230. .device_dma_enable = true,
  231. #else
  232. .device_dma_enable = false,
  233. #endif
  234. .device_dma_desc_enable = false,
  235. .device_rx_fifo_size = (1006 - 16 - 256 - 128 - 128 - 128 - 128),
  236. .device_tx_fifo_size = {
  237. [0] = 16, // 64 byte
  238. [1] = 256, // 1024 byte
  239. [2] = 128, // 512 byte
  240. [3] = 128, // 512 byte
  241. [4] = 128, // 512 byte
  242. [5] = 128, // 512 byte
  243. [6] = 0,
  244. [7] = 0,
  245. [8] = 0,
  246. [9] = 0,
  247. [10] = 0,
  248. [11] = 0,
  249. [12] = 0,
  250. [13] = 0,
  251. [14] = 0,
  252. [15] = 0 },
  253. .host_dma_desc_enable = false,
  254. .host_rx_fifo_size = 622,
  255. .host_nperio_tx_fifo_size = 128, // 512 byte
  256. .host_perio_tx_fifo_size = 256, // 1024 byte
  257. #if defined(STM32F722xx) || defined(STM32F723xx) || defined(STM32F730xx) || defined(STM32F732xx) || defined(STM32F733xx)
  258. .device_gccfg = (1 << 23), // USB_OTG_GCCFG_PHYHSEN
  259. .host_gccfg = (1 << 23), // USB_OTG_GCCFG_PHYHSEN
  260. #else
  261. #ifdef CONFIG_USB_HS
  262. .device_gccfg = 0,
  263. .host_gccfg = 0,
  264. #else
  265. .device_gccfg = (1 << 16), // fs: USB_OTG_GCCFG_PWRDWN hs:0
  266. .host_gccfg = (1 << 16), // fs: USB_OTG_GCCFG_PWRDWN hs:0
  267. #endif
  268. #endif
  269. .b_session_valid_override = true
  270. };
  271. #elif __has_include("stm32h7xx_hal.h")
  272. #include "stm32h7xx_hal.h"
  273. const struct dwc2_user_params param_pa11_pa12 = {
  274. .phy_type = DWC2_PHY_TYPE_PARAM_FS, // DWC2_PHY_TYPE_PARAM_UTMI
  275. #ifdef CONFIG_USB_DWC2_DMA_ENABLE
  276. .device_dma_enable = true,
  277. #else
  278. .device_dma_enable = false,
  279. #endif
  280. .device_dma_desc_enable = false,
  281. .device_rx_fifo_size = (952 - 16 - 256 - 128 - 128 - 128 - 128),
  282. .device_tx_fifo_size = {
  283. [0] = 16, // 64 byte
  284. [1] = 256, // 1024 byte
  285. [2] = 128, // 512 byte
  286. [3] = 128, // 512 byte
  287. [4] = 128, // 512 byte
  288. [5] = 128, // 512 byte
  289. [6] = 0,
  290. [7] = 0,
  291. [8] = 0,
  292. [9] = 0,
  293. [10] = 0,
  294. [11] = 0,
  295. [12] = 0,
  296. [13] = 0,
  297. [14] = 0,
  298. [15] = 0 },
  299. .host_dma_desc_enable = false,
  300. .host_rx_fifo_size = 568,
  301. .host_nperio_tx_fifo_size = 128, // 512 byte
  302. .host_perio_tx_fifo_size = 256, // 1024 byte
  303. .device_gccfg = (1 << 16), // fs: USB_OTG_GCCFG_PWRDWN hs:0
  304. .host_gccfg = (1 << 16), // fs: USB_OTG_GCCFG_PWRDWN hs:0
  305. .b_session_valid_override = true
  306. };
  307. const struct dwc2_user_params param_pb14_pb15 = {
  308. #ifdef CONFIG_USB_HS
  309. .phy_type = DWC2_PHY_TYPE_PARAM_UTMI,
  310. #else
  311. .phy_type = DWC2_PHY_TYPE_PARAM_FS,
  312. #endif
  313. #ifdef CONFIG_USB_DWC2_DMA_ENABLE
  314. .device_dma_enable = true,
  315. #else
  316. .device_dma_enable = false,
  317. #endif
  318. .device_dma_desc_enable = false,
  319. .device_rx_fifo_size = (952 - 16 - 256 - 128 - 128 - 128 - 128),
  320. .device_tx_fifo_size = {
  321. [0] = 16, // 64 byte
  322. [1] = 256, // 1024 byte
  323. [2] = 128, // 512 byte
  324. [3] = 128, // 512 byte
  325. [4] = 128, // 512 byte
  326. [5] = 128, // 512 byte
  327. [6] = 0,
  328. [7] = 0,
  329. [8] = 0,
  330. [9] = 0,
  331. [10] = 0,
  332. [11] = 0,
  333. [12] = 0,
  334. [13] = 0,
  335. [14] = 0,
  336. [15] = 0 },
  337. .host_dma_desc_enable = false,
  338. .host_rx_fifo_size = 568,
  339. .host_nperio_tx_fifo_size = 128, // 512 byte
  340. .host_perio_tx_fifo_size = 256, // 1024 byte
  341. #ifdef CONFIG_USB_HS
  342. .device_gccfg = 0,
  343. .host_gccfg = 0,
  344. #else
  345. .device_gccfg = (1 << 16), // fs: USB_OTG_GCCFG_PWRDWN hs:0
  346. .host_gccfg = (1 << 16), // fs: USB_OTG_GCCFG_PWRDWN hs:0
  347. #endif
  348. .b_session_valid_override = true
  349. };
  350. #elif __has_include("stm32h7rsxx_hal.h")
  351. #include "stm32h7rsxx_hal.h"
  352. const struct dwc2_user_params param_pa11_pa12 = {
  353. .phy_type = DWC2_PHY_TYPE_PARAM_FS,
  354. .device_dma_enable = false,
  355. .device_dma_desc_enable = false,
  356. .device_rx_fifo_size = (320 - 16 - 16 - 16 - 16),
  357. .device_tx_fifo_size = {
  358. [0] = 16, // 64 byte
  359. [1] = 16, // 64 byte
  360. [2] = 16, // 64 byte
  361. [3] = 16, // 64 byte
  362. [4] = 0,
  363. [5] = 0,
  364. [6] = 0,
  365. [7] = 0,
  366. [8] = 0,
  367. [9] = 0,
  368. [10] = 0,
  369. [11] = 0,
  370. [12] = 0,
  371. [13] = 0,
  372. [14] = 0,
  373. [15] = 0 },
  374. .device_gccfg = (1 << 16), // fs: USB_OTG_GCCFG_PWRDWN
  375. .b_session_valid_override = true,
  376. .total_fifo_size = 320 // 1280 byte
  377. };
  378. const struct dwc2_user_params param_pb14_pb15 = {
  379. .phy_type = DWC2_PHY_TYPE_PARAM_UTMI,
  380. #ifdef CONFIG_USB_DWC2_DMA_ENABLE
  381. .device_dma_enable = true,
  382. #else
  383. .device_dma_enable = false,
  384. #endif
  385. .device_dma_desc_enable = false,
  386. .device_rx_fifo_size = (952 - 16 - 256 - 128 - 128 - 128 - 128),
  387. .device_tx_fifo_size = {
  388. [0] = 16, // 64 byte
  389. [1] = 256, // 1024 byte
  390. [2] = 128, // 512 byte
  391. [3] = 128, // 512 byte
  392. [4] = 128, // 512 byte
  393. [5] = 128, // 512 byte
  394. [6] = 0,
  395. [7] = 0,
  396. [8] = 0,
  397. [9] = 0,
  398. [10] = 0,
  399. [11] = 0,
  400. [12] = 0,
  401. [13] = 0,
  402. [14] = 0,
  403. [15] = 0 },
  404. .host_dma_desc_enable = false,
  405. .host_rx_fifo_size = 568,
  406. .host_nperio_tx_fifo_size = 128, // 512 byte
  407. .host_perio_tx_fifo_size = 256, // 1024 byte
  408. .device_gccfg = ((1 << 23) | (1 << 24)), // hs: USB_OTG_GCCFG_VBVALEXTOEN | USB_OTG_GCCFG_VBVALOVAL
  409. .host_gccfg = (1 << 25) // hs: USB_OTG_GCCFG_PULLDOWNEN
  410. };
  411. #elif __has_include("stm32l4xx_hal.h")
  412. #include "stm32l4xx_hal.h"
  413. const struct dwc2_user_params param_pa11_pa12 = {
  414. .phy_type = DWC2_PHY_TYPE_PARAM_FS,
  415. .device_dma_enable = false,
  416. .device_dma_desc_enable = false,
  417. .device_rx_fifo_size = (320 - 16 - 16 - 16 - 16),
  418. .device_tx_fifo_size = {
  419. [0] = 16, // 64 byte
  420. [1] = 16, // 64 byte
  421. [2] = 16, // 64 byte
  422. [3] = 16, // 64 byte
  423. [4] = 0,
  424. [5] = 0,
  425. [6] = 0,
  426. [7] = 0,
  427. [8] = 0,
  428. [9] = 0,
  429. [10] = 0,
  430. [11] = 0,
  431. [12] = 0,
  432. [13] = 0,
  433. [14] = 0,
  434. [15] = 0 },
  435. .device_gccfg = (1 << 16),
  436. .b_session_valid_override = true,
  437. .total_fifo_size = 320 // 1280 byte
  438. };
  439. const struct dwc2_user_params param_pb14_pb15 = { 0 }; // do not support
  440. #if defined(HAL_HCD_MODULE_ENABLED)
  441. #error "HAL_HCD_MODULE_ENABLED is not supported for STM32L4xx, please use HAL_PCD_MODULE_ENABLED"
  442. #endif
  443. #elif __has_include("stm32u5xx_hal.h")
  444. #include "stm32u5xx_hal.h"
  445. const struct dwc2_user_params param_pa11_pa12 = {
  446. .phy_type = DWC2_PHY_TYPE_PARAM_FS,
  447. .device_dma_enable = false,
  448. .device_dma_desc_enable = false,
  449. .device_rx_fifo_size = (320 - 16 - 16 - 16 - 16),
  450. .device_tx_fifo_size = {
  451. [0] = 16, // 64 byte
  452. [1] = 16, // 64 byte
  453. [2] = 16, // 64 byte
  454. [3] = 16, // 64 byte
  455. [4] = 0,
  456. [5] = 0,
  457. [6] = 0,
  458. [7] = 0,
  459. [8] = 0,
  460. [9] = 0,
  461. [10] = 0,
  462. [11] = 0,
  463. [12] = 0,
  464. [13] = 0,
  465. [14] = 0,
  466. [15] = 0 },
  467. .device_gccfg = (1 << 16),
  468. .b_session_valid_override = true,
  469. .total_fifo_size = 320 // 1280 byte
  470. };
  471. #if defined(STM32U595xx) || defined(STM32U5A5xx) || defined(STM32U599xx) || defined(STM32U5A9xx) || \
  472. defined(STM32U5F7xx) || defined(STM32U5G7xx) || defined(STM32U5F9xx) || defined(STM32U5G9xx)
  473. const struct dwc2_user_params param_pb14_pb15 = {
  474. .phy_type = DWC2_PHY_TYPE_PARAM_UTMI,
  475. #ifdef CONFIG_USB_DWC2_DMA_ENABLE
  476. .device_dma_enable = true,
  477. #else
  478. .device_dma_enable = false,
  479. #endif
  480. .device_dma_desc_enable = false,
  481. .device_rx_fifo_size = (952 - 16 - 256 - 128 - 128 - 128 - 128),
  482. .device_tx_fifo_size = {
  483. [0] = 16, // 64 byte
  484. [1] = 256, // 1024 byte
  485. [2] = 128, // 512 byte
  486. [3] = 128, // 512 byte
  487. [4] = 128, // 512 byte
  488. [5] = 128, // 512 byte
  489. [6] = 0,
  490. [7] = 0,
  491. [8] = 0,
  492. [9] = 0,
  493. [10] = 0,
  494. [11] = 0,
  495. [12] = 0,
  496. [13] = 0,
  497. [14] = 0,
  498. [15] = 0 },
  499. .host_dma_desc_enable = false,
  500. .host_rx_fifo_size = 568,
  501. .host_nperio_tx_fifo_size = 128, // 512 byte
  502. .host_perio_tx_fifo_size = 256, // 1024 byte
  503. .device_gccfg = ((1 << 23) | (1 << 24)), // hs: USB_OTG_GCCFG_VBVALEXTOEN | USB_OTG_GCCFG_VBVALOVAL
  504. .host_gccfg = (1 << 25) // hs: USB_OTG_GCCFG_PULLDOWNEN
  505. };
  506. #else
  507. const struct dwc2_user_params param_pb14_pb15 = { 0 }; // do not support
  508. #endif
  509. #endif
  510. #endif // CONFIG_USB_DWC2_CUSTOM_PARAM
  511. #if !defined(HAL_HCD_MODULE_ENABLED) && !defined(HAL_PCD_MODULE_ENABLED)
  512. #error please define HAL_HCD_MODULE_ENABLED or HAL_PCD_MODULE_ENABLED in stm32xxx_hal_conf.h
  513. #endif
  514. typedef void (*usb_dwc2_irq)(uint8_t busid);
  515. struct dwc2_instance {
  516. USB_OTG_GlobalTypeDef *Instance;
  517. };
  518. static usb_dwc2_irq g_usb_dwc2_irq[2];
  519. static uint8_t g_usb_dwc2_busid[2] = { 0, 0 };
  520. static struct dwc2_instance g_dwc2_instance;
  521. #if defined(STM32F722xx) || defined(STM32F723xx) || defined(STM32F730xx) || defined(STM32F732xx) || defined(STM32F733xx)
  522. /**
  523. * @brief Enables control of a High Speed USB PHY
  524. * Init the low level hardware : GPIO, CLOCK, NVIC...
  525. * @param USBx Selected device
  526. * @retval HAL status
  527. */
  528. static int usb_hsphy_init(uint32_t hse_value)
  529. {
  530. __IO uint32_t count = 0U;
  531. /* Enable LDO */
  532. USB_HS_PHYC->USB_HS_PHYC_LDO |= USB_HS_PHYC_LDO_ENABLE;
  533. /* wait for LDO Ready */
  534. while ((USB_HS_PHYC->USB_HS_PHYC_LDO & USB_HS_PHYC_LDO_STATUS) == 0U) {
  535. count++;
  536. if (count > 200000U) {
  537. return -1;
  538. }
  539. }
  540. /* Controls PHY frequency operation selection */
  541. if (hse_value == 12000000U) /* HSE = 12MHz */
  542. {
  543. USB_HS_PHYC->USB_HS_PHYC_PLL = (0x0U << 1);
  544. } else if (hse_value == 12500000U) /* HSE = 12.5MHz */
  545. {
  546. USB_HS_PHYC->USB_HS_PHYC_PLL = (0x2U << 1);
  547. } else if (hse_value == 16000000U) /* HSE = 16MHz */
  548. {
  549. USB_HS_PHYC->USB_HS_PHYC_PLL = (0x3U << 1);
  550. } else if (hse_value == 24000000U) /* HSE = 24MHz */
  551. {
  552. USB_HS_PHYC->USB_HS_PHYC_PLL = (0x4U << 1);
  553. } else if (hse_value == 25000000U) /* HSE = 25MHz */
  554. {
  555. USB_HS_PHYC->USB_HS_PHYC_PLL = (0x5U << 1);
  556. } else if (hse_value == 32000000U) /* HSE = 32MHz */
  557. {
  558. USB_HS_PHYC->USB_HS_PHYC_PLL = (0x7U << 1);
  559. } else {
  560. /* ... */
  561. }
  562. /* Control the tuning interface of the High Speed PHY */
  563. USB_HS_PHYC->USB_HS_PHYC_TUNE |= USB_HS_PHYC_TUNE_VALUE;
  564. /* Enable PLL internal PHY */
  565. USB_HS_PHYC->USB_HS_PHYC_PLL |= USB_HS_PHYC_PLL_PLLEN;
  566. /* 2ms Delay required to get internal phy clock stable */
  567. HAL_Delay(2U);
  568. return 0;
  569. }
  570. #endif
  571. #ifdef HAL_PCD_MODULE_ENABLED
  572. void usb_dc_low_level_init(uint8_t busid)
  573. {
  574. if (g_usbdev_bus[busid].reg_base == 0x40040000UL) { // USB_OTG_HS_PERIPH_BASE
  575. g_usb_dwc2_busid[1] = busid;
  576. g_usb_dwc2_irq[1] = USBD_IRQHandler;
  577. } else {
  578. g_usb_dwc2_busid[0] = busid;
  579. g_usb_dwc2_irq[0] = USBD_IRQHandler;
  580. }
  581. g_dwc2_instance.Instance = (USB_OTG_GlobalTypeDef *)g_usbdev_bus[busid].reg_base;
  582. HAL_PCD_MspInit((PCD_HandleTypeDef *)&g_dwc2_instance);
  583. #if defined(STM32F722xx) || defined(STM32F723xx) || defined(STM32F730xx) || defined(STM32F732xx) || defined(STM32F733xx)
  584. usb_hsphy_init(25000000U);
  585. #endif
  586. }
  587. void usb_dc_low_level_deinit(uint8_t busid)
  588. {
  589. if (g_usbdev_bus[busid].reg_base == 0x40040000UL) { // USB_OTG_HS_PERIPH_BASE
  590. g_usb_dwc2_busid[1] = 0;
  591. g_usb_dwc2_irq[1] = NULL;
  592. } else {
  593. g_usb_dwc2_busid[0] = 0;
  594. g_usb_dwc2_irq[0] = NULL;
  595. }
  596. g_dwc2_instance.Instance = (USB_OTG_GlobalTypeDef *)g_usbdev_bus[busid].reg_base;
  597. HAL_PCD_MspDeInit((PCD_HandleTypeDef *)&g_dwc2_instance);
  598. }
  599. #endif
  600. #ifdef HAL_HCD_MODULE_ENABLED
  601. void usb_hc_low_level_init(struct usbh_bus *bus)
  602. {
  603. if (bus->hcd.reg_base == 0x40040000UL) { // USB_OTG_HS_PERIPH_BASE
  604. g_usb_dwc2_busid[1] = bus->hcd.hcd_id;
  605. g_usb_dwc2_irq[1] = USBH_IRQHandler;
  606. } else {
  607. g_usb_dwc2_busid[0] = bus->hcd.hcd_id;
  608. g_usb_dwc2_irq[0] = USBH_IRQHandler;
  609. }
  610. g_dwc2_instance.Instance = (USB_OTG_GlobalTypeDef *)bus->hcd.reg_base;
  611. HAL_HCD_MspInit((HCD_HandleTypeDef *)&g_dwc2_instance);
  612. #if defined(STM32F722xx) || defined(STM32F723xx) || defined(STM32F730xx) || defined(STM32F732xx) || defined(STM32F733xx)
  613. usb_hsphy_init(25000000U);
  614. #endif
  615. }
  616. void usb_hc_low_level_deinit(struct usbh_bus *bus)
  617. {
  618. if (bus->hcd.reg_base == 0x40040000UL) { // USB_OTG_HS_PERIPH_BASE
  619. g_usb_dwc2_busid[1] = 0;
  620. g_usb_dwc2_irq[1] = NULL;
  621. } else {
  622. g_usb_dwc2_busid[0] = 0;
  623. g_usb_dwc2_irq[0] = NULL;
  624. }
  625. g_dwc2_instance.Instance = (USB_OTG_GlobalTypeDef *)bus->hcd.reg_base;
  626. HAL_HCD_MspDeInit((HCD_HandleTypeDef *)&g_dwc2_instance);
  627. }
  628. #endif
  629. #ifndef CONFIG_USB_DWC2_CUSTOM_PARAM
  630. void dwc2_get_user_params(uint32_t reg_base, struct dwc2_user_params *params)
  631. {
  632. if (reg_base == 0x40040000UL) { // USB_OTG_HS_PERIPH_BASE
  633. memcpy(params, &param_pb14_pb15, sizeof(struct dwc2_user_params));
  634. } else {
  635. memcpy(params, &param_pa11_pa12, sizeof(struct dwc2_user_params));
  636. }
  637. #ifdef CONFIG_USB_DWC2_CUSTOM_FIFO
  638. struct usb_dwc2_user_fifo_config s_dwc2_fifo_config;
  639. dwc2_get_user_fifo_config(reg_base, &s_dwc2_fifo_config);
  640. params->device_rx_fifo_size = s_dwc2_fifo_config.device_rx_fifo_size;
  641. for (uint8_t i = 0; i < MAX_EPS_CHANNELS; i++)
  642. {
  643. params->device_tx_fifo_size[i] = s_dwc2_fifo_config.device_tx_fifo_size[i];
  644. }
  645. #endif
  646. }
  647. #endif
  648. extern uint32_t SystemCoreClock;
  649. void usbd_dwc2_delay_ms(uint8_t ms)
  650. {
  651. uint32_t count = SystemCoreClock / 1000 * ms;
  652. while (count--) {
  653. __asm volatile("nop");
  654. }
  655. }
  656. void OTG_FS_IRQHandler(void)
  657. {
  658. g_usb_dwc2_irq[0](g_usb_dwc2_busid[0]);
  659. }
  660. void OTG_HS_IRQHandler(void)
  661. {
  662. g_usb_dwc2_irq[1](g_usb_dwc2_busid[1]);
  663. }
  664. #ifdef CONFIG_USB_DCACHE_ENABLE
  665. void usb_dcache_clean(uintptr_t addr, size_t size)
  666. {
  667. SCB_CleanDCache_by_Addr((void *)addr, size);
  668. }
  669. void usb_dcache_invalidate(uintptr_t addr, size_t size)
  670. {
  671. SCB_InvalidateDCache_by_Addr((void *)addr, size);
  672. }
  673. void usb_dcache_flush(uintptr_t addr, size_t size)
  674. {
  675. SCB_CleanInvalidateDCache_by_Addr((void *)addr, size);
  676. }
  677. #endif