cherryusb_port.c 8.6 KB

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