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