usb_glue_nation.c 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193
  1. /*
  2. * Copyright (c) 2025, sakumisu
  3. *
  4. * SPDX-License-Identifier: Apache-2.0
  5. */
  6. #include "usbd_core.h"
  7. #include "usbh_core.h"
  8. __WEAK void USBD_IRQHandler(uint8_t busid)
  9. {
  10. }
  11. __WEAK void USBH_IRQHandler(uint8_t busid)
  12. {
  13. }
  14. #if defined(N32H473) || defined(N32H474) || defined(N32H475) || defined(N32H482) || defined(N32H487)
  15. #include "n32h47x_48x_rcc.h"
  16. #include "n32h47x_48x_gpio.h"
  17. #include "n32h47x_48x_exti.h"
  18. #include "misc.h"
  19. typedef void (*usb_dwc2_irq)(uint8_t busid);
  20. static usb_dwc2_irq g_usb_dwc2_irq;
  21. static volatile uint8_t g_usb_dwc2_busid = 0;
  22. static void usbhs_common_init(void)
  23. {
  24. RCC_EnableAHB1PeriphClk(RCC_AHB_PERIPHEN_GPIOA | RCC_AHB_PERIPHEN_GPIOB, ENABLE);
  25. RCC_EnableAPB2PeriphClk(RCC_APB2_PERIPH_AFIO, ENABLE);
  26. /* PLL= 240MHz */
  27. #if (HSE_VALUE == 8000000)
  28. /* Select PLL clock as USBHS clock source , clock 15 divisions = 16M */
  29. RCC_ConfigUSBPLLPresClk(RCC_USBPLLCLK_SRC_PLL, RCC_USBPLLCLK_DIV15);
  30. /* Select the corresponding bandwidth and frequency*/
  31. RCC_ConfigUSBHSBandwidth(RCC_USBHS_BW_16M);
  32. /* Select USBHS clock source frequency */
  33. RCC_ConfigUSBHSFrequency(RCC_USBHS_FREQ_16_OR_32M);
  34. /* Select PLL as USBHS clock */
  35. RCC_ConfigUSBHSClk(RCC_USBHS_CLKSRC_PLLPRES);
  36. #else //HSE 16M
  37. RCC_ConfigUSBHSBandwidth(RCC_USBHS_BW_16M);
  38. RCC_ConfigUSBHSFrequency(RCC_USBHS_FREQ_16_OR_32M);
  39. RCC_ConfigUSBHSClk(RCC_USBHS_CLKSRC_HSE);
  40. #endif
  41. /* Reset the USBHS phy clock*/
  42. RCC_EnableAHBPeriphReset(RCC_AHBPRST_USBHSPHYRST);
  43. /* Enables the USBHS peripheral clock*/
  44. RCC_EnableAHBPeriphClk(RCC_AHB_PERIPHEN_USBHS, ENABLE);
  45. NVIC_InitType NVIC_InitStructure;
  46. // EXTI_InitType EXTI_InitStructure;
  47. // NVIC_InitStructure.NVIC_IRQChannel = USB_HS_WKUP_IRQn;
  48. // NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
  49. // NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
  50. // NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  51. // NVIC_Init(&NVIC_InitStructure);
  52. NVIC_InitStructure.NVIC_IRQChannel = USB_HS_IRQn;
  53. NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
  54. NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;
  55. NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  56. NVIC_Init(&NVIC_InitStructure);
  57. /* Configure the EXTI line 23 connected internally to the USBHS IP */
  58. // EXTI_ClrITPendBit(EXTI_LINE23);
  59. // EXTI_InitStructure.EXTI_Line = EXTI_LINE23;
  60. // EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
  61. // EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;
  62. // EXTI_InitStructure.EXTI_LineCmd = ENABLE;
  63. // EXTI_InitPeripheral(&EXTI_InitStructure);
  64. }
  65. static void usbhs_gpio_init(void)
  66. {
  67. GPIO_InitType GPIO_InitStructure;
  68. RCC_EnableAHB1PeriphClk(RCC_AHB_PERIPHEN_GPIOA | RCC_AHB_PERIPHEN_GPIOB | RCC_AHB_PERIPHEN_GPIOE, ENABLE);
  69. RCC_EnableAPB2PeriphClk(RCC_APB2_PERIPH_AFIO, ENABLE);
  70. GPIO_ConfigPinRemap(0, 0, GPIO_RMP_SWJ_SWD);
  71. GPIO_InitStruct(&GPIO_InitStructure);
  72. #ifdef USBHS_HOST
  73. GPIO_InitStructure.Pin = GPIO_PIN_1;
  74. GPIO_InitStructure.GPIO_Mode = GPIO_MODE_OUTPUT_PP;
  75. GPIO_InitPeripheral(GPIOE, &GPIO_InitStructure);
  76. GPIO_ResetBits(GPIOE, GPIO_PIN_1);
  77. GPIO_InitStructure.Pin = GPIO_PIN_3;
  78. GPIO_InitPeripheral(GPIOB, &GPIO_InitStructure);
  79. GPIO_ResetBits(GPIOB, GPIO_PIN_3);
  80. #endif
  81. // VBUS
  82. // GPIO_InitStructure.Pin = GPIO_PIN_13;
  83. // GPIO_InitStructure.GPIO_Mode = GPIO_MODE_INPUT;
  84. // GPIO_InitPeripheral(GPIOB, &GPIO_InitStructure);
  85. // // SOF
  86. // GPIO_InitStructure.Pin = GPIO_PIN_4;
  87. // GPIO_InitStructure.GPIO_Mode = GPIO_MODE_AF_PP;
  88. // GPIO_InitStructure.GPIO_Alternate = 8; // SOF
  89. // GPIO_InitPeripheral(GPIOA, &GPIO_InitStructure);
  90. // // ID
  91. // GPIO_InitStructure.Pin = GPIO_PIN_12;
  92. // GPIO_InitStructure.GPIO_Mode = GPIO_MODE_AF_PP;
  93. // GPIO_InitStructure.GPIO_Alternate = 14; // ID
  94. // GPIO_InitPeripheral(GPIOB, &GPIO_InitStructure);
  95. }
  96. void usb_dc_low_level_init(uint8_t busid)
  97. {
  98. g_usb_dwc2_irq = USBD_IRQHandler;
  99. g_usb_dwc2_busid = busid;
  100. usbhs_common_init();
  101. RCC->USBHSCTRL2 |= (uint32_t)0x01 << 19;
  102. RCC->USBHSCTRL1 |= (uint32_t)0x01 << 31;
  103. }
  104. void usb_dc_low_level_deinit(uint8_t busid)
  105. {
  106. NVIC_InitType NVIC_InitStructure;
  107. NVIC_InitStructure.NVIC_IRQChannel = USB_HS_IRQn;
  108. NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
  109. NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;
  110. NVIC_InitStructure.NVIC_IRQChannelCmd = DISABLE;
  111. NVIC_Init(&NVIC_InitStructure);
  112. RCC_EnableAHBPeriphReset(RCC_AHBPRST_USBHSPHYRST);
  113. /* Enables the USBHS peripheral clock*/
  114. RCC_EnableAHBPeriphClk(RCC_AHB_PERIPHEN_USBHS, DISABLE);
  115. }
  116. void usb_hc_low_level_init(struct usbh_bus *bus)
  117. {
  118. g_usb_dwc2_irq = USBH_IRQHandler;
  119. g_usb_dwc2_busid = 0;
  120. usbhs_common_init();
  121. RCC->USBHSCTRL2 &= ~(uint32_t)0x01 << 19;
  122. RCC->USBHSCTRL1 |= (uint32_t)0x01 << 31;
  123. }
  124. void usb_hc_low_level_deinit(struct usbh_bus *bus)
  125. {
  126. NVIC_InitType NVIC_InitStructure;
  127. NVIC_InitStructure.NVIC_IRQChannel = USB_HS_IRQn;
  128. NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
  129. NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;
  130. NVIC_InitStructure.NVIC_IRQChannelCmd = DISABLE;
  131. NVIC_Init(&NVIC_InitStructure);
  132. RCC_EnableAHBPeriphReset(RCC_AHBPRST_USBHSPHYRST);
  133. /* Enables the USBHS peripheral clock*/
  134. RCC_EnableAHBPeriphClk(RCC_AHB_PERIPHEN_USBHS, DISABLE);
  135. }
  136. uint32_t usbd_get_dwc2_gccfg_conf(uint32_t reg_base)
  137. {
  138. return 0;
  139. }
  140. uint32_t usbh_get_dwc2_gccfg_conf(uint32_t reg_base)
  141. {
  142. return 0;
  143. }
  144. void USB_HS_IRQHandler(void)
  145. {
  146. g_usb_dwc2_irq(g_usb_dwc2_busid);
  147. }
  148. extern uint32_t SystemCoreClock;
  149. void usbd_dwc2_delay_ms(uint8_t ms)
  150. {
  151. uint32_t count = SystemCoreClock / 1000 * ms;
  152. while (count--) {
  153. __asm volatile("nop");
  154. }
  155. }
  156. #endif