1 /*
2  * Copyright (c) 2023-2024 HPMicro
3  *
4  * SPDX-License-Identifier: BSD-3-Clause
5  *
6  */
7 
8 #ifndef _HPM_BOARD_H
9 #define _HPM_BOARD_H
10 #include <stdio.h>
11 #include <stdarg.h>
12 #include "hpm_common.h"
13 #include "hpm_clock_drv.h"
14 #include "hpm_soc.h"
15 #include "hpm_soc_feature.h"
16 #include "pinmux.h"
17 #if !defined(CONFIG_NDEBUG_CONSOLE) || !CONFIG_NDEBUG_CONSOLE
18 #include "hpm_debug_console.h"
19 #endif
20 
21 #define BOARD_NAME          "hpm5300evk"
22 #define BOARD_UF2_SIGNATURE (0x0A4D5048UL)
23 
24 /* ACMP desction */
25 #define BOARD_ACMP             HPM_ACMP
26 #define BOARD_ACMP_CHANNEL     ACMP_CHANNEL_CHN1
27 #define BOARD_ACMP_IRQ         IRQn_ACMP_1
28 #define BOARD_ACMP_PLUS_INPUT  ACMP_INPUT_DAC_OUT  /* use internal DAC */
29 #define BOARD_ACMP_MINUS_INPUT ACMP_INPUT_ANALOG_4 /* align with used pin */
30 
31 /* dma section */
32 #define BOARD_APP_HDMA      HPM_HDMA
33 #define BOARD_APP_HDMA_IRQ  IRQn_HDMA
34 #define BOARD_APP_DMAMUX    HPM_DMAMUX
35 #define TEST_DMA_CONTROLLER HPM_HDMA
36 #define TEST_DMA_IRQ        IRQn_HDMA
37 
38 #ifndef BOARD_RUNNING_CORE
39 #define BOARD_RUNNING_CORE HPM_CORE0
40 #endif
41 
42 /* uart section */
43 #ifndef BOARD_APP_UART_BASE
44 #define BOARD_APP_UART_BASE HPM_UART2
45 #define BOARD_APP_UART_IRQ  IRQn_UART2
46 #define BOARD_APP_UART_BAUDRATE   (115200UL)
47 #define BOARD_APP_UART_CLK_NAME   clock_uart2
48 #define BOARD_APP_UART_RX_DMA_REQ HPM_DMA_SRC_UART2_RX
49 #define BOARD_APP_UART_TX_DMA_REQ HPM_DMA_SRC_UART2_TX
50 #endif
51 
52 /* uart lin sample section */
53 #define BOARD_UART_LIN          HPM_UART3
54 #define BOARD_UART_LIN_IRQ      IRQn_UART3
55 #define BOARD_UART_LIN_CLK_NAME clock_uart3
56 #define BOARD_UART_LIN_TX_PORT  GPIO_DI_GPIOA
57 #define BOARD_UART_LIN_TX_PIN   (15U) /* PA15 should align with used pin in pinmux configuration */
58 
59 
60 #if !defined(CONFIG_NDEBUG_CONSOLE) || !CONFIG_NDEBUG_CONSOLE
61 #ifndef BOARD_CONSOLE_TYPE
62 #define BOARD_CONSOLE_TYPE CONSOLE_TYPE_UART
63 #endif
64 
65 #if BOARD_CONSOLE_TYPE == CONSOLE_TYPE_UART
66 #ifndef BOARD_CONSOLE_UART_BASE
67 #define BOARD_CONSOLE_UART_BASE     HPM_UART0
68 #define BOARD_CONSOLE_UART_CLK_NAME clock_uart0
69 #define BOARD_CONSOLE_UART_IRQ      IRQn_UART0
70 #define BOARD_CONSOLE_UART_TX_DMA_REQ HPM_DMA_SRC_UART0_TX
71 #define BOARD_CONSOLE_UART_RX_DMA_REQ HPM_DMA_SRC_UART0_RX
72 #endif
73 #define BOARD_CONSOLE_UART_BAUDRATE (115200UL)
74 #endif
75 #endif
76 
77 /* usb cdc acm uart section */
78 #define BOARD_USB_CDC_ACM_UART            BOARD_APP_UART_BASE
79 #define BOARD_USB_CDC_ACM_UART_CLK_NAME   BOARD_APP_UART_CLK_NAME
80 #define BOARD_USB_CDC_ACM_UART_TX_DMA_SRC BOARD_APP_UART_TX_DMA_REQ
81 #define BOARD_USB_CDC_ACM_UART_RX_DMA_SRC BOARD_APP_UART_RX_DMA_REQ
82 
83 /* rtthread-nano finsh section */
84 #define BOARD_RT_CONSOLE_BASE        BOARD_CONSOLE_UART_BASE
85 
86 /* modbus sample section */
87 #define BOARD_MODBUS_UART_BASE       BOARD_APP_UART_BASE
88 #define BOARD_MODBUS_UART_CLK_NAME   BOARD_APP_UART_CLK_NAME
89 #define BOARD_MODBUS_UART_RX_DMA_REQ BOARD_APP_UART_RX_DMA_REQ
90 #define BOARD_MODBUS_UART_TX_DMA_REQ BOARD_APP_UART_TX_DMA_REQ
91 
92 /* nor flash section */
93 #define BOARD_FLASH_BASE_ADDRESS (0x80000000UL) /* Check */
94 #define BOARD_FLASH_SIZE         (SIZE_1MB)
95 
96 /* i2c section */
97 #define BOARD_APP_I2C_BASE     HPM_I2C0
98 #define BOARD_APP_I2C_IRQ      IRQn_I2C0
99 #define BOARD_APP_I2C_CLK_NAME clock_i2c0
100 #define BOARD_APP_I2C_DMA      HPM_HDMA
101 #define BOARD_APP_I2C_DMAMUX   HPM_DMAMUX
102 #define BOARD_APP_I2C_DMA_SRC  HPM_DMA_SRC_I2C0
103 
104 /* gptmr section */
105 #define BOARD_GPTMR                   HPM_GPTMR0
106 #define BOARD_GPTMR_IRQ               IRQn_GPTMR0
107 #define BOARD_GPTMR_CHANNEL           0
108 #define BOARD_GPTMR_DMA_SRC           HPM_DMA_SRC_GPTMR0_0
109 #define BOARD_GPTMR_CLK_NAME          clock_gptmr0
110 #define BOARD_GPTMR_PWM               HPM_GPTMR0
111 #define BOARD_GPTMR_PWM_CHANNEL       0
112 #define BOARD_GPTMR_PWM_DMA_SRC       HPM_DMA_SRC_GPTMR0_0
113 #define BOARD_GPTMR_PWM_CLK_NAME      clock_gptmr0
114 #define BOARD_GPTMR_PWM_IRQ           IRQn_GPTMR0
115 #define BOARD_GPTMR_PWM_SYNC          HPM_GPTMR0
116 #define BOARD_GPTMR_PWM_SYNC_CHANNEL  1
117 #define BOARD_GPTMR_PWM_SYNC_CLK_NAME clock_gptmr0
118 
119 /* User LED */
120 #define BOARD_LED_GPIO_CTRL  HPM_GPIO0
121 #define BOARD_LED_GPIO_INDEX GPIO_DI_GPIOA
122 #define BOARD_LED_GPIO_PIN   23
123 
124 #define BOARD_LED_OFF_LEVEL 1
125 #define BOARD_LED_ON_LEVEL  0
126 
127 /* 12V Power Enable for lin transceiver */
128 #define BOARD_SUPPORT_LIN_TRANSCEIVER_CONTROL 1
129 #define BOARD_12V_EN_GPIO_CTRL  HPM_GPIO0
130 #define BOARD_12V_EN_GPIO_INDEX GPIO_DI_GPIOA
131 #define BOARD_12V_EN_GPIO_PIN   24
132 #define BOARD_LIN_TRANSCEIVER_GPIO_CTRL  HPM_GPIO0
133 #define BOARD_LIN_TRANSCEIVER_GPIO_INDEX GPIO_DI_GPIOA
134 #define BOARD_LIN_TRANSCEIVER_GPIO_PIN   13
135 
136 
137 /* gpiom section */
138 #define BOARD_APP_GPIOM_BASE            HPM_GPIOM
139 #define BOARD_APP_GPIOM_USING_CTRL      HPM_FGPIO
140 #define BOARD_APP_GPIOM_USING_CTRL_NAME gpiom_core0_fast
141 
142 /* User button */
143 #define BOARD_APP_GPIO_CTRL  HPM_GPIO0
144 #define BOARD_APP_GPIO_INDEX GPIO_DI_GPIOA
145 #define BOARD_APP_GPIO_PIN   9
146 #define BOARD_APP_GPIO_IRQ   IRQn_GPIO0_A
147 
148 /* spi section */
149 #define BOARD_APP_SPI_BASE              HPM_SPI1
150 #define BOARD_APP_SPI_CLK_NAME          clock_spi1
151 #define BOARD_APP_SPI_IRQ               IRQn_SPI1
152 #define BOARD_APP_SPI_SCLK_FREQ         (20000000UL)
153 #define BOARD_APP_SPI_ADDR_LEN_IN_BYTES (1U)
154 #define BOARD_APP_SPI_DATA_LEN_IN_BITS  (8U)
155 #define BOARD_APP_SPI_RX_DMA            HPM_DMA_SRC_SPI1_RX
156 #define BOARD_APP_SPI_TX_DMA            HPM_DMA_SRC_SPI1_TX
157 #define BOARD_SPI_CS_GPIO_CTRL          HPM_GPIO0
158 #define BOARD_SPI_CS_PIN                IOC_PAD_PA26
159 #define BOARD_SPI_CS_ACTIVE_LEVEL       (0U)
160 
161 /* ADC section */
162 #define BOARD_APP_ADC16_NAME     "ADC0"
163 #define BOARD_APP_ADC16_BASE     HPM_ADC0
164 #define BOARD_APP_ADC16_IRQn     IRQn_ADC0
165 #define BOARD_APP_ADC16_CH_1     (13U)
166 #define BOARD_APP_ADC16_CLK_NAME (clock_adc0)
167 
168 #define BOARD_APP_ADC16_HW_TRIG_SRC     HPM_PWM0
169 #define BOARD_APP_ADC16_HW_TRGM         HPM_TRGM0
170 #define BOARD_APP_ADC16_HW_TRGM_IN      HPM_TRGM0_INPUT_SRC_PWM0_CH8REF
171 #define BOARD_APP_ADC16_HW_TRGM_OUT_SEQ TRGM_TRGOCFG_ADC0_STRGI
172 #define BOARD_APP_ADC16_HW_TRGM_OUT_PMT TRGM_TRGOCFG_ADCX_PTRGI0A
173 
174 #define BOARD_APP_ADC16_PMT_TRIG_CH ADC16_CONFIG_TRG0A
175 
176 /* DAC section */
177 #define BOARD_DAC_BASE           HPM_DAC0
178 #define BOARD_DAC_IRQn           IRQn_DAC0
179 #define BOARD_APP_DAC_CLOCK_NAME clock_dac0
180 
181 /* Flash section */
182 #define BOARD_APP_XPI_NOR_XPI_BASE     (HPM_XPI0)
183 #define BOARD_APP_XPI_NOR_CFG_OPT_HDR  (0xfcf90002U)
184 #define BOARD_APP_XPI_NOR_CFG_OPT_OPT0 (0x00000006U)
185 #define BOARD_APP_XPI_NOR_CFG_OPT_OPT1 (0x00001000U)
186 
187 /* SDXC section */
188 #define BOARD_APP_SDCARD_SDXC_BASE   (HPM_SDXC0)
189 #define BOARD_APP_SDCARD_SUPPORT_1V8 (0)
190 
191 /* MCAN section */
192 #define BOARD_APP_CAN_BASE HPM_MCAN3
193 #define BOARD_APP_CAN_IRQn IRQn_MCAN3
194 
195 /* CALLBACK TIMER section */
196 #define BOARD_CALLBACK_TIMER          (HPM_GPTMR3)
197 #define BOARD_CALLBACK_TIMER_CH       1
198 #define BOARD_CALLBACK_TIMER_IRQ      IRQn_GPTMR3
199 #define BOARD_CALLBACK_TIMER_CLK_NAME (clock_gptmr3)
200 
201 /* APP PWM */
202 #define BOARD_APP_PWM             HPM_PWM0
203 #define BOARD_APP_PWM_CLOCK_NAME  clock_mot0
204 #define BOARD_APP_PWM_OUT1        2
205 #define BOARD_APP_PWM_OUT2        3
206 #define BOARD_APP_TRGM            HPM_TRGM0
207 #define BOARD_APP_PWM_IRQ         IRQn_PWM0
208 #define BOARD_APP_TRGM_PWM_OUTPUT TRGM_TRGOCFG_PWM0_SYNCI
209 
210 /*BLDC pwm*/
211 /*PWM define*/
212 #define BOARD_BLDCPWM              HPM_PWM0
213 #define BOARD_BLDC_UH_PWM_OUTPIN   (6U)
214 #define BOARD_BLDC_UL_PWM_OUTPIN   (7U)
215 #define BOARD_BLDC_VH_PWM_OUTPIN   (4U)
216 #define BOARD_BLDC_VL_PWM_OUTPIN   (5U)
217 #define BOARD_BLDC_WH_PWM_OUTPIN   (2U)
218 #define BOARD_BLDC_WL_PWM_OUTPIN   (3U)
219 #define BOARD_BLDCPWM_TRGM         HPM_TRGM0
220 #define BOARD_BLDCAPP_PWM_IRQ      IRQn_PWM0
221 #define BOARD_BLDCPWM_CMP_INDEX_0  (0U)
222 #define BOARD_BLDCPWM_CMP_INDEX_1  (1U)
223 #define BOARD_BLDCPWM_CMP_INDEX_2  (2U)
224 #define BOARD_BLDCPWM_CMP_INDEX_3  (3U)
225 #define BOARD_BLDCPWM_CMP_INDEX_4  (4U)
226 #define BOARD_BLDCPWM_CMP_INDEX_5  (5U)
227 #define BOARD_BLDCPWM_CMP_INDEX_6  (6U)
228 #define BOARD_BLDCPWM_CMP_INDEX_7  (7U)
229 #define BOARD_BLDCPWM_CMP_TRIG_CMP (20U)
230 
231 /*HALL define*/
232 
233 /*RDC*/
234 #define BOARD_RDC_TRGM            HPM_TRGM0
235 #define BOARD_RDC_TRGIGMUX_IN_NUM HPM_TRGM0_INPUT_SRC_RDC_TRGO_0
236 #define BOARD_RDC_TRG_NUM         TRGM_TRGOCFG_MOT_GPIO0
237 #define BOARD_RDC_TRG_ADC_NUM     TRGM_TRGOCFG_ADCX_PTRGI0A
238 #define BOARD_RDC_ADC_I_BASE      HPM_ADC0
239 #define BOARD_RDC_ADC_Q_BASE      HPM_ADC1
240 #define BOARD_RDC_ADC_I_CHN       (5U)
241 #define BOARD_RDC_ADC_Q_CHN       (6U)
242 #define BOARD_RDC_ADC_IRQn        IRQn_ADC0
243 #define BOARD_RDC_ADC_TRIG_FLAG   adc16_event_trig_complete
244 #define BOARD_RDC_ADC_TRG         ADC16_CONFIG_TRG0A
245 
246 /*QEI*/
247 #define BOARD_BLDC_QEI_TRGM                      HPM_TRGM0
248 #define BOARD_BLDC_QEIV2_BASE                    HPM_QEI1
249 #define BOARD_BLDC_QEIV2_IRQ                     IRQn_QEI1
250 #define BOARD_BLDC_QEI_MOTOR_PHASE_COUNT_PER_REV (16U)
251 #define BOARD_BLDC_QEI_CLOCK_SOURCE              clock_mot0
252 #define BOARD_BLDC_QEI_FOC_PHASE_COUNT_PER_REV   (4000U)
253 #define BOARD_BLDC_QEI_ADC_MATRIX_ADC0           trgm_adc_matrix_output_to_qei1_adc0
254 #define BOARD_BLDC_QEI_ADC_MATRIX_ADC1           trgm_adc_matrix_output_to_qei1_adc1
255 
256 /*Timer define*/
257 #define BOARD_BLDC_TMR_1MS    HPM_GPTMR2
258 #define BOARD_BLDC_TMR_CH     0
259 #define BOARD_BLDC_TMR_CMP    0
260 #define BOARD_BLDC_TMR_IRQ    IRQn_GPTMR2
261 #define BOARD_BLDC_TMR_RELOAD (100000U)
262 
263 /*adc*/
264 #define BOARD_BLDC_ADC_MODULE    (ADCX_MODULE_ADC16)
265 #define BOARD_BLDC_ADC_U_BASE    HPM_ADC0
266 #define BOARD_BLDC_ADC_V_BASE    HPM_ADC1
267 #define BOARD_BLDC_ADC_W_BASE    HPM_ADC1
268 #define BOARD_BLDC_ADC_TRIG_FLAG adc16_event_trig_complete
269 
270 #define BOARD_BLDC_ADC_CH_U                   (5U)
271 #define BOARD_BLDC_ADC_CH_V                   (6U)
272 #define BOARD_BLDC_ADC_CH_W                   (4U)
273 #define BOARD_BLDC_ADC_IRQn                   IRQn_ADC0
274 #define BOARD_BLDC_ADC_PMT_DMA_SIZE_IN_4BYTES (ADC_SOC_PMT_MAX_DMA_BUFF_LEN_IN_4BYTES)
275 #define BOARD_BLDC_ADC_TRG                    ADC16_CONFIG_TRG0A
276 #define BOARD_BLDC_ADC_PREEMPT_TRIG_LEN       (1U)
277 #define BOARD_BLDC_PWM_TRIG_CMP_INDEX         (8U)
278 #define BOARD_BLDC_TRIGMUX_IN_NUM             HPM_TRGM0_INPUT_SRC_PWM0_CH8REF
279 #define BOARD_BLDC_TRG_NUM                    TRGM_TRGOCFG_ADCX_PTRGI0A
280 
281 #define BOARD_PLB_COUNTER              HPM_PLB
282 #define BOARD_PLB_PWM_BASE             HPM_PWM0
283 #define BOARD_PLB_PWM_CLOCK_NAME       clock_mot0
284 #define BOARD_PLB_TRGM                 HPM_TRGM0
285 #define BOARD_PLB_PWM_TRG              (HPM_TRGM0_INPUT_SRC_PWM0_CH8REF)
286 #define BOARD_PLB_IN_PWM_TRG_NUM       (TRGM_TRGOCFG_PLB_IN_00)
287 #define BOARD_PLB_IN_PWM_PULSE_TRG_NUM (TRGM_TRGOCFG_PLB_IN_02)
288 #define BOARD_PLB_OUT_TRG              (HPM_TRGM0_INPUT_SRC_PLB_OUT00)
289 #define BOARD_PLB_IO_TRG_NUM           (TRGM_TRGOCFG_MOT_GPIO2)
290 #define BOARD_PLB_IO_TRG_SHIFT         (2)
291 #define BOARD_PLB_PWM_CMP              (8U)
292 #define BOARD_PLB_PWM_CHN              (8U)
293 #define BOARD_PLB_CHN                  plb_chn0
294 
295 /* QEO */
296 #define BOARD_QEO          HPM_QEO0
297 #define BOARD_QEO_TRGM_POS trgm_pos_matrix_output_to_qeo0
298 
299 /* moto */
300 #define BOARD_MOTOR_CLK_NAME clock_mot0
301 
302 /* SEI */
303 #define BOARD_SEI      HPM_SEI
304 #define BOARD_SEI_CTRL SEI_CTRL_1
305 #define BOARD_SEI_IRQn IRQn_SEI1
306 
307 /* USB */
308 #define BOARD_USB HPM_USB0
309 
310 /* OPAMP */
311 #define BOARD_APP_OPAMP HPM_OPAMP0
312 
313 #ifndef BOARD_SHOW_CLOCK
314 #define BOARD_SHOW_CLOCK 1
315 #endif
316 #ifndef BOARD_SHOW_BANNER
317 #define BOARD_SHOW_BANNER 1
318 #endif
319 
320 /* FreeRTOS Definitions */
321 #define BOARD_FREERTOS_TIMER          HPM_GPTMR2
322 #define BOARD_FREERTOS_TIMER_CHANNEL  1
323 #define BOARD_FREERTOS_TIMER_IRQ      IRQn_GPTMR2
324 #define BOARD_FREERTOS_TIMER_CLK_NAME clock_gptmr2
325 
326 /* Threadx Definitions */
327 #define BOARD_THREADX_TIMER           HPM_GPTMR2
328 #define BOARD_THREADX_TIMER_CHANNEL   1
329 #define BOARD_THREADX_TIMER_IRQ       IRQn_GPTMR2
330 #define BOARD_THREADX_TIMER_CLK_NAME  clock_gptmr2
331 #if defined(__cplusplus)
332 extern "C" {
333 #endif /* __cplusplus */
334 
335 typedef void (*board_timer_cb)(void);
336 
337 void board_init(void);
338 void board_init_console(void);
339 void board_init_gpio_pins(void);
340 void board_init_led_pins(void);
341 void board_init_usb_pins(void);
342 void board_led_write(uint8_t state);
343 void board_led_toggle(void);
344 void board_init_uart(UART_Type *ptr);
345 uint32_t board_init_spi_clock(SPI_Type *ptr);
346 void board_init_spi_pins(SPI_Type *ptr);
347 void board_usb_vbus_ctrl(uint8_t usb_index, uint8_t level);
348 uint32_t board_init_adc16_clock(ADC16_Type *ptr, bool clk_src_ahb);
349 void board_init_adc16_pins(void);
350 uint32_t board_init_dac_clock(DAC_Type *ptr, bool clk_src_ahb);
351 void board_init_can(MCAN_Type *ptr);
352 uint32_t board_init_can_clock(MCAN_Type *ptr);
353 void board_init_rgb_pwm_pins(void);
354 void board_disable_output_rgb_led(uint8_t color);
355 void board_enable_output_rgb_led(uint8_t color);
356 void board_init_dac_pins(DAC_Type *ptr);
357 void board_write_spi_cs(uint32_t pin, uint8_t state);
358 void board_init_spi_pins_with_gpio_as_cs(SPI_Type *ptr);
359 
360 void board_init_usb_dp_dm_pins(void);
361 void board_init_clock(void);
362 void board_delay_us(uint32_t us);
363 void board_delay_ms(uint32_t ms);
364 void board_timer_create(uint32_t ms, board_timer_cb cb);
365 void board_ungate_mchtmr_at_lp_mode(void);
366 
367 uint8_t board_get_led_gpio_off_level(void);
368 uint8_t board_get_led_pwm_off_level(void);
369 
370 void board_init_pmp(void);
371 
372 uint32_t board_init_uart_clock(UART_Type *ptr);
373 void board_init_sei_pins(SEI_Type *ptr, uint8_t sei_ctrl_idx);
374 
375 void board_init_i2c(I2C_Type *ptr);
376 
377 void board_init_adc_qeiv2_pins(void);
378 
379 void board_lin_transceiver_control(bool enable);
380 uint32_t board_init_gptmr_clock(GPTMR_Type *ptr);
381 uint32_t board_init_pwm_clock(PWM_Type *ptr);
382 #if defined(__cplusplus)
383 }
384 #endif /* __cplusplus */
385 #endif /* _HPM_BOARD_H */
386