tty串列埠驅動程式設計

2021-07-30 04:37:14 字數 2685 閱讀 8048

在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...