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