1、終端裝置
在linux系統中,終端是一種字元型裝置,它有多種型別,通常使用tty來簡稱各種型別的終端裝置。tty是teletype的縮寫,teletype是最早出現的一種終端裝置,很像電傳打字機,是由teletype公司生產的。
linux中包含如下幾類終端裝置:
1).串列埠終端(/dev/ttysn)
使用計算機串列埠連線的終端裝置。串列埠對應的裝置名稱是/dev/ttysn。如/dev/ttys0、/dev/ttys1等,裝置號分別是(4,0)、(4,1)
2).偽終端(/dev/pty/)
顯示器通常稱為控制台終端,若當前程序有控制終端,則/dev/tty就是當前程序的控制終端的裝置特殊檔案。可以使用命令「ps-ax」檢視程序與哪個控制終端相連,使用命令「tty」檢視它具體對應哪個實際終端裝置。
3).控制台終端(/dev/ttyn, /dev/console)
2、linux核心tty層次結構
(1)、tty執行緒規程
以特殊的方式格式化從乙個使用者或者硬體收到的資料,這種格式化常常採用乙個協議轉換的形式,如ppp、bluetooth。
(2)、tty裝置傳送資料流程
tty核心從乙個使用者獲取將要傳送給乙個tty裝置的資料,tty核心將資料傳遞給tty線路規程驅動,接著資料被傳遞到tty驅動,tty驅動將資料轉換為可以傳送的硬體格式。
(3)、tty裝置接收資料流程
從tty硬體接收到的資料向上交給tty驅動,進入tty線路規程驅動,再進入tty核心,在此被使用者獲取。儘管tty核心與tty之間的資料傳輸會經歷tty線路規程的轉換,但是tty驅動與tty核心之間也可以直接傳輸資料。
(4)、上圖第一部分,因為終端是一種字元裝置,所以要按字元裝置的要求來註冊,並有對應的file_operations結構體,用於對裝置進行操作。
註冊的方法有兩種:
(1)、在drivers/char/tty_io.c中定義:
static const struct file_operations tty_fops = ;
此結構體在下面初始化函式中被賦值給對應的字元裝置tty
可以在註冊tty_driver結構體例項時進行,一般用此方法。 /*
* called by a tty driver to register itself.
*/int tty_register_driver(struct tty_driver *driver)
if (!driver->major)
} else
if (error < 0)
if (p) else
cdev_init(&driver->cdev, &tty_fops);
driver->cdev.owner = driver->owner;
error = cdev_add(&driver->cdev, dev, driver->num);
if (error)
mutex_lock(&tty_mutex);
list_add(&driver->tty_drivers, &tty_drivers);
mutex_unlock(&tty_mutex);
if (!(driver->flags & tty_driver_dynamic_dev))
proc_tty_register_driver(driver);
driver->flags |= tty_driver_installed;
return 0;}
S3C2440 UART串列埠驅動
通用非同步接收器和傳送器 universal asynchronous receiver and transmitter 簡稱uart。通常是嵌入式裝置中預設都會配置的通訊介面。這是因為,很多嵌入式裝置沒有顯示屏,無法獲得嵌入式裝置實時資料資訊,通過uart串列埠和超級終端相連,列印嵌入式裝置輸出資...
串列埠驅動設計(基於S3C6410)
串列埠充當的角色有兩個,乙個是資料傳輸,還有乙個就是充當控制台。串列埠通訊分為同步和非同步,我們通常使用的是非同步串列埠。通訊時,雙方先約定好資料幀的格式,即波特率,資料位,停止位,奇偶校驗位等。我們通常使用的是rs232的9幀串列埠,其中,最重要的是2,3,5腳。2 rxd接收資料 3 txd傳送...
Linux串列埠驅動程式 6 串列埠驅動實現
在linux驅動開發中,一般都不會從0開始寫,我們做的更多的是移植和修改,有時候還需要對驅動程式進行優化。當然具備移植 修改驅動能力的基礎是能夠讀懂驅動程式,同時需要對這個驅動程式的核心功能非常了解。接下來開始編寫傳送中斷處理程式和接收中斷處理程式的 1.傳送中斷處理程式的設計 傳送中斷處理程式 s...