1 /*
2 * Copyright (C) 2020-2021 Alibaba Group Holding Limited
3 */
4
5 #ifndef AOS_UART_H
6 #define AOS_UART_H
7
8 #include <aos/tty.h>
9
10 typedef aos_tty_ref_t aos_uart_ref_t;
11
12 typedef enum {
13 AOS_UART_PARITY_NONE,
14 AOS_UART_PARITY_ODD,
15 AOS_UART_PARITY_EVEN,
16 } aos_uart_parity_t;
17
18 #define aos_uart_put aos_tty_put
19 #define aos_uart_get_attr aos_tty_get_attr
20 #define aos_uart_set_attr aos_tty_set_attr
21 #define aos_uart_read aos_tty_read
22 #define aos_uart_write aos_tty_write
23
24 #ifdef __cplusplus
25 extern "C" {
26 #endif
27
aos_uart_get(aos_uart_ref_t * ref,uint32_t id)28 static inline aos_status_t aos_uart_get(aos_uart_ref_t *ref, uint32_t id)
29 {
30 struct termios termios;
31 aos_status_t ret;
32
33 ret = aos_tty_get(ref, id);
34 if (ret)
35 return ret;
36
37 ret = aos_tty_get_attr(ref, &termios);
38 if (ret) {
39 aos_tty_put(ref);
40 return ret;
41 }
42
43 cfmakeraw(&termios);
44 termios.c_cflag |= CREAD;
45 termios.c_cc[VMIN] = 0;
46 termios.c_cc[VTIME] = 0;
47
48 ret = aos_tty_set_attr(ref, TCSANOW, &termios);
49 if (ret) {
50 aos_tty_put(ref);
51 return ret;
52 }
53
54 return 0;
55 }
56
57 static inline aos_status_t
aos_uart_get_with_attr(aos_uart_ref_t * ref,uint32_t id,uint32_t baudrate,aos_uart_parity_t parity)58 aos_uart_get_with_attr(aos_uart_ref_t *ref, uint32_t id, uint32_t baudrate, aos_uart_parity_t parity)
59 {
60 struct termios termios;
61 aos_status_t ret;
62
63 ret = aos_tty_get(ref, id);
64 if (ret)
65 return ret;
66
67 ret = aos_tty_get_attr(ref, &termios);
68 if (ret) {
69 aos_tty_put(ref);
70 return ret;
71 }
72
73 cfmakeraw(&termios);
74 termios.c_cflag |= CREAD;
75 termios.c_cflag &= ~(PARENB | PARODD);
76 termios.c_cc[VMIN] = 0;
77 termios.c_cc[VTIME] = 0;
78
79 if (cfsetspeed(&termios, baudrate)) {
80 aos_tty_put(ref);
81 return -EINVAL;
82 }
83
84 switch (parity) {
85 case AOS_UART_PARITY_NONE:
86 break;
87 case AOS_UART_PARITY_ODD:
88 termios.c_cflag |= PARENB | PARODD;
89 break;
90 case AOS_UART_PARITY_EVEN:
91 termios.c_cflag |= PARENB;
92 break;
93 default:
94 aos_tty_put(ref);
95 return -EINVAL;
96 }
97
98 ret = aos_tty_set_attr(ref, TCSANOW, &termios);
99 if (ret) {
100 aos_tty_put(ref);
101 return ret;
102 }
103
104 return 0;
105 }
106
107 #ifdef __cplusplus
108 }
109 #endif
110
111 #endif /* AOS_UART_H */
112