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