Linux子系統(tǒng)系列-TTY處理過(guò)幾個(gè)串口的問(wèn)題,,這幾天才稍微有了些時(shí)間來(lái)整理一下這一塊的東西,。 目錄暫時(shí)大致分為以下幾部分吧: 0,背景 1,,串口驅(qū)動(dòng)的結(jié)構(gòu) 2,串口驅(qū)動(dòng)的實(shí)現(xiàn) 3,,關(guān)于TTY core --------------------------------------------------------------------------------------------------- 0,,背景 往常review這塊代碼的時(shí)候,經(jīng)常會(huì)被linux代碼樹(shù)中東一片西一片的uart,,tty,,serial device的代碼搞的暈頭轉(zhuǎn)向。參照l(shuí)inux的驅(qū)動(dòng)設(shè)備模型,,其實(shí)串口驅(qū)動(dòng)被一層層的完美的組裝在一起,。 對(duì) 于用于,直接接觸的是串口(serial interface),,這是在計(jì)算機(jī)或嵌入式設(shè)備上一種應(yīng)用非常廣泛的一個(gè)設(shè)備接口,。我們嘴里經(jīng)常嘮叨的UART其實(shí)只是串口通信的一種硬件實(shí)現(xiàn)方式而 已,,只不過(guò)最早最廣泛使用的是這一種方式,所以大家聽(tīng)到的比較多?,F(xiàn)在在串口后面的硬件實(shí)現(xiàn)方式越來(lái)越多:紅外設(shè)備,,usb設(shè)備等等,口那幾根線后面接的 chip的種類也越來(lái)越多,,每種片子都對(duì)需要不同的驅(qū)動(dòng)來(lái)工作,。Linux領(lǐng)域的大師們就根據(jù)這些情況以及發(fā)展趨勢(shì),將一些通用的接口抽象出來(lái),,形成一個(gè) 支持多種串行通信的子系統(tǒng)-TTY Core,,當(dāng)然也提供了通用的支持linux 設(shè)備模型的接口方便編寫符合linux設(shè)備模型規(guī)范的驅(qū)動(dòng)代碼,:). note:tty并不是完全指代串口的底層抽象,,后面會(huì)稍加闡述,。 1,串口驅(qū)動(dòng)的結(jié)構(gòu) 對(duì)于一般的UART串口,,它的實(shí)現(xiàn)分為三層,,最底層是TTY Core,中間是UART Core,,最上層是特定的芯片驅(qū)動(dòng),。 最上層的驅(qū)動(dòng)使用UART Core的API簡(jiǎn)單直觀的完成設(shè)備和驅(qū)動(dòng)的注冊(cè),UART Core利用TTY Core中API最終實(shí)現(xiàn)設(shè)備驅(qū)動(dòng)的注冊(cè),。
2,,串口驅(qū)動(dòng)的實(shí)現(xiàn) 系統(tǒng)啟動(dòng)時(shí),tty會(huì)作為一個(gè)char設(shè)備早早的注冊(cè)到kernel(driver/char/tty_io.c),,因?yàn)樗浅橄蟮淖罴兇獾模?),。 UART Core沒(méi)有作為一個(gè)模塊注冊(cè)到kernel,它實(shí)現(xiàn)了一些通用的API來(lái)供使用到UART的串口設(shè)備來(lái)調(diào)用,。 最 上層的芯片驅(qū)動(dòng)就根據(jù)芯片的具體特性和參考串行通信的基本模式依賴UART Core的一些API實(shí)現(xiàn)相應(yīng)的功能供用戶層配置和使用,。主要是實(shí)現(xiàn)一些tty_operations里面聲明的一些回調(diào)函數(shù),如果使用UART設(shè)備,,有 一些實(shí)現(xiàn)也會(huì)在UART Core里面實(shí)現(xiàn),。 struct tty_operations { 3,關(guān)于TTY core TTY在linux領(lǐng)域指的是終端,,它可以指代任意終端設(shè)備,,包括串口設(shè)備,console設(shè)備等等,。 在/dev目錄下,,大家如果看到ttyS*就表示指代的是串口設(shè)備(S'serial' tty),而pty就指的是虛擬/偽終端設(shè)備(Pseudo tty) TTY 子系統(tǒng)使用tty_driver來(lái)表示一個(gè)在它這個(gè)層次抽象出來(lái)的設(shè)備驅(qū)動(dòng),,TTY實(shí)現(xiàn)了以下API來(lái)完成一個(gè)終端設(shè)備驅(qū)動(dòng)的注冊(cè): 1)alloc_tty_driver() 2)tty_set_operations():建立tty entry point 3)tty_register_driver() 4)tty_register_device() 這樣讓一個(gè)終端驅(qū)動(dòng)的注冊(cè)變的十分清晰,。 |
|