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