在linux系統中,終端是一類字元型裝置,它包括多種型別,通常使用tty來簡稱各種型別的終端裝置。
1、 串列埠中斷(/dev/ttys*)
2、 控制台終端(/dev/console)
3、 虛擬終端(/dev/tty*)
控制台
供核心使用的終端為控制台。控制台在linux啟動時,通過命令console=…指定,如果沒有指定控制台,系統把第乙個註冊的終端tty作為控制台。
終端體系
在linux中,tty體系分為:tty核心,tty線路規程,tty驅動3部分。tty核心從使用者獲取要傳送給tty裝置的資料,然後把資料傳遞給tty線路規程,他對資料進行處理後,負責把資料傳遞到tty驅動程式,tty驅動程式負責格式化資料,並通過硬體傳送出去。
從硬體收到的資料向上通過tty驅動,進入tty線路規程,再進入tty核心,最後被使用者獲取。tty驅動可以直接和tty核心通訊,但是通常tty執行緒規劃會修改在兩者之間傳送的資料。tty驅動不能直接和線路規程通訊,甚至不知道它的存在,線路規程的工作是格式化從使用者或者硬體收到的資料。這種格式化常常實現為乙個協議,如ppp或bluetooth。
讀操作tty驅動從硬體收到資料後,負責把資料傳遞到tty核心,tty核心將從tty驅動收到的資料快取到乙個tty_flip_buffer型別的結構中。該結構包含兩個資料陣列。從tty裝置接裝置接收到的資料被儲存於第乙個陣列,當這個陣列滿,等待資料的使用者將被通知。當使用者從這個陣列讀資料時資料時,任何從tty驅動驅動新來的資料將被儲存在第2個陣列。當第二個陣列存滿後,資料再次提交給使用者,並且驅動又開始填充第1個陣列,以此交替。
驅動描述
structuart_driver {
struct module *owner;
const char *driver_name; //驅動名
const char *dev_name; //裝置名
int major; //主裝置號
int minor; //起始次裝置號
int nr; //裝置數
struct console *cons;
struct uart_state *state;
struct tty_driver *tty_driver;
驅動註冊
int uart_register_driver(struct uart_driver *drv)
埠描述struct uart_port
spinlock_t lock; /* 埠鎖 */
unsigned int iobase; /* io埠基位址 */
unsigned char __iomem *membase; /* io記憶體基位址 */
unsigned int irq; /* 中斷號*/
unsigned char fifosize; /*傳輸fifo大小*/
const struct uart_ops *ops;
操作串列埠
struct uart_ops
unsigned int(*tx_empty)(struct uart_port*);
void(*set_mctrl)(struct uart_port *, unsigned int mctrl);
unsigned int(*get_mctrl)(struct uart_port*);
void(*stop_tx)(struct uart_port*); //停止傳送
void(*start_tx)(struct uart_port*); //開始傳送
void(*send_xchar)(struct uart_port *, char ch); //傳送xchar
void(*stop_rx)(struct uart_port*); //停止接收
新增埠int uart_add_one_port(struct uart_driver*drv, struct uart_port *port)
操作流程
1、 定義乙個usrt_druver的變數,並初始化;
2、 使用uart_register_driver來註冊這個驅動;
3、 初始化uart_port和ops
4、 呼叫uart_add_one_port()新增初始化好的uart_port
串列埠開啟
1、 使能串列埠接收功能:rx_enabled
2、 為資料接收註冊中斷處理程式
3、 使能串列埠傳送功能tx_enabled
4、 為資料傳送註冊中斷處理程式
串列埠傳送資料
1、 判斷x_char是否為0,如果不為0,則傳送x_char。
2、 如果傳送緩衝區或驅動為停止傳送,取消傳送。
3、 迴圈傳送,迴圈條件:傳送緩衝區不為空
4、 如果傳送緩衝區的剩餘資料量<256,則喚醒之前阻塞的傳送程序。
5、 如果傳送緩衝為空,則關閉傳送使能。
串列埠驅動程式設計
在linux系統中,終端是一類字元型裝置,它包括多種型別,通常使用tty來簡稱各種型別的終端裝置。主要包括以下幾種 串列埠終端 dev ttys 串列埠終端是使用計算機串列埠連線的終端裝置。linux把每個串列埠都看作是乙個字元裝置。這些串列埠所對應的裝置名稱是 dev ttysac0 dev tt...
Linux串列埠驅動程式 1 tty驅動程式架構
1.tty概念分析 控制台終端 dev console 虛擬終端 dev tty 在linux核心中printk函式處理是交給控制台終端的,控制台終端又把它對映到串列埠終端或者螢幕終端上。而虛擬終端更多是在應用程式中使用。2.tty架構解析 3.回溯串列埠資料傳送 static void s3c24...
MAC OS X 連線tty串列埠指令碼
通過串列埠除錯裝置,最常用到的軟體是securecrt,putty 和超級終端。在osx 上,超級終端徹底沒戲,這是windows的程式。putty有port的x11版本,雖然可以使用,但一直不太穩定,會莫名其妙的死掉。securecrt有原生mac的版本,但是太貴了,一直沒捨得買。securecr...