第14章 Linux終端裝置驅動

來源:互聯網
上載者:User

本文摘自(偶有較小改動)《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()成員函數用於改變連接埠的參數設定。


 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.