usb_glue_hc.c 8.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303
  1. /*
  2. * Copyright (c) 2022-2024, Xiaohua Semiconductor Co., Ltd.
  3. *
  4. * SPDX-License-Identifier: Apache-2.0
  5. *
  6. * Change Logs:
  7. * Date Author Notes
  8. * 2025-08-08 CDT first version
  9. */
  10. #include "usbd_core.h"
  11. #include "usbh_core.h"
  12. #include "usb_dwc2_param.h"
  13. #include "board_config.h"
  14. #if defined(RT_CHERRYUSB_HOST) && defined(RT_CHERRYUSB_DEVICE)
  15. #if defined(HC32F460) || defined(HC32F472)
  16. #error "Only one USB role can be selected!"
  17. #endif
  18. #endif
  19. const struct dwc2_user_params param_fs_core =
  20. {
  21. .phy_type = DWC2_PHY_TYPE_PARAM_FS,
  22. #ifdef CONFIG_USB_DWC2_DMA_ENABLE
  23. .device_dma_enable = true,
  24. #else
  25. .device_dma_enable = false,
  26. #endif
  27. .device_dma_desc_enable = false,
  28. .device_rx_fifo_size = CONFIG_USB_FS_CORE_DEVICE_RX_FIFO_SIZE,
  29. .device_tx_fifo_size = {
  30. [0] = CONFIG_USB_FS_CORE_DEVICE_TX0_FIFO_SIZE,
  31. [1] = CONFIG_USB_FS_CORE_DEVICE_TX1_FIFO_SIZE,
  32. [2] = CONFIG_USB_FS_CORE_DEVICE_TX2_FIFO_SIZE,
  33. [3] = CONFIG_USB_FS_CORE_DEVICE_TX3_FIFO_SIZE,
  34. [4] = CONFIG_USB_FS_CORE_DEVICE_TX4_FIFO_SIZE,
  35. [5] = CONFIG_USB_FS_CORE_DEVICE_TX5_FIFO_SIZE,
  36. #if defined(HC32F4A0) || defined(HC32F4A8)
  37. [6] = CONFIG_USB_FS_CORE_DEVICE_TX6_FIFO_SIZE,
  38. [7] = CONFIG_USB_FS_CORE_DEVICE_TX7_FIFO_SIZE,
  39. [8] = CONFIG_USB_FS_CORE_DEVICE_TX8_FIFO_SIZE,
  40. [9] = CONFIG_USB_FS_CORE_DEVICE_TX9_FIFO_SIZE,
  41. [10] = CONFIG_USB_FS_CORE_DEVICE_TX10_FIFO_SIZE,
  42. [11] = CONFIG_USB_FS_CORE_DEVICE_TX11_FIFO_SIZE,
  43. [12] = CONFIG_USB_FS_CORE_DEVICE_TX12_FIFO_SIZE,
  44. [13] = CONFIG_USB_FS_CORE_DEVICE_TX13_FIFO_SIZE,
  45. [14] = CONFIG_USB_FS_CORE_DEVICE_TX14_FIFO_SIZE,
  46. [15] = CONFIG_USB_FS_CORE_DEVICE_TX15_FIFO_SIZE
  47. #elif defined(HC32F460) || defined(HC32F472)
  48. [6] = 0,
  49. [7] = 0,
  50. [8] = 0,
  51. [9] = 0,
  52. [10] = 0,
  53. [11] = 0,
  54. [12] = 0,
  55. [13] = 0,
  56. [14] = 0,
  57. [15] = 0
  58. #endif
  59. },
  60. .total_fifo_size = CONFIG_USB_FS_CORE_TOTAL_FIFO_SIZE,
  61. .host_dma_desc_enable = false,
  62. .host_rx_fifo_size = CONFIG_USB_FS_CORE_HOST_RX_FIFO_SIZE,
  63. .host_nperio_tx_fifo_size = CONFIG_USB_FS_CORE_HOST_NP_FIFO_SIZE,
  64. .host_perio_tx_fifo_size = CONFIG_USB_FS_CORE_HOST_PE_FIFO_SIZE,
  65. .device_gccfg = 0,
  66. .host_gccfg = 0,
  67. #if defined(HC32F4A0) || defined(HC32F4A8) || defined(HC32F460)
  68. .b_session_valid_override = false,
  69. #elif defined(HC32F472)
  70. .b_session_valid_override = true,
  71. #endif
  72. };
  73. #if defined(HC32F4A0) || defined(HC32F4A8)
  74. const struct dwc2_user_params param_hs_core =
  75. {
  76. #ifdef CONFIG_USB_HS
  77. .phy_type = DWC2_PHY_TYPE_PARAM_UTMI,
  78. #else
  79. .phy_type = DWC2_PHY_TYPE_PARAM_FS,
  80. #endif
  81. #ifdef CONFIG_USB_DWC2_DMA_ENABLE
  82. .device_dma_enable = true,
  83. #else
  84. .device_dma_enable = false,
  85. #endif
  86. .device_dma_desc_enable = false,
  87. .device_rx_fifo_size = CONFIG_USB_HS_CORE_DEVICE_RX_FIFO_SIZE,
  88. .device_tx_fifo_size = {
  89. [0] = CONFIG_USB_HS_CORE_DEVICE_TX0_FIFO_SIZE,
  90. [1] = CONFIG_USB_HS_CORE_DEVICE_TX1_FIFO_SIZE,
  91. [2] = CONFIG_USB_HS_CORE_DEVICE_TX2_FIFO_SIZE,
  92. [3] = CONFIG_USB_HS_CORE_DEVICE_TX3_FIFO_SIZE,
  93. [4] = CONFIG_USB_HS_CORE_DEVICE_TX4_FIFO_SIZE,
  94. [5] = CONFIG_USB_HS_CORE_DEVICE_TX5_FIFO_SIZE,
  95. [6] = CONFIG_USB_HS_CORE_DEVICE_TX6_FIFO_SIZE,
  96. [7] = CONFIG_USB_HS_CORE_DEVICE_TX7_FIFO_SIZE,
  97. [8] = CONFIG_USB_HS_CORE_DEVICE_TX8_FIFO_SIZE,
  98. [9] = CONFIG_USB_HS_CORE_DEVICE_TX9_FIFO_SIZE,
  99. [10] = CONFIG_USB_HS_CORE_DEVICE_TX10_FIFO_SIZE,
  100. [11] = CONFIG_USB_HS_CORE_DEVICE_TX11_FIFO_SIZE,
  101. [12] = CONFIG_USB_HS_CORE_DEVICE_TX12_FIFO_SIZE,
  102. [13] = CONFIG_USB_HS_CORE_DEVICE_TX13_FIFO_SIZE,
  103. [14] = CONFIG_USB_HS_CORE_DEVICE_TX14_FIFO_SIZE,
  104. [15] = CONFIG_USB_HS_CORE_DEVICE_TX15_FIFO_SIZE
  105. },
  106. .total_fifo_size = CONFIG_USB_HS_CORE_TOTAL_FIFO_SIZE,
  107. .host_dma_desc_enable = false,
  108. .host_rx_fifo_size = CONFIG_USB_HS_CORE_HOST_RX_FIFO_SIZE,
  109. .host_nperio_tx_fifo_size = CONFIG_USB_HS_CORE_HOST_NP_FIFO_SIZE,
  110. .host_perio_tx_fifo_size = CONFIG_USB_HS_CORE_HOST_PE_FIFO_SIZE,
  111. .device_gccfg = 0,
  112. .host_gccfg = 0,
  113. .b_session_valid_override = false,
  114. };
  115. #endif
  116. #ifndef CONFIG_USB_DWC2_CUSTOM_PARAM
  117. void dwc2_get_user_params(uint32_t reg_base, struct dwc2_user_params *params)
  118. {
  119. #if defined(HC32F4A0) || defined(HC32F4A8)
  120. if (reg_base == CM_USBHS_BASE)
  121. {
  122. memcpy(params, &param_hs_core, sizeof(struct dwc2_user_params));
  123. }
  124. else
  125. #endif
  126. {
  127. memcpy(params, &param_fs_core, sizeof(struct dwc2_user_params));
  128. }
  129. #ifdef CONFIG_USB_DWC2_CUSTOM_FIFO
  130. struct usb_dwc2_user_fifo_config s_dwc2_fifo_config;
  131. dwc2_get_user_fifo_config(reg_base, &s_dwc2_fifo_config);
  132. params->device_rx_fifo_size = s_dwc2_fifo_config.device_rx_fifo_size;
  133. for (uint8_t i = 0; i < MAX_EPS_CHANNELS; i++)
  134. {
  135. params->device_tx_fifo_size[i] = s_dwc2_fifo_config.device_tx_fifo_size[i];
  136. }
  137. #endif
  138. }
  139. #endif
  140. #define BOARD_INIT_USB_HOST_MODE (0U)
  141. #define BOARD_INIT_USB_DEVICE_MODE (1U)
  142. extern rt_err_t rt_hw_usbfs_board_init(uint8_t devmode);
  143. static uint8_t g_usb_fs_busid = 0U;
  144. #if defined(HC32F4A0) || defined(HC32F4A8)
  145. extern rt_err_t rt_hw_usbhs_board_init(uint8_t devmode);
  146. static uint8_t g_usb_hs_busid = 0U;
  147. #endif
  148. #if defined(RT_CHERRYUSB_HOST)
  149. static void usbh_fs_irq_handler(void)
  150. {
  151. USBH_IRQHandler(g_usb_fs_busid);
  152. }
  153. #if defined(HC32F4A0) || defined(HC32F4A8)
  154. static void usbh_hs_irq_handler(void)
  155. {
  156. USBH_IRQHandler(g_usb_hs_busid);
  157. }
  158. #endif
  159. #if defined(HC32F472)
  160. void USBFS_Handler(void)
  161. {
  162. usbh_fs_irq_handler();
  163. }
  164. #endif
  165. void usb_hc_low_level_init(struct usbh_bus *bus)
  166. {
  167. struct hc32_irq_config irq_config;
  168. #if defined(HC32F4A0) || defined(HC32F4A8)
  169. if (bus->hcd.reg_base == CM_USBHS_BASE)
  170. {
  171. g_usb_hs_busid = bus->hcd.hcd_id;
  172. rt_hw_usbhs_board_init(BOARD_INIT_USB_HOST_MODE);
  173. FCG_Fcg1PeriphClockCmd(FCG1_PERIPH_USBHS, ENABLE);
  174. #ifndef CONFIG_USB_HS
  175. /* enable the embedded PHY in USBHS mode */
  176. CM_PERIC->USB_SYCTLREG |= PERIC_USB_SYCTLREG_USBHS_FSPHYE;
  177. #endif
  178. irq_config.irq_num = BSP_USBHS_GLB_IRQ_NUM;
  179. irq_config.int_src = INT_SRC_USBHS_GLB;
  180. irq_config.irq_prio = BSP_USBHS_GLB_IRQ_PRIO;
  181. /* register interrupt */
  182. hc32_install_irq_handler(&irq_config,
  183. usbh_hs_irq_handler,
  184. RT_TRUE);
  185. }
  186. else
  187. #endif
  188. {
  189. g_usb_fs_busid = bus->hcd.hcd_id;
  190. rt_hw_usbfs_board_init(BOARD_INIT_USB_HOST_MODE);
  191. FCG_Fcg1PeriphClockCmd(FCG1_PERIPH_USBFS, ENABLE);
  192. irq_config.irq_num = BSP_USBFS_GLB_IRQ_NUM;
  193. irq_config.int_src = INT_SRC_USBFS_GLB;
  194. irq_config.irq_prio = BSP_USBFS_GLB_IRQ_PRIO;
  195. /* register interrupt */
  196. hc32_install_irq_handler(&irq_config,
  197. usbh_fs_irq_handler,
  198. RT_TRUE);
  199. }
  200. }
  201. #endif
  202. #if defined(RT_CHERRYUSB_DEVICE)
  203. static void usbd_fs_irq_handler(void)
  204. {
  205. USBD_IRQHandler(g_usb_fs_busid);
  206. }
  207. #if defined(HC32F4A0) || defined(HC32F4A8)
  208. static void usbd_hs_irq_handler(void)
  209. {
  210. USBD_IRQHandler(g_usb_hs_busid);
  211. }
  212. #endif
  213. #if defined(HC32F472)
  214. void USBFS_Handler(void)
  215. {
  216. usbd_fs_irq_handler();
  217. }
  218. #endif
  219. void usb_dc_low_level_init(uint8_t busid)
  220. {
  221. struct hc32_irq_config irq_config;
  222. #if defined(HC32F4A0) || defined(HC32F4A8)
  223. if (g_usbdev_bus[busid].reg_base == CM_USBHS_BASE)
  224. {
  225. g_usb_hs_busid = busid;
  226. rt_hw_usbhs_board_init(BOARD_INIT_USB_DEVICE_MODE);
  227. FCG_Fcg1PeriphClockCmd(FCG1_PERIPH_USBHS, ENABLE);
  228. #ifndef CONFIG_USB_HS
  229. /* enable the embedded PHY in USBHS mode */
  230. CM_PERIC->USB_SYCTLREG |= PERIC_USB_SYCTLREG_USBHS_FSPHYE;
  231. #endif
  232. irq_config.irq_num = BSP_USBHS_GLB_IRQ_NUM;
  233. irq_config.int_src = INT_SRC_USBHS_GLB;
  234. irq_config.irq_prio = BSP_USBHS_GLB_IRQ_PRIO;
  235. /* register interrupt */
  236. hc32_install_irq_handler(&irq_config,
  237. usbd_hs_irq_handler,
  238. RT_TRUE);
  239. }
  240. else
  241. #endif
  242. {
  243. g_usb_fs_busid = busid;
  244. rt_hw_usbfs_board_init(BOARD_INIT_USB_DEVICE_MODE);
  245. FCG_Fcg1PeriphClockCmd(FCG1_PERIPH_USBFS, ENABLE);
  246. irq_config.irq_num = BSP_USBFS_GLB_IRQ_NUM;
  247. irq_config.int_src = INT_SRC_USBFS_GLB;
  248. irq_config.irq_prio = BSP_USBFS_GLB_IRQ_PRIO;
  249. /* register interrupt */
  250. hc32_install_irq_handler(&irq_config,
  251. usbd_fs_irq_handler,
  252. RT_TRUE);
  253. }
  254. }
  255. void usb_dc_low_level_deinit(uint8_t busid)
  256. {
  257. (void)busid;
  258. /* reserved */
  259. }
  260. #endif
  261. extern uint32_t SystemCoreClock;
  262. void usbd_dwc2_delay_ms(uint8_t ms)
  263. {
  264. uint32_t count = SystemCoreClock / 1000 * ms;
  265. while (count--) {
  266. __asm volatile("nop");
  267. }
  268. }