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  * 2022-04-28     CDT          first version
9  */
10 
11 #include <rtdevice.h>
12 #include "board_config.h"
13 
14 /**
15  * The below functions will initialize HC32 board.
16  */
17 
18 #if defined RT_USING_SERIAL
rt_hw_board_uart_init(CM_USART_TypeDef * USARTx)19 rt_err_t rt_hw_board_uart_init(CM_USART_TypeDef *USARTx)
20 {
21     rt_err_t result = RT_EOK;
22 
23     switch ((rt_uint32_t)USARTx)
24     {
25 #if defined(BSP_USING_UART2)
26     case (rt_uint32_t)CM_USART2:
27         /* Configure USART RX/TX pin. */
28         GPIO_SetFunc(USART2_RX_PORT, USART2_RX_PIN, USART2_RX_FUNC);
29         GPIO_SetFunc(USART2_TX_PORT, USART2_TX_PIN, USART2_TX_FUNC);
30         break;
31 #endif
32 #if defined(BSP_USING_UART4)
33     case (rt_uint32_t)CM_USART4:
34         /* Configure USART RX/TX pin. */
35         GPIO_SetFunc(USART4_RX_PORT, USART4_RX_PIN, USART4_RX_FUNC);
36         GPIO_SetFunc(USART4_TX_PORT, USART4_TX_PIN, USART4_TX_FUNC);
37         break;
38 #endif
39     default:
40         result = -RT_ERROR;
41         break;
42     }
43 
44     return result;
45 }
46 #endif
47 
48 #if defined(RT_USING_I2C)
rt_hw_board_i2c_init(CM_I2C_TypeDef * I2Cx)49 rt_err_t rt_hw_board_i2c_init(CM_I2C_TypeDef *I2Cx)
50 {
51     rt_err_t result = RT_EOK;
52     stc_gpio_init_t stcGpioInit;
53     (void)GPIO_StructInit(&stcGpioInit);
54 
55     switch ((rt_uint32_t)I2Cx)
56     {
57 #if defined(BSP_USING_I2C3)
58     case (rt_uint32_t)CM_I2C3:
59         /* Configure I2C3 SDA/SCL pin. */
60         GPIO_SetFunc(I2C3_SDA_PORT, I2C3_SDA_PIN, I2C3_SDA_FUNC);
61         GPIO_SetFunc(I2C3_SCL_PORT, I2C3_SCL_PIN, I2C3_SCL_FUNC);
62         break;
63 #endif
64     default:
65         result = -RT_ERROR;
66         break;
67     }
68     return result;
69 }
70 #endif
71 
72 #if defined(RT_USING_ADC)
rt_hw_board_adc_init(CM_ADC_TypeDef * ADCx)73 rt_err_t rt_hw_board_adc_init(CM_ADC_TypeDef *ADCx)
74 {
75     rt_err_t result = RT_EOK;
76     stc_gpio_init_t stcGpioInit;
77 
78     (void)GPIO_StructInit(&stcGpioInit);
79     stcGpioInit.u16PinAttr = PIN_ATTR_ANALOG;
80     switch ((rt_uint32_t)ADCx)
81     {
82 #if defined(BSP_USING_ADC1)
83     case (rt_uint32_t)CM_ADC1:
84         (void)GPIO_Init(ADC1_CH_PORT, ADC1_CH_PIN, &stcGpioInit);
85         break;
86 #endif
87 #if defined(BSP_USING_ADC2)
88     case (rt_uint32_t)CM_ADC2:
89         (void)GPIO_Init(ADC2_CH_PORT, ADC2_CH_PIN, &stcGpioInit);
90         break;
91 #endif
92     default:
93         result = -RT_ERROR;
94         break;
95     }
96 
97     return result;
98 }
99 #endif
100 
101 #if defined(RT_USING_CAN)
CanPhyEnable(void)102 void CanPhyEnable(void)
103 {
104     GPIO_ResetPins(CAN1_STB_PORT, CAN1_STB_PIN);
105     GPIO_OutputCmd(CAN1_STB_PORT, CAN1_STB_PIN, ENABLE);
106 }
107 
rt_hw_board_can_init(CM_CAN_TypeDef * CANx)108 rt_err_t rt_hw_board_can_init(CM_CAN_TypeDef *CANx)
109 {
110     rt_err_t result = RT_EOK;
111 
112     switch ((rt_uint32_t)CANx)
113     {
114 #if defined(BSP_USING_CAN1)
115     case (rt_uint32_t)CM_CAN:
116         GPIO_SetFunc(CAN1_TX_PORT, CAN1_TX_PIN, CAN1_TX_PIN_FUNC);
117         GPIO_SetFunc(CAN1_RX_PORT, CAN1_RX_PIN, CAN1_RX_PIN_FUNC);
118         break;
119 #endif
120     default:
121         result = -RT_ERROR;
122         break;
123     }
124 
125     return result;
126 }
127 #endif
128 
129 
130 #if defined (RT_USING_SPI)
rt_hw_spi_board_init(CM_SPI_TypeDef * CM_SPIx)131 rt_err_t rt_hw_spi_board_init(CM_SPI_TypeDef *CM_SPIx)
132 {
133     rt_err_t result = RT_EOK;
134 #if defined(BSP_USING_SPI3)
135     stc_gpio_init_t stcGpioInit;
136 #endif
137 
138     switch ((rt_uint32_t)CM_SPIx)
139     {
140 #if defined(BSP_USING_SPI3)
141     case (rt_uint32_t)CM_SPI3:
142         GPIO_StructInit(&stcGpioInit);
143         stcGpioInit.u16PinState = PIN_STAT_SET;
144         stcGpioInit.u16PinDir   = PIN_DIR_OUT;
145         GPIO_Init(SPI3_WP_PORT, SPI3_WP_PIN, &stcGpioInit);
146         GPIO_Init(SPI3_HOLD_PORT, SPI3_HOLD_PIN, &stcGpioInit);
147 
148         (void)GPIO_StructInit(&stcGpioInit);
149         stcGpioInit.u16PinDrv = PIN_HIGH_DRV;
150         (void)GPIO_Init(SPI3_SCK_PORT,  SPI3_SCK_PIN,  &stcGpioInit);
151         (void)GPIO_Init(SPI3_MOSI_PORT, SPI3_MOSI_PIN, &stcGpioInit);
152         (void)GPIO_Init(SPI3_MISO_PORT, SPI3_MISO_PIN, &stcGpioInit);
153         GPIO_SetFunc(SPI3_SCK_PORT,  SPI3_SCK_PIN,  SPI3_SCK_FUNC);
154         GPIO_SetFunc(SPI3_MOSI_PORT, SPI3_MOSI_PIN, SPI3_MOSI_FUNC);
155         GPIO_SetFunc(SPI3_MISO_PORT, SPI3_MISO_PIN, SPI3_MISO_FUNC);
156         break;
157 #endif
158     default:
159         result = -RT_ERROR;
160         break;
161     }
162 
163     return result;
164 }
165 #endif
166 
167 #if defined (RT_USING_SDIO)
rt_hw_board_sdio_init(CM_SDIOC_TypeDef * SDIOCx)168 rt_err_t rt_hw_board_sdio_init(CM_SDIOC_TypeDef *SDIOCx)
169 {
170     rt_err_t result = RT_EOK;
171     stc_gpio_init_t stcGpioInit;
172 
173     switch ((rt_uint32_t)SDIOCx)
174     {
175 #if defined(BSP_USING_SDIO1)
176     case (rt_uint32_t)CM_SDIOC1:
177         /************************* Set pin drive capacity *************************/
178         (void)GPIO_StructInit(&stcGpioInit);
179         stcGpioInit.u16PinDrv = PIN_HIGH_DRV;
180         (void)GPIO_Init(SDIOC1_CK_PORT,  SDIOC1_CK_PIN,  &stcGpioInit);
181         (void)GPIO_Init(SDIOC1_CMD_PORT, SDIOC1_CMD_PIN, &stcGpioInit);
182         (void)GPIO_Init(SDIOC1_D0_PORT,  SDIOC1_D0_PIN,  &stcGpioInit);
183         (void)GPIO_Init(SDIOC1_D1_PORT,  SDIOC1_D1_PIN,  &stcGpioInit);
184         (void)GPIO_Init(SDIOC1_D2_PORT,  SDIOC1_D2_PIN,  &stcGpioInit);
185         (void)GPIO_Init(SDIOC1_D3_PORT,  SDIOC1_D3_PIN,  &stcGpioInit);
186 
187         GPIO_SetFunc(SDIOC1_CK_PORT,  SDIOC1_CK_PIN,  SDIOC1_CK_FUNC);
188         GPIO_SetFunc(SDIOC1_CMD_PORT, SDIOC1_CMD_PIN, SDIOC1_CMD_FUNC);
189         GPIO_SetFunc(SDIOC1_D0_PORT,  SDIOC1_D0_PIN,  SDIOC1_D0_FUNC);
190         GPIO_SetFunc(SDIOC1_D1_PORT,  SDIOC1_D1_PIN,  SDIOC1_D1_FUNC);
191         GPIO_SetFunc(SDIOC1_D2_PORT,  SDIOC1_D2_PIN,  SDIOC1_D2_FUNC);
192         GPIO_SetFunc(SDIOC1_D3_PORT,  SDIOC1_D3_PIN,  SDIOC1_D3_FUNC);
193         break;
194 #endif
195     default:
196         result = -RT_ERROR;
197         break;
198     }
199 
200     return result;
201 }
202 #endif
203 
204 #if defined(RT_USING_PWM)
205 #if defined(BSP_USING_PWM_TMRA)
rt_hw_board_pwm_tmra_init(CM_TMRA_TypeDef * TMRAx)206 rt_err_t rt_hw_board_pwm_tmra_init(CM_TMRA_TypeDef *TMRAx)
207 {
208     rt_err_t result = RT_EOK;
209     switch ((rt_uint32_t)TMRAx)
210     {
211 #if defined(BSP_USING_PWM_TMRA_1)
212     case (rt_uint32_t)CM_TMRA_1:
213 #ifdef BSP_USING_PWM_TMRA_1_CH1
214         GPIO_SetFunc(PWM_TMRA_1_CH1_PORT, PWM_TMRA_1_CH1_PIN, PWM_TMRA_1_CH1_PIN_FUNC);
215 #endif
216 #ifdef BSP_USING_PWM_TMRA_1_CH2
217         GPIO_SetFunc(PWM_TMRA_1_CH2_PORT, PWM_TMRA_1_CH2_PIN, PWM_TMRA_1_CH2_PIN_FUNC);
218 #endif
219 #ifdef BSP_USING_PWM_TMRA_1_CH3
220         GPIO_SetFunc(PWM_TMRA_1_CH3_PORT, PWM_TMRA_1_CH3_PIN, PWM_TMRA_1_CH3_PIN_FUNC);
221 #endif
222 #ifdef BSP_USING_PWM_TMRA_1_CH4
223         GPIO_SetFunc(PWM_TMRA_1_CH4_PORT, PWM_TMRA_1_CH4_PIN, PWM_TMRA_1_CH4_PIN_FUNC);
224 #endif
225         break;
226 #endif
227 
228     default:
229         result = -RT_ERROR;
230         break;
231     }
232 
233     return result;
234 }
235 #endif
236 
237 #if defined(BSP_USING_PWM_TMR4)
rt_hw_board_pwm_tmr4_init(CM_TMR4_TypeDef * TMR4x)238 rt_err_t rt_hw_board_pwm_tmr4_init(CM_TMR4_TypeDef *TMR4x)
239 {
240     rt_err_t result = RT_EOK;
241     switch ((rt_uint32_t)TMR4x)
242     {
243 #if defined(BSP_USING_PWM_TMR4_1)
244     case (rt_uint32_t)CM_TMR4_1:
245 #ifdef BSP_USING_PWM_TMR4_1_OUH
246         GPIO_SetFunc(PWM_TMR4_1_OUH_PORT, PWM_TMR4_1_OUH_PIN, PWM_TMR4_1_OUH_PIN_FUNC);
247 #endif
248 #ifdef BSP_USING_PWM_TMR4_1_OUL
249         GPIO_SetFunc(PWM_TMR4_1_OUL_PORT, PWM_TMR4_1_OUL_PIN, PWM_TMR4_1_OUL_PIN_FUNC);
250 #endif
251 #ifdef BSP_USING_PWM_TMR4_1_OVH
252         GPIO_SetFunc(PWM_TMR4_1_OVH_PORT, PWM_TMR4_1_OVH_PIN, PWM_TMR4_1_OVH_PIN_FUNC);
253 #endif
254 #ifdef BSP_USING_PWM_TMR4_1_OVL
255         GPIO_SetFunc(PWM_TMR4_1_OVL_PORT, PWM_TMR4_1_OVL_PIN, PWM_TMR4_1_OVL_PIN_FUNC);
256 #endif
257 #ifdef BSP_USING_PWM_TMR4_1_OWH
258         GPIO_SetFunc(PWM_TMR4_1_OWH_PORT, PWM_TMR4_1_OWH_PIN, PWM_TMR4_1_OWH_PIN_FUNC);
259 #endif
260 #ifdef BSP_USING_PWM_TMR4_1_OWL
261         GPIO_SetFunc(PWM_TMR4_1_OWL_PORT, PWM_TMR4_1_OWL_PIN, PWM_TMR4_1_OWL_PIN_FUNC);
262 #endif
263         break;
264 #endif
265 
266     default:
267         result = -RT_ERROR;
268         break;
269     }
270     return result;
271 }
272 #endif
273 
274 #if defined(BSP_USING_PWM_TMR6)
rt_hw_board_pwm_tmr6_init(CM_TMR6_TypeDef * TMR6x)275 rt_err_t rt_hw_board_pwm_tmr6_init(CM_TMR6_TypeDef *TMR6x)
276 {
277     rt_err_t result = RT_EOK;
278     switch ((rt_uint32_t)TMR6x)
279     {
280 #if defined(BSP_USING_PWM_TMR6_1)
281     case (rt_uint32_t)CM_TMR6_1:
282 #ifdef BSP_USING_PWM_TMR6_1_A
283         GPIO_SetFunc(PWM_TMR6_1_A_PORT, PWM_TMR6_1_A_PIN, PWM_TMR6_1_A_PIN_FUNC);
284 #endif
285 #ifdef BSP_USING_PWM_TMR6_1_B
286         GPIO_SetFunc(PWM_TMR6_1_B_PORT, PWM_TMR6_1_B_PIN, PWM_TMR6_1_B_PIN_FUNC);
287 #endif
288         break;
289 #endif
290 
291     default:
292         result = -RT_ERROR;
293         break;
294     }
295 
296     return result;
297 }
298 #endif
299 #endif
300 
301 #if defined (BSP_USING_INPUT_CAPTURE)
rt_hw_board_input_capture_init(uint32_t * tmr_instance)302 rt_err_t rt_hw_board_input_capture_init(uint32_t *tmr_instance)
303 {
304     rt_err_t result = RT_EOK;
305 
306     switch ((rt_uint32_t)tmr_instance)
307     {
308 #if defined (BSP_USING_INPUT_CAPTURE_TMR6_1)
309     case (rt_uint32_t)CM_TMR6_1:
310         GPIO_SetFunc(INPUT_CAPTURE_TMR6_1_PORT, INPUT_CAPTURE_TMR6_1_PIN, GPIO_FUNC_3);
311         break;
312 #endif
313 #if defined (BSP_USING_INPUT_CAPTURE_TMR6_2)
314     case (rt_uint32_t)CM_TMR6_2:
315         GPIO_SetFunc(INPUT_CAPTURE_TMR6_2_PORT, INPUT_CAPTURE_TMR6_2_PIN, GPIO_FUNC_3);
316         break;
317 #endif
318 #if defined (BSP_USING_INPUT_CAPTURE_TMR6_3)
319     case (rt_uint32_t)CM_TMR6_3:
320         GPIO_SetFunc(INPUT_CAPTURE_TMR6_3_PORT, INPUT_CAPTURE_TMR6_3_PIN, GPIO_FUNC_3);
321         break;
322 #endif
323     default:
324         result = -RT_ERROR;
325         break;
326     }
327     return result;
328 }
329 #endif
330 #ifdef RT_USING_PM
rt_hw_board_pm_sysclk_cfg(uint8_t run_mode)331 void rt_hw_board_pm_sysclk_cfg(uint8_t run_mode)
332 {
333     switch (run_mode)
334     {
335     case PM_RUN_MODE_HIGH_SPEED:
336     case PM_RUN_MODE_NORMAL_SPEED:
337         CLK_SetSysClockSrc(CLK_SYSCLK_SRC_PLL);
338         break;
339     case PM_RUN_MODE_LOW_SPEED:
340         /* Ensure that system clock less than 8M */
341         CLK_SetSysClockSrc(CLK_SYSCLK_SRC_XTAL);
342         break;
343     default:
344         break;
345     }
346 }
347 #endif
348 
349 #if defined(BSP_USING_USBD) || defined(BSP_USING_USBH)
rt_hw_usbfs_board_init(void)350 rt_err_t rt_hw_usbfs_board_init(void)
351 {
352     stc_gpio_init_t stcGpioCfg;
353     (void)GPIO_StructInit(&stcGpioCfg);
354 #if defined(BSP_USING_USBFS)
355     stcGpioCfg.u16PinAttr = PIN_ATTR_ANALOG;
356     (void)GPIO_Init(USBF_DM_PORT, USBF_DM_PIN, &stcGpioCfg);
357     (void)GPIO_Init(USBF_DP_PORT, USBF_DP_PIN, &stcGpioCfg);
358 #if defined(BSP_USING_USBD)
359     GPIO_SetFunc(USBF_VBUS_PORT, USBF_VBUS_PIN, USBF_VBUS_FUNC); /* VBUS */
360 #endif
361 #if defined(BSP_USING_USBH)
362     GPIO_SetFunc(USBF_DRVVBUS_PORT, USBF_DRVVBUS_PIN, USBF_DRVVBUS_FUNC); /* DRV VBUS */
363 #endif
364 #endif
365     return RT_EOK;
366 }
367 #endif
368 
369 #if defined(BSP_USING_QSPI)
rt_hw_qspi_board_init(void)370 rt_err_t rt_hw_qspi_board_init(void)
371 {
372     stc_gpio_init_t stcGpioInit;
373 
374     (void)GPIO_StructInit(&stcGpioInit);
375     stcGpioInit.u16PinDrv = PIN_HIGH_DRV;
376 #ifndef BSP_QSPI_USING_SOFT_CS
377     (void)GPIO_Init(QSPI_FLASH_CS_PORT,  QSPI_FLASH_CS_PIN,  &stcGpioInit);
378     GPIO_SetFunc(QSPI_FLASH_CS_PORT,  QSPI_FLASH_CS_PIN,  QSPI_FLASH_CS_FUNC);
379 #endif
380     (void)GPIO_Init(QSPI_FLASH_SCK_PORT, QSPI_FLASH_SCK_PIN, &stcGpioInit);
381     (void)GPIO_Init(QSPI_FLASH_IO0_PORT, QSPI_FLASH_IO0_PIN, &stcGpioInit);
382     (void)GPIO_Init(QSPI_FLASH_IO1_PORT, QSPI_FLASH_IO1_PIN, &stcGpioInit);
383     (void)GPIO_Init(QSPI_FLASH_IO2_PORT, QSPI_FLASH_IO2_PIN, &stcGpioInit);
384     (void)GPIO_Init(QSPI_FLASH_IO3_PORT, QSPI_FLASH_IO3_PIN, &stcGpioInit);
385     GPIO_SetFunc(QSPI_FLASH_SCK_PORT, QSPI_FLASH_SCK_PIN, QSPI_FLASH_SCK_FUNC);
386     GPIO_SetFunc(QSPI_FLASH_IO0_PORT, QSPI_FLASH_IO0_PIN, QSPI_FLASH_IO0_FUNC);
387     GPIO_SetFunc(QSPI_FLASH_IO1_PORT, QSPI_FLASH_IO1_PIN, QSPI_FLASH_IO1_FUNC);
388     GPIO_SetFunc(QSPI_FLASH_IO2_PORT, QSPI_FLASH_IO2_PIN, QSPI_FLASH_IO2_FUNC);
389     GPIO_SetFunc(QSPI_FLASH_IO3_PORT, QSPI_FLASH_IO3_PIN, QSPI_FLASH_IO3_FUNC);
390 
391     return RT_EOK;
392 }
393 #endif
394 
395 #if defined(BSP_USING_TMRA_PULSE_ENCODER)
rt_hw_board_pulse_encoder_tmra_init(void)396 rt_err_t rt_hw_board_pulse_encoder_tmra_init(void)
397 {
398 #if defined(BSP_USING_PULSE_ENCODER_TMRA_1)
399     GPIO_SetFunc(PULSE_ENCODER_TMRA_1_A_PORT, PULSE_ENCODER_TMRA_1_A_PIN, PULSE_ENCODER_TMRA_1_A_PIN_FUNC);
400     GPIO_SetFunc(PULSE_ENCODER_TMRA_1_B_PORT, PULSE_ENCODER_TMRA_1_B_PIN, PULSE_ENCODER_TMRA_1_B_PIN_FUNC);
401 #endif
402 
403     return RT_EOK;
404 }
405 #endif
406 
407 #if defined(BSP_USING_TMR6_PULSE_ENCODER)
rt_hw_board_pulse_encoder_tmr6_init(void)408 rt_err_t rt_hw_board_pulse_encoder_tmr6_init(void)
409 {
410 #if defined(BSP_USING_PULSE_ENCODER_TMR6_1)
411     GPIO_SetFunc(PULSE_ENCODER_TMR6_1_A_PORT, PULSE_ENCODER_TMR6_1_A_PIN, PULSE_ENCODER_TMR6_1_A_PIN_FUNC);
412     GPIO_SetFunc(PULSE_ENCODER_TMR6_1_B_PORT, PULSE_ENCODER_TMR6_1_B_PIN, PULSE_ENCODER_TMR6_1_B_PIN_FUNC);
413 #endif
414 
415     return RT_EOK;
416 }
417 #endif
418