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}