xref: /DragonOS/kernel/src/driver/tty/termios.rs (revision 418ad41fd84c15ed7e132e56970150ac38fc24a9)
152da9a59SGnoCiYeH use super::tty_ldisc::LineDisciplineType;
252da9a59SGnoCiYeH 
352da9a59SGnoCiYeH /// ## 窗口大小
452da9a59SGnoCiYeH #[repr(C)]
59365e801SGnoCiYeH #[derive(Debug, Default, Clone, Copy, PartialEq)]
652da9a59SGnoCiYeH pub struct WindowSize {
752da9a59SGnoCiYeH     /// 行
852da9a59SGnoCiYeH     pub row: u16,
952da9a59SGnoCiYeH     /// 列
1052da9a59SGnoCiYeH     pub col: u16,
1152da9a59SGnoCiYeH     /// x方向像素数
1252da9a59SGnoCiYeH     pub xpixel: u16,
1352da9a59SGnoCiYeH     /// y方向像素数
1452da9a59SGnoCiYeH     pub ypixel: u16,
1552da9a59SGnoCiYeH }
1652da9a59SGnoCiYeH 
17*418ad41fSLoGin impl WindowSize {
new(row: u16, col: u16, xpixel: u16, ypixel: u16) -> Self18*418ad41fSLoGin     pub fn new(row: u16, col: u16, xpixel: u16, ypixel: u16) -> Self {
19*418ad41fSLoGin         Self {
20*418ad41fSLoGin             row,
21*418ad41fSLoGin             col,
22*418ad41fSLoGin             xpixel,
23*418ad41fSLoGin             ypixel,
24*418ad41fSLoGin         }
25*418ad41fSLoGin     }
26*418ad41fSLoGin }
27*418ad41fSLoGin 
2852da9a59SGnoCiYeH #[derive(Debug, Clone, Copy)]
2952da9a59SGnoCiYeH pub struct Termios {
3052da9a59SGnoCiYeH     pub input_mode: InputMode,
3152da9a59SGnoCiYeH     pub output_mode: OutputMode,
3252da9a59SGnoCiYeH     pub control_mode: ControlMode,
3352da9a59SGnoCiYeH     pub local_mode: LocalMode,
3452da9a59SGnoCiYeH     pub control_characters: [u8; CONTORL_CHARACTER_NUM],
3552da9a59SGnoCiYeH     pub line: LineDisciplineType,
3652da9a59SGnoCiYeH     pub input_speed: u32,
3752da9a59SGnoCiYeH     pub output_speed: u32,
3852da9a59SGnoCiYeH }
3952da9a59SGnoCiYeH 
40be60c929SGnoCiYeH #[derive(Clone, Copy, Default)]
4152da9a59SGnoCiYeH pub struct PosixTermios {
4252da9a59SGnoCiYeH     pub c_iflag: u32,
4352da9a59SGnoCiYeH     pub c_oflag: u32,
4452da9a59SGnoCiYeH     pub c_cflag: u32,
4552da9a59SGnoCiYeH     pub c_lflag: u32,
4652da9a59SGnoCiYeH     pub c_cc: [u8; CONTORL_CHARACTER_NUM],
4752da9a59SGnoCiYeH     pub c_line: u8,
4852da9a59SGnoCiYeH     pub c_ispeed: u32,
4952da9a59SGnoCiYeH     pub c_ospeed: u32,
5052da9a59SGnoCiYeH }
5152da9a59SGnoCiYeH 
5252da9a59SGnoCiYeH impl PosixTermios {
from_kernel_termios(termios: Termios) -> Self5352da9a59SGnoCiYeH     pub fn from_kernel_termios(termios: Termios) -> Self {
5452da9a59SGnoCiYeH         Self {
5552da9a59SGnoCiYeH             c_iflag: termios.input_mode.bits,
5652da9a59SGnoCiYeH             c_oflag: termios.output_mode.bits,
5752da9a59SGnoCiYeH             c_cflag: termios.control_mode.bits,
5852da9a59SGnoCiYeH             c_lflag: termios.local_mode.bits,
59b5b571e0SLoGin             c_cc: termios.control_characters,
6052da9a59SGnoCiYeH             c_line: termios.line as u8,
6152da9a59SGnoCiYeH             c_ispeed: termios.input_speed,
6252da9a59SGnoCiYeH             c_ospeed: termios.output_speed,
6352da9a59SGnoCiYeH         }
6452da9a59SGnoCiYeH     }
6552da9a59SGnoCiYeH 
6652da9a59SGnoCiYeH     #[allow(dead_code)]
to_kernel_termios(self) -> Termios67b5b571e0SLoGin     pub fn to_kernel_termios(self) -> Termios {
68be60c929SGnoCiYeH         // TODO:这里没有考虑非规范模式
6952da9a59SGnoCiYeH         Termios {
7052da9a59SGnoCiYeH             input_mode: InputMode::from_bits_truncate(self.c_iflag),
7152da9a59SGnoCiYeH             output_mode: OutputMode::from_bits_truncate(self.c_oflag),
7252da9a59SGnoCiYeH             control_mode: ControlMode::from_bits_truncate(self.c_cflag),
7352da9a59SGnoCiYeH             local_mode: LocalMode::from_bits_truncate(self.c_lflag),
74b5b571e0SLoGin             control_characters: self.c_cc,
7552da9a59SGnoCiYeH             line: LineDisciplineType::from_line(self.c_line),
7652da9a59SGnoCiYeH             input_speed: self.c_ispeed,
7752da9a59SGnoCiYeH             output_speed: self.c_ospeed,
7852da9a59SGnoCiYeH         }
7952da9a59SGnoCiYeH     }
8052da9a59SGnoCiYeH }
8152da9a59SGnoCiYeH 
8252da9a59SGnoCiYeH pub const INIT_CONTORL_CHARACTERS: [u8; CONTORL_CHARACTER_NUM] = [
8352da9a59SGnoCiYeH     b'C' - 0x40,  // VINTR
8452da9a59SGnoCiYeH     b'\\' - 0x40, // VQUIT
8552da9a59SGnoCiYeH     0o177,        // VERASE
8652da9a59SGnoCiYeH     b'U' - 0x40,  // VKILL
8752da9a59SGnoCiYeH     b'D' - 0x40,  // VEOF
8852da9a59SGnoCiYeH     1,            // VMIN
8952da9a59SGnoCiYeH     0,            // VEOL
9052da9a59SGnoCiYeH     0,            // VTIME
9152da9a59SGnoCiYeH     0,            // VEOL2
9252da9a59SGnoCiYeH     0,            // VSWTC
9352da9a59SGnoCiYeH     b'W' - 0x40,  // VWERASE
9452da9a59SGnoCiYeH     b'R' - 0x40,  // VREPRINT
9552da9a59SGnoCiYeH     b'Z' - 0x40,  // VSUSP
9652da9a59SGnoCiYeH     b'Q' - 0x40,  // VSTART
9752da9a59SGnoCiYeH     b'S' - 0x40,  // VSTOP
9852da9a59SGnoCiYeH     b'V' - 0x40,  // VLNEXT
9952da9a59SGnoCiYeH     b'O' - 0x40,  // VDISCARD
10052da9a59SGnoCiYeH     0,
10152da9a59SGnoCiYeH     0,
10252da9a59SGnoCiYeH ];
10352da9a59SGnoCiYeH 
10452da9a59SGnoCiYeH // pub const INIT_CONTORL_CHARACTERS: [u8; CONTORL_CHARACTER_NUM] = {
10552da9a59SGnoCiYeH //     let mut chs: [u8; CONTORL_CHARACTER_NUM] = Default::default();
10652da9a59SGnoCiYeH //     chs[ControlCharIndex::VINTR] = b'C' - 0x40;
10752da9a59SGnoCiYeH //     chs[ControlCharIndex::VQUIT] = b'\\' - 0x40;
10852da9a59SGnoCiYeH //     chs[ControlCharIndex::VERASE] = 0o177;
10952da9a59SGnoCiYeH //     chs[ControlCharIndex::VKILL] = b'U' - 0x40;
11052da9a59SGnoCiYeH //     chs[ControlCharIndex::VEOF] = b'D' - 0x40;
11152da9a59SGnoCiYeH //     chs[ControlCharIndex::VSTART] = b'Q' - 0x40;
11252da9a59SGnoCiYeH //     chs[ControlCharIndex::VSTOP] = b'S' - 0x40;
11352da9a59SGnoCiYeH //     chs[ControlCharIndex::VSUSP] = b'Z' - 0x40;
11452da9a59SGnoCiYeH //     chs[ControlCharIndex::VREPRINT] = b'R' - 0x40;
11552da9a59SGnoCiYeH //     chs[ControlCharIndex::VDISCARD] = b'O' - 0x40;
11652da9a59SGnoCiYeH //     chs[ControlCharIndex::VWERASE] = b'W' - 0x40;
11752da9a59SGnoCiYeH //     chs[ControlCharIndex::VLNEXT] = b'V' - 0x40;
11852da9a59SGnoCiYeH //     // chs[ContorlCharIndex::VDSUSP] = b'Y'  - 0x40;
11952da9a59SGnoCiYeH //     chs[ControlCharIndex::VMIN] = 1;
12052da9a59SGnoCiYeH //     return chs;
12152da9a59SGnoCiYeH // };
12252da9a59SGnoCiYeH 
12352da9a59SGnoCiYeH lazy_static! {
12452da9a59SGnoCiYeH     pub static ref TTY_STD_TERMIOS: Termios = {
12552da9a59SGnoCiYeH         Termios {
12652da9a59SGnoCiYeH             input_mode: InputMode::ICRNL | InputMode::IXON,
12752da9a59SGnoCiYeH             output_mode: OutputMode::OPOST | OutputMode::ONLCR,
12852da9a59SGnoCiYeH             control_mode: ControlMode::B38400
12952da9a59SGnoCiYeH                 | ControlMode::CREAD
13052da9a59SGnoCiYeH                 | ControlMode::HUPCL
13152da9a59SGnoCiYeH                 | ControlMode::CS8,
13252da9a59SGnoCiYeH             local_mode: LocalMode::ISIG
13352da9a59SGnoCiYeH                 | LocalMode::ICANON
13452da9a59SGnoCiYeH                 | LocalMode::ECHO
13552da9a59SGnoCiYeH                 | LocalMode::ECHOE
13652da9a59SGnoCiYeH                 | LocalMode::ECHOK
13752da9a59SGnoCiYeH                 | LocalMode::ECHOCTL
13852da9a59SGnoCiYeH                 | LocalMode::ECHOKE
13952da9a59SGnoCiYeH                 | LocalMode::IEXTEN,
140b5b571e0SLoGin             control_characters: INIT_CONTORL_CHARACTERS,
14152da9a59SGnoCiYeH             line: LineDisciplineType::NTty,
14252da9a59SGnoCiYeH             input_speed: 38400,
14352da9a59SGnoCiYeH             output_speed: 38400,
14452da9a59SGnoCiYeH         }
14552da9a59SGnoCiYeH     };
14652da9a59SGnoCiYeH }
14752da9a59SGnoCiYeH 
14852da9a59SGnoCiYeH pub const CONTORL_CHARACTER_NUM: usize = 19;
14952da9a59SGnoCiYeH 
15052da9a59SGnoCiYeH bitflags! {
15152da9a59SGnoCiYeH     /// termios输入特性
15252da9a59SGnoCiYeH     pub struct InputMode: u32 {
15352da9a59SGnoCiYeH         /// 如果设置了该标志,表示启用软件流控制。
15452bcb59eSGnoCiYeH         const IXON = 0x0400;
15552da9a59SGnoCiYeH         /// 如果设置了该标志,表示启用输入流控制。
15652bcb59eSGnoCiYeH         const IXOFF = 0x1000;
15752da9a59SGnoCiYeH         /// Map Uppercase to Lowercase on Input 将大写转换为小写
15852da9a59SGnoCiYeH         /// 表示不区分大小写
15952bcb59eSGnoCiYeH         const IUCLC = 0x0200;
16052da9a59SGnoCiYeH         /// 如果设置了该标志,表示当输入队列满时,产生一个响铃信号。
16152da9a59SGnoCiYeH         const IMAXBEL = 0x2000;
16252da9a59SGnoCiYeH         /// 如果设置了该标志,表示输入数据被视为 UTF-8 编码。
16352da9a59SGnoCiYeH         const IUTF8 = 0x4000;
16452da9a59SGnoCiYeH 
16552da9a59SGnoCiYeH         /// 忽略中断信号
16652da9a59SGnoCiYeH         const IGNBRK	= 0x001;
16752da9a59SGnoCiYeH         /// 检测到中断信号时生成中断(产生中断信号)
16852da9a59SGnoCiYeH         const BRKINT	= 0x002;
16952da9a59SGnoCiYeH         /// 忽略具有奇偶校验错误的字符
17052da9a59SGnoCiYeH         const IGNPAR	= 0x004;
17152da9a59SGnoCiYeH         /// 在检测到奇偶校验错误或帧错误时,将字符以 \377 标记
17252da9a59SGnoCiYeH         const PARMRK	= 0x008;
17352da9a59SGnoCiYeH         /// 启用输入奇偶校验检查
17452da9a59SGnoCiYeH         const INPCK	= 0x010;
17552da9a59SGnoCiYeH         /// 从输入字符中剥离第 8 位,即只保留低 7 位
17652da9a59SGnoCiYeH         const ISTRIP	= 0x020;
17752da9a59SGnoCiYeH         /// 表示将输入的换行符 (\n) 映射为回车符 (\r)
17852da9a59SGnoCiYeH         const INLCR	= 0x040;
17952da9a59SGnoCiYeH         /// 表示忽略回车符 (\r)
18052da9a59SGnoCiYeH         const IGNCR	= 0x080;
18152da9a59SGnoCiYeH         /// 表示将输入的回车符 (\r) 映射为换行符 (\n)
18252da9a59SGnoCiYeH         const ICRNL	= 0x100;
18352da9a59SGnoCiYeH         /// 表示在输入被停止(Ctrl-S)后,任何字符的输入都将重新启动输入
18452da9a59SGnoCiYeH         const IXANY	= 0x800;
18552da9a59SGnoCiYeH     }
18652da9a59SGnoCiYeH 
18752da9a59SGnoCiYeH     /// termios输出特性
18852da9a59SGnoCiYeH     pub struct OutputMode: u32 {
18952da9a59SGnoCiYeH         /// 在输出时将换行符替换\r\n
19052bcb59eSGnoCiYeH         const ONLCR	= 0x00004;
19152da9a59SGnoCiYeH         /// Map Lowercase to Uppercase on Output 输出字符时将小写字母映射为大写字母
19252bcb59eSGnoCiYeH         const OLCUC	= 0x00002;
19352da9a59SGnoCiYeH 
19452da9a59SGnoCiYeH         /// 与NL协同 配置换行符的处理方式
19552bcb59eSGnoCiYeH         const NLDLY	= 0x00100;
19652da9a59SGnoCiYeH         const   NL0	= 0x00000;  // 不延迟换行
19752da9a59SGnoCiYeH         const   NL1	= 0x00100;  // 延迟换行(输出回车后等待一段时间再输出换行)
19852da9a59SGnoCiYeH 
19952da9a59SGnoCiYeH         /// 配置水平制表符的处理方式
20052bcb59eSGnoCiYeH         const TABDLY = 0x01800;
20152da9a59SGnoCiYeH         const  TAB0 = 0x00000;  // 不延迟水平制表符
20252bcb59eSGnoCiYeH         const  TAB1 = 0x00800;  // 在输出水平制表符时,延迟到下一个设置的水平制表符位置
20352bcb59eSGnoCiYeH         const  TAB2 = 0x01000;  // 在输出水平制表符时,延迟到下一个设置的 8 的倍数的位置
20452bcb59eSGnoCiYeH         const  TAB3 = 0x01800;  // TAB3 和 XTABS(与 TAB3 等效)保留,暂未使用
20552bcb59eSGnoCiYeH         const XTABS = 0x01800;
20652da9a59SGnoCiYeH 
20752da9a59SGnoCiYeH         /// 配置回车符的处理方式
20852bcb59eSGnoCiYeH         const CRDLY	= 0x00600;
20952da9a59SGnoCiYeH         const   CR0	= 0x00000;  // 不延迟回车
21052bcb59eSGnoCiYeH         const   CR1	= 0x02000;  //  延迟回车(输出回车后等待一段时间再输出换行)
21152bcb59eSGnoCiYeH         const   CR2	= 0x04000;  // CR2 和 CR3保留,暂未使用
21252bcb59eSGnoCiYeH         const   CR3	= 0x06000;
21352da9a59SGnoCiYeH 
21452da9a59SGnoCiYeH         /// 配置换页符(form feed)的处理方式
21552bcb59eSGnoCiYeH         const FFDLY	= 0x08000;
21652da9a59SGnoCiYeH         const   FF0	= 0x00000;  // 不延迟换页
21752bcb59eSGnoCiYeH         const   FF1	= 0x08000;  // 延迟换页
21852da9a59SGnoCiYeH 
21952da9a59SGnoCiYeH         /// 配置退格符(backspace)的处理方式
22052bcb59eSGnoCiYeH         const BSDLY	= 0x02000;
22152da9a59SGnoCiYeH         const   BS0	= 0x00000;  // 不延迟退格
22252bcb59eSGnoCiYeH         const   BS1	= 0x02000;  // 延迟退格
22352da9a59SGnoCiYeH 
22452da9a59SGnoCiYeH         /// 配置垂直制表符(vertical tab)的处理方式
22552bcb59eSGnoCiYeH         const VTDLY	= 0x04000;
22652da9a59SGnoCiYeH         const   VT0	= 0x00000;  // 不延迟垂直制表符
22752bcb59eSGnoCiYeH         const   VT1	= 0x04000;  // 延迟垂直制表符
22852da9a59SGnoCiYeH 
22952da9a59SGnoCiYeH         /// 表示执行输出处理,即启用输出处理函数
23052da9a59SGnoCiYeH         const OPOST	= 0x01;
23152da9a59SGnoCiYeH         /// 表示将输出的回车符 (\r) 映射为换行符 (\n)
23252da9a59SGnoCiYeH         const OCRNL	= 0x08;
23352da9a59SGnoCiYeH         /// 表示在输出时,如果光标在第 0 列,则不输出回车符 (\r)
23452da9a59SGnoCiYeH         const ONOCR	= 0x10;
23552da9a59SGnoCiYeH         /// 表示将回车符 (\r) 映射为换行符 (\n)
23652da9a59SGnoCiYeH         const ONLRET	= 0x20;
23752da9a59SGnoCiYeH         /// 表示使用填充字符进行延迟。这个填充字符的默认值是空格。
23852da9a59SGnoCiYeH         const OFILL	= 0x40;
23952da9a59SGnoCiYeH         /// 表示使用删除字符 (DEL, \177) 作为填充字符
24052da9a59SGnoCiYeH         const OFDEL	= 0x80;
24152da9a59SGnoCiYeH     }
24252da9a59SGnoCiYeH 
24352da9a59SGnoCiYeH     /// 配置终端设备的基本特性和控制参数
24452da9a59SGnoCiYeH     pub struct ControlMode: u32 {
24552da9a59SGnoCiYeH         /// Baud Rate Mask 指定波特率的掩码
24652bcb59eSGnoCiYeH         const CBAUD		= 0x0000100f;
24752da9a59SGnoCiYeH         /// Extra Baud Bits 指定更高的波特率位
24852bcb59eSGnoCiYeH         const CBAUDEX	= 0x00001000;
24952da9a59SGnoCiYeH         /// Custom Baud Rate 指定自定义波特率 如果设置了 BOTHER,则通过以下位来设置自定义的波特率值
25052bcb59eSGnoCiYeH         const BOTHER	= 0x00001000;
25152da9a59SGnoCiYeH 
25252bcb59eSGnoCiYeH         /* Common CBAUD rates */
25352bcb59eSGnoCiYeH         const     B0	= 0x00000000;	/* hang up */
25452da9a59SGnoCiYeH         const    B50	= 0x00000001;
25552da9a59SGnoCiYeH         const    B75	= 0x00000002;
25652da9a59SGnoCiYeH         const   B110	= 0x00000003;
25752da9a59SGnoCiYeH         const   B134	= 0x00000004;
25852da9a59SGnoCiYeH         const   B150	= 0x00000005;
25952da9a59SGnoCiYeH         const   B200	= 0x00000006;
26052da9a59SGnoCiYeH         const   B300	= 0x00000007;
26152da9a59SGnoCiYeH         const   B600	= 0x00000008;
26252da9a59SGnoCiYeH         const  B1200	= 0x00000009;
26352da9a59SGnoCiYeH         const  B1800	= 0x0000000a;
26452da9a59SGnoCiYeH         const  B2400	= 0x0000000b;
26552da9a59SGnoCiYeH         const  B4800	= 0x0000000c;
26652da9a59SGnoCiYeH         const  B9600	= 0x0000000d;
26752da9a59SGnoCiYeH         const B19200	= 0x0000000e;
26852da9a59SGnoCiYeH         const B38400	= 0x0000000f;
26952da9a59SGnoCiYeH 
27052bcb59eSGnoCiYeH         const     B57600 = 0x00001001;
27152bcb59eSGnoCiYeH         const    B115200 = 0x00001002;
27252bcb59eSGnoCiYeH         const    B230400 = 0x00001003;
27352bcb59eSGnoCiYeH         const    B460800 = 0x00001004;
27452bcb59eSGnoCiYeH         const    B500000 = 0x00001005;
27552bcb59eSGnoCiYeH         const    B576000 = 0x00001006;
27652bcb59eSGnoCiYeH         const    B921600 = 0x00001007;
27752bcb59eSGnoCiYeH         const   B1000000 = 0x00001008;
27852bcb59eSGnoCiYeH         const   B1152000 = 0x00001009;
27952bcb59eSGnoCiYeH         const   B1500000 = 0x0000100a;
28052bcb59eSGnoCiYeH         const   B2000000 = 0x0000100b;
28152bcb59eSGnoCiYeH         const   B2500000 = 0x0000100c;
28252bcb59eSGnoCiYeH         const   B3000000 = 0x0000100d;
28352bcb59eSGnoCiYeH         const   B3500000 = 0x0000100e;
28452bcb59eSGnoCiYeH         const   B4000000 = 0x0000100f;
28552da9a59SGnoCiYeH 
28652da9a59SGnoCiYeH         /// 指定字符大小的掩码 以下位为特定字符大小
28752bcb59eSGnoCiYeH         const CSIZE		= 0x00000030;
28852da9a59SGnoCiYeH         const   CS5		= 0x00000000;
28952bcb59eSGnoCiYeH         const   CS6		= 0x00000010;
29052bcb59eSGnoCiYeH         const   CS7		= 0x00000020;
29152bcb59eSGnoCiYeH         const   CS8		= 0x00000030;
29252da9a59SGnoCiYeH 
29352da9a59SGnoCiYeH         /// Stop Bit Select 表示使用两个停止位;否则,表示使用一个停止位
29452bcb59eSGnoCiYeH         const CSTOPB	= 0x00000040;
29552da9a59SGnoCiYeH         /// 表示启用接收器。如果未设置,则禁用接收器。
29652bcb59eSGnoCiYeH         const CREAD		= 0x00000080;
29752da9a59SGnoCiYeH         /// 表示启用奇偶校验。如果未设置,则禁用奇偶校验。
29852bcb59eSGnoCiYeH         const PARENB	= 0x00000100;
29952da9a59SGnoCiYeH         /// 表示启用奇校验。如果未设置,则表示启用偶校验。
30052bcb59eSGnoCiYeH         const PARODD	= 0x00000200;
30152da9a59SGnoCiYeH         /// 表示在终端设备被关闭时挂断线路(执行挂断操作)
30252bcb59eSGnoCiYeH         const HUPCL		= 0x00000400;
30352da9a59SGnoCiYeH         /// 表示忽略调制解调器的状态(DCD、DSR、CTS 等)
30452bcb59eSGnoCiYeH         const CLOCAL	= 0x00000800;
30552da9a59SGnoCiYeH         /// 指定输入波特率的掩码
30652bcb59eSGnoCiYeH         const CIBAUD	= 0x100f0000;
30752da9a59SGnoCiYeH 
30852da9a59SGnoCiYeH         const ADDRB = 0x20000000;
30952da9a59SGnoCiYeH     }
31052da9a59SGnoCiYeH 
31152da9a59SGnoCiYeH     /// 配置终端设备的本地模式(local mode)或控制输入处理的行为
31252da9a59SGnoCiYeH     pub struct LocalMode: u32 {
31352da9a59SGnoCiYeH         /// 启用中断字符(Ctrl-C、Ctrl-Z)
31452bcb59eSGnoCiYeH         const ISIG	 = 0x00001;
31552da9a59SGnoCiYeH         /// 表示启用规范模式,即启用行缓冲和回显。在规范模式下,输入被缓冲,并且只有在输入回车符时才会传递给应用程序。
31652bcb59eSGnoCiYeH         const ICANON = 0x00002;
31752da9a59SGnoCiYeH         /// 表示启用大写模式,即输入输出都将被转换为大写。
31852bcb59eSGnoCiYeH         const XCASE	 = 0x00004;
31952da9a59SGnoCiYeH         /// 表示启用回显(显示用户输入的字符)
32052bcb59eSGnoCiYeH         const ECHO	 = 0x00008;
32152da9a59SGnoCiYeH         /// 表示在回显时将擦除的字符用 backspace 和空格字符显示。
32252bcb59eSGnoCiYeH         const ECHOE	 = 0x00010;
32352da9a59SGnoCiYeH         /// 表示在回显时将换行符后的字符用空格字符显示。
32452bcb59eSGnoCiYeH         const ECHOK	 = 0x00020;
32552da9a59SGnoCiYeH         /// 表示在回显时将换行符显示为换行和回车符。
32652bcb59eSGnoCiYeH         const ECHONL = 0x00040;
32752da9a59SGnoCiYeH         /// 表示在收到中断(Ctrl-C)和退出(Ctrl-\)字符后,不清空输入和输出缓冲区。
32852bcb59eSGnoCiYeH         const NOFLSH = 0x00080;
32952da9a59SGnoCiYeH         /// 表示在后台进程尝试写入终端时,发送停止信号(Ctrl-S)
33052bcb59eSGnoCiYeH         const TOSTOP = 0x00100;
33152da9a59SGnoCiYeH         /// 表示在回显时,显示控制字符为 ^ 加字符。
33252bcb59eSGnoCiYeH         const ECHOCTL= 0x00200;
33352da9a59SGnoCiYeH         /// 表示在回显时显示带有 # 的换行符(为了与 echo -n 命令兼容)。
33452bcb59eSGnoCiYeH         const ECHOPRT= 0x00400;
33552da9a59SGnoCiYeH         /// 表示在回显时将 KILL 字符(Ctrl-U)用空格字符显示。
33652bcb59eSGnoCiYeH         const ECHOKE = 0x00800;
33752da9a59SGnoCiYeH         /// 表示输出正在被冲刷(flush),通常是由于输入/输出流的状态变化。
33852bcb59eSGnoCiYeH         const FLUSHO = 0x01000;
33952da9a59SGnoCiYeH         /// 表示在规范模式下,存在需要重新打印的字符。
34052bcb59eSGnoCiYeH         const PENDIN = 0x04000;
34152da9a59SGnoCiYeH         /// 表示启用实现定义的输入处理。
34252bcb59eSGnoCiYeH         const IEXTEN = 0x08000;
34352da9a59SGnoCiYeH         /// 表示启用扩展的处理函数
34452bcb59eSGnoCiYeH         const EXTPROC= 0x10000;
34552da9a59SGnoCiYeH     }
34652da9a59SGnoCiYeH 
34752da9a59SGnoCiYeH     pub struct TtySetTermiosOpt: u8 {
34852da9a59SGnoCiYeH         const TERMIOS_FLUSH	=1;
34952da9a59SGnoCiYeH         const TERMIOS_WAIT	=2;
35052da9a59SGnoCiYeH         const TERMIOS_TERMIO	=4;
35152da9a59SGnoCiYeH         const TERMIOS_OLD	=8;
35252da9a59SGnoCiYeH     }
35352da9a59SGnoCiYeH }
35452da9a59SGnoCiYeH 
35552da9a59SGnoCiYeH /// 对应termios中控制字符的索引
35652da9a59SGnoCiYeH pub struct ControlCharIndex;
35752da9a59SGnoCiYeH #[allow(dead_code)]
35852da9a59SGnoCiYeH impl ControlCharIndex {
35952da9a59SGnoCiYeH     pub const DISABLE_CHAR: u8 = b'\0';
36052da9a59SGnoCiYeH     /// 中断信号
36152da9a59SGnoCiYeH     pub const VINTR: usize = 0;
36252da9a59SGnoCiYeH     /// 退出信号
36352da9a59SGnoCiYeH     pub const VQUIT: usize = 1;
36452da9a59SGnoCiYeH     /// 退格
36552da9a59SGnoCiYeH     pub const VERASE: usize = 2;
36652da9a59SGnoCiYeH     /// 终止输入信号
36752da9a59SGnoCiYeH     pub const VKILL: usize = 3;
36852da9a59SGnoCiYeH     /// 文件结束信号 \0?
36952da9a59SGnoCiYeH     pub const VEOF: usize = 4;
37052da9a59SGnoCiYeH     /// 指定非规范模式下的最小字符数
37152da9a59SGnoCiYeH     pub const VMIN: usize = 5;
37252da9a59SGnoCiYeH     /// 换行符
37352da9a59SGnoCiYeH     pub const VEOL: usize = 6;
37452da9a59SGnoCiYeH     /// 指定非规范模式下的超时时间
37552da9a59SGnoCiYeH     pub const VTIME: usize = 7;
37652da9a59SGnoCiYeH     /// 换行符
37752da9a59SGnoCiYeH     pub const VEOL2: usize = 8;
37852da9a59SGnoCiYeH     /// 未使用,保留
37952da9a59SGnoCiYeH     pub const VSWTC: usize = 9;
38052da9a59SGnoCiYeH     /// 擦除前一个单词
38152da9a59SGnoCiYeH     pub const VWERASE: usize = 10;
38252da9a59SGnoCiYeH     /// 重新打印整行
38352da9a59SGnoCiYeH     pub const VREPRINT: usize = 11;
38452da9a59SGnoCiYeH     /// 挂起信号
38552da9a59SGnoCiYeH     pub const VSUSP: usize = 12;
38652da9a59SGnoCiYeH     /// 启动输出信号
38752da9a59SGnoCiYeH     pub const VSTART: usize = 13;
38852da9a59SGnoCiYeH     /// 停止输出信号
38952da9a59SGnoCiYeH     pub const VSTOP: usize = 14;
39052da9a59SGnoCiYeH     /// 将下一个字符视为字面值,而不是特殊字符
39152da9a59SGnoCiYeH     pub const VLNEXT: usize = 15;
39252da9a59SGnoCiYeH     /// 对应于字符丢弃信号,用于丢弃当前输入的行
39352da9a59SGnoCiYeH     pub const VDISCARD: usize = 16;
39452da9a59SGnoCiYeH }
395