一、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,
};
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/500232.html
標籤:嵌入式
