1 /*
2  * Copyright (c) 2006-2024, RT-Thread Development Team
3  *
4  * SPDX-License-Identifier: Apache-2.0
5  *
6  * Change Logs:
7  * Date           Author       Notes
8  * 2024-04-08     QT-one       first version
9  */
10 
11 #include "ht32_msp.h"
12 
13 /* GPIO configuration for UART */
14 #ifdef BSP_USING_UART
ht32_usart_gpio_init(void * instance)15 void ht32_usart_gpio_init(void *instance)
16 {
17     CKCU_PeripClockConfig_TypeDef   CKCUClock = {{0}};
18     HT_USART_TypeDef *usart_x = (HT_USART_TypeDef *)instance;
19 #ifdef BSP_USING_USART0
20     if (HT_USART0 == usart_x)
21     {
22         CKCUClock.Bit.HTCFG_USART0_TX_GPIO_CLK = 1;
23         CKCUClock.Bit.HTCFG_USART0_RX_GPIO_CLK = 1;
24         CKCU_PeripClockConfig(CKCUClock, ENABLE);
25         /* Turn on UxART Rx internal pull up resistor to prevent unknow state */
26         GPIO_PullResistorConfig(HTCFG_USART0_RX_GPIO_PORT, HTCFG_USART0_RX_GPIO_PIN, GPIO_PR_UP);
27         /* Config AFIO mode as UxART function */
28         AFIO_GPxConfig(HTCFG_USART0_TX_GPIO_ID, HTCFG_USART0_TX_GPIO_PIN, AFIO_FUN_USART_UART);
29         AFIO_GPxConfig(HTCFG_USART0_RX_GPIO_ID, HTCFG_USART0_RX_GPIO_PIN, AFIO_FUN_USART_UART);
30     }
31 #endif
32 #ifdef BSP_USING_USART1
33     if (HT_USART1 == usart_x)
34     {
35         CKCUClock.Bit.HTCFG_USART1_TX_GPIO_CLK = 1;
36         CKCUClock.Bit.HTCFG_USART1_RX_GPIO_CLK = 1;
37         CKCU_PeripClockConfig(CKCUClock, ENABLE);
38         /* Turn on UxART Rx internal pull up resistor to prevent unknow state */
39         GPIO_PullResistorConfig(HTCFG_USART1_RX_GPIO_PORT, HTCFG_USART1_RX_GPIO_PIN, GPIO_PR_UP);
40         /* Config AFIO mode as UxART function */
41         AFIO_GPxConfig(HTCFG_USART1_TX_GPIO_ID, HTCFG_USART1_TX_GPIO_PIN, AFIO_FUN_USART_UART);
42         AFIO_GPxConfig(HTCFG_USART1_RX_GPIO_ID, HTCFG_USART1_RX_GPIO_PIN, AFIO_FUN_USART_UART);
43     }
44 #endif
45 #ifdef BSP_USING_UART0
46     if (HT_UART0 == usart_x)
47     {
48         CKCUClock.Bit.HTCFG_UART0_TX_GPIO_CLK = 1;
49         CKCUClock.Bit.HTCFG_UART0_RX_GPIO_CLK = 1;
50         CKCU_PeripClockConfig(CKCUClock, ENABLE);
51         /* Turn on UxART Rx internal pull up resistor to prevent unknow state */
52         GPIO_PullResistorConfig(HTCFG_UART0_RX_GPIO_PORT, HTCFG_UART0_RX_GPIO_PIN, GPIO_PR_UP);
53         /* Config AFIO mode as UxART function */
54         AFIO_GPxConfig(HTCFG_UART0_TX_GPIO_ID, HTCFG_UART0_TX_GPIO_PIN, AFIO_FUN_USART_UART);
55         AFIO_GPxConfig(HTCFG_UART0_RX_GPIO_ID, HTCFG_UART0_RX_GPIO_PIN, AFIO_FUN_USART_UART);
56     }
57 #endif
58 #ifdef BSP_USING_UART1
59     if (HT_UART1 == usart_x)
60     {
61         CKCUClock.Bit.HTCFG_UART1_TX_GPIO_CLK = 1;
62         CKCUClock.Bit.HTCFG_UART1_RX_GPIO_CLK = 1;
63         CKCU_PeripClockConfig(CKCUClock, ENABLE);
64         /* Turn on UxART Rx internal pull up resistor to prevent unknow state */
65         GPIO_PullResistorConfig(HTCFG_UART1_RX_GPIO_PORT, HTCFG_UART1_RX_GPIO_PIN, GPIO_PR_UP);
66         /* Config AFIO mode as UxART function */
67         AFIO_GPxConfig(HTCFG_UART1_TX_GPIO_ID, HTCFG_UART1_TX_GPIO_PIN, AFIO_FUN_USART_UART);
68         AFIO_GPxConfig(HTCFG_UART1_RX_GPIO_ID, HTCFG_UART1_RX_GPIO_PIN, AFIO_FUN_USART_UART);
69     }
70 #endif
71 }
72 #endif
73 
74 /* GPIO configuration for SPI */
75 #ifdef BSP_USING_SPI
ht32_spi_gpio_init(void * instance)76 void ht32_spi_gpio_init(void *instance)
77 {
78     CKCU_PeripClockConfig_TypeDef   CKCUClock = {{0}};
79     HT_SPI_TypeDef *spi_x = (HT_SPI_TypeDef *)instance;
80 #ifdef BSP_USING_SPI0
81     if (HT_SPI0 == spi_x)
82     {
83         CKCUClock.Bit.HTCFG_SPI0_SCK_GPIO_CLK = 1;
84         CKCUClock.Bit.HTCFG_SPI0_MISO_GPIO_CLK = 1;
85         CKCUClock.Bit.HTCFG_SPI0_MOSI_GPIO_CLK = 1;
86         CKCU_PeripClockConfig(CKCUClock, ENABLE);
87 
88         AFIO_GPxConfig(HTCFG_SPI0_SCK_GPIO_ID, HTCFG_SPI0_SCK_GPIO_PIN, AFIO_FUN_SPI);
89         AFIO_GPxConfig(HTCFG_SPI0_MISO_GPIO_ID, HTCFG_SPI0_MISO_GPIO_PIN, AFIO_FUN_SPI);
90         AFIO_GPxConfig(HTCFG_SPI0_MOSI_GPIO_ID, HTCFG_SPI0_MOSI_GPIO_PIN, AFIO_FUN_SPI);
91     }
92 #endif
93 #ifdef BSP_USING_SPI1
94     if (HT_SPI1 == spi_x)
95     {
96         CKCUClock.Bit.HTCFG_SPI1_SCK_GPIO_CLK = 1;
97         CKCUClock.Bit.HTCFG_SPI1_MISO_GPIO_CLK = 1;
98         CKCUClock.Bit.HTCFG_SPI1_MOSI_GPIO_CLK = 1;
99         CKCU_PeripClockConfig(CKCUClock, ENABLE);
100 
101         AFIO_GPxConfig(HTCFG_SPI1_SCK_GPIO_ID, HTCFG_SPI1_SCK_GPIO_PIN, AFIO_FUN_SPI);
102         AFIO_GPxConfig(HTCFG_SPI1_MISO_GPIO_ID, HTCFG_SPI1_MISO_GPIO_PIN, AFIO_FUN_SPI);
103         AFIO_GPxConfig(HTCFG_SPI1_MOSI_GPIO_ID, HTCFG_SPI1_MOSI_GPIO_PIN, AFIO_FUN_SPI);
104     }
105 #endif
106 }
107 #endif
108 
109 /* GPIO configuration for I2C */
110 #ifdef BSP_USING_I2C_HW
ht32_hardware_i2c_gpio_init(void * instance)111 void ht32_hardware_i2c_gpio_init(void *instance)
112 {
113     CKCU_PeripClockConfig_TypeDef   CKCUClock = {{0}};
114     HT_I2C_TypeDef *i2c_x = (HT_I2C_TypeDef *)instance;
115 #ifdef BSP_USING_I2C0_HW
116     if (HT_I2C0 == i2c_x)
117     {
118         CKCUClock.Bit.HTCFG_I2C0_SCL_GPIO_CLK = 1;
119         CKCUClock.Bit.HTCFG_I2C0_SDA_GPIO_CLK = 1;
120         CKCU_PeripClockConfig(CKCUClock, ENABLE);
121         /* Configure GPIO to I2C mode */
122         AFIO_GPxConfig(HTCFG_I2C0_SCL_GPIO_ID, HTCFG_I2C0_SCL_GPIO_PIN, AFIO_FUN_I2C);
123         AFIO_GPxConfig(HTCFG_I2C0_SDA_GPIO_ID, HTCFG_I2C0_SDA_GPIO_PIN, AFIO_FUN_I2C);
124     }
125 #endif
126 #ifdef BSP_USING_I2C1_HW
127     if (HT_I2C1 == i2c_x)
128     {
129         CKCUClock.Bit.HTCFG_I2C1_SCL_GPIO_CLK = 1;
130         CKCUClock.Bit.HTCFG_I2C1_SDA_GPIO_CLK = 1;
131         CKCU_PeripClockConfig(CKCUClock, ENABLE);
132         /* Configure GPIO to I2C mode */
133         AFIO_GPxConfig(HTCFG_I2C1_SCL_GPIO_ID, HTCFG_I2C1_SCL_GPIO_PIN, AFIO_FUN_I2C);
134         AFIO_GPxConfig(HTCFG_I2C1_SDA_GPIO_ID, HTCFG_I2C1_SDA_GPIO_PIN, AFIO_FUN_I2C);
135     }
136 #endif
137 }
138 #endif
139 
140 /* GPIO configuration for ADC */
141 #ifdef BSP_USING_ADC
ht32_adc_gpio_init(void * instance,int8_t channel)142 void ht32_adc_gpio_init(void *instance,int8_t channel)
143 {
144     CKCU_PeripClockConfig_TypeDef CKCUClock = {{ 0 }};
145     HT_ADC_TypeDef *adc_x = (HT_ADC_TypeDef *)instance;
146 #ifdef BSP_USING_ADC0
147     if (HT_ADC0 == adc_x)
148     {
149         /* Enable peripheral clock */
150         CKCUClock.Bit.AFIO = 1;
151         CKCUClock.Bit.ADC0 = 1;
152         CKCU_PeripClockConfig(CKCUClock, ENABLE);
153 
154         /* Configure AFIO mode as ADC function */
155         switch(channel)
156         {
157             case 0:
158                 AFIO_GPxConfig(HTCFG_ADC0CH0_GPIO_ID, HTCFG_ADC0CH0_AFIO_PIN, AFIO_FUN_ADC0);
159                 break;
160             case 1:
161                 AFIO_GPxConfig(HTCFG_ADC0CH1_GPIO_ID, HTCFG_ADC0CH1_AFIO_PIN, AFIO_FUN_ADC0);
162                 break;
163             case 2:
164                 AFIO_GPxConfig(HTCFG_ADC0CH2_GPIO_ID, HTCFG_ADC0CH2_AFIO_PIN, AFIO_FUN_ADC0);
165                 break;
166             case 3:
167                 AFIO_GPxConfig(HTCFG_ADC0CH3_GPIO_ID, HTCFG_ADC0CH3_AFIO_PIN, AFIO_FUN_ADC0);
168                 break;
169             case 4:
170                 AFIO_GPxConfig(HTCFG_ADC0CH4_GPIO_ID, HTCFG_ADC0CH4_AFIO_PIN, AFIO_FUN_ADC0);
171                 break;
172             case 5:
173                 AFIO_GPxConfig(HTCFG_ADC0CH5_GPIO_ID, HTCFG_ADC0CH5_AFIO_PIN, AFIO_FUN_ADC0);
174                 break;
175             case 6:
176                 AFIO_GPxConfig(HTCFG_ADC0CH6_GPIO_ID, HTCFG_ADC0CH6_AFIO_PIN, AFIO_FUN_ADC0);
177                 break;
178             case 7:
179                 AFIO_GPxConfig(HTCFG_ADC0CH7_GPIO_ID, HTCFG_ADC0CH7_AFIO_PIN, AFIO_FUN_ADC0);
180                 break;
181             case 8:
182                 AFIO_GPxConfig(HTCFG_ADC0CH8_GPIO_ID, HTCFG_ADC0CH8_AFIO_PIN, AFIO_FUN_ADC0);
183                 break;
184             case 9:
185                 AFIO_GPxConfig(HTCFG_ADC0CH9_GPIO_ID, HTCFG_ADC0CH9_AFIO_PIN, AFIO_FUN_ADC0);
186                 break;
187             case 10:
188                 AFIO_GPxConfig(HTCFG_ADC0CH10_GPIO_ID, HTCFG_ADC0CH10_AFIO_PIN, AFIO_FUN_ADC0);
189                 break;
190             case 11:
191                 AFIO_GPxConfig(HTCFG_ADC0CH11_GPIO_ID, HTCFG_ADC0CH11_AFIO_PIN, AFIO_FUN_ADC0);
192                 break;
193             case 12:
194                 AFIO_GPxConfig(HTCFG_ADC0CH12_GPIO_ID, HTCFG_ADC0CH12_AFIO_PIN, AFIO_FUN_ADC0);
195                 break;
196             case 13:
197                 AFIO_GPxConfig(HTCFG_ADC0CH13_GPIO_ID, HTCFG_ADC0CH13_AFIO_PIN, AFIO_FUN_ADC0);
198                 break;
199             case 14:
200                 AFIO_GPxConfig(HTCFG_ADC0CH14_GPIO_ID, HTCFG_ADC0CH14_AFIO_PIN, AFIO_FUN_ADC0);
201                 break;
202             case 15:
203                 AFIO_GPxConfig(HTCFG_ADC0CH15_GPIO_ID, HTCFG_ADC0CH15_AFIO_PIN, AFIO_FUN_ADC0);
204                 break;
205             default:
206                 break;
207         }
208     }
209 #endif
210 #ifdef BSP_USING_ADC1
211     if (HT_ADC1 == adc_x)
212     {
213         /* Enable peripheral clock */
214         CKCUClock.Bit.AFIO = 1;
215         CKCUClock.Bit.ADC1 = 1;
216         CKCU_PeripClockConfig(CKCUClock, ENABLE);
217 
218         /* Configure AFIO mode as ADC function */
219         switch(channel)
220         {
221             case 0:
222                 AFIO_GPxConfig(HTCFG_ADC1CH0_GPIO_ID, HTCFG_ADC1CH0_AFIO_PIN, AFIO_FUN_ADC0);
223                 break;
224             case 1:
225                 AFIO_GPxConfig(HTCFG_ADC1CH1_GPIO_ID, HTCFG_ADC1CH1_AFIO_PIN, AFIO_FUN_ADC0);
226                 break;
227             case 2:
228                 AFIO_GPxConfig(HTCFG_ADC1CH2_GPIO_ID, HTCFG_ADC1CH2_AFIO_PIN, AFIO_FUN_ADC0);
229                 break;
230             case 3:
231                 AFIO_GPxConfig(HTCFG_ADC1CH3_GPIO_ID, HTCFG_ADC1CH3_AFIO_PIN, AFIO_FUN_ADC0);
232                 break;
233             case 4:
234                 AFIO_GPxConfig(HTCFG_ADC1CH4_GPIO_ID, HTCFG_ADC1CH4_AFIO_PIN, AFIO_FUN_ADC0);
235                 break;
236             case 5:
237                 AFIO_GPxConfig(HTCFG_ADC1CH5_GPIO_ID, HTCFG_ADC1CH5_AFIO_PIN, AFIO_FUN_ADC0);
238                 break;
239             case 6:
240                 AFIO_GPxConfig(HTCFG_ADC1CH6_GPIO_ID, HTCFG_ADC1CH6_AFIO_PIN, AFIO_FUN_ADC0);
241                 break;
242             case 7:
243                 AFIO_GPxConfig(HTCFG_ADC1CH7_GPIO_ID, HTCFG_ADC1CH7_AFIO_PIN, AFIO_FUN_ADC0);
244                 break;
245             default:
246                 break;
247         }
248     }
249 #endif
250 }
251 #endif
252