#ifndef _TERMIOS_H
#define _TERMIOS_H
#define TTY_BUF_SIZE 1024 // tty 中的緩衝區長度。
/* 0x54 is just a magic number to make these relatively uniqe ('T') */
/* 0x54 只是一個魔數,目的是為了使這些常數唯一('T') */
// tty 裝置的ioctl 呼叫命令集。ioctl 將命令編碼在低位字中。
// 下面名稱TC[*]的含義是tty 控制命令。
// 取相應終端termios 結構中的資訊(參見tcgetattr())。
#define TCGETS 0x5401
// 設定相應終端termios 結構中的資訊(參見tcsetattr(),TCSANOW)。
#define TCSETS 0x5402
// 在設定終端termios 的資訊之前,需要先等待輸出佇列中所有資料處理完(耗盡)。對於修改引數
// 會影響輸出的情況,就需要使用這種形式(參見tcsetattr(),TCSADRAIN 選項)。
#define TCSETSW 0x5403
// 在設定termios 的資訊之前,需要先等待輸出佇列中所有資料處理完,並且重新整理(清空)輸入佇列。
// 再設定(參見tcsetattr(),TCSAFLUSH 選項)。
#define TCSETSF 0x5404
// 取相應終端termio 結構中的資訊(參見tcgetattr())。
#define TCGETA 0x5405
// 設定相應終端termio 結構中的資訊(參見tcsetattr(),TCSANOW 選項)。
#define TCSETA 0x5406
// 在設定終端termio 的資訊之前,需要先等待輸出佇列中所有資料處理完(耗盡)。對於修改引數
// 會影響輸出的情況,就需要使用這種形式(參見tcsetattr(),TCSADRAIN 選項)。
#define TCSETAW 0x5407
// 在設定termio 的資訊之前,需要先等待輸出佇列中所有資料處理完,並且重新整理(清空)輸入佇列。
// 再設定(參見tcsetattr(),TCSAFLUSH 選項)。
#define TCSETAF 0x5408
// 等待輸出佇列處理完畢(空),如果引數值是0,則傳送一個break(參見tcsendbreak(),tcdrain())。
#define TCSBRK 0x5409
// 開始/停止控制。如果引數值是0,則掛起輸出;如果是1,則重新開啟掛起的輸出;如果是2,則掛起
// 輸入;如果是3,則重新開啟掛起的輸入(參見tcflow())。
#define TCXONC 0x540A
//重新整理已寫輸出但還沒傳送或已收但還沒有讀資料。如果引數是0,則重新整理(清空)輸入佇列;如果是1,
// 則重新整理輸出佇列;如果是2,則重新整理輸入和輸出佇列(參見tcflush())。
#define TCFLSH 0x540B
// 下面名稱TIOC[*]的含義是tty 輸入輸出控制命令。
// 設定終端序列線路專用模式。
#define TIOCEXCL 0x540C
// 復位終端序列線路專用模式。
#define TIOCNXCL 0x540D
// 設定tty 為控制終端。(TIOCNOTTY - 禁止tty 為控制終端)。
#define TIOCSCTTY 0x540E
// 讀取指定終端裝置程式的組id(參見tcgetpgrp())。
#define TIOCGPGRP 0x540F
// 設定指定終端裝置程式的組id(參見tcsetpgrp())。
#define TIOCSPGRP 0x5410
// 返回輸出佇列中還未送出的字元數。
#define TIOCOUTQ 0x5411
// 模擬終端輸入。該命令以一個指向字元的指標作為引數,並假裝該字元是在終端上鍵入的。使用者必須
// 在該控制終端上具有超級使用者許可權或具有讀許可許可權。
#define TIOCSTI 0x5412
// 讀取終端裝置視窗大小資訊(參見winsize 結構)。
#define TIOCGWINSZ 0x5413
// 設定終端裝置視窗大小資訊(參見winsize 結構)。
#define TIOCSWINSZ 0x5414
// 返回modem 狀態控制引線的當前狀態位元位標誌集(參見下面185-196 行)。
#define TIOCMGET 0x5415
// 設定單個modem 狀態控制引線的狀態(true 或false)(Individual control line Set)。
#define TIOCMBIS 0x5416
// 復位單個modem 狀態控制引線的狀態(Individual control line clear)。
#define TIOCMBIC 0x5417
// 設定modem 狀態引線的狀態。如果某一位元位置位,則modem 對應的狀態引線將置為有效。
#define TIOCMSET 0x5418
// 讀取軟體載波檢測標誌(1 - 開啟;0 - 關閉)。
// 對於本地連線的終端或其它裝置,軟體載波標誌是開啟的,對於使用modem 線路的終端或裝置則
// 是關閉的。為了能使用這兩個ioctl 呼叫,tty 線路應該是以O_NDELAY 方式開啟的,這樣open()
// 就不會等待載波。
#define TIOCGSOFTCAR 0x5419
// 設定軟體載波檢測標誌(1 - 開啟;0 - 關閉)。
#define TIOCSSOFTCAR 0x541A
// 返回輸入佇列中還未取走字元的數目。
#define TIOCINQ 0x541B
// 視窗大小(Window size)屬性結構。在視窗環境中可用於基於螢幕的應用程式。
// ioctls 中的TIOCGWINSZ 和TIOCSWINSZ 可用來讀取或設定這些資訊。
struct winsize
{
unsigned short ws_row; // 視窗字元行數。
unsigned short ws_col; // 視窗字元列數。
unsigned short ws_xpixel; // 視窗寬度,象素值。
unsigned short ws_ypixel; // 視窗高度,象素值。
};
// AT&T 系統V 的termio 結構。
#define NCC 8 // termio 結構中控制字元陣列的長度。
struct termio
{
unsigned short c_iflag; /* input mode flags */// 輸入模式標誌。
unsigned short c_oflag; /* output mode flags */// 輸出模式標誌。
unsigned short c_cflag; /* control mode flags */// 控制模式標誌。
unsigned short c_lflag; /* local mode flags */// 本地模式標誌。
unsigned char c_line; /* line discipline */// 線路規程(速率)。
unsigned char c_cc[NCC]; /* control characters */// 控制字元陣列。
};
// POSIX 的termios 結構。
#define NCCS 17 // termios 結構中控制字元陣列的長度。
struct termios
{
unsigned long c_iflag; /* input mode flags */// 輸入模式標誌。
unsigned long c_oflag; /* output mode flags */// 輸出模式標誌。
unsigned long c_cflag; /* control mode flags */// 控制模式標誌。
unsigned long c_lflag; /* local mode flags */// 本地模式標誌。
unsigned char c_line; /* line discipline */// 線路規程(速率)。
unsigned char c_cc[NCCS]; /* control characters */// 控制字元陣列。
};
/* c_cc characters *//* c_cc 陣列中的字元 */
// 以下是c_cc 陣列對應字元的索引值。
#define VINTR 0 // c_cc[VINTR] = INTR (^C),/003,中斷字元。
#define VQUIT 1 // c_cc[VQUIT] = QUIT (^/),/034,退出字元。
#define VERASE 2 // c_cc[VERASE] = ERASE (^H),/177,擦出字元。
#define VKILL 3 // c_cc[VKILL] = KILL (^U),/025,終止字元。
#define VEOF 4 // c_cc[VEOF] = EOF (^D),/004,檔案結束字元。
#define VTIME 5 // c_cc[VTIME] = TIME (/0),/0, 定時器值(參見後面說明)。
#define VMIN 6 // c_cc[VMIN] = MIN (/1),/1, 定時器值。
#define VSWTC 7 // c_cc[VSWTC] = SWTC (/0),/0, 交換字元。
#define VSTART 8 // c_cc[VSTART] = START (^Q),/021,開始字元。
#define VSTOP 9 // c_cc[VSTOP] = STOP (^S),/023,停止字元。
#define VSUSP 10 // c_cc[VSUSP] = SUSP (^Z),/032,掛起字元。
#define VEOL 11 // c_cc[VEOL] = EOL (/0),/0, 行結束字元。
#define VREPRINT 12 // c_cc[VREPRINT] = REPRINT (^R),/022,重顯示字元。
#define VDISCARD 13 // c_cc[VDISCARD] = DISCARD (^O),/017,丟棄字元。
#define VWERASE 14 // c_cc[VWERASE] = WERASE (^W),/027,單詞擦除字元。
#define VLNEXT 15 // c_cc[VLNEXT] = LNEXT (^V),/026,下一行字元。
#define VEOL2 16 // c_cc[VEOL2] = EOL2 (/0),/0, 行結束2。
/* c_iflag bits *//* c_iflag 位元位 */
// termios 結構輸入模式欄位c_iflag 各種標誌的符號常數。
#define IGNBRK 0000001 // 輸入時忽略BREAK 條件。
#define BRKINT 0000002 // 在BREAK 時產生SIGINT 訊號。
#define IGNPAR 0000004 // 忽略奇偶校驗出錯的字元。
#define PARMRK 0000010 // 標記奇偶校驗錯。
#define INPCK 0000020 // 允許輸入奇偶校驗。
#define ISTRIP 0000040 // 遮蔽字元第8 位。
#define INLCR 0000100 // 輸入時將換行符NL 對映成回車符CR。
#define IGNCR 0000200 // 忽略回車符CR。
#define ICRNL 0000400 // 在輸入時將回車符CR 對映成換行符NL。
#define IUCLC 0001000 // 在輸入時將大寫字元轉換成小寫字元。
#define IXON 0002000 // 允許開始/停止(XON/XOFF)輸出控制。
#define IXANY 0004000 // 允許任何字元重啟輸出。
#define IXOFF 0010000 // 允許開始/停止(XON/XOFF)輸入控制。
#define IMAXBEL 0020000 // 輸入佇列滿時響鈴。
/* c_oflag bits *//* c_oflag 位元位 */
// termios 結構中輸出模式欄位c_oflag 各種標誌的符號常數。
#define OPOST 0000001 // 執行輸出處理。
#define OLCUC 0000002 // 在輸出時將小寫字元轉換成大寫字元。
#define ONLCR 0000004 // 在輸出時將換行符NL 對映成回車-換行符CR-NL。
#define OCRNL 0000010 // 在輸出時將回車符CR 對映成換行符NL。
#define ONOCR 0000020 // 在0 列不輸出回車符CR。
#define ONLRET 0000040 // 換行符NL 執行回車符的功能。
#define OFILL 0000100 // 延遲時使用填充字元而不使用時間延遲。
#define OFDEL 0000200 // 填充字元是ASCII 碼DEL。如果未設定,則使用ASCII NULL。
#define NLDLY 0000400 // 選擇換行延遲。
#define NL0 0000000 // 換行延遲型別0。
#define NL1 0000400 // 換行延遲型別1。
#define CRDLY 0003000 // 選擇回車延遲。
#define CR0 0000000 // 回車延遲型別0。
#define CR1 0001000 // 回車延遲型別1。
#define CR2 0002000 // 回車延遲型別2。
#define CR3 0003000 // 回車延遲型別3。
#define TABDLY 0014000 // 選擇水平製表延遲。
#define TAB0 0000000 // 水平製表延遲型別0。
#define TAB1 0004000 // 水平製表延遲型別1。
#define TAB2 0010000 // 水平製表延遲型別2。
#define TAB3 0014000 // 水平製表延遲型別3。
#define XTABS 0014000 // 將製表符TAB 換成空格,該值表示空格數。
#define BSDLY 0020000 // 選擇退格延遲。
#define BS0 0000000 // 退格延遲型別0。
#define BS1 0020000 // 退格延遲型別1。
#define VTDLY 0040000 // 縱向製表延遲。
#define VT0 0000000 // 縱向製表延遲型別0。
#define VT1 0040000 // 縱向製表延遲型別1。
#define FFDLY 0040000 // 選擇換頁延遲。
#define FF0 0000000 // 換頁延遲型別0。
#define FF1 0040000 // 換頁延遲型別1。
/* c_cflag bit meaning *//* c_cflag 位元位的含義 */
// termios 結構中控制模式標誌欄位c_cflag 標誌的符號常數(8 進位制數)。
#define CBAUD 0000017 // 傳輸速率位遮蔽碼。
#define B0 0000000 /* hang up */ /* 結束通話線路 */
#define B50 0000001 // 波特率 50。
#define B75 0000002 // 波特率 75。
#define B110 0000003 // 波特率 110。
#define B134 0000004 // 波特率 134。
#define B150 0000005 // 波特率 150。
#define B200 0000006 // 波特率 200。
#define B300 0000007 // 波特率 300。
#define B600 0000010 // 波特率 600。
#define B1200 0000011 // 波特率 1200。
#define B1800 0000012 // 波特率 1800。
#define B2400 0000013 // 波特率 2400。
#define B4800 0000014 // 波特率 4800。
#define B9600 0000015 // 波特率 9600。
#define B19200 0000016 // 波特率 19200。
#define B38400 0000017 // 波特率 38400。
#define EXTA B19200 // 擴充套件波特率A。
#define EXTB B38400 // 擴充套件波特率B。
#define CSIZE 0000060 // 字元位寬度遮蔽碼。
#define CS5 0000000 // 每字元5 位元位。
#define CS6 0000020 // 每字元6 位元位。
#define CS7 0000040 // 每字元7 位元位。
#define CS8 0000060 // 每字元8 位元位。
#define CSTOPB 0000100 // 設定兩個停止位,而不是1 個。
#define CREAD 0000200 // 允許接收。
#define CPARENB 0000400 // 開啟輸出時產生奇偶位、輸入時進行奇偶校驗。
#define CPARODD 0001000 // 輸入/輸入校驗是奇校驗。
#define HUPCL 0002000 // 最後程式關閉後結束通話。
#define CLOCAL 0004000 // 忽略調變解調器(modem)控制線路。
#define CIBAUD 03600000 /* input baud rate (not used) */ /* 輸入波特率(未使用) */
#define CRTSCTS 020000000000 /* flow control */ /* 流控制 */
#define PARENB CPARENB // 開啟輸出時產生奇偶位、輸入時進行奇偶校驗。
#define PARODD CPARODD // 輸入/輸入校驗是奇校驗。
/* c_lflag bits *//* c_lflag 位元位 */
// termios 結構中本地模式標誌欄位c_lflag 的符號常數。
#define ISIG 0000001 // 當收到字元INTR、QUIT、SUSP 或DSUSP,產生相應的訊號。
#define ICANON 0000002 // 開啟規範模式(熟模式)。
#define XCASE 0000004 // 若設定了ICANON,則終端是大寫字元的。
#define ECHO 0000010 // 回顯輸入字元。
#define ECHOE 0000020 // 若設定了ICANON,則ERASE/WERASE 將擦除前一字元/單詞。
#define ECHOK 0000040 // 若設定了ICANON,則KILL 字元將擦除當前行。
#define ECHONL 0000100 // 如設定了ICANON,則即使ECHO 沒有開啟也回顯NL 字元。
#define NOFLSH 0000200 // 當生成SIGINT 和SIGQUIT 訊號時不重新整理輸入輸出佇列,當
// 生成SIGSUSP 訊號時,重新整理輸入佇列。
#define TOSTOP 0000400 // 傳送SIGTTOU 訊號到後臺程式的程式組,該後臺程式試圖寫
// 自己的控制終端。
#define ECHOCTL 0001000 // 若設定了ECHO,則除TAB、NL、START 和STOP 以外的ASCII
// 控制訊號將被回顯成象^X 式樣,X 值是控制符+0x40。
#define ECHOPRT 0002000 // 若設定了ICANON 和IECHO,則字元在擦除時將顯示。
#define ECHOKE 0004000 // 若設定了ICANON,則KILL 通過擦除行上的所有字元被回顯。
#define FLUSHO 0010000 // 輸出被重新整理。通過鍵入DISCARD 字元,該標誌被翻轉。
#define PENDIN 0040000 // 當下一個字元是讀時,輸入佇列中的所有字元將被重顯。
#define IEXTEN 0100000 // 開啟實現時定義的輸入處理。
/* modem lines *//* modem 線路訊號符號常數 */
#define TIOCM_LE 0x001 // 線路允許(Line Enable)。
#define TIOCM_DTR 0x002 // 資料終端就緒(Data Terminal Ready)。
#define TIOCM_RTS 0x004 // 請求傳送(Request to Send)。
#define TIOCM_ST 0x008 // 序列資料傳送(Serial Transfer)。[??]
#define TIOCM_SR 0x010 // 序列資料接收(Serial Receive)。[??]
#define TIOCM_CTS 0x020 // 清除傳送(Clear To Send)。
#define TIOCM_CAR 0x040 // 載波監測(Carrier Detect)。
#define TIOCM_RNG 0x080 // 響鈴指示(Ring indicate)。
#define TIOCM_DSR 0x100 // 資料裝置就緒(Data Set Ready)。
#define TIOCM_CD TIOCM_CAR
#define TIOCM_RI TIOCM_RNG
/* tcflow() and TCXONC use these *//* tcflow()和TCXONC 使用這些符號常數 */
#define TCOOFF 0 // 掛起輸出。
#define TCOON 1 // 重啟被掛起的輸出。
#define TCIOFF 2 // 系統傳輸一個STOP 字元,使裝置停止向系統傳輸資料。
#define TCION 3 // 系統傳輸一個START 字元,使裝置開始向系統傳輸資料。
/* tcflush() and TCFLSH use these *//* tcflush()和TCFLSH 使用這些符號常數 */
#define TCIFLUSH 0 // 清接收到的資料但不讀。
#define TCOFLUSH 1 // 清已寫的資料但不傳送。
#define TCIOFLUSH 2 // 清接收到的資料但不讀。清已寫的資料但不傳送。
/* tcsetattr uses these *//* tcsetattr()使用這些符號常數 */
#define TCSANOW 0 // 改變立即發生。
#define TCSADRAIN 1 // 改變在所有已寫的輸出被傳輸之後發生。
#define TCSAFLUSH 2 // 改變在所有已寫的輸出被傳輸之後並且在所有接收到但
// 還沒有讀取的資料被丟棄之後發生。
typedef int speed_t; // 波特率數值型別。
// 返回termios_p 所指termios 結構中的接收波特率。
extern speed_t cfgetispeed (struct termios *termios_p);
// 返回termios_p 所指termios 結構中的傳送波特率。
extern speed_t cfgetospeed (struct termios *termios_p);
// 將termios_p 所指termios 結構中的接收波特率設定為speed。
extern int cfsetispeed (struct termios *termios_p, speed_t speed);
// 將termios_p 所指termios 結構中的傳送波特率設定為speed。
extern int cfsetospeed (struct termios *termios_p, speed_t speed);
// 等待fildes 所指物件已寫輸出資料被傳送出去。
extern int tcdrain (int fildes);
// 掛起/重啟fildes 所指物件資料的接收和傳送。
extern int tcflow (int fildes, int action);
// 丟棄fildes 指定物件所有已寫但還沒傳送以及所有已收到但還沒有讀取的資料。
extern int tcflush (int fildes, int queue_selector);
// 獲取與控制程式碼fildes 對應物件的引數,並將其儲存在termios_p 所指的地方。
extern int tcgetattr (int fildes, struct termios *termios_p);
// 如果終端使用非同步序列資料傳輸,則在一定時間內連續傳輸一系列0 值位元位。
extern int tcsendbreak (int fildes, int duration);
// 使用termios 結構指標termios_p 所指的資料,設定與終端相關的引數。
extern int tcsetattr (int fildes, int optional_actions,
struct termios *termios_p);
#endif