libc_core/
termios.rs

1//! This module provides the `libc` types for Termios.
2//!
3//! MUSL: <https://github.com/bminor/musl/blob/c47ad25ea3b484e10326f933e927c0bc8cded3da/arch/generic/bits/termios.h>
4
5#[repr(C)]
6#[derive(Clone, Copy, Debug)]
7/// `termios` 结构体用于控制异步通信端口(如串口、终端)的通用终端接口。
8/// 它由多个标志位和特殊字符数组组成,用于控制终端的输入、输出、控制和本地模式。
9/// MUSL: <https://github.com/bminor/musl/blob/c47ad25ea3b484e10326f933e927c0bc8cded3da/arch/generic/bits/termios.h#L1>
10pub struct Termios {
11    /// 输入模式标志(Input modes),如是否启用回显、处理换行等
12    pub iflag: InputFlags,
13    /// 输出模式标志(Output modes),如是否自动添加换行符等
14    pub oflag: OutputFlags,
15    /// 控制模式标志(Control modes),如波特率、字符长度、停止位、硬件流控制等
16    pub cflag: u32,
17    /// 本地模式标志(Local modes),如是否启用 canonical 模式、信号生成等
18    pub lflag: LocalFlags,
19    /// 行控制符,一般用于选择 `cc` 中的哪一个控制字符表示行结束符
20    pub line: u8,
21    /// 终端特殊字符数组(Control characters),如中断键、结束符、擦除符等,大小通常为 NCCS(一般为 32)
22    pub cc: [u8; 32],
23    /// 输入速度(Input speed),表示波特率
24    pub ispeed: u32,
25    /// 输出速度(Output speed),表示波特率
26    pub ospeed: u32,
27}
28
29impl Default for Termios {
30    fn default() -> Self {
31        Termios {
32            // IMAXBEL | IUTF8 | IXON | IXANY | ICRNL | BRKINT
33            iflag: InputFlags::IMAXBEL
34                | InputFlags::IUTF8
35                | InputFlags::IXON
36                | InputFlags::IXANY
37                | InputFlags::ICRNL
38                | InputFlags::BRKINT,
39            // OPOST | ONLCR
40            oflag: OutputFlags::OPOST | OutputFlags::ONLCR,
41            // HUPCL | CREAD | CSIZE | EXTB
42            // cflag: 0o2277,
43            cflag: ControlFlags::CREAD.bits() | ControlFlags::HUPCL.bits() | 0x77,
44            // IEXTEN | ECHOTCL | ECHOKE ECHO | ECHOE | ECHOK | ISIG | ICANON
45            lflag: LocalFlags::ISIG
46                | LocalFlags::ICANON
47                | LocalFlags::ECHO
48                | LocalFlags::ECHOE
49                | LocalFlags::ECHOK
50                | LocalFlags::ECHONL
51                | LocalFlags::IEXTEN,
52            line: 0,
53            cc: [
54                3,   // VINTR Ctrl-C
55                28,  // VQUIT
56                127, // VERASE
57                21,  // VKILL
58                4,   // VEOF Ctrl-D
59                0,   // VTIME
60                1,   // VMIN
61                0,   // VSWTC
62                17,  // VSTART
63                19,  // VSTOP
64                26,  // VSUSP Ctrl-Z
65                255, // VEOL
66                18,  // VREPAINT
67                15,  // VDISCARD
68                23,  // VWERASE
69                22,  // VLNEXT
70                255, // VEOL2
71                0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
72            ],
73            ispeed: 0,
74            ospeed: 0,
75        }
76    }
77}
78
79/// 控制字符索引(Control Characters Index)
80///
81/// 用于 termios 结构中 c_cc 数组,表示各种控制字符在数组中的位置。
82/// MUSL: <https://github.com/bminor/musl/blob/c47ad25ea3b484e10326f933e927c0bc8cded3da/arch/generic/bits/termios.h>
83#[repr(u8)]
84#[derive(Debug, Clone, Copy, PartialEq, Eq)]
85pub enum ControlChar {
86    /// 中断字符,通常是 Ctrl-C,用于发送中断信号
87    VINTR = 0,
88    /// 退出字符,通常是 Ctrl-\
89    VQUIT = 1,
90    /// 删除字符,通常是退格键(Backspace)
91    VERASE = 2,
92    /// 删除整行字符
93    VKILL = 3,
94    /// 文件结束字符,通常是 Ctrl-D
95    VEOF = 4,
96    /// 读取时的超时值(定时器)
97    VTIME = 5,
98    /// 读取时的最小字节数
99    VMIN = 6,
100    /// 切换字符(不常用)
101    VSWTC = 7,
102    /// 开始字符,通常是 Ctrl-Q,用于软件流控制
103    VSTART = 8,
104    /// 停止字符,通常是 Ctrl-S,用于软件流控制
105    VSTOP = 9,
106    /// 挂起字符,通常是 Ctrl-Z
107    VSUSP = 10,
108    /// 额外的行结束字符(EOL)
109    VEOL = 11,
110    /// 重新打印字符,用于重新显示当前输入行
111    VREPRINT = 12,
112    /// 丢弃输出字符
113    VDISCARD = 13,
114    /// 删除一个单词字符
115    VWERASE = 14,
116    /// 下一字符字面量输入(转义下一个字符)
117    VLNEXT = 15,
118    /// 第二个额外的行结束字符(EOL2)
119    VEOL2 = 16,
120}
121
122bitflags! {
123    /// 输入模式标志(Input Modes Flags),对应 termios 结构体中的 c_iflag 字段。
124    ///
125    /// 这些标志控制终端输入的行为,如是否忽略断开信号、是否进行流控等。
126    /// MUSL: <https://github.com/bminor/musl/blob/c47ad25ea3b484e10326f933e927c0bc8cded3da/arch/generic/bits/termios.h#L30>
127    #[derive(Debug, Clone, Copy)]
128    pub struct InputFlags: u32 {
129        /// 忽略 BREAK 条件(输入中的断开信号)
130        const IGNBRK  = 0o000001;
131        /// 在输入 BREAK 时产生中断信号
132        const BRKINT  = 0o000002;
133        /// 忽略奇偶校验错误的字符
134        const IGNPAR  = 0o000004;
135        /// 标记奇偶校验错误的字符
136        const PARMRK  = 0o000010;
137        /// 启用输入奇偶校验检查
138        const INPCK   = 0o000020;
139        /// 去除输入字符的第 8 位
140        const ISTRIP  = 0o000040;
141        /// 将输入的换行符 NL 转换为回车符 CR
142        const INLCR   = 0o000100;
143        /// 忽略输入的回车符 CR
144        const IGNCR   = 0o000200;
145        /// 将输入的回车符 CR 转换为换行符 NL
146        const ICRNL   = 0o000400;
147        /// 将大写字母转换为小写字母(已废弃,通常不使用)
148        const IUCLC   = 0o001000;
149        /// 启用 XON/XOFF 输出流控制
150        const IXON    = 0o002000;
151        /// 允许任何字符中断输出暂停(XON)
152        const IXANY   = 0o004000;
153        /// 启用 XON/XOFF 输入流控制
154        const IXOFF   = 0o010000;
155        /// 当输入缓冲区满时发出响铃
156        const IMAXBEL = 0o020000;
157        /// UTF-8 输入编码(Linux 特有)
158        const IUTF8   = 0o040000;
159    }
160
161
162    /// 输出模式标志(Output Modes Flags),对应 termios 结构体中的 c_oflag 字段。
163    ///
164    /// 这些标志用于控制终端输出的处理行为,如是否进行后处理、换行符转换等。
165    /// MUSL: <https://github.com/bminor/musl/blob/c47ad25ea3b484e10326f933e927c0bc8cded3da/arch/generic/bits/termios.h#L46>
166    #[derive(Debug, Clone, Copy)]
167    pub struct OutputFlags: u32 {
168        /// 启用输出处理(如换行符转换)
169        const OPOST  = 0o000001;
170        /// 将输出中的小写字母转换为大写字母(多数系统不使用)
171        const OLCUC  = 0o000002;
172        /// 将输出中的换行符 NL 转换为回车符 CR 加换行符 NL
173        const ONLCR  = 0o000004;
174        /// 将输出中的回车符 CR 转换为换行符 NL
175        const OCRNL  = 0o000010;
176        /// 不输出回车符 CR
177        const ONOCR  = 0o000020;
178        /// 输出换行符时不回车(不常用)
179        const ONLRET = 0o000040;
180        /// 用填充字符填充输出(如延迟输出)
181        const OFILL  = 0o000100;
182        /// 填充字符使用 DEL(0x7f)
183        const OFDEL  = 0o000200;
184
185        // 以下标志通常带条件编译,根据平台支持情况可能不同
186
187        /// 新行延迟标志掩码
188        const NLDLY  = 0o000400;
189        /// 新行延迟设置为0(无延迟)
190        const NL0    = 0o000000;
191        /// 新行延迟设置为1(延迟)
192        const NL1    = 0o000400;
193
194        /// 回车延迟标志掩码
195        const CRDLY  = 0o003000;
196        /// 回车延迟设置0(无延迟)
197        const CR0    = 0o000000;
198        /// 回车延迟设置1
199        const CR1    = 0o001000;
200        /// 回车延迟设置2
201        const CR2    = 0o002000;
202        /// 回车延迟设置3
203        const CR3    = 0o003000;
204
205        /// 制表符延迟标志掩码
206        const TABDLY = 0o014000;
207        /// 制表符延迟设置0(无延迟)
208        const TAB0   = 0o000000;
209        /// 制表符延迟设置1
210        const TAB1   = 0o004000;
211        /// 制表符延迟设置2
212        const TAB2   = 0o010000;
213        /// 制表符延迟设置3
214        const TAB3   = 0o014000;
215
216        /// 退格延迟标志掩码
217        const BSDLY  = 0o020000;
218        /// 退格延迟设置0(无延迟)
219        const BS0    = 0o000000;
220        /// 退格延迟设置1
221        const BS1    = 0o020000;
222
223        /// 换页延迟标志掩码
224        const FFDLY  = 0o100000;
225        /// 换页延迟设置0(无延迟)
226        const FF0    = 0o000000;
227        /// 换页延迟设置1
228        const FF1    = 0o100000;
229
230        /// 垂直制表延迟标志掩码
231        const VTDLY  = 0o040000;
232        /// 垂直制表延迟设置0(无延迟)
233        const VT0    = 0o000000;
234        /// 垂直制表延迟设置1
235        const VT1    = 0o040000;
236    }
237    /// 控制模式标志(Control Modes Flags),对应 termios 结构体中的 c_cflag 字段。
238    ///
239    /// 这些标志用于控制终端的硬件相关设置,如字符大小、停止位、校验以及本地连接等。
240    /// MUSL: <https://github.com/bminor/musl/blob/c47ad25ea3b484e10326f933e927c0bc8cded3da/arch/generic/bits/termios.h#L113>
241    #[derive(Debug, Clone, Copy)]
242    pub struct ControlFlags: u32 {
243        /// 字符大小掩码(用于选择 CS5、CS6、CS7 或 CS8)
244        const CSIZE  = 0o000060;
245        /// 字符大小:5 位
246        const CS5    = 0o000000;
247        /// 字符大小:6 位
248        const CS6    = 0o000020;
249        /// 字符大小:7 位
250        const CS7    = 0o000040;
251        /// 字符大小:8 位
252        const CS8    = 0o000060;
253        /// 发送两位停止位,默认是一位停止位
254        const CSTOPB = 0o000100;
255        /// 启用接收器
256        const CREAD  = 0o000200;
257        /// 启用奇偶校验位
258        const PARENB = 0o000400;
259        /// 奇偶校验为奇校验,默认是偶校验
260        const PARODD = 0o001000;
261        /// 关闭调制解调器挂断控制(保持连接)
262        const HUPCL  = 0o002000;
263        /// 忽略调制解调器状态线,允许本地连接
264        const CLOCAL = 0o004000;
265    }
266    /// 本地模式标志(Local Modes Flags),对应 termios 结构体中的 c_lflag 字段。
267    ///
268    /// 这些标志控制终端的本地行为,如信号产生、行编辑、回显等。
269    /// MUSL: <https://github.com/bminor/musl/blob/c47ad25ea3b484e10326f933e927c0bc8cded3da/arch/generic/bits/termios.h#L125>
270    #[derive(Debug, Clone, Copy)]
271    pub struct LocalFlags: u32 {
272        /// 允许产生信号,如 INTR, QUIT, SUSP
273        const ISIG   = 0o000001;
274        /// 启用标准模式(规范模式)输入,即行缓冲和行编辑
275        const ICANON = 0o000002;
276        /// 启用输入字符回显
277        const ECHO   = 0o000010;
278        /// 启用 ERASE 字符的回显效果(擦除字符时,光标左移)
279        const ECHOE  = 0o000020;
280        /// 输入 KILL 字符时回显一个新行
281        const ECHOK  = 0o000040;
282        /// 在新行输入时回显换行符
283        const ECHONL = 0o000100;
284        /// 禁止输入或输出时刷新终端队列
285        const NOFLSH = 0o000200;
286        /// 背景进程尝试写终端时发送 SIGTTOU 信号
287        const TOSTOP = 0o000400;
288        /// 启用扩展功能处理,如实现特殊控制字符(如 VDISCARD)
289        const IEXTEN = 0o100000;
290    }
291
292}
293
294/// 波特率常量(Baud Rate Constants),用于设置串口通信的波特率。
295#[allow(missing_docs)]
296#[repr(u32)]
297#[derive(Debug, Clone, Copy, PartialEq, Eq)]
298pub enum BaudRate {
299    B0 = 0o000000,
300    B50 = 0o000001,
301    B75 = 0o000002,
302    B110 = 0o000003,
303    B134 = 0o000004,
304    B150 = 0o000005,
305    B200 = 0o000006,
306    B300 = 0o000007,
307    B600 = 0o000010,
308    B1200 = 0o000011,
309    B1800 = 0o000012,
310    B2400 = 0o000013,
311    B4800 = 0o000014,
312    B9600 = 0o000015,
313    B19200 = 0o000016,
314    B38400 = 0o000017,
315    B57600 = 0o100001,
316    B115200 = 0o100002,
317    B230400 = 0o100003,
318    B460800 = 0o100004,
319    B500000 = 0o100005,
320    B576000 = 0o100006,
321    B921600 = 0o100007,
322    B1000000 = 0o100010,
323    B1152000 = 0o100011,
324    B1500000 = 0o100012,
325    B2000000 = 0o100013,
326    B2500000 = 0o100014,
327    B3000000 = 0o100015,
328    B3500000 = 0o100016,
329    B4000000 = 0o100017,
330}