1 /*
2 * Copyright (c) 2019-2025 Allwinner Technology Co., Ltd. ALL rights reserved.
3 *
4 * Allwinner is a trademark of Allwinner Technology Co.,Ltd., registered in
5 * the the people's Republic of China and other countries.
6 * All Allwinner Technology Co.,Ltd. trademarks are used with permission.
7 *
8 * DISCLAIMER
9 * THIRD PARTY LICENCES MAY BE REQUIRED TO IMPLEMENT THE SOLUTION/PRODUCT.
10 * IF YOU NEED TO INTEGRATE THIRD PARTY'S TECHNOLOGY (SONY, DTS, DOLBY, AVS OR MPEGLA, ETC.)
11 * IN ALLWINNERS'SDK OR PRODUCTS, YOU SHALL BE SOLELY RESPONSIBLE TO OBTAIN
12 * ALL APPROPRIATELY REQUIRED THIRD PARTY LICENCES.
13 * ALLWINNER SHALL HAVE NO WARRANTY, INDEMNITY OR OTHER OBLIGATIONS WITH RESPECT TO MATTERS
14 * COVERED UNDER ANY REQUIRED THIRD PARTY LICENSE.
15 * YOU ARE SOLELY RESPONSIBLE FOR YOUR USAGE OF THIRD PARTY'S TECHNOLOGY.
16 *
17 *
18 * THIS SOFTWARE IS PROVIDED BY ALLWINNER"AS IS" AND TO THE MAXIMUM EXTENT
19 * PERMITTED BY LAW, ALLWINNER EXPRESSLY DISCLAIMS ALL WARRANTIES OF ANY KIND,
20 * WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING WITHOUT LIMITATION REGARDING
21 * THE TITLE, NON-INFRINGEMENT, ACCURACY, CONDITION, COMPLETENESS, PERFORMANCE
22 * OR MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
23 * IN NO EVENT SHALL ALLWINNER BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
24 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
25 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
26 * LOSS OF USE, DATA, OR PROFITS, OR BUSINESS INTERRUPTION)
27 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
28 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
29 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
30 * OF THE POSSIBILITY OF SUCH DAMAGE.
31 */
32 
33 #include <stdio.h>
34 #include <stdlib.h>
35 #include <stdint.h>
36 #include <string.h>
37 
38 #include <hal_log.h>
39 #include <hal_cmd.h>
40 #include <hal_timer.h>
41 #include <hal_uart.h>
42 
cmd_usage(void)43 static void cmd_usage(void)
44 {
45     printf("Usage:\n"
46         "\t hal_uart <port> <baudrate>\n");
47 }
48 
cmd_test_uart(int argc,char ** argv)49 int cmd_test_uart(int argc, char **argv)
50 {
51     char tbuf[6] = {"hello"};
52     uint8_t rbuf[10] = {0};
53     uart_port_t port;
54     uint32_t baudrate;
55     _uart_config_t uart_config;
56     int i;
57 
58     hal_log_info("Testing UART in loopback mode");
59 
60     if (argc != 3) {
61         cmd_usage();
62         return -1;
63     }
64 
65     port = strtol(argv[1], NULL, 0);
66     baudrate = strtol(argv[2], NULL, 0);
67 
68     memset(rbuf, 0, 10 * sizeof(uint8_t));
69 
70     switch (baudrate) {
71     case 4800:
72         uart_config.baudrate = UART_BAUDRATE_4800;
73         break;
74 
75     case 9600:
76         uart_config.baudrate = UART_BAUDRATE_9600;
77         break;
78 
79     case 115200:
80         uart_config.baudrate = UART_BAUDRATE_115200;
81         break;
82 
83     default:
84         hal_log_info("Using default baudrate: 115200");
85         uart_config.baudrate = UART_BAUDRATE_115200;
86         break;
87     }
88 
89     uart_config.word_length = UART_WORD_LENGTH_8;
90     uart_config.stop_bit = UART_STOP_BIT_1;
91     uart_config.parity = UART_PARITY_NONE;
92 
93     hal_uart_init(port);
94     hal_uart_control(port, 0, &uart_config);
95     hal_uart_disable_flowcontrol(port);
96     hal_uart_set_loopback(port, 1);
97 
98     /* send */
99     hal_uart_send(port, tbuf, 5);
100 
101     /* loopback receive */
102     hal_uart_receive(port, rbuf, 5);
103 
104     printf("Sending:");
105     for (i = 0; i < 5; i++)
106         printf("%c", tbuf[i]);
107     printf("\n");
108 
109     printf("Receiving:");
110     for (i = 0; i < 5; i++)
111         printf("%c", rbuf[i]);
112     printf("\n");
113 
114     /* verify data */
115     for (i = 0; i < 5; i++) {
116         if (tbuf[i] != rbuf[i])
117             break;
118     }
119     if (i == 5) {
120         hal_log_info("Test hal_uart_init API success!");
121         hal_log_info("Test hal_uart_control API success!");
122         hal_log_info("Test hal_uart_disable_flowcontrol API success!");
123         hal_log_info("Test hal_uart_set_loopback API success!");
124         hal_log_info("Test hal_uart_send API success!");
125         hal_log_info("Test hal_uart_receive API success!");
126         hal_log_info("Test hal_uart_deinit API success!");
127         hal_log_info("Test uart hal APIs success!");
128     } else {
129         hal_log_info("Test uart hal APIs failed!");
130     }
131 
132     hal_msleep(1000);
133     hal_uart_deinit(port);
134 
135     return 0;
136 }
137 
138 FINSH_FUNCTION_EXPORT_CMD(cmd_test_uart, hal_uart, uart hal APIs tests)
139