一、對于串口驅動Linux系統(tǒng)中UART驅動屬于終端設備驅動,應該說是實現(xiàn)串口驅動和終端驅動來實現(xiàn)串口終端設備的驅動。要了解串口終端的驅動在Linux系統(tǒng)的結構就先要了解終端設備驅動在Linux系統(tǒng)中的結構體系,一方面自己了解的不夠,另一發(fā)面關于終端設備的體系結構網(wǎng)上有很多很好很詳細的資料參考,這里我主要是鑒于終端設備體系的復雜性,我大概總結一下自己了解到的一些方面和一個整體的框架。 二、終端設備的結構 Linux內核中 tty的層次結構圖所示,包含tty核心、tty線路規(guī)程和tty驅動。tty核心是對整個tty設備的抽象,對用戶提供統(tǒng)一的接口,tty線路規(guī)程是對傳輸數(shù)據(jù)的格式化,tty驅動則是面向tty設備的驅動,這是對設備的驅動,應該要我們來實現(xiàn)的,但是后面我們可以看到,對于串口驅動Linux還要進行抽象把共性提取出來封裝,使得整個驅動層次化簡單化。使得驅動的修改只要設計設備硬件的差異來,但是這樣使得設備驅動的結構體系比較復雜,過程層次太多,難于理解。 tty設備發(fā)送數(shù)據(jù)的流程為:tty核心從一個用戶獲取將要發(fā)送給一個 tty設備的數(shù)據(jù),tty核心將數(shù)據(jù)傳遞給tty線路規(guī)程驅動,接著數(shù)據(jù)被傳遞到tty驅動,tty驅動將數(shù)據(jù)轉換為可以發(fā)送給硬件的格式。 接收數(shù)據(jù)的流程為: 從tty硬件接收到的數(shù)據(jù)向上交給tty驅動,進入tty線路規(guī)程驅動,再進入 tty 核心,在這里它被一個用戶獲取。盡管大多數(shù)時候tty核心和tty之間的數(shù)據(jù)傳輸會經(jīng)歷tty線路規(guī)程的轉換,但是tty驅動與tty核心之間也可以直接傳輸數(shù)據(jù)。 三、tty設備驅動結構 圖顯示了與tty相關的主要源文件及數(shù)據(jù)的流向。tty_io.c定義了tty 設備通用的file_operations結構體并實現(xiàn)了接口函數(shù)tty_register_driver()用于注冊tty設備,它會利fs/char_dev.c提供的接口函數(shù)注冊字符設備,與具體設備對應的tty驅動將實現(xiàn)tty_driver結構體中的成員函數(shù)。同時 tty_io.c也提供了tty_register_ldisc()接口函數(shù)用于注冊線路規(guī)程,n_tty.c文件則實現(xiàn)了tty_disc結構體中的成員。特定tty設備驅動的主體工作是填充tty_driver結構體中的成員,實現(xiàn)其中的成員函數(shù)。 四、串口驅動核心層 上圖的數(shù)據(jù)流向應該和上面tty設備驅動一樣,同樣需要經(jīng)過tty線路規(guī)則層,不過上圖箭頭標的不是很準確,說明一下,因為圖是從網(wǎng)上下的。 很明顯的看得到由tty設備驅動到串口驅動中間經(jīng)過了一層serial_core ,從tty設備驅動中需要填充的是tty_driver結構,經(jīng)過串口核心層后就轉變成了實現(xiàn)xxx_uart.c 。到現(xiàn)在Linux系統(tǒng)已經(jīng)封裝了終端設備(tty)的驅動,www.而我們只需要實現(xiàn)串口驅動就能實現(xiàn)整個串口終端驅動。 五、主要結構與關系 對于tty驅動層主要有幾個重要的結構 serial_core實現(xiàn)了UART設備的通用TTY驅動層(稱為串口核心層),這樣UART驅動的主要任務演變成了實現(xiàn)serial_core中定義的一組uart_xxx接口而非tty_xxx接口,見如下的對應關系 ----------------設備方法-----------------------------設備注冊------------------------設備信息 ------------tty_operations------------------------tty_driver---------------------------tty-struct // tty核心層定義,serial_core(串口核心層實現(xiàn)的結構體) + + + + + + --------------uart_ops-----------------------------uart_driver---------------------------uart_port // 串口核心層定義,需要我們實現(xiàn),但是Linuxs3c2410支持很好,我們只有去修改一下 ----------s3c24xx_serial-ops-----------------s3c24xx_uart_drv-----------------s3c24xx_uart_port 對于s3c2410支持很好,一般只需要修改一些設備的硬件的一些寄存器設置的差異部分,所以看s3c2440的uart驅動代碼的時候發(fā)現(xiàn)好少,一開始我都懵了,怎么其他的驅動代碼這么多,怎么2440的代碼這么少,下一篇文章我將分析一下s3c2440的代碼。那么這樣一來主要修改的地方時s3c24xx_uart_port的一些設置 s3c24xx_uart_port主要包含一下幾個結構
另外在加上一個結構體 s3c2410_uartcfg ——>硬件端口、寄存器 ,這個需要修改 歸納起來,對于支持完善的s3c2410的Linux來修改成s3c2440的驅動,需要修改的地方就是后面說明的三個結構體啦,所以工作就簡單了很多啊。但是整個結構變的復雜了,上面是我自己總結的,圖是網(wǎng)上下載的,有什么地方不對或者錯誤,希望廣大網(wǎng)友指出,我好更正。 |
|