一、TTY介紹 當前主要有三種類型tty設備及驅動程式:控制台、pty和串口。其中控制台和pty可看作為虛擬tty設備,物理tty設備包含串口、USB轉串口、SPI轉串口等。 二、TTY設備及驅動信息查看 確定tty設備及驅動程式類型可查閱/proc/tty/drivers文件。如下所示: 文件從左 ...
一、TTY介紹
當前主要有三種類型tty設備及驅動程式:控制台、pty和串口。其中控制台和pty可看作為虛擬tty設備,物理tty設備包含串口、USB轉串口、SPI轉串口等。
二、TTY設備及驅動信息查看
確定tty設備及驅動程式類型可查閱/proc/tty/drivers文件。如下所示:
文件從左至右列舉了:驅動程式名稱,預設節點名稱,驅動程式主設備號,次設備號範圍,tty驅動程式類型。
以cdc-acm驅動為例,驅動為acm,節點名為/dev/ttyACMx,類型為serial串口。
當前註冊並存在於內核的tty設備在/sys/class/tty下都有自己的子目錄,如將USB CDC轉雙串口晶元CH342接入USB主機時,信息如下:
三、TTY驅動概覽
Linux tty驅動包含硬體、tty驅動層、tty線路規程及tty核心層。
tty驅動層:將發送給它的數據格式化成硬體能理解的格式,並從硬體那裡接收數據。
tty線路規程:使用特殊方法,把從用戶或硬體接收的數據格式化,這類格式化通常使用一些協議完成轉換,比如PPP或者藍牙。
tty數據發送:tty核心從用戶層得到發往tty設備的數據,然後把數據發送給tty線路規程驅動,該驅動負責把數據傳遞給tty驅動程式,tty驅動程式對數據進行格式化,然後才能發送給硬體。
tty數據接收:tty硬體接收的數據會傳遞給tty驅動程式,然後流入tty線路規程驅動程式,接著是tty核心,最後用戶從tty核心獲取數據。
四、TTY驅動實現
tty驅動的註冊與註銷
tty驅動程式的主要數據結構是結構tty_driver,被用來向tty核心註冊和註銷驅動程式。
註冊tty驅動程式時,會同時註冊字元設備驅動。
註冊tty驅動
介面:tty_register_driver
- 指定驅動名
- 指定串口設備名
- 分配主從設備號
註銷tty驅動
介面:tty_unregister_driver
實現TTY操作函數集
tty核心將和硬體有關的操作,抽象、封裝出來,形成名稱為struct tty_operations的數據結構,具體的tty driver不需要關心具體的業務邏輯,只需要根據實際的硬體情況,實現這些操作介面即可。
這些操作介面主要為上層tty應用程式操作硬體提供硬體實現,驅動和應用通過termios結構體關聯,需要實現的通信介面主要包括:
- 設備的打開(open)和關閉(close)
- 設備的讀(read)和寫(write)
- 線路設置(set_termios):可看作串口參數配置
- 設置與獲取控制線路參數(tiocmget/tiocmset):可看作MODEM信號讀寫
- 其他自定義ioctls方法:如設置和獲得串口線路信息等
如:CDC驅動中相應實現
/*
* TTY driver structures.
*/
static const struct tty_operations acm_ops = {
.install = acm_tty_install,
.open = acm_tty_open,
.close = acm_tty_close,
.cleanup = acm_tty_cleanup,
.hangup = acm_tty_hangup,
.write = acm_tty_write,
.write_room = acm_tty_write_room,
.ioctl = acm_tty_ioctl,
.throttle = acm_tty_throttle,
.unthrottle = acm_tty_unthrottle,
.chars_in_buffer = acm_tty_chars_in_buffer,
.break_ctl = acm_tty_break_ctl,
.set_termios = acm_tty_set_termios,
.tiocmget = acm_tty_tiocmget,
.tiocmset = acm_tty_tiocmset,
.get_serial = get_serial_info,
.set_serial = set_serial_info,
.get_icount = acm_tty_get_icount,
};