在linux系統中,終端是一類字元型裝置,它包括多種型別,通常使用tty來簡稱各種型別的終端裝置。主要包括以下幾種:
串列埠終端(/dev/ttys*):
串列埠終端是使用計算機串列埠連線的終端裝置。linux把每個串列埠都看作是乙個字元裝置。這些串列埠所對應的裝置名稱是 /dev/ttysac0; /dev/ttysac1……
控制台終端(/dev/console):
在linux系統中,計算機的輸出裝置通常被稱為控制台終端(console),這裡特指printk資訊輸出到的裝置。/dev/console 是乙個虛擬的裝置,它需要對映到真正的tty上,比如通過核心啟動引數 」 console=ttysac0 」就把console對映到了串列埠0。
虛擬終端(/dev/tty*):
當使用者登入時,使用的是虛擬終端。使用ctcl+alt+[f1—f6]組合鍵時,我們就可以切換到tty1、tty2、tty3等上面去。tty1–tty6等稱為虛擬終端,而tty0則是當前所使用虛擬終端的乙個別名。
tty架構分析:
linux 的 tty 子系統包含:tty核心,tty線路規程和tty驅動。tty核心是對整個tty裝置的抽象,對使用者提供統一的介面,tty線路規程是對傳輸資料的格式化,tty驅動則是面向tty裝置的硬體驅動。
初始化:
uart驅動程式結構:struct uart_driver
uart埠結構: struct uart_port
uart相關操作函式結構: struct uart_ops
uart狀態結構: struct uart_state
uart資訊結構: struct uart_info
開啟裝置:
傳送資料:
接收資料:
下面的兩個例子都是在ok6410開發板的串列埠驅動程式,詳細**在核心**linux-ok6410\drivers\tty\serial\samsung.c檔案中。
傳送資料中斷處理函式:
接收資料中斷處理函式://串列埠傳送函式
static irqreturn_t s3c24xx_serial_tx_chars(int irq, void *id)
//2、判斷迴圈緩衝是否為空或者串列埠驅動是否關閉,若是則取消傳送
if (uart_circ_empty(xmit) || uart_tx_stopped(port))
//3、若傳送緩衝不為空,且傳送數量小於256個,則迴圈傳送
while (!uart_circ_empty(xmit) && count-- > 0)//大於0
//4、如果傳送緩衝中的剩餘資料量小於256,則喚醒之前阻塞的傳送程序
if (uart_circ_chars_pending(xmit) < wakeup_chars)
uart_write_wakeup(port);
//5、如果傳送緩衝為空,關閉傳送使能
if (uart_circ_empty(xmit))
s3c24xx_serial_stop_tx(port);
out:
return irq_handled;
}
//串列埠接收資料函式
static irqreturn_t s3c24xx_serial_rx_chars(int irq, void *dev_id)
//10、將串列埠驅動接受到的資料送進線路規程中,匯入到 read-buf 中
tty_flip_buffer_push(tty);
out:
return irq_handled;
}
tty串列埠驅動程式設計
在linux系統中,終端是一類字元型裝置,它包括多種型別,通常使用tty來簡稱各種型別的終端裝置。1 串列埠中斷 dev ttys 2 控制台終端 dev console 3 虛擬終端 dev tty 控制台 供核心使用的終端為控制台。控制台在linux啟動時,通過命令console 指定,如果沒有...
HAL驅動的串列埠程式設計陷阱
手上有塊nucleo stm32l053x板子,用來做串列埠實驗,看了下st的最新庫hal驅動,於是想用hal驅動來做串列埠。使用過程中發現只能傳送資料不能接收資料,用邏輯分析儀檢視rx,tx引角,都有資料,但就是收不到資料。使用stm32f103傳統驅動,一點問題沒有,改到hal怎麼就不行了呢?經...
串列埠驅動新增
檢視原理圖可知,當前開發板的串列埠鏈結在dio2 和dio3 引腳定義在cc2640r2 launchxl.h中,此處無需更改 串列埠引腳配置參考如下部分,rx被配置為下拉輸入,tx被配置為上拉輸出。在本例中我新建了乙個uart的使用者任務,大家可不糾結於此,後面會對當前的框架調整進行詳細說明。ua...