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