summaryrefslogtreecommitdiff
path: root/bsp/renesas/libraries/HAL_Drivers/nano/drv_console.c
blob: 1a1eede7bcf96ef02b7866455909075f4ebe5b4c (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
/*
 * Copyright (c) 2006-2025, RT-Thread Development Team
 *
 * SPDX-License-Identifier: Apache-2.0
 *
 * Change Logs:
 * Date           Author       Notes
 * 2025-08-20     kurisaw      First version
 */

#include <rtthread.h>
#include <rthw.h>
#include <hal_data.h>

#if defined(RT_USING_CONSOLE) && defined(RT_USING_SEMAPHORE)

struct rt_semaphore console_sem;

#if defined(RT_NANO_CONSOLE_UART0)
#define renesas_uart_ctrl       g_uart0_ctrl
#define renesas_uart_cfg        g_uart0_cfg
#define renesas_uart_callback   user_uart0_callback
#elif defined(RT_NANO_CONSOLE_UART1)
#define renesas_uart_ctrl       g_uart1_ctrl
#define renesas_uart_cfg        g_uart1_cfg
#define renesas_uart_callback   user_uart1_callback
#elif defined(RT_NANO_CONSOLE_UART2)
#define renesas_uart_ctrl       g_uart2_ctrl
#define renesas_uart_cfg        g_uart2_cfg
#define renesas_uart_callback   user_uart2_callback
#elif defined(RT_NANO_CONSOLE_UART3)
#define renesas_uart_ctrl       g_uart3_ctrl
#define renesas_uart_cfg        g_uart3_cfg
#define renesas_uart_callback   user_uart3_callback
#elif defined(RT_NANO_CONSOLE_UART4)
#define renesas_uart_ctrl       g_uart4_ctrl
#define renesas_uart_cfg        g_uart4_cfg
#define renesas_uart_callback   user_uart4_callback
#elif defined(RT_NANO_CONSOLE_UART5)
#define renesas_uart_ctrl       g_uart5_ctrl
#define renesas_uart_cfg        g_uart5_cfg
#define renesas_uart_callback   user_uart5_callback
#elif defined(RT_NANO_CONSOLE_UART6)
#define renesas_uart_ctrl       g_uart6_ctrl
#define renesas_uart_cfg        g_uart6_cfg
#define renesas_uart_callback   user_uart6_callback
#elif defined(RT_NANO_CONSOLE_UART7)
#define renesas_uart_ctrl       g_uart7_ctrl
#define renesas_uart_cfg        g_uart7_cfg
#define renesas_uart_callback   user_uart7_callback
#elif defined(RT_NANO_CONSOLE_UART8)
#define renesas_uart_ctrl       g_uart8_ctrl
#define renesas_uart_cfg        g_uart8_cfg
#define renesas_uart_callback   user_uart8_callback
#elif defined(RT_NANO_CONSOLE_UART9)
#define renesas_uart_ctrl       g_uart9_ctrl
#define renesas_uart_cfg        g_uart9_cfg
#define renesas_uart_callback   user_uart9_callback
#endif

void rt_hw_console_init(void)
{
    fsp_err_t err = FSP_SUCCESS;
    rt_err_t res = RT_EOK;

    res = rt_sem_init(&console_sem, "console", 0, RT_IPC_FLAG_FIFO);
    RT_ASSERT(res == RT_EOK);

    /* Initialize UART using FSP */
#ifdef SOC_SERIES_R7FA8M85
    err = R_SCI_B_UART_Open(&renesas_uart_ctrl, &renesas_uart_cfg);
#else
    err = R_SCI_UART_Open(&renesas_uart_ctrl, &renesas_uart_cfg);
#endif
    if (FSP_SUCCESS != err)
    {
        while (1); /* Trap on failure */
    }
    return;
}

void console_send_byte(uint8_t ch)
{
    renesas_uart_ctrl.p_reg->TDR = ch;
#if defined(SOC_SERIES_R7FA8M85) || defined(SOC_SERIES_R9A07G0)
    while ((renesas_uart_ctrl.p_reg->CSR_b.TEND) == 0);
#else
    while ((renesas_uart_ctrl.p_reg->SSR_b.TEND) == 0);
#endif
}

void rt_hw_console_output(const char *str)
{
    rt_size_t i = 0, size = 0;
    char a = '\r';

    size = rt_strlen(str);

    for (i = 0; i < size; i++)
    {
        if (*(str + i) == '\n')
        {
            console_send_byte((uint8_t) a);
        }
        console_send_byte(*(str + i));
    }
}

void renesas_uart_callback(uart_callback_args_t *p_args)
{
    /* Handle the UART event */
    switch (p_args->event)
    {
        /* Received a character or receive completed */
        case UART_EVENT_RX_CHAR:
        case UART_EVENT_RX_COMPLETE:
            rt_sem_release(&console_sem);
            break;

        default:
            break;
    }
}

char rt_hw_console_getchar(void)
{
    int ch = -1;
    rt_sem_take(&console_sem, RT_WAITING_FOREVER);
#ifdef SOC_SERIES_R7FA8M85
    fsp_err_t ret = R_SCI_B_UART_Read(&renesas_uart_ctrl, (uint8_t *)&ch, 1);
#else
    fsp_err_t ret = R_SCI_UART_Read(&renesas_uart_ctrl, (uint8_t *)&ch, 1);
#endif
    if(ret != FSP_SUCCESS)
    {
        ch = -1;
        rt_thread_mdelay(10);
    }
    return ch;
}
#endif