libc_core/
termios.rs

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
//! This module provides the `libc` types for Termios.
//!
//! MUSL: <https://github.com/bminor/musl/blob/c47ad25ea3b484e10326f933e927c0bc8cded3da/arch/generic/bits/termios.h>

#[repr(C)]
#[derive(Clone, Copy, Debug)]
/// `termios` 结构体用于控制异步通信端口(如串口、终端)的通用终端接口。
/// 它由多个标志位和特殊字符数组组成,用于控制终端的输入、输出、控制和本地模式。
/// MUSL: <https://github.com/bminor/musl/blob/c47ad25ea3b484e10326f933e927c0bc8cded3da/arch/generic/bits/termios.h#L1>
pub struct Termios {
    /// 输入模式标志(Input modes),如是否启用回显、处理换行等
    pub iflag: InputFlags,
    /// 输出模式标志(Output modes),如是否自动添加换行符等
    pub oflag: OutputFlags,
    /// 控制模式标志(Control modes),如波特率、字符长度、停止位、硬件流控制等
    pub cflag: u32,
    /// 本地模式标志(Local modes),如是否启用 canonical 模式、信号生成等
    pub lflag: LocalFlags,
    /// 行控制符,一般用于选择 `cc` 中的哪一个控制字符表示行结束符
    pub line: u8,
    /// 终端特殊字符数组(Control characters),如中断键、结束符、擦除符等,大小通常为 NCCS(一般为 32)
    pub cc: [u8; 32],
    /// 输入速度(Input speed),表示波特率
    pub ispeed: u32,
    /// 输出速度(Output speed),表示波特率
    pub ospeed: u32,
}

impl Default for Termios {
    fn default() -> Self {
        Termios {
            // IMAXBEL | IUTF8 | IXON | IXANY | ICRNL | BRKINT
            iflag: InputFlags::IMAXBEL
                | InputFlags::IUTF8
                | InputFlags::IXON
                | InputFlags::IXANY
                | InputFlags::ICRNL
                | InputFlags::BRKINT,
            // OPOST | ONLCR
            oflag: OutputFlags::OPOST | OutputFlags::ONLCR,
            // HUPCL | CREAD | CSIZE | EXTB
            // cflag: 0o2277,
            cflag: ControlFlags::CREAD.bits() | ControlFlags::HUPCL.bits() | 0x77,
            // IEXTEN | ECHOTCL | ECHOKE ECHO | ECHOE | ECHOK | ISIG | ICANON
            lflag: LocalFlags::ISIG
                | LocalFlags::ICANON
                | LocalFlags::ECHO
                | LocalFlags::ECHOE
                | LocalFlags::ECHOK
                | LocalFlags::ECHONL
                | LocalFlags::IEXTEN,
            line: 0,
            cc: [
                3,   // VINTR Ctrl-C
                28,  // VQUIT
                127, // VERASE
                21,  // VKILL
                4,   // VEOF Ctrl-D
                0,   // VTIME
                1,   // VMIN
                0,   // VSWTC
                17,  // VSTART
                19,  // VSTOP
                26,  // VSUSP Ctrl-Z
                255, // VEOL
                18,  // VREPAINT
                15,  // VDISCARD
                23,  // VWERASE
                22,  // VLNEXT
                255, // VEOL2
                0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
            ],
            ispeed: 0,
            ospeed: 0,
        }
    }
}

/// 控制字符索引(Control Characters Index)
///
/// 用于 termios 结构中 c_cc 数组,表示各种控制字符在数组中的位置。
/// MUSL: <https://github.com/bminor/musl/blob/c47ad25ea3b484e10326f933e927c0bc8cded3da/arch/generic/bits/termios.h>
#[repr(u8)]
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum ControlChar {
    /// 中断字符,通常是 Ctrl-C,用于发送中断信号
    VINTR = 0,
    /// 退出字符,通常是 Ctrl-\
    VQUIT = 1,
    /// 删除字符,通常是退格键(Backspace)
    VERASE = 2,
    /// 删除整行字符
    VKILL = 3,
    /// 文件结束字符,通常是 Ctrl-D
    VEOF = 4,
    /// 读取时的超时值(定时器)
    VTIME = 5,
    /// 读取时的最小字节数
    VMIN = 6,
    /// 切换字符(不常用)
    VSWTC = 7,
    /// 开始字符,通常是 Ctrl-Q,用于软件流控制
    VSTART = 8,
    /// 停止字符,通常是 Ctrl-S,用于软件流控制
    VSTOP = 9,
    /// 挂起字符,通常是 Ctrl-Z
    VSUSP = 10,
    /// 额外的行结束字符(EOL)
    VEOL = 11,
    /// 重新打印字符,用于重新显示当前输入行
    VREPRINT = 12,
    /// 丢弃输出字符
    VDISCARD = 13,
    /// 删除一个单词字符
    VWERASE = 14,
    /// 下一字符字面量输入(转义下一个字符)
    VLNEXT = 15,
    /// 第二个额外的行结束字符(EOL2)
    VEOL2 = 16,
}

bitflags! {
    /// 输入模式标志(Input Modes Flags),对应 termios 结构体中的 c_iflag 字段。
    ///
    /// 这些标志控制终端输入的行为,如是否忽略断开信号、是否进行流控等。
    /// MUSL: <https://github.com/bminor/musl/blob/c47ad25ea3b484e10326f933e927c0bc8cded3da/arch/generic/bits/termios.h#L30>
    #[derive(Debug, Clone, Copy)]
    pub struct InputFlags: u32 {
        /// 忽略 BREAK 条件(输入中的断开信号)
        const IGNBRK  = 0o000001;
        /// 在输入 BREAK 时产生中断信号
        const BRKINT  = 0o000002;
        /// 忽略奇偶校验错误的字符
        const IGNPAR  = 0o000004;
        /// 标记奇偶校验错误的字符
        const PARMRK  = 0o000010;
        /// 启用输入奇偶校验检查
        const INPCK   = 0o000020;
        /// 去除输入字符的第 8 位
        const ISTRIP  = 0o000040;
        /// 将输入的换行符 NL 转换为回车符 CR
        const INLCR   = 0o000100;
        /// 忽略输入的回车符 CR
        const IGNCR   = 0o000200;
        /// 将输入的回车符 CR 转换为换行符 NL
        const ICRNL   = 0o000400;
        /// 将大写字母转换为小写字母(已废弃,通常不使用)
        const IUCLC   = 0o001000;
        /// 启用 XON/XOFF 输出流控制
        const IXON    = 0o002000;
        /// 允许任何字符中断输出暂停(XON)
        const IXANY   = 0o004000;
        /// 启用 XON/XOFF 输入流控制
        const IXOFF   = 0o010000;
        /// 当输入缓冲区满时发出响铃
        const IMAXBEL = 0o020000;
        /// UTF-8 输入编码(Linux 特有)
        const IUTF8   = 0o040000;
    }


    /// 输出模式标志(Output Modes Flags),对应 termios 结构体中的 c_oflag 字段。
    ///
    /// 这些标志用于控制终端输出的处理行为,如是否进行后处理、换行符转换等。
    /// MUSL: <https://github.com/bminor/musl/blob/c47ad25ea3b484e10326f933e927c0bc8cded3da/arch/generic/bits/termios.h#L46>
    #[derive(Debug, Clone, Copy)]
    pub struct OutputFlags: u32 {
        /// 启用输出处理(如换行符转换)
        const OPOST  = 0o000001;
        /// 将输出中的小写字母转换为大写字母(多数系统不使用)
        const OLCUC  = 0o000002;
        /// 将输出中的换行符 NL 转换为回车符 CR 加换行符 NL
        const ONLCR  = 0o000004;
        /// 将输出中的回车符 CR 转换为换行符 NL
        const OCRNL  = 0o000010;
        /// 不输出回车符 CR
        const ONOCR  = 0o000020;
        /// 输出换行符时不回车(不常用)
        const ONLRET = 0o000040;
        /// 用填充字符填充输出(如延迟输出)
        const OFILL  = 0o000100;
        /// 填充字符使用 DEL(0x7f)
        const OFDEL  = 0o000200;

        // 以下标志通常带条件编译,根据平台支持情况可能不同

        /// 新行延迟标志掩码
        const NLDLY  = 0o000400;
        /// 新行延迟设置为0(无延迟)
        const NL0    = 0o000000;
        /// 新行延迟设置为1(延迟)
        const NL1    = 0o000400;

        /// 回车延迟标志掩码
        const CRDLY  = 0o003000;
        /// 回车延迟设置0(无延迟)
        const CR0    = 0o000000;
        /// 回车延迟设置1
        const CR1    = 0o001000;
        /// 回车延迟设置2
        const CR2    = 0o002000;
        /// 回车延迟设置3
        const CR3    = 0o003000;

        /// 制表符延迟标志掩码
        const TABDLY = 0o014000;
        /// 制表符延迟设置0(无延迟)
        const TAB0   = 0o000000;
        /// 制表符延迟设置1
        const TAB1   = 0o004000;
        /// 制表符延迟设置2
        const TAB2   = 0o010000;
        /// 制表符延迟设置3
        const TAB3   = 0o014000;

        /// 退格延迟标志掩码
        const BSDLY  = 0o020000;
        /// 退格延迟设置0(无延迟)
        const BS0    = 0o000000;
        /// 退格延迟设置1
        const BS1    = 0o020000;

        /// 换页延迟标志掩码
        const FFDLY  = 0o100000;
        /// 换页延迟设置0(无延迟)
        const FF0    = 0o000000;
        /// 换页延迟设置1
        const FF1    = 0o100000;

        /// 垂直制表延迟标志掩码
        const VTDLY  = 0o040000;
        /// 垂直制表延迟设置0(无延迟)
        const VT0    = 0o000000;
        /// 垂直制表延迟设置1
        const VT1    = 0o040000;
    }
    /// 控制模式标志(Control Modes Flags),对应 termios 结构体中的 c_cflag 字段。
    ///
    /// 这些标志用于控制终端的硬件相关设置,如字符大小、停止位、校验以及本地连接等。
    /// MUSL: <https://github.com/bminor/musl/blob/c47ad25ea3b484e10326f933e927c0bc8cded3da/arch/generic/bits/termios.h#L113>
    #[derive(Debug, Clone, Copy)]
    pub struct ControlFlags: u32 {
        /// 字符大小掩码(用于选择 CS5、CS6、CS7 或 CS8)
        const CSIZE  = 0o000060;
        /// 字符大小:5 位
        const CS5    = 0o000000;
        /// 字符大小:6 位
        const CS6    = 0o000020;
        /// 字符大小:7 位
        const CS7    = 0o000040;
        /// 字符大小:8 位
        const CS8    = 0o000060;
        /// 发送两位停止位,默认是一位停止位
        const CSTOPB = 0o000100;
        /// 启用接收器
        const CREAD  = 0o000200;
        /// 启用奇偶校验位
        const PARENB = 0o000400;
        /// 奇偶校验为奇校验,默认是偶校验
        const PARODD = 0o001000;
        /// 关闭调制解调器挂断控制(保持连接)
        const HUPCL  = 0o002000;
        /// 忽略调制解调器状态线,允许本地连接
        const CLOCAL = 0o004000;
    }
    /// 本地模式标志(Local Modes Flags),对应 termios 结构体中的 c_lflag 字段。
    ///
    /// 这些标志控制终端的本地行为,如信号产生、行编辑、回显等。
    /// MUSL: <https://github.com/bminor/musl/blob/c47ad25ea3b484e10326f933e927c0bc8cded3da/arch/generic/bits/termios.h#L125>
    #[derive(Debug, Clone, Copy)]
    pub struct LocalFlags: u32 {
        /// 允许产生信号,如 INTR, QUIT, SUSP
        const ISIG   = 0o000001;
        /// 启用标准模式(规范模式)输入,即行缓冲和行编辑
        const ICANON = 0o000002;
        /// 启用输入字符回显
        const ECHO   = 0o000010;
        /// 启用 ERASE 字符的回显效果(擦除字符时,光标左移)
        const ECHOE  = 0o000020;
        /// 输入 KILL 字符时回显一个新行
        const ECHOK  = 0o000040;
        /// 在新行输入时回显换行符
        const ECHONL = 0o000100;
        /// 禁止输入或输出时刷新终端队列
        const NOFLSH = 0o000200;
        /// 背景进程尝试写终端时发送 SIGTTOU 信号
        const TOSTOP = 0o000400;
        /// 启用扩展功能处理,如实现特殊控制字符(如 VDISCARD)
        const IEXTEN = 0o100000;
    }

}

/// 波特率常量(Baud Rate Constants),用于设置串口通信的波特率。
#[allow(missing_docs)]
#[repr(u32)]
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum BaudRate {
    B0 = 0o000000,
    B50 = 0o000001,
    B75 = 0o000002,
    B110 = 0o000003,
    B134 = 0o000004,
    B150 = 0o000005,
    B200 = 0o000006,
    B300 = 0o000007,
    B600 = 0o000010,
    B1200 = 0o000011,
    B1800 = 0o000012,
    B2400 = 0o000013,
    B4800 = 0o000014,
    B9600 = 0o000015,
    B19200 = 0o000016,
    B38400 = 0o000017,
    B57600 = 0o100001,
    B115200 = 0o100002,
    B230400 = 0o100003,
    B460800 = 0o100004,
    B500000 = 0o100005,
    B576000 = 0o100006,
    B921600 = 0o100007,
    B1000000 = 0o100010,
    B1152000 = 0o100011,
    B1500000 = 0o100012,
    B2000000 = 0o100013,
    B2500000 = 0o100014,
    B3000000 = 0o100015,
    B3500000 = 0o100016,
    B4000000 = 0o100017,
}