• 正文
    • 區(qū)分不同的終端類型
    • 總結(jié)
    • 串口驅(qū)動(dòng)框架
  • 相關(guān)推薦
申請(qǐng)入駐 產(chǎn)業(yè)圖譜

【驅(qū)動(dòng)】串口驅(qū)動(dòng)分析(一)-軟件架構(gòu)

02/02 11:51
1769
加入交流群
掃碼加入
獲取工程師必備禮包
參與熱點(diǎn)資訊討論

區(qū)分不同的終端類型

串行端口終端(/dev/ttySn)

串行端口終端(Serial Port Terminal)是使用計(jì)算機(jī)串行端口連接的終端設(shè)備。計(jì)算機(jī)把每個(gè)串行端口都看作是一個(gè)字符設(shè)備。

有段時(shí)間這些串行端口設(shè)備通常被稱為終端設(shè)備,因?yàn)?那時(shí)它的最大用途就是用來連接終端。這些串行端口所對(duì)應(yīng)的設(shè)備名稱是/dev/tts/0(或/dev/ttyS0)、/dev/tts/1(或/dev /ttyS1)等,設(shè)備號(hào)分別是(4,0)、(4,1)等,分別對(duì)應(yīng)于DOS系統(tǒng)下的COM1、COM2等。

若要向一個(gè)端口發(fā)送數(shù)據(jù),可以在命令行上把標(biāo) 準(zhǔn)輸出重定向到這些特殊文件名上即可。例如,在命令行提示符下鍵入:echo test > /dev/ttyS1會(huì)把單詞”test”發(fā)送到連接在ttyS1(COM2)端口的設(shè)備上。

偽終端(/dev/pty/)

偽終端 /dev/pts是遠(yuǎn)程登陸(telnet,ssh等)后創(chuàng)建的控制臺(tái)設(shè)備文件所在的目錄。

由于可能有好幾千個(gè)用戶登陸,所以/dev/pts其實(shí)是動(dòng)態(tài)生成的,不象其他設(shè)備文件是構(gòu)建系統(tǒng)時(shí)就已經(jīng)產(chǎn)生的硬盤節(jié)點(diǎn)(如果未使用devfs) 。

第一個(gè)用戶登陸,console的設(shè)備文件為/dev/pts/0,第二個(gè)為/dev/pts/1,以此類推。這里的0、1、2、3不是具體的標(biāo)準(zhǔn)輸入或輸出,而是整個(gè)控制臺(tái)。你可嘗試 echo "aaaaaa" > /dev/pts0、1、2……。

控制終端(/dev/tty)

控制終端 /dev/tty指的是當(dāng)前所處的終端,輸出到此的內(nèi)容只會(huì)顯示在當(dāng)前工作的終端顯示器上。

如果當(dāng)前進(jìn)程有控制終端(Controlling Terminal)的話,那么/dev/tty就是當(dāng)前進(jìn)程的控制終端的設(shè)備特殊文件??梢允褂妹睢眕s –ax”來查看進(jìn)程與哪個(gè)控制終端相連。對(duì)于你登錄的shell,/dev/tty就是你使用的終端,設(shè)備號(hào)是(5,0)。

使用命令”tty”可以查看它具體對(duì)應(yīng)哪個(gè)實(shí)際終端設(shè)備。/dev/tty有些類似于到實(shí)際所使用終端設(shè)備的一個(gè)聯(lián)接。這個(gè)終端文件可以由各個(gè)用戶共享

控制臺(tái)終端(/dev/ttyn, /dev/console)

控制臺(tái)終端/dev/ttyn n(0到6), tty1,tty2就是不同的虛擬終端(virtual console).

/dev/console 就是tty0 ,tty0則是當(dāng)前所使用虛擬終端即激活的虛擬終端的一個(gè)別名,系統(tǒng)所產(chǎn)生的信息會(huì)發(fā)送到該終端上,實(shí)際上機(jī)器只有一個(gè)屏幕,也就是我們看到的這個(gè)屏幕,可以理解為console指向激活的那個(gè)tty,準(zhǔn)確地說是激活的那個(gè)tty才將輸出顯示到console。

歷史上,console指主機(jī)本身的屏幕鍵盤,而tty指用電纜鏈接的其它位置的控制臺(tái)(僅包含屏幕和鍵盤)。tty0是系統(tǒng)自動(dòng)打開的,但不用于用戶登錄。

總結(jié)

其實(shí),上古時(shí)期,都有實(shí)體,理解完全不是難事。

這個(gè)IBM的廣告,美女左手是terminal,右手是console

terminal 相對(duì)的是console

      • terminal是終端,不在主機(jī)上,遠(yuǎn)端控制console是主機(jī)上的面板開關(guān),本機(jī)控制

terminal是一個(gè)設(shè)備,最早借用了teletypewriter的產(chǎn)品形態(tài),簡(jiǎn)稱tty

      • 長(zhǎng)得像臺(tái)打字機(jī),其實(shí)輸入輸出確實(shí)都打印在紙上后來進(jìn)化出一個(gè)crt顯示器所以上古時(shí)期,terminal包含tty,tty就是terminal的一種

shell相對(duì)的是kernel

    • 那個(gè)時(shí)候有shell嘛?可能還沒有出現(xiàn)

實(shí)體terminal時(shí)代的邏輯流程圖如下:

到了PC時(shí)代,本機(jī)自帶了鍵盤鼠標(biāo),于是混亂就開始了

    實(shí)體的terminal設(shè)備,已經(jīng)消失了,沒有打字機(jī)形態(tài)的tty,也不存在video tty但是,基因被傳承了下來,還是有terminal,tty這樣的名稱存在,并且邏輯上一以貫之shell作為kernel的中間層,也發(fā)明了出來,搞不清打開的是terminal還是shell

我們平時(shí)打開的iterm2之類的,實(shí)際上是terminal應(yīng)用

      • 并不直接與shell交互,更不與kernel交互它是一個(gè)帶顯示器的遠(yuǎn)程對(duì)講機(jī),或者說是facetime,和虛擬master交互

實(shí)體tty不存在了,但是虛擬出一個(gè)偽終端,pseudo tty,簡(jiǎn)稱pty

      • 這個(gè)pty虛擬出來一個(gè)master,你可以理解成一個(gè)坐在實(shí)體終端機(jī)前面的小人pty又虛擬出一個(gè)slave,你可以理解成上古時(shí)代的終端機(jī)

為什么要這樣做呢?

      • 好比把之前主機(jī)的實(shí)體外設(shè),在主機(jī)內(nèi)部模擬了一下老的傳統(tǒng)被傳承了下來,設(shè)定有一個(gè)人,在敲終端機(jī)保持了系統(tǒng)的一貫性,只是各種名稱,帶來了混亂

master與外部terminal應(yīng)用交互,slave與shell交互,shell與kernel交互

現(xiàn)代tty架構(gòu)

串口驅(qū)動(dòng)框架

串口驅(qū)動(dòng),內(nèi)核啟動(dòng)的時(shí)候,便初始化完成,后期應(yīng)用層用到的時(shí)候,訪問設(shè)備節(jié)點(diǎn)便,獲取串口設(shè)備的 fd 句柄,然后設(shè)置相關(guān)的參數(shù)(波特率,停止位,校驗(yàn)位等等)便可以使用串口進(jìn)行數(shù)據(jù)收發(fā)。

Linux Kernel 的 UART 串口分為幾層,tty 核心層,tty 線路規(guī)程,串行驅(qū)動(dòng)核心層,以及下面對(duì)接具體芯片的 ops:

整個(gè)流程走下來,有太多的數(shù)據(jù)結(jié)構(gòu)和 ops,要分析清楚整個(gè)流程,有兩種方式:

1、至上而下,即,從用戶空間調(diào)用串口配置以及串口讀寫的角度來分析

2、從底層注冊(cè)開始分析

本文先從底層注冊(cè)開始分析,根據(jù)內(nèi)核已知提供的接口,逐步打開魔盒,力求擴(kuò)散到每一個(gè)常用的地方。

tty ?core

tty core主要實(shí)現(xiàn)如下三類功能:

    將串口設(shè)備有關(guān)的物理對(duì)象(及其操作方法)封裝成一個(gè)一個(gè)的數(shù)據(jù)結(jié)構(gòu),以達(dá)到用軟件語言描述硬件的目的。向底層driver提供串口驅(qū)動(dòng)的編程接口?;赥TY framework所提供的TTY driver的編寫規(guī)則,將底層driver看到的serial driver,轉(zhuǎn)換為TTY driver,并將所有的serial操作,轉(zhuǎn)換為對(duì)應(yīng)的tty操作。

線路規(guī)程

負(fù)責(zé)在串口設(shè)備之間進(jìn)行上下文切換,以實(shí)現(xiàn)多任務(wù)調(diào)度。當(dāng)有數(shù)據(jù)需要從串口設(shè)備發(fā)送或接收時(shí),線程調(diào)度器會(huì)將任務(wù)切換到適當(dāng)?shù)脑O(shè)備上。

串口硬件驅(qū)動(dòng)層

這個(gè)層次主要負(fù)責(zé)和具體的串口硬件進(jìn)行通信,實(shí)現(xiàn)了對(duì)硬件的控制和訪問。在內(nèi)核中,串口驅(qū)動(dòng)模塊通常被實(shí)現(xiàn)為字符設(shè)備,通過字符設(shè)備接口與串口核心模塊進(jìn)行交互。它通過注冊(cè)到串口核心層,實(shí)現(xiàn)了對(duì)上層的透明。

小結(jié)

tty core 和串口硬件驅(qū)動(dòng)層是串口驅(qū)動(dòng)框架的核心部分。在使用串口設(shè)備時(shí),用戶通常只需要與tty core模塊進(jìn)行交互,而不需要直接操作串口驅(qū)動(dòng)模塊和平臺(tái)驅(qū)動(dòng)模塊。下一節(jié)我們將深入到串口驅(qū)動(dòng)內(nèi)部分析tty core的框架體系結(jié)構(gòu)。

本文參考

https://blog.csdn.net/liusaoyue/article/details/5075745

https://www.zhihu.com/question/21711307?sort=created

https://blog.csdn.net/awks4002/article/details/102360209

相關(guān)推薦

登錄即可解鎖
  • 海量技術(shù)文章
  • 設(shè)計(jì)資源下載
  • 產(chǎn)業(yè)鏈客戶資源
  • 寫文章/發(fā)需求
立即登錄

作者就職于某500強(qiáng)公司,擔(dān)任BSP工程師。具有豐富的嵌入式開發(fā)經(jīng)驗(yàn)。專欄主要分享計(jì)算機(jī)基礎(chǔ),操作系統(tǒng),Linux驅(qū)動(dòng)開發(fā),Arm體系與架構(gòu),C/C++,數(shù)據(jù)結(jié)構(gòu)與算法等相關(guān)文章。歡迎關(guān)注我的公眾號(hào)【嵌入式與Linux那些事】,一起學(xué)習(xí)交流。