Linux設(shè)備驅(qū)動(dòng)程序是高級(jí)應(yīng)用程序與硬件設(shè)備之間的橋梁。驅(qū)動(dòng)程序開發(fā)是軟硬件相互結(jié)合的技術(shù)。本書是一本專門介紹Linux設(shè)備驅(qū)動(dòng)程序開發(fā)的書籍,涵蓋了Linux驅(qū)動(dòng)程序基礎(chǔ)、驅(qū)動(dòng)模型、內(nèi)存管理、內(nèi)核同步機(jī)制、I2C驅(qū)動(dòng)程序、LCD驅(qū)動(dòng)程序、網(wǎng)絡(luò)驅(qū)動(dòng)程序、USB驅(qū)動(dòng)程序、輸入子系統(tǒng)驅(qū)動(dòng)程序、塊設(shè)備驅(qū)動(dòng)程序、音頻設(shè)備驅(qū)動(dòng)等內(nèi)容。本書以實(shí)例為主線,是為L(zhǎng)inux設(shè)備驅(qū)動(dòng)程序開發(fā)人員量身打造的學(xué)習(xí)精品書籍和實(shí)戰(zhàn)指南。本書基于Linux4.5內(nèi)核,提供了豐富的實(shí)例代碼和詳細(xì)的注釋,并附贈(zèng)完整源代碼供讀者下載。本書主要面向各種層次的嵌入式Linux軟硬件開發(fā)工程師,也可以作為各類嵌入式系統(tǒng)培訓(xùn)機(jī)構(gòu)的培訓(xùn)實(shí)驗(yàn)教材和高校計(jì)算機(jī)課程教輔書籍。
寫作背景自 1991 年問世以來,Linux 操作系統(tǒng)一直在創(chuàng)造著開源世界的神話,它已經(jīng)在服務(wù)器、嵌入式系統(tǒng)、智能手機(jī)等領(lǐng)域大放異彩,當(dāng)之無愧地成為了當(dāng)前最重量級(jí)的操作系統(tǒng)。從最初的 Linux 0.01 版到現(xiàn)在的 Linux 4.x 版,讓我們看到了 Linux 強(qiáng)大的生命力。我們有理由相信,Linux 操作系統(tǒng)將健康地發(fā)展下去。
自十多年前在 Linux 平臺(tái)上開發(fā)第一個(gè)應(yīng)用開始,我便喜愛上了 Linux 平臺(tái)上的軟件開發(fā)。從那之后,我有幸能夠長(zhǎng)期從事嵌入式 Linux 的驅(qū)動(dòng)與應(yīng)用開發(fā),今后也將在 Linux 驅(qū)動(dòng)開發(fā)領(lǐng)域持續(xù)耕耘。Linux 帶給我無窮的樂趣,我也希望向讀者介紹 Linux 平臺(tái)的驅(qū)動(dòng)開發(fā)技術(shù),為 Linux 的發(fā)展貢獻(xiàn)一點(diǎn)綿薄之力。本書上一版出版之后,很多熱心讀者發(fā)來建議,也促使我創(chuàng)作本書第 2 版。
設(shè)備驅(qū)動(dòng)程序依然是 Linux 這個(gè)偉大的操作系統(tǒng)的最重要的部分,設(shè)備驅(qū)動(dòng)程序開發(fā)也是實(shí)際項(xiàng)目中非常重要的任務(wù)。設(shè)備驅(qū)動(dòng)程序關(guān)系到系統(tǒng)的穩(wěn)定可靠,這就要求工程師具備嚴(yán)謹(jǐn)?shù)墓ぷ鲬B(tài)度。設(shè)備驅(qū)動(dòng)程序開發(fā)是軟件與硬件相結(jié)合的領(lǐng)域,希望讀者能先了解一些硬件方面的知識(shí),為學(xué)習(xí)本書打下基礎(chǔ)。
“操千曲而后曉聲,觀千劍而后識(shí)器!蔽沂冀K認(rèn)為要成為一個(gè)領(lǐng)域的專家,就需要長(zhǎng)時(shí)間不斷地練習(xí)以及總結(jié),在實(shí)踐中不斷深入探索是最便捷的學(xué)習(xí)方法,所以本書實(shí)例驅(qū)動(dòng)的學(xué)習(xí)模式。希望讀者能夠認(rèn)真鉆研每一個(gè)例程,并舉一反三,早日成為一名合格的驅(qū)動(dòng)開發(fā)工程師。
本書特點(diǎn)? 實(shí)戰(zhàn)性:本書提供多達(dá)三十多個(gè)驅(qū)動(dòng)程序例程,非常適合各種層次的驅(qū)動(dòng)程序開發(fā)人員。書中例子全部基于 Linux 4.5.2 內(nèi)核。本書附贈(zèng)代碼包含了書中大部分實(shí)例的相關(guān)代碼,讀者可以免費(fèi)下載。
? 全面性:本書涵蓋了 Linux 驅(qū)動(dòng)程序基礎(chǔ)、驅(qū)動(dòng)模型、內(nèi)存管理、內(nèi)核同步機(jī)制、I2C驅(qū)動(dòng)程序、LCD 驅(qū)動(dòng)程序、網(wǎng)絡(luò)驅(qū)動(dòng)程序、USB 驅(qū)動(dòng)程序、輸入子系統(tǒng)驅(qū)動(dòng)程序、塊設(shè)備驅(qū)動(dòng)程序、音頻設(shè)備驅(qū)動(dòng)等內(nèi)容,是驅(qū)動(dòng)程序開發(fā)人員的完整參考書。
? 易讀性:本書以實(shí)例為主線,代碼注釋豐富,帶領(lǐng)讀者由淺入深掌握 Linux 驅(qū)動(dòng)程序開發(fā)的精髓。
內(nèi)容結(jié)構(gòu)本書內(nèi)容豐富全面,涵蓋了 Linux 4.5 下的三類驅(qū)動(dòng)設(shè)備,包括字符設(shè)備、塊設(shè)備、網(wǎng)絡(luò)設(shè)備的開發(fā)技術(shù)。本書第 1~5 章為 Linux 驅(qū)動(dòng)程序開發(fā)入門基礎(chǔ)知識(shí);第 6 章介紹基本的硬件設(shè)備驅(qū)動(dòng)開發(fā);第 7~15 章介紹各種硬件接口的驅(qū)動(dòng)程序體系,包括 I2C、LCD、USB、輸入設(shè)備、網(wǎng)絡(luò)、TTY、音頻等接口。
讀者對(duì)象本書是一本專門介紹嵌入式 Linux 驅(qū)動(dòng)程序開發(fā)的書,讀者應(yīng)具備 C 語言編程和操作系統(tǒng)方面的基礎(chǔ)知識(shí)。本書主要面向嵌入式 Linux 系統(tǒng)的內(nèi)核、設(shè)備驅(qū)動(dòng)程序、應(yīng)用程序的開發(fā)工程師以及 ARM 嵌入式系統(tǒng)的硬件設(shè)計(jì)工程師,也可以作為各類嵌入式系統(tǒng)培訓(xùn)機(jī)構(gòu)的培訓(xùn)實(shí)驗(yàn)教材和高校操作系統(tǒng)課程的輔導(dǎo)書籍。
特別致謝在朋友、家人和機(jī)械工業(yè)出版社的幫助和支持下,本書終于得以問世,在此對(duì)他們表示衷心的感謝。特別是責(zé)任編輯車忱老師,在本書編寫過程中提出了大量合理的建議,使本書得以順利出版。
本書大部分例程基于深圳友堅(jiān)恒天的 idea6410 開發(fā)板,在此對(duì)他們表示特別的感謝。本人希望能夠和讀者一起努力,擴(kuò)大交流,共同進(jìn)步。由于 Linux 驅(qū)動(dòng)程序開發(fā)相當(dāng)博大精深,加之本人水平有限,本書錯(cuò)誤在所難免,請(qǐng)各位讀者原諒并指正。
馮國進(jìn)2016 年 10 月 1 日
第 1 章 Linux 設(shè)備驅(qū)動(dòng)程序入門 1
1.1 設(shè)備驅(qū)動(dòng)程序基礎(chǔ) 1
1.1.1 驅(qū)動(dòng)程序的概念 1
1.1.2 驅(qū)動(dòng)程序的加載方式 2
1.1.3 編寫可加載模塊 3
1.1.4 帶參數(shù)的可加載模塊 4
1.1.5 模塊依賴 5
1.1.6 printk 的等級(jí) 7
1.1.7 設(shè)備驅(qū)動(dòng)程序類別 8
1.2 字符設(shè)備驅(qū)動(dòng)程序原理 9
1.2.1 file_o p erations 結(jié)構(gòu) 9
1.2.2 使用 register_chrdev 注冊(cè)字符設(shè)備 11
1.2.3 使用 cdev_add 注冊(cè)字符設(shè)備 14
1.2.4 字符設(shè)備的讀寫 16
1.2.5 IOCTL 接口 17
1.2.6 seek 接口 20
1.2.7 poll 接口 22
1.2.8 異步通知 26
1.3 seq_file 機(jī)制 28
1.3.1 seq_file 原理 28
1.3.2 seq_file 實(shí)例 29
1.4 /proc 文件系統(tǒng) 35
1.4.1 /proc 文件系統(tǒng)概述 35
1.4.2 /proc 文件系統(tǒng)接口 36
1.5 Linux 內(nèi)核導(dǎo)讀 40
1.5.1 Linux 內(nèi)核組成 40
1.5.2 Linux 的代碼結(jié)構(gòu) 42
1.5.3 內(nèi)核 Makefile 43
第 2 章 Linux 設(shè)備驅(qū)動(dòng)模型 44
2.1 內(nèi)核對(duì)象 44
2.1.1 Kobject 44
2.1.2 kobj_type 45
2.1.3 Kset 45
2.2 設(shè)備模型層次 46
2.3 sysfs 文件系統(tǒng) 49
2.4 platform 概念 51
2.5 Attributes 56
2.6 設(shè)備事件通知 60
2.6.1 kobject uevent 60
2.6.2 uevent helper 61
2.6.3 udev 63
2.7 設(shè)備樹 64
第 3 章 Linux 內(nèi)核同步機(jī)制 67
3.1 原子操作 67
3.2 鎖機(jī)制 68
3.2.1 自旋鎖 68
3.2.2 讀寫鎖 70
3.2.3 RCU 71
3.2.4 信號(hào)量 75
3.2.5 讀寫信號(hào)量 77
3.2.6 互斥量 77
3.3 等待隊(duì)列 78
3.3.1 等待隊(duì)列原理 78
3.3.2 阻塞模式讀實(shí)例 78
3.3.3 完成事件 81
3.4 通知鏈 83
第 4 章 內(nèi)存管理與鏈表 86
4.1 物理地址和虛擬地址 86
4.2 內(nèi)存分配與釋放 87
4.3 cache 88
4.4 IO 端口到虛擬地址的映射 88
4.4.1 靜態(tài)映射 88
4.4.2 ioremap 89
4.5 內(nèi)核空間到用戶空間的映射 90
4.5.1 mmap 接口 90
4.5.2 mmap 系統(tǒng)調(diào)用 91
4.6 DMA 映射 93
4.7 內(nèi)核鏈表 93
4.7.1 Linux 內(nèi)核中的鏈表 93
4.7.2 內(nèi)核鏈表實(shí)例 95
第 5 章 任務(wù)與調(diào)度 98
5.1 schedule 98
5.2 內(nèi)核線程 99
5.3 內(nèi)核調(diào)用應(yīng)用程序 101
5.4 軟中斷機(jī)制 103
5.4.1 軟中斷原理 103
5.4.2 tasklet 106
5.5 工作隊(duì)列 108
5.5.1 工作隊(duì)列原理 108
5.5.2 延遲工作隊(duì)列 110
5.6 內(nèi)核時(shí)間 110
5.6.1 Linux 下的時(shí)間概念 110
5.6.2 Linux 下的延遲 111
5.6.3 內(nèi)核定時(shí)器 112
第 6 章 簡(jiǎn)單硬件設(shè)備驅(qū)動(dòng)程序 115
6.1 硬件基礎(chǔ)知識(shí) 115
6.1.1 硬件設(shè)備原理 115
6.1.2 時(shí)序圖原理 116
6.1.3 嵌入式 Linux 系統(tǒng)構(gòu)成 117
6.1.4 硬件初始化 117
6.1.5 clk 體系 120
6.2 dev/mem 與 dev/kmem 121
6.3 寄存器訪問 124
6.3.1 S3C6410X 地址映射 124
6.3.2 S3C6410X 看門狗驅(qū)動(dòng)程序?qū)嵗? 128
6.4 電平控制 131
6.4.1 S3C6410X LED 驅(qū)動(dòng)程序?qū)嵗? 132
6.4.2 掃描型按鍵驅(qū)動(dòng)程序?qū)嵗? 135
6.5 硬件中斷處理 137
6.5.1 硬件中斷處理原理 137
6.5.2 中斷型按鍵驅(qū)動(dòng)程序?qū)嵗? 141
6.6 看門狗驅(qū)動(dòng)架構(gòu) 146
6.7 RTC 驅(qū)動(dòng) 148
6.8 LED 類設(shè)備 153
第 7 章 I2C 設(shè)備驅(qū)動(dòng)程序 157
7.1 I2C 接口原理 157
7.2 Linux 的 I2C 驅(qū)動(dòng)程序架構(gòu) 159
7.2.1 I2C 適配器 160
7.2.2 I2C 算法 161
7.2.3 I2C 從設(shè)備 161
7.2.4 I2C 從設(shè)備驅(qū)動(dòng) 162
7.2.5 I2C 從設(shè)備驅(qū)動(dòng)開發(fā) 163
7.3 I2C 控制器驅(qū)動(dòng) 163
7.3.1 S3C2410X 的 I2C 控制器 163
7.3.2 S3C2410X 的 I2C 控制器驅(qū)動(dòng) 164
7.4 通用 I2C 從設(shè)備 172
7.4.1 通用 I2C 從設(shè)備驅(qū)動(dòng) 172
7.4.2 通過 read 與 write 接口讀寫 174
7.4.3 通過 I2C_RDWR 命令讀寫 177
7.4.4 I2Ctools 180
7.5 個(gè)性化 I2C 從設(shè)備驅(qū)動(dòng) 181
第 8 章 TTY 與串口驅(qū)動(dòng)程序 185
8.1 TTY 概念 185
8.2 Linux TTY 驅(qū)動(dòng)程序體系 185
8.2.1 TTY 驅(qū)動(dòng)程序架構(gòu) 185
8.2.2 TTY 文件層 186
8.2.3 線路規(guī)程層 188
8.2.4 TTY 驅(qū)動(dòng)層 190
8.2.5 TTY 數(shù)據(jù)鏈路分析 193
8.3 串口驅(qū)動(dòng)層 194
8.3.1 uart_driver 194
8.3.2 uart_port 195
8.4 S3C6410X 串口設(shè)備驅(qū)動(dòng)程序 197
8.5 TTY 應(yīng)用層 201
第 9 章 Framebuffer 驅(qū)動(dòng)程序 203
9.1 Linux Framebuffer 驅(qū)動(dòng)程序原理 203
9.1.1 Framebuffer 核心數(shù)據(jù)結(jié)構(gòu) 203
9.1.2 Framebuffer 操作接口 206
9.1.3 Framebuffer 驅(qū)動(dòng)的文件接口 207
9.1.4 Framebuffer 驅(qū)動(dòng)框架代碼分析 209
9.2 S3C6410X 顯示控制器 210
9.3 S3C6410X LCD 驅(qū)動(dòng)程序?qū)嵗? 215
9.3.1 注冊(cè)與初始化 215
9.3.2 fb_ops 實(shí)現(xiàn) 220
9.3.3 DMA 傳輸機(jī)制 222
9.3.4 內(nèi)核配置 227
9.4 Framebuffer 應(yīng)用層 227
9.5 Qt 界面系統(tǒng)移植 229
第 10 章 輸入子系統(tǒng) 231
10.1 Linux 輸入子系統(tǒng)概述 231
10.2 Linux 輸入子系統(tǒng)原理 231
10.2.1 輸入設(shè)備 232
10.2.2 輸入事件 233
10.2.3 input Handler 層 234
10.2.4 常用的 Input Handler 236
10.3 輸入設(shè)備應(yīng)用層 241
10.4 鍵盤輸入設(shè)備驅(qū)動(dòng)程序?qū)嵗? 243
10.5 Event 接口實(shí)例 249