1 /*
2 * Copyright (c) 2006-2025, RT-Thread Development Team
3 *
4 * SPDX-License-Identifier: Apache-2.0
5 *
6 * Change Logs:
7 * Date Author Notes
8 * 2021-07-29 KyleChan first version
9 * 2023-10-17 Rbb666 add ra8 adapt
10 * 2024-03-11 Wangyuqiang add rzt/rzn adapt
11 */
12
13 #include <drv_usart_v2.h>
14
15 #ifdef RT_USING_SERIAL_V2
16
17 //#define DRV_DEBUG
18 #define DBG_TAG "drv.usart"
19 #ifdef DRV_DEBUG
20 #define DBG_LVL DBG_LOG
21 #else
22 #define DBG_LVL DBG_INFO
23 #endif /* DRV_DEBUG */
24 #include <rtdbg.h>
25
26 static struct ra_uart_config uart_config[] =
27 {
28 #ifdef BSP_USING_UART0
29 UART0_CONFIG,
30 #endif
31
32 #ifdef BSP_USING_UART1
33 UART1_CONFIG,
34 #endif
35
36 #ifdef BSP_USING_UART2
37 UART2_CONFIG,
38 #endif
39
40 #ifdef BSP_USING_UART3
41 UART3_CONFIG,
42 #endif
43
44 #ifdef BSP_USING_UART4
45 UART4_CONFIG,
46 #endif
47
48 #ifdef BSP_USING_UART5
49 UART5_CONFIG,
50 #endif
51
52 #ifdef BSP_USING_UART6
53 UART6_CONFIG,
54 #endif
55
56 #ifdef BSP_USING_UART7
57 UART7_CONFIG,
58 #endif
59
60 #ifdef BSP_USING_UART8
61 UART8_CONFIG,
62 #endif
63
64 #ifdef BSP_USING_UART9
65 UART9_CONFIG,
66 #endif
67 };
68
69 enum
70 {
71 #ifdef BSP_USING_UART0
72 UART0_INDEX,
73 #endif
74
75 #ifdef BSP_USING_UART1
76 UART1_INDEX,
77 #endif
78
79 #ifdef BSP_USING_UART2
80 UART2_INDEX,
81 #endif
82
83 #ifdef BSP_USING_UART3
84 UART3_INDEX,
85 #endif
86
87 #ifdef BSP_USING_UART4
88 UART4_INDEX,
89 #endif
90
91 #ifdef BSP_USING_UART5
92 UART5_INDEX,
93 #endif
94
95 #ifdef BSP_USING_UART6
96 UART6_INDEX,
97 #endif
98
99 #ifdef BSP_USING_UART7
100 UART7_INDEX,
101 #endif
102
103 #ifdef BSP_USING_UART8
104 UART8_INDEX,
105 #endif
106
107 #ifdef BSP_USING_UART9
108 UART9_INDEX,
109 #endif
110 };
111
112 static struct ra_uart uart_obj[sizeof(uart_config) / sizeof(uart_config[0])] = {0};
113
ra_uart_get_config(void)114 static void ra_uart_get_config(void)
115 {
116 struct serial_configure config = RT_SERIAL_CONFIG_DEFAULT;
117
118 #ifdef BSP_USING_UART0
119 uart_obj[UART0_INDEX].serial.config = config;
120 uart_obj[UART0_INDEX].uart_dma_flag = 0;
121
122 uart_obj[UART0_INDEX].serial.config.rx_bufsz = BSP_UART0_RX_BUFSIZE;
123 uart_obj[UART0_INDEX].serial.config.tx_bufsz = BSP_UART0_TX_BUFSIZE;
124 #endif
125
126 #ifdef BSP_USING_UART1
127 uart_obj[UART1_INDEX].serial.config = config;
128 uart_obj[UART1_INDEX].uart_dma_flag = 0;
129
130 uart_obj[UART1_INDEX].serial.config.rx_bufsz = BSP_UART1_RX_BUFSIZE;
131 uart_obj[UART1_INDEX].serial.config.tx_bufsz = BSP_UART1_TX_BUFSIZE;
132 #endif
133
134 #ifdef BSP_USING_UART2
135 uart_obj[UART2_INDEX].serial.config = config;
136 uart_obj[UART2_INDEX].uart_dma_flag = 0;
137
138 uart_obj[UART2_INDEX].serial.config.rx_bufsz = BSP_UART2_RX_BUFSIZE;
139 uart_obj[UART2_INDEX].serial.config.tx_bufsz = BSP_UART2_TX_BUFSIZE;
140 #endif
141
142 #ifdef BSP_USING_UART3
143 uart_obj[UART3_INDEX].serial.config = config;
144 uart_obj[UART3_INDEX].uart_dma_flag = 0;
145
146 uart_obj[UART3_INDEX].serial.config.rx_bufsz = BSP_UART3_RX_BUFSIZE;
147 uart_obj[UART3_INDEX].serial.config.tx_bufsz = BSP_UART3_TX_BUFSIZE;
148 #endif
149
150 #ifdef BSP_USING_UART4
151 uart_obj[UART4_INDEX].serial.config = config;
152 uart_obj[UART4_INDEX].uart_dma_flag = 0;
153
154 uart_obj[UART4_INDEX].serial.config.rx_bufsz = BSP_UART4_RX_BUFSIZE;
155 uart_obj[UART4_INDEX].serial.config.tx_bufsz = BSP_UART4_TX_BUFSIZE;
156 #endif
157
158 #ifdef BSP_USING_UART5
159 uart_obj[UART5_INDEX].serial.config = config;
160 uart_obj[UART5_INDEX].uart_dma_flag = 0;
161
162 uart_obj[UART5_INDEX].serial.config.rx_bufsz = BSP_UART5_RX_BUFSIZE;
163 uart_obj[UART5_INDEX].serial.config.tx_bufsz = BSP_UART5_TX_BUFSIZE;
164 #endif
165
166 #ifdef BSP_USING_UART6
167 uart_obj[UART6_INDEX].serial.config = config;
168 uart_obj[UART6_INDEX].uart_dma_flag = 0;
169
170 uart_obj[UART6_INDEX].serial.config.rx_bufsz = BSP_UART6_RX_BUFSIZE;
171 uart_obj[UART6_INDEX].serial.config.tx_bufsz = BSP_UART6_TX_BUFSIZE;
172 #endif
173
174 #ifdef BSP_USING_UART7
175 uart_obj[UART7_INDEX].serial.config = config;
176 uart_obj[UART7_INDEX].uart_dma_flag = 0;
177
178 uart_obj[UART7_INDEX].serial.config.rx_bufsz = BSP_UART7_RX_BUFSIZE;
179 uart_obj[UART7_INDEX].serial.config.tx_bufsz = BSP_UART7_TX_BUFSIZE;
180 #endif
181
182 #ifdef BSP_USING_UART8
183 uart_obj[UART8_INDEX].serial.config = config;
184 uart_obj[UART8_INDEX].uart_dma_flag = 0;
185
186 uart_obj[UART8_INDEX].serial.config.rx_bufsz = BSP_UART8_RX_BUFSIZE;
187 uart_obj[UART8_INDEX].serial.config.tx_bufsz = BSP_UART8_TX_BUFSIZE;
188 #endif
189
190 #ifdef BSP_USING_UART9
191 uart_obj[UART9_INDEX].serial.config = config;
192 uart_obj[UART9_INDEX].uart_dma_flag = 0;
193
194 uart_obj[UART9_INDEX].serial.config.rx_bufsz = BSP_UART9_RX_BUFSIZE;
195 uart_obj[UART9_INDEX].serial.config.tx_bufsz = BSP_UART9_TX_BUFSIZE;
196 #endif
197 }
198
199
200 /*
201 * UART interface
202 */
ra_uart_configure(struct rt_serial_device * serial,struct serial_configure * cfg)203 static rt_err_t ra_uart_configure(struct rt_serial_device *serial, struct serial_configure *cfg)
204 {
205 struct ra_uart *uart;
206 RT_ASSERT(serial != RT_NULL);
207 RT_ASSERT(cfg != RT_NULL);
208
209 fsp_err_t err = FSP_SUCCESS;
210
211 uart = rt_container_of(serial, struct ra_uart, serial);
212 RT_ASSERT(uart != RT_NULL);
213
214 #ifdef SOC_SERIES_R7FA8M85
215 err = R_SCI_B_UART_Open(uart->config->p_api_ctrl, uart->config->p_cfg);
216 #else
217 err = R_SCI_UART_Open(uart->config->p_api_ctrl, uart->config->p_cfg);
218 #endif
219 if (FSP_SUCCESS != err)
220 {
221 return -RT_ERROR;
222 }
223
224 return RT_EOK;
225 }
226
ra_uart_control(struct rt_serial_device * serial,int cmd,void * arg)227 static rt_err_t ra_uart_control(struct rt_serial_device *serial, int cmd, void *arg)
228 {
229 return RT_EOK;
230 }
231
ra_uart_putc(struct rt_serial_device * serial,char c)232 static int ra_uart_putc(struct rt_serial_device *serial, char c)
233 {
234 struct ra_uart *uart;
235 RT_ASSERT(serial != RT_NULL);
236
237 uart = rt_container_of(serial, struct ra_uart, serial);
238 RT_ASSERT(uart != RT_NULL);
239
240 #ifdef SOC_SERIES_R7FA8M85
241 sci_b_uart_instance_ctrl_t *p_ctrl = (sci_b_uart_instance_ctrl_t *)uart->config->p_api_ctrl;
242 #else
243 sci_uart_instance_ctrl_t *p_ctrl = (sci_uart_instance_ctrl_t *)uart->config->p_api_ctrl;
244 #endif
245
246 p_ctrl->p_reg->TDR = c;
247
248 #if defined(SOC_SERIES_R7FA8M85) || defined(SOC_SERIES_R9A07G0)
249 while ((p_ctrl->p_reg->CSR_b.TEND) == 0);
250 #else
251 while ((p_ctrl->p_reg->SSR_b.TEND) == 0);
252 #endif
253
254 return RT_EOK;
255 }
256
ra_uart_getc(struct rt_serial_device * serial)257 static int ra_uart_getc(struct rt_serial_device *serial)
258 {
259 return RT_EOK;
260 }
261
ra_uart_transmit(struct rt_serial_device * serial,rt_uint8_t * buf,rt_size_t size,rt_uint32_t tx_flag)262 static rt_ssize_t ra_uart_transmit(struct rt_serial_device *serial,
263 rt_uint8_t *buf,
264 rt_size_t size,
265 rt_uint32_t tx_flag)
266 {
267 struct ra_uart *uart;
268
269 RT_ASSERT(serial != RT_NULL);
270 RT_ASSERT(buf != RT_NULL);
271 uart = rt_container_of(serial, struct ra_uart, serial);
272 RT_ASSERT(uart != RT_NULL);
273
274 ra_uart_control(serial, RT_DEVICE_CTRL_SET_INT, (void *)tx_flag);
275
276 return size;
277 }
278
279 #ifdef BSP_USING_UART0
user_uart0_callback(uart_callback_args_t * p_args)280 void user_uart0_callback(uart_callback_args_t *p_args)
281 {
282 rt_interrupt_enter();
283
284 struct rt_serial_device *serial = &uart_obj[UART0_INDEX].serial;
285 RT_ASSERT(serial != RT_NULL);
286
287 if (UART_EVENT_RX_CHAR == p_args->event)
288 {
289 char chr = p_args->data;
290 rt_hw_serial_control_isr(serial, RT_HW_SERIAL_CTRL_PUTC, &chr);
291
292 rt_hw_serial_isr(serial, RT_SERIAL_EVENT_RX_IND);
293 }
294
295 rt_interrupt_leave();
296 }
297 #endif
298
299 #ifdef BSP_USING_UART1
user_uart1_callback(uart_callback_args_t * p_args)300 void user_uart1_callback(uart_callback_args_t *p_args)
301 {
302 rt_interrupt_enter();
303
304 struct rt_serial_device *serial = &uart_obj[UART1_INDEX].serial;
305 RT_ASSERT(serial != RT_NULL);
306
307 if (UART_EVENT_RX_CHAR == p_args->event)
308 {
309 char chr = p_args->data;
310 rt_hw_serial_control_isr(serial, RT_HW_SERIAL_CTRL_PUTC, &chr);
311 rt_hw_serial_isr(serial, RT_SERIAL_EVENT_RX_IND);
312 }
313
314 rt_interrupt_leave();
315 }
316 #endif
317
318 #ifdef BSP_USING_UART2
user_uart2_callback(uart_callback_args_t * p_args)319 void user_uart2_callback(uart_callback_args_t *p_args)
320 {
321 rt_interrupt_enter();
322
323 struct rt_serial_device *serial = &uart_obj[UART2_INDEX].serial;
324 RT_ASSERT(serial != RT_NULL);
325
326 if (UART_EVENT_RX_CHAR == p_args->event)
327 {
328 char chr = p_args->data;
329 rt_hw_serial_control_isr(serial, RT_HW_SERIAL_CTRL_PUTC, &chr);
330 rt_hw_serial_isr(serial, RT_SERIAL_EVENT_RX_IND);
331 }
332
333 rt_interrupt_leave();
334 }
335 #endif
336
337 #ifdef BSP_USING_UART3
user_uart3_callback(uart_callback_args_t * p_args)338 void user_uart3_callback(uart_callback_args_t *p_args)
339 {
340 rt_interrupt_enter();
341
342 struct rt_serial_device *serial = &uart_obj[UART3_INDEX].serial;
343 RT_ASSERT(serial != RT_NULL);
344
345 if (UART_EVENT_RX_CHAR == p_args->event)
346 {
347 char chr = p_args->data;
348 rt_hw_serial_control_isr(serial, RT_HW_SERIAL_CTRL_PUTC, &chr);
349 rt_hw_serial_isr(serial, RT_SERIAL_EVENT_RX_IND);
350 }
351
352 rt_interrupt_leave();
353 }
354 #endif
355
356 #ifdef BSP_USING_UART4
user_uart4_callback(uart_callback_args_t * p_args)357 void user_uart4_callback(uart_callback_args_t *p_args)
358 {
359 rt_interrupt_enter();
360
361 struct rt_serial_device *serial = &uart_obj[UART4_INDEX].serial;
362 RT_ASSERT(serial != RT_NULL);
363
364 if (UART_EVENT_RX_CHAR == p_args->event)
365 {
366 char chr = p_args->data;
367 rt_hw_serial_control_isr(serial, RT_HW_SERIAL_CTRL_PUTC, &chr);
368 rt_hw_serial_isr(serial, RT_SERIAL_EVENT_RX_IND);
369 }
370
371 rt_interrupt_leave();
372 }
373 #endif
374
375 #ifdef BSP_USING_UART5
user_uart5_callback(uart_callback_args_t * p_args)376 void user_uart5_callback(uart_callback_args_t *p_args)
377 {
378 rt_interrupt_enter();
379
380 struct rt_serial_device *serial = &uart_obj[UART5_INDEX].serial;
381 RT_ASSERT(serial != RT_NULL);
382
383 if (UART_EVENT_RX_CHAR == p_args->event)
384 {
385 char chr = p_args->data;
386 rt_hw_serial_control_isr(serial, RT_HW_SERIAL_CTRL_PUTC, &chr);
387 rt_hw_serial_isr(serial, RT_SERIAL_EVENT_RX_IND);
388 }
389
390 rt_interrupt_leave();
391 }
392 #endif
393
394 #ifdef BSP_USING_UART6
user_uart6_callback(uart_callback_args_t * p_args)395 void user_uart6_callback(uart_callback_args_t *p_args)
396 {
397 rt_interrupt_enter();
398
399 struct rt_serial_device *serial = &uart_obj[UART6_INDEX].serial;
400 RT_ASSERT(serial != RT_NULL);
401
402 if (UART_EVENT_RX_CHAR == p_args->event)
403 {
404 char chr = p_args->data;
405 rt_hw_serial_control_isr(serial, RT_HW_SERIAL_CTRL_PUTC, &chr);
406 rt_hw_serial_isr(serial, RT_SERIAL_EVENT_RX_IND);
407 }
408
409 rt_interrupt_leave();
410 }
411 #endif
412
413 #ifdef BSP_USING_UART7
user_uart7_callback(uart_callback_args_t * p_args)414 void user_uart7_callback(uart_callback_args_t *p_args)
415 {
416 rt_interrupt_enter();
417
418 struct rt_serial_device *serial = &uart_obj[UART7_INDEX].serial;
419 RT_ASSERT(serial != RT_NULL);
420
421 if (UART_EVENT_RX_CHAR == p_args->event)
422 {
423 char chr = p_args->data;
424 rt_hw_serial_control_isr(serial, RT_HW_SERIAL_CTRL_PUTC, &chr);
425 rt_hw_serial_isr(serial, RT_SERIAL_EVENT_RX_IND);
426 }
427
428 rt_interrupt_leave();
429 }
430 #endif
431
432 #ifdef BSP_USING_UART8
user_uart8_callback(uart_callback_args_t * p_args)433 void user_uart8_callback(uart_callback_args_t *p_args)
434 {
435 rt_interrupt_enter();
436
437 struct rt_serial_device *serial = &uart_obj[UART8_INDEX].serial;
438 RT_ASSERT(serial != RT_NULL);
439
440 if (UART_EVENT_RX_CHAR == p_args->event)
441 {
442 char chr = p_args->data;
443 rt_hw_serial_control_isr(serial, RT_HW_SERIAL_CTRL_PUTC, &chr);
444 rt_hw_serial_isr(serial, RT_SERIAL_EVENT_RX_IND);
445 }
446
447 rt_interrupt_leave();
448 }
449 #endif
450
451 #ifdef BSP_USING_UART9
user_uart9_callback(uart_callback_args_t * p_args)452 void user_uart9_callback(uart_callback_args_t *p_args)
453 {
454 rt_interrupt_enter();
455
456 struct rt_serial_device *serial = &uart_obj[UART9_INDEX].serial;
457 RT_ASSERT(serial != RT_NULL);
458
459 if (UART_EVENT_RX_CHAR == p_args->event)
460 {
461 char chr = p_args->data;
462 rt_hw_serial_control_isr(serial, RT_HW_SERIAL_CTRL_PUTC, &chr);
463 rt_hw_serial_isr(serial, RT_SERIAL_EVENT_RX_IND);
464 }
465
466 rt_interrupt_leave();
467 }
468 #endif
469
470 static const struct rt_uart_ops ra_uart_ops =
471 {
472 .configure = ra_uart_configure,
473 .control = ra_uart_control,
474 .putc = ra_uart_putc,
475 .getc = ra_uart_getc,
476 .transmit = ra_uart_transmit
477 };
478
479
rt_hw_usart_init(void)480 int rt_hw_usart_init(void)
481 {
482 rt_err_t result = 0;
483 rt_size_t obj_num = sizeof(uart_obj) / sizeof(struct ra_uart);
484
485 ra_uart_get_config();
486 for (int i = 0; i < obj_num; i++)
487 {
488 /* init UART object */
489 uart_obj[i].config = &uart_config[i];
490 uart_obj[i].serial.ops = &ra_uart_ops;
491 /* register UART device */
492 result = rt_hw_serial_register(&uart_obj[i].serial,
493 uart_obj[i].config->name,
494 RT_DEVICE_FLAG_RDWR,
495 NULL);
496 RT_ASSERT(result == RT_EOK);
497 }
498
499 return result;
500 }
501
502 #endif /* RT_USING_SERIAL_V2 */
503