xref: /DragonOS/kernel/src/driver/tty/termios.rs (revision 52da9a59374752b4d01907b052135a0d317781dd)
1*52da9a59SGnoCiYeH use super::tty_ldisc::LineDisciplineType;
2*52da9a59SGnoCiYeH 
3*52da9a59SGnoCiYeH /// ## 窗口大小
4*52da9a59SGnoCiYeH #[repr(C)]
5*52da9a59SGnoCiYeH #[derive(Debug, Default, Clone, Copy)]
6*52da9a59SGnoCiYeH pub struct WindowSize {
7*52da9a59SGnoCiYeH     /// 行
8*52da9a59SGnoCiYeH     pub row: u16,
9*52da9a59SGnoCiYeH     /// 列
10*52da9a59SGnoCiYeH     pub col: u16,
11*52da9a59SGnoCiYeH     /// x方向像素数
12*52da9a59SGnoCiYeH     pub xpixel: u16,
13*52da9a59SGnoCiYeH     /// y方向像素数
14*52da9a59SGnoCiYeH     pub ypixel: u16,
15*52da9a59SGnoCiYeH }
16*52da9a59SGnoCiYeH 
17*52da9a59SGnoCiYeH #[derive(Debug, Clone, Copy)]
18*52da9a59SGnoCiYeH pub struct Termios {
19*52da9a59SGnoCiYeH     pub input_mode: InputMode,
20*52da9a59SGnoCiYeH     pub output_mode: OutputMode,
21*52da9a59SGnoCiYeH     pub control_mode: ControlMode,
22*52da9a59SGnoCiYeH     pub local_mode: LocalMode,
23*52da9a59SGnoCiYeH     pub control_characters: [u8; CONTORL_CHARACTER_NUM],
24*52da9a59SGnoCiYeH     pub line: LineDisciplineType,
25*52da9a59SGnoCiYeH     pub input_speed: u32,
26*52da9a59SGnoCiYeH     pub output_speed: u32,
27*52da9a59SGnoCiYeH }
28*52da9a59SGnoCiYeH 
29*52da9a59SGnoCiYeH #[derive(Clone, Copy)]
30*52da9a59SGnoCiYeH pub struct PosixTermios {
31*52da9a59SGnoCiYeH     pub c_iflag: u32,
32*52da9a59SGnoCiYeH     pub c_oflag: u32,
33*52da9a59SGnoCiYeH     pub c_cflag: u32,
34*52da9a59SGnoCiYeH     pub c_lflag: u32,
35*52da9a59SGnoCiYeH     pub c_cc: [u8; CONTORL_CHARACTER_NUM],
36*52da9a59SGnoCiYeH     pub c_line: u8,
37*52da9a59SGnoCiYeH     pub c_ispeed: u32,
38*52da9a59SGnoCiYeH     pub c_ospeed: u32,
39*52da9a59SGnoCiYeH }
40*52da9a59SGnoCiYeH 
41*52da9a59SGnoCiYeH impl PosixTermios {
42*52da9a59SGnoCiYeH     pub fn from_kernel_termios(termios: Termios) -> Self {
43*52da9a59SGnoCiYeH         Self {
44*52da9a59SGnoCiYeH             c_iflag: termios.input_mode.bits,
45*52da9a59SGnoCiYeH             c_oflag: termios.output_mode.bits,
46*52da9a59SGnoCiYeH             c_cflag: termios.control_mode.bits,
47*52da9a59SGnoCiYeH             c_lflag: termios.local_mode.bits,
48*52da9a59SGnoCiYeH             c_cc: termios.control_characters.clone(),
49*52da9a59SGnoCiYeH             c_line: termios.line as u8,
50*52da9a59SGnoCiYeH             c_ispeed: termios.input_speed,
51*52da9a59SGnoCiYeH             c_ospeed: termios.output_speed,
52*52da9a59SGnoCiYeH         }
53*52da9a59SGnoCiYeH     }
54*52da9a59SGnoCiYeH 
55*52da9a59SGnoCiYeH     #[allow(dead_code)]
56*52da9a59SGnoCiYeH     pub fn to_kernel_termios(&self) -> Termios {
57*52da9a59SGnoCiYeH         Termios {
58*52da9a59SGnoCiYeH             input_mode: InputMode::from_bits_truncate(self.c_iflag),
59*52da9a59SGnoCiYeH             output_mode: OutputMode::from_bits_truncate(self.c_oflag),
60*52da9a59SGnoCiYeH             control_mode: ControlMode::from_bits_truncate(self.c_cflag),
61*52da9a59SGnoCiYeH             local_mode: LocalMode::from_bits_truncate(self.c_lflag),
62*52da9a59SGnoCiYeH             control_characters: self.c_cc.clone(),
63*52da9a59SGnoCiYeH             line: LineDisciplineType::from_line(self.c_line),
64*52da9a59SGnoCiYeH             input_speed: self.c_ispeed,
65*52da9a59SGnoCiYeH             output_speed: self.c_ospeed,
66*52da9a59SGnoCiYeH         }
67*52da9a59SGnoCiYeH     }
68*52da9a59SGnoCiYeH }
69*52da9a59SGnoCiYeH 
70*52da9a59SGnoCiYeH pub const INIT_CONTORL_CHARACTERS: [u8; CONTORL_CHARACTER_NUM] = [
71*52da9a59SGnoCiYeH     b'C' - 0x40,  // VINTR
72*52da9a59SGnoCiYeH     b'\\' - 0x40, // VQUIT
73*52da9a59SGnoCiYeH     0o177,        // VERASE
74*52da9a59SGnoCiYeH     b'U' - 0x40,  // VKILL
75*52da9a59SGnoCiYeH     b'D' - 0x40,  // VEOF
76*52da9a59SGnoCiYeH     1,            // VMIN
77*52da9a59SGnoCiYeH     0,            // VEOL
78*52da9a59SGnoCiYeH     0,            // VTIME
79*52da9a59SGnoCiYeH     0,            // VEOL2
80*52da9a59SGnoCiYeH     0,            // VSWTC
81*52da9a59SGnoCiYeH     b'W' - 0x40,  // VWERASE
82*52da9a59SGnoCiYeH     b'R' - 0x40,  // VREPRINT
83*52da9a59SGnoCiYeH     b'Z' - 0x40,  // VSUSP
84*52da9a59SGnoCiYeH     b'Q' - 0x40,  // VSTART
85*52da9a59SGnoCiYeH     b'S' - 0x40,  // VSTOP
86*52da9a59SGnoCiYeH     b'V' - 0x40,  // VLNEXT
87*52da9a59SGnoCiYeH     b'O' - 0x40,  // VDISCARD
88*52da9a59SGnoCiYeH     0,
89*52da9a59SGnoCiYeH     0,
90*52da9a59SGnoCiYeH ];
91*52da9a59SGnoCiYeH 
92*52da9a59SGnoCiYeH // pub const INIT_CONTORL_CHARACTERS: [u8; CONTORL_CHARACTER_NUM] = {
93*52da9a59SGnoCiYeH //     let mut chs: [u8; CONTORL_CHARACTER_NUM] = Default::default();
94*52da9a59SGnoCiYeH //     chs[ControlCharIndex::VINTR] = b'C' - 0x40;
95*52da9a59SGnoCiYeH //     chs[ControlCharIndex::VQUIT] = b'\\' - 0x40;
96*52da9a59SGnoCiYeH //     chs[ControlCharIndex::VERASE] = 0o177;
97*52da9a59SGnoCiYeH //     chs[ControlCharIndex::VKILL] = b'U' - 0x40;
98*52da9a59SGnoCiYeH //     chs[ControlCharIndex::VEOF] = b'D' - 0x40;
99*52da9a59SGnoCiYeH //     chs[ControlCharIndex::VSTART] = b'Q' - 0x40;
100*52da9a59SGnoCiYeH //     chs[ControlCharIndex::VSTOP] = b'S' - 0x40;
101*52da9a59SGnoCiYeH //     chs[ControlCharIndex::VSUSP] = b'Z' - 0x40;
102*52da9a59SGnoCiYeH //     chs[ControlCharIndex::VREPRINT] = b'R' - 0x40;
103*52da9a59SGnoCiYeH //     chs[ControlCharIndex::VDISCARD] = b'O' - 0x40;
104*52da9a59SGnoCiYeH //     chs[ControlCharIndex::VWERASE] = b'W' - 0x40;
105*52da9a59SGnoCiYeH //     chs[ControlCharIndex::VLNEXT] = b'V' - 0x40;
106*52da9a59SGnoCiYeH //     // chs[ContorlCharIndex::VDSUSP] = b'Y'  - 0x40;
107*52da9a59SGnoCiYeH //     chs[ControlCharIndex::VMIN] = 1;
108*52da9a59SGnoCiYeH //     return chs;
109*52da9a59SGnoCiYeH // };
110*52da9a59SGnoCiYeH 
111*52da9a59SGnoCiYeH lazy_static! {
112*52da9a59SGnoCiYeH     pub static ref TTY_STD_TERMIOS: Termios = {
113*52da9a59SGnoCiYeH         Termios {
114*52da9a59SGnoCiYeH             input_mode: InputMode::ICRNL | InputMode::IXON,
115*52da9a59SGnoCiYeH             output_mode: OutputMode::OPOST | OutputMode::ONLCR,
116*52da9a59SGnoCiYeH             control_mode: ControlMode::B38400
117*52da9a59SGnoCiYeH                 | ControlMode::CREAD
118*52da9a59SGnoCiYeH                 | ControlMode::HUPCL
119*52da9a59SGnoCiYeH                 | ControlMode::CS8,
120*52da9a59SGnoCiYeH             local_mode: LocalMode::ISIG
121*52da9a59SGnoCiYeH                 | LocalMode::ICANON
122*52da9a59SGnoCiYeH                 | LocalMode::ECHO
123*52da9a59SGnoCiYeH                 | LocalMode::ECHOE
124*52da9a59SGnoCiYeH                 | LocalMode::ECHOK
125*52da9a59SGnoCiYeH                 | LocalMode::ECHOCTL
126*52da9a59SGnoCiYeH                 | LocalMode::ECHOKE
127*52da9a59SGnoCiYeH                 | LocalMode::IEXTEN,
128*52da9a59SGnoCiYeH             control_characters: INIT_CONTORL_CHARACTERS.clone(),
129*52da9a59SGnoCiYeH             line: LineDisciplineType::NTty,
130*52da9a59SGnoCiYeH             input_speed: 38400,
131*52da9a59SGnoCiYeH             output_speed: 38400,
132*52da9a59SGnoCiYeH         }
133*52da9a59SGnoCiYeH     };
134*52da9a59SGnoCiYeH }
135*52da9a59SGnoCiYeH 
136*52da9a59SGnoCiYeH pub const CONTORL_CHARACTER_NUM: usize = 19;
137*52da9a59SGnoCiYeH 
138*52da9a59SGnoCiYeH bitflags! {
139*52da9a59SGnoCiYeH     /// termios输入特性
140*52da9a59SGnoCiYeH     pub struct InputMode: u32 {
141*52da9a59SGnoCiYeH         /// 如果设置了该标志,表示启用软件流控制。
142*52da9a59SGnoCiYeH         const IXON = 0x0200;
143*52da9a59SGnoCiYeH         /// 如果设置了该标志,表示启用输入流控制。
144*52da9a59SGnoCiYeH         const IXOFF = 0x0400;
145*52da9a59SGnoCiYeH         /// Map Uppercase to Lowercase on Input 将大写转换为小写
146*52da9a59SGnoCiYeH         /// 表示不区分大小写
147*52da9a59SGnoCiYeH         const IUCLC = 0x1000;
148*52da9a59SGnoCiYeH         /// 如果设置了该标志,表示当输入队列满时,产生一个响铃信号。
149*52da9a59SGnoCiYeH         const IMAXBEL = 0x2000;
150*52da9a59SGnoCiYeH         /// 如果设置了该标志,表示输入数据被视为 UTF-8 编码。
151*52da9a59SGnoCiYeH         const IUTF8 = 0x4000;
152*52da9a59SGnoCiYeH 
153*52da9a59SGnoCiYeH         /// 忽略中断信号
154*52da9a59SGnoCiYeH         const IGNBRK	= 0x001;
155*52da9a59SGnoCiYeH         /// 检测到中断信号时生成中断(产生中断信号)
156*52da9a59SGnoCiYeH         const BRKINT	= 0x002;
157*52da9a59SGnoCiYeH         /// 忽略具有奇偶校验错误的字符
158*52da9a59SGnoCiYeH         const IGNPAR	= 0x004;
159*52da9a59SGnoCiYeH         /// 在检测到奇偶校验错误或帧错误时,将字符以 \377 标记
160*52da9a59SGnoCiYeH         const PARMRK	= 0x008;
161*52da9a59SGnoCiYeH         /// 启用输入奇偶校验检查
162*52da9a59SGnoCiYeH         const INPCK	= 0x010;
163*52da9a59SGnoCiYeH         /// 从输入字符中剥离第 8 位,即只保留低 7 位
164*52da9a59SGnoCiYeH         const ISTRIP	= 0x020;
165*52da9a59SGnoCiYeH         /// 表示将输入的换行符 (\n) 映射为回车符 (\r)
166*52da9a59SGnoCiYeH         const INLCR	= 0x040;
167*52da9a59SGnoCiYeH         /// 表示忽略回车符 (\r)
168*52da9a59SGnoCiYeH         const IGNCR	= 0x080;
169*52da9a59SGnoCiYeH         /// 表示将输入的回车符 (\r) 映射为换行符 (\n)
170*52da9a59SGnoCiYeH         const ICRNL	= 0x100;
171*52da9a59SGnoCiYeH         /// 表示在输入被停止(Ctrl-S)后,任何字符的输入都将重新启动输入
172*52da9a59SGnoCiYeH         const IXANY	= 0x800;
173*52da9a59SGnoCiYeH     }
174*52da9a59SGnoCiYeH 
175*52da9a59SGnoCiYeH     /// termios输出特性
176*52da9a59SGnoCiYeH     pub struct OutputMode: u32 {
177*52da9a59SGnoCiYeH         /// 在输出时将换行符替换\r\n
178*52da9a59SGnoCiYeH         const ONLCR	= 0x00002;
179*52da9a59SGnoCiYeH         /// Map Lowercase to Uppercase on Output 输出字符时将小写字母映射为大写字母
180*52da9a59SGnoCiYeH         const OLCUC	= 0x00004;
181*52da9a59SGnoCiYeH 
182*52da9a59SGnoCiYeH         /// 与NL协同 配置换行符的处理方式
183*52da9a59SGnoCiYeH         const NLDLY	= 0x00300;
184*52da9a59SGnoCiYeH         const   NL0	= 0x00000;  // 不延迟换行
185*52da9a59SGnoCiYeH         const   NL1	= 0x00100;  // 延迟换行(输出回车后等待一段时间再输出换行)
186*52da9a59SGnoCiYeH         const   NL2	= 0x00200;  // NL2 和 NL3保留,暂未使用
187*52da9a59SGnoCiYeH         const   NL3	= 0x00300;
188*52da9a59SGnoCiYeH 
189*52da9a59SGnoCiYeH         /// 配置水平制表符的处理方式
190*52da9a59SGnoCiYeH         const TABDLY = 0x00c00;
191*52da9a59SGnoCiYeH         const  TAB0 = 0x00000;  // 不延迟水平制表符
192*52da9a59SGnoCiYeH         const  TAB1 = 0x00400;  // 在输出水平制表符时,延迟到下一个设置的水平制表符位置
193*52da9a59SGnoCiYeH         const  TAB2 = 0x00800;  // 在输出水平制表符时,延迟到下一个设置的 8 的倍数的位置
194*52da9a59SGnoCiYeH         const  TAB3 = 0x00c00;  // TAB3 和 XTABS(与 TAB3 等效)保留,暂未使用
195*52da9a59SGnoCiYeH         const XTABS = 0x00c00;
196*52da9a59SGnoCiYeH 
197*52da9a59SGnoCiYeH         /// 配置回车符的处理方式
198*52da9a59SGnoCiYeH         const CRDLY	= 0x03000;
199*52da9a59SGnoCiYeH         const   CR0	= 0x00000;  // 不延迟回车
200*52da9a59SGnoCiYeH         const   CR1	= 0x01000;  //  延迟回车(输出回车后等待一段时间再输出换行)
201*52da9a59SGnoCiYeH         const   CR2	= 0x02000;  // CR2 和 CR3保留,暂未使用
202*52da9a59SGnoCiYeH         const   CR3	= 0x03000;
203*52da9a59SGnoCiYeH 
204*52da9a59SGnoCiYeH         /// 配置换页符(form feed)的处理方式
205*52da9a59SGnoCiYeH         const FFDLY	= 0x04000;
206*52da9a59SGnoCiYeH         const   FF0	= 0x00000;  // 不延迟换页
207*52da9a59SGnoCiYeH         const   FF1	= 0x04000;  // 延迟换页
208*52da9a59SGnoCiYeH 
209*52da9a59SGnoCiYeH         /// 配置退格符(backspace)的处理方式
210*52da9a59SGnoCiYeH         const BSDLY	= 0x08000;
211*52da9a59SGnoCiYeH         const   BS0	= 0x00000;  // 不延迟退格
212*52da9a59SGnoCiYeH         const   BS1	= 0x08000;  // 延迟退格
213*52da9a59SGnoCiYeH 
214*52da9a59SGnoCiYeH         /// 配置垂直制表符(vertical tab)的处理方式
215*52da9a59SGnoCiYeH         const VTDLY	= 0x10000;
216*52da9a59SGnoCiYeH         const   VT0	= 0x00000;  // 不延迟垂直制表符
217*52da9a59SGnoCiYeH         const   VT1	= 0x10000;  // 延迟垂直制表符
218*52da9a59SGnoCiYeH 
219*52da9a59SGnoCiYeH         /// 表示执行输出处理,即启用输出处理函数
220*52da9a59SGnoCiYeH         const OPOST	= 0x01;
221*52da9a59SGnoCiYeH         /// 表示将输出的回车符 (\r) 映射为换行符 (\n)
222*52da9a59SGnoCiYeH         const OCRNL	= 0x08;
223*52da9a59SGnoCiYeH         /// 表示在输出时,如果光标在第 0 列,则不输出回车符 (\r)
224*52da9a59SGnoCiYeH         const ONOCR	= 0x10;
225*52da9a59SGnoCiYeH         /// 表示将回车符 (\r) 映射为换行符 (\n)
226*52da9a59SGnoCiYeH         const ONLRET	= 0x20;
227*52da9a59SGnoCiYeH         /// 表示使用填充字符进行延迟。这个填充字符的默认值是空格。
228*52da9a59SGnoCiYeH         const OFILL	= 0x40;
229*52da9a59SGnoCiYeH         /// 表示使用删除字符 (DEL, \177) 作为填充字符
230*52da9a59SGnoCiYeH         const OFDEL	= 0x80;
231*52da9a59SGnoCiYeH     }
232*52da9a59SGnoCiYeH 
233*52da9a59SGnoCiYeH     /// 配置终端设备的基本特性和控制参数
234*52da9a59SGnoCiYeH     pub struct ControlMode: u32 {
235*52da9a59SGnoCiYeH         /// Baud Rate Mask 指定波特率的掩码
236*52da9a59SGnoCiYeH         const CBAUD		= 0x000000ff;
237*52da9a59SGnoCiYeH         /// Extra Baud Bits 指定更高的波特率位
238*52da9a59SGnoCiYeH         const CBAUDEX	= 0x00000000;
239*52da9a59SGnoCiYeH         /// Custom Baud Rate 指定自定义波特率 如果设置了 BOTHER,则通过以下位来设置自定义的波特率值
240*52da9a59SGnoCiYeH         const BOTHER	= 0x0000001f;
241*52da9a59SGnoCiYeH 
242*52da9a59SGnoCiYeH         const     B0	= 0x00000000;
243*52da9a59SGnoCiYeH         const    B50	= 0x00000001;
244*52da9a59SGnoCiYeH         const    B75	= 0x00000002;
245*52da9a59SGnoCiYeH         const   B110	= 0x00000003;
246*52da9a59SGnoCiYeH         const   B134	= 0x00000004;
247*52da9a59SGnoCiYeH         const   B150	= 0x00000005;
248*52da9a59SGnoCiYeH         const   B200	= 0x00000006;
249*52da9a59SGnoCiYeH         const   B300	= 0x00000007;
250*52da9a59SGnoCiYeH         const   B600	= 0x00000008;
251*52da9a59SGnoCiYeH         const  B1200	= 0x00000009;
252*52da9a59SGnoCiYeH         const  B1800	= 0x0000000a;
253*52da9a59SGnoCiYeH         const  B2400	= 0x0000000b;
254*52da9a59SGnoCiYeH         const  B4800	= 0x0000000c;
255*52da9a59SGnoCiYeH         const  B9600	= 0x0000000d;
256*52da9a59SGnoCiYeH         const B19200	= 0x0000000e;
257*52da9a59SGnoCiYeH         const B38400	= 0x0000000f;
258*52da9a59SGnoCiYeH 
259*52da9a59SGnoCiYeH         const    B57600	= 0x00000010;
260*52da9a59SGnoCiYeH         const   B115200	= 0x00000011;
261*52da9a59SGnoCiYeH         const   B230400	= 0x00000012;
262*52da9a59SGnoCiYeH         const   B460800	= 0x00000013;
263*52da9a59SGnoCiYeH         const   B500000	= 0x00000014;
264*52da9a59SGnoCiYeH         const   B576000	= 0x00000015;
265*52da9a59SGnoCiYeH         const   B921600	= 0x00000016;
266*52da9a59SGnoCiYeH         const  B1000000	= 0x00000017;
267*52da9a59SGnoCiYeH         const  B1152000	= 0x00000018;
268*52da9a59SGnoCiYeH         const  B1500000	= 0x00000019;
269*52da9a59SGnoCiYeH         const  B2000000	= 0x0000001a;
270*52da9a59SGnoCiYeH         const  B2500000	= 0x0000001b;
271*52da9a59SGnoCiYeH         const  B3000000	= 0x0000001c;
272*52da9a59SGnoCiYeH         const  B3500000	= 0x0000001d;
273*52da9a59SGnoCiYeH         const  B4000000	= 0x0000001e;
274*52da9a59SGnoCiYeH 
275*52da9a59SGnoCiYeH         /// 指定字符大小的掩码 以下位为特定字符大小
276*52da9a59SGnoCiYeH         const CSIZE		= 0x00000300;
277*52da9a59SGnoCiYeH         const   CS5		= 0x00000000;
278*52da9a59SGnoCiYeH         const   CS6		= 0x00000100;
279*52da9a59SGnoCiYeH         const   CS7		= 0x00000200;
280*52da9a59SGnoCiYeH         const   CS8		= 0x00000300;
281*52da9a59SGnoCiYeH 
282*52da9a59SGnoCiYeH         /// Stop Bit Select 表示使用两个停止位;否则,表示使用一个停止位
283*52da9a59SGnoCiYeH         const CSTOPB	= 0x00000400;
284*52da9a59SGnoCiYeH         /// 表示启用接收器。如果未设置,则禁用接收器。
285*52da9a59SGnoCiYeH         const CREAD		= 0x00000800;
286*52da9a59SGnoCiYeH         /// 表示启用奇偶校验。如果未设置,则禁用奇偶校验。
287*52da9a59SGnoCiYeH         const PARENB	= 0x00001000;
288*52da9a59SGnoCiYeH         /// 表示启用奇校验。如果未设置,则表示启用偶校验。
289*52da9a59SGnoCiYeH         const PARODD	= 0x00002000;
290*52da9a59SGnoCiYeH         /// 表示在终端设备被关闭时挂断线路(执行挂断操作)
291*52da9a59SGnoCiYeH         const HUPCL		= 0x00004000;
292*52da9a59SGnoCiYeH         /// 表示忽略调制解调器的状态(DCD、DSR、CTS 等)
293*52da9a59SGnoCiYeH         const CLOCAL	= 0x00008000;
294*52da9a59SGnoCiYeH         /// 指定输入波特率的掩码
295*52da9a59SGnoCiYeH         const CIBAUD	= 0x00ff0000;
296*52da9a59SGnoCiYeH 
297*52da9a59SGnoCiYeH         const ADDRB = 0x20000000;
298*52da9a59SGnoCiYeH     }
299*52da9a59SGnoCiYeH 
300*52da9a59SGnoCiYeH     /// 配置终端设备的本地模式(local mode)或控制输入处理的行为
301*52da9a59SGnoCiYeH     pub struct LocalMode: u32 {
302*52da9a59SGnoCiYeH         /// 启用中断字符(Ctrl-C、Ctrl-Z)
303*52da9a59SGnoCiYeH         const ISIG	 = 0x00000080;
304*52da9a59SGnoCiYeH         /// 表示启用规范模式,即启用行缓冲和回显。在规范模式下,输入被缓冲,并且只有在输入回车符时才会传递给应用程序。
305*52da9a59SGnoCiYeH         const ICANON = 0x00000100;
306*52da9a59SGnoCiYeH         /// 表示启用大写模式,即输入输出都将被转换为大写。
307*52da9a59SGnoCiYeH         const XCASE	 = 0x00004000;
308*52da9a59SGnoCiYeH         /// 表示启用回显(显示用户输入的字符)
309*52da9a59SGnoCiYeH         const ECHO	 = 0x00000008;
310*52da9a59SGnoCiYeH         /// 表示在回显时将擦除的字符用 backspace 和空格字符显示。
311*52da9a59SGnoCiYeH         const ECHOE	 = 0x00000002;
312*52da9a59SGnoCiYeH         /// 表示在回显时将换行符后的字符用空格字符显示。
313*52da9a59SGnoCiYeH         const ECHOK	 = 0x00000004;
314*52da9a59SGnoCiYeH         /// 表示在回显时将换行符显示为换行和回车符。
315*52da9a59SGnoCiYeH         const ECHONL = 0x00000010;
316*52da9a59SGnoCiYeH         /// 表示在收到中断(Ctrl-C)和退出(Ctrl-\)字符后,不清空输入和输出缓冲区。
317*52da9a59SGnoCiYeH         const NOFLSH = 0x80000000;
318*52da9a59SGnoCiYeH         /// 表示在后台进程尝试写入终端时,发送停止信号(Ctrl-S)
319*52da9a59SGnoCiYeH         const TOSTOP = 0x00400000;
320*52da9a59SGnoCiYeH         /// 表示在回显时,显示控制字符为 ^ 加字符。
321*52da9a59SGnoCiYeH         const ECHOCTL= 0x00000040;
322*52da9a59SGnoCiYeH         /// 表示在回显时显示带有 # 的换行符(为了与 echo -n 命令兼容)。
323*52da9a59SGnoCiYeH         const ECHOPRT= 0x00000020;
324*52da9a59SGnoCiYeH         /// 表示在回显时将 KILL 字符(Ctrl-U)用空格字符显示。
325*52da9a59SGnoCiYeH         const ECHOKE = 0x00000001;
326*52da9a59SGnoCiYeH         /// 表示输出正在被冲刷(flush),通常是由于输入/输出流的状态变化。
327*52da9a59SGnoCiYeH         const FLUSHO = 0x00800000;
328*52da9a59SGnoCiYeH         /// 表示在规范模式下,存在需要重新打印的字符。
329*52da9a59SGnoCiYeH         const PENDIN = 0x20000000;
330*52da9a59SGnoCiYeH         /// 表示启用实现定义的输入处理。
331*52da9a59SGnoCiYeH         const IEXTEN = 0x00000400;
332*52da9a59SGnoCiYeH         /// 表示启用扩展的处理函数
333*52da9a59SGnoCiYeH         const EXTPROC= 0x10000000;
334*52da9a59SGnoCiYeH     }
335*52da9a59SGnoCiYeH 
336*52da9a59SGnoCiYeH     pub struct TtySetTermiosOpt: u8 {
337*52da9a59SGnoCiYeH         const TERMIOS_FLUSH	=1;
338*52da9a59SGnoCiYeH         const TERMIOS_WAIT	=2;
339*52da9a59SGnoCiYeH         const TERMIOS_TERMIO	=4;
340*52da9a59SGnoCiYeH         const TERMIOS_OLD	=8;
341*52da9a59SGnoCiYeH     }
342*52da9a59SGnoCiYeH }
343*52da9a59SGnoCiYeH 
344*52da9a59SGnoCiYeH /// 对应termios中控制字符的索引
345*52da9a59SGnoCiYeH pub struct ControlCharIndex;
346*52da9a59SGnoCiYeH #[allow(dead_code)]
347*52da9a59SGnoCiYeH impl ControlCharIndex {
348*52da9a59SGnoCiYeH     pub const DISABLE_CHAR: u8 = b'\0';
349*52da9a59SGnoCiYeH     /// 中断信号
350*52da9a59SGnoCiYeH     pub const VINTR: usize = 0;
351*52da9a59SGnoCiYeH     /// 退出信号
352*52da9a59SGnoCiYeH     pub const VQUIT: usize = 1;
353*52da9a59SGnoCiYeH     /// 退格
354*52da9a59SGnoCiYeH     pub const VERASE: usize = 2;
355*52da9a59SGnoCiYeH     /// 终止输入信号
356*52da9a59SGnoCiYeH     pub const VKILL: usize = 3;
357*52da9a59SGnoCiYeH     /// 文件结束信号 \0?
358*52da9a59SGnoCiYeH     pub const VEOF: usize = 4;
359*52da9a59SGnoCiYeH     /// 指定非规范模式下的最小字符数
360*52da9a59SGnoCiYeH     pub const VMIN: usize = 5;
361*52da9a59SGnoCiYeH     /// 换行符
362*52da9a59SGnoCiYeH     pub const VEOL: usize = 6;
363*52da9a59SGnoCiYeH     /// 指定非规范模式下的超时时间
364*52da9a59SGnoCiYeH     pub const VTIME: usize = 7;
365*52da9a59SGnoCiYeH     /// 换行符
366*52da9a59SGnoCiYeH     pub const VEOL2: usize = 8;
367*52da9a59SGnoCiYeH     /// 未使用,保留
368*52da9a59SGnoCiYeH     pub const VSWTC: usize = 9;
369*52da9a59SGnoCiYeH     /// 擦除前一个单词
370*52da9a59SGnoCiYeH     pub const VWERASE: usize = 10;
371*52da9a59SGnoCiYeH     /// 重新打印整行
372*52da9a59SGnoCiYeH     pub const VREPRINT: usize = 11;
373*52da9a59SGnoCiYeH     /// 挂起信号
374*52da9a59SGnoCiYeH     pub const VSUSP: usize = 12;
375*52da9a59SGnoCiYeH     /// 启动输出信号
376*52da9a59SGnoCiYeH     pub const VSTART: usize = 13;
377*52da9a59SGnoCiYeH     /// 停止输出信号
378*52da9a59SGnoCiYeH     pub const VSTOP: usize = 14;
379*52da9a59SGnoCiYeH     /// 将下一个字符视为字面值,而不是特殊字符
380*52da9a59SGnoCiYeH     pub const VLNEXT: usize = 15;
381*52da9a59SGnoCiYeH     /// 对应于字符丢弃信号,用于丢弃当前输入的行
382*52da9a59SGnoCiYeH     pub const VDISCARD: usize = 16;
383*52da9a59SGnoCiYeH }
384