本文摘自(偶有較小改動)《Linux 裝置驅動開發詳解》(宋寶華 編著;人民郵電出版社;),留作紀念。
——Living Park
第14章 Linux終端裝置驅動
14.1終端裝置
在Linux系統中,終端是一種字元型裝置。包括序列埠終端、偽終端和控制台終端。
14.2終端裝置驅動結構
Linux核心中tty的層次包含tty核心、tty線路和tty驅動。
操作:分配tty驅動 alloc_tty_driver();註冊tty驅動 tty_register_driver();登出tty驅動 tty_unregister_driver();註冊tty裝置 tty_register_device();登出tty裝置 tty_unregister_device();設定tty驅動操作 tty_set_operations()。
14.3終端裝置驅動的初始化與釋放
14.3.1 模組載入與卸載函數
tty驅動的模組載入函數中通常需要分配、初始化tty_driver結構體並申請必要的硬體資源,卸載函數則相反。
14.3.2 開啟與關閉函數
tty驅動必須設定open()成員,否則,-ENODEV將被返回給調用open()的使用者。
驅動中可以定義一個裝置相關的結構體,並在open()函數中將其賦值給tty_struct的driver_data成員。
14.4資料發送和接收
因為速度和tty硬體緩衝區容量的原因,不是所有的寫程式要求的字元都可以在調用寫函數時被發送,因此寫函數應當返回能夠發送給硬體的位元組數以便使用者程式檢查是否所有的資料被真正寫入。
14.5 tty線路設定
14.5.1 線路設定使用者空間介面
調用使用者空間的termios庫函數,需要引用termios.h標頭檔。
操作:操作模式設定和擷取
tcgetattr(),tcsetattr();輸入輸出傳輸速率的擷取和設定
cfgetospeed(),cfgetispeed(),cfsetospeed(),cfsetispeed();完成線路控制 tcdrain(),tcflush(),tcflow(),tcsedbreak()。
大部分termios庫函數會被轉化成對tty裝置節點的ioctl()調用。
14.5.2 tty驅動的set_termios函數
大部分termios使用者空間函數被庫轉換為對驅動節點的ioctl()調用,而tty ioctl中的大部分命令會被tty核心轉換為對tty驅動的set_termios()函數的調用。set_termios()函數需要根據使用者對termios的設定完成實際的硬體設定。
14.5.3 tty驅動的tiocmget和tiocmset函數
對TIOCMGET、TIOCMSET、TIOCMBIC和TIOCMBIS
IO控制命令的調用將被tty核心轉換為對tty驅動tiocmget()函數和tiocmset()函數的調用。
14.5.4 tty驅動的ioctl函數
當使用者在tty裝置節點上進行ioctl調用時,tty_opetations中的ioctl()函數會被tty核心調用。
14.6 UART裝置驅動
Linux核心中實現了UART裝置的通用tty驅動層。串口核心層提供了如下3個結構體。
1. uart_driver
包含串口裝置的驅動名、裝置名稱、裝置號等資訊。註冊/登出uart_driver
uart_register_driver(),uart_unregister_driver()。
2. uart_port
用於描述一個UART連接埠的I/O連接埠或I/O記憶體位址、FIFO大小、連接埠類型等。添加/移除一個連接埠 uart_add_one_port(),uart_remove_one_port()。
3. uart_ops
定義了對UART的一系列操作,包括髮送、接收及線路設定等。
14.7 S3C2410
UART的驅動執行個體
14.7.1 S3C2410串口硬體描述
S3C2410內部具有3個獨立的UART控制器,每個控制器都可以工作在Interrupt模式或DMA模式,也就是說UART控制器可以在CPU與UART控制器傳送資料的時候產生中斷或DMA請求。S3C2410整合的每個UART均具有16位元組的FIFO,支援的最高傳輸速率可達到230.4Kbit/s。
14.7.2 S3C2410串口驅動的資料結構
定義了結構體s3c24xx_uart_port。
14.7.3 S3C2410串口驅動的初始化與釋放
14.7.4 S3C2410串口資料收發
S3C2410串口驅動uart_ops結構體的startup()成員函數s3c24xx_serial_startup()用於啟動連接埠,申請連接埠的發送、接收中斷,使能連接埠的發送和接收。s3c24xx_serial_shutdown()相反。
與資料收發關係最密切的是s3c24xx_serial_rx_chars()和s3c24xx_serial_tx_chars()。
14.7.5 S3C2410串口線路設定
S3C2410串口驅動uart_ops結構體的set_termios()成員函數用於改變連接埠的參數設定。