手把手教你學Linux設備驅動開發
北京迅為電子有限公司
相關主題
商品描述
Linux 設備驅動程序(常簡稱為驅動)開發是構建智能硬件與物聯網系統的核心技術,它不僅要求開發者深入理解 Linux 內核工作機制,還要求開發者掌握硬件交互、並發控制、中斷處理等關鍵系統級編程技能。
本書系統講解嵌入式 Linux 設備驅動的知識體系與開發方法。全書從前置知識與Linux內核編程出發,深入講解字符設備驅動、並發與競爭、I/O 模型、中斷、平臺總線、設備樹、設備模型、熱插拔技術等核心機制。在此基礎上,本書結合現代嵌入式開發的實際需求,深入剖析pinctrl 與GPIO子系統、輸入子系統等關鍵框架。之後,以單總線、I2C 總線、SPI 總線、串口通信、PWM、CAN 總線等為例,系統闡述復雜總線設備的驅動開發流程,並進一步拓展至網絡設備、IIO 子系統、USB 子系統及塊設備驅動的實現,涵蓋從外設到網絡、從通信到存儲的各個驅動開發領域。
本書面向嵌入式系統開發工程師、Linux 驅動工程師,以及具有相關基礎的嵌入式開發愛好者,既可作為系統學習驅動開發的指南,也可作為高校嵌入式相關課程的教學參考書。
作者簡介
北京迅為電子有限公司(簡稱迅為公司)是一家專註於嵌入式平臺與解決方案的高新技術公司,也是物聯網與邊緣計算領域的重要技術創新公司。
迅為公司研發團隊在嵌入式領域擁有十余年的技術積累與行業實踐經驗,在硬件設計、嵌入式 Linux 系統與 Android 系統定制、底層驅動開發、系統性能優化及合規性設計等方向形成了完整的技術棧,具備出色的跨行業項目落地能力。團隊長期深耕嵌入式核心技術,致力於為工業物聯網、智能終端、邊緣計算等領域提供可靠的嵌入式平臺與解決方案,持續助力國家智能制造與信息化建設。
目錄大綱
第 1 章 前置知識..............................................1
1.1 Linux 基礎知識.................................1
1.1.1 Linux 的前身——UNIX ...........1
1.1.2 GNU 和 Linux 的發展 ..............2
1.1.3 Linux 的優勢.............................2
1.1.4 Linux 版本命名.........................3
1.2 設備驅動開發的基礎知識.............5
1.2.1 設備驅動分類............................5
1.2.2 框架學習法................................5
1.3 iTOP 開發板介紹.............................6
1.3.1 連接方式介紹............................6
1.3.2 核心板介紹................................8
1.3.3 底板介紹..................................11
1.4 小結.....................................................13
第 2 章 Linux 內核編程 ...............................14
2.1 Linux 內核源碼結構......................14
2.2 helloworld 驅動程序 ......................15
2.3 將驅動編譯為內核模塊 ...............16
2.3.1 內核模塊編譯及加載與卸載....16
2.3.2 內核模塊參數傳遞..................17
2.3.3 內核模塊符號導出..................19
2.3.4 內核模塊的加載流程..............19
2.4 將驅動編譯進內核.........................20
2.4.1 圖形化操作界面......................20
2.4.2 Kconfig 與 Makefile ................21
2.4.3 編譯進內核的驅動的加載流程..................22
2.5 小結....................................................24
第 3 章 字符設備驅動..................................25
3.1 文件操作集......................................25
3.2 字符設備註冊..................................26
3.2.1 申請和釋放設備號 .................26
3.2.2 創建設備節點 .........................26
3.2.3 註冊字符設備 .........................27
3.3 雜項設備註冊..................................28
3.4 內核空間與用戶空間數據交互機制...........................29
3.5 文件私有數據管理........................30
3.6 ioctl()函數..........................................31
3.7 內核定時器......................................33
3.8 RTC 驅動..........................................35
3.9 看門狗驅動......................................36
3.10 驅動程序調試方法......................38
3.11 小結..................................................39
第 4 章 並發與競爭.......................................40
4.1 並發與競爭概述.............................40
4.2 原子操作...........................................40
4.3 自旋鎖................................................42
4.4 信號量................................................44
4.5 互斥鎖................................................46
4.6 小結....................................................46
第 5 章 I/O 模型............................................. 47
5.1 阻塞與非阻塞 I/O ......................... 47
5.2 I/O 多路復用................................... 51
5.3 信號驅動 I/O................................... 52
5.4 小結.................................................... 53
第 6 章 中斷 .................................................... 54
6.1 中斷概述........................................... 54
6.2 中斷的申請與處理........................ 55
6.3 中斷的底半部實現方法............... 57
6.3.1 tasklet....................................... 57
6.3.2 軟中斷..................................... 59
6.3.3 工作隊列................................. 60
6.3.4 中斷線程化............................. 62
6.4 小結.................................................... 63
第 7 章 平臺總線........................................... 64
7.1 平臺總線模型................................. 64
7.2 平臺總線驅動開發........................ 67
7.2.1 平臺設備註冊和卸載............. 67
7.2.2 平臺驅動註冊和卸載............. 68
7.3 小結.................................................... 69
第 8 章 設備樹................................................ 70
8.1 設備樹概述...................................... 70
8.2 設備樹語法...................................... 71
8.2.1 根節點..................................... 71
8.2.2 子節點..................................... 71
8.2.3 reg 屬性................................... 72
8.2.4 compatible 屬性 ...................... 72
8.2.5 中斷相關屬性......................... 73
8.2.6 自定義屬性............................. 74
8.2.7 修改或追加節點內容............. 74
8.2.8 包含文件................................. 75
8.3 常用的 of 操作函數....................... 75
8.3.1 查找節點函數......................... 75
8.3.2 獲取屬性函數......................... 76
8.3.3 映射函數................................. 76
8.3.4 獲取中斷資源函數................. 77
8.4 設備樹展開流程............................. 77
8.5 設備樹插件.......................................81
8.6 小結.....................................................82
第 9 章 設備模型............................................83
9.1 設備模型概述..................................83
9.1.1 總線..........................................83
9.1.2 設備..........................................84
9.1.3 設備驅動..................................84
9.1.4 類..............................................86
9.2 kobject 與 kset ..................................87
9.3 引用計數...........................................91
9.4 小結.....................................................93
第 10 章 熱插拔技術 ....................................94
10.1 熱插拔概述....................................94
10.2 udev 和 mdev 規則.......................94
10.3 小結..................................................97
第 11 章 pinctrl 與 GPIO 子系統 .............98
11.1 pinctrl 子系統概述.......................98
11.2 pinctrl 子系統使用.....................101
11.3 GPIO 子系統概述 .....................106
11.4 pinctrl 子系統與GPIO 子系統配合使用.................107
11.5 小結................................................109
第 12 章 輸入子系統 ..................................110
12.1 輸入子系統概述.........................110
12.2 輸入設備驅動開發....................114
12.3 輸入事件處理驅動開發...........117
12.4 上報數據分析..............................119
12.4.1 數據格式簡介....................119
12.4.2 實例分析............................120
12.5 小結................................................122
第 13 章 單總線............................................123
13.1 單總線概述..................................123
13.2 DS18B20 寄存器介紹...............124
13.3 DS18B20 指令介紹 ...................125
13.4 DS18B20 驅動開發....................126
13.4.1 申請 GPIO ...........................126
13.4.2 實現復位時序......................126
13.4.3 實現寫時序..........................127
13.4.4 實現讀時序..........................129
13.4.5 實現溫度讀取功能..............130
13.5 小結 ................................................130
第 14 章 I2C 總線.........................................131
14.1 I2C 總線概述................................131
14.2 I2C 時序分析................................132
14.3 I2C 子系統框架 ...........................134
14.4 I2C設備驅動開發.......................135
14.4.1 i2c_client 部分...................135
14.4.2 i2c_driver 部分 ..................137
14.4.3 I2C讀寫函數......................138
14.5 在應用層使用I2C 總線............141
14.6 i2c-tools 的使用...........................143
14.6.1 i2cdetect:掃描I2C總線設備................143
14.6.2 i2cdump:讀取設備寄存器的值...............144
14.6.3 i2cset:向指定寄存器寫入數據..............145
14.6.4 i2cget:從指定寄存器讀取數據..............145
14.7 小結 ................................................145
第 15 章 SPI 總線........................................146
15.1 SPI 總線概述...............................146
15.2 SPI 工作模式...............................147
15.3 SPI 子系統框架 ..........................149
15.4 SPI 設備驅動開發......................150
15.4.1 spi_device 部分..................150
15.4.2 spi_driver 部分...................151
15.4.3 SPI 讀寫函數.....................153
15.5 在應用層使用 SPI 總線...........155
15.5.1 spidev 工具組簡介 ............155
15.5.2 SPI 應用開發.....................156
15.6 小結 ................................................158
第 16 章 串口通信.......................................159
16.1 串口概述.......................................159
16.2 串口通信協議.............................160
16.3 串口應用開發.............................160
16.4 小結................................................162
第 17 章 PWM..............................................163
17.1 PWM 概述...................................163
17.2 PWM 驅動開發..........................165
17.2.1 PWM 子系統核心 API .....165
17.2.2 PWM 驅動程序編寫.........166
17.3 模擬 PWM...................................167
17.4 小結................................................169
第 18 章 CAN 總線.....................................170
18.1 CAN 概述.....................................170
18.2 CAN 幀格式................................170
18.3 CAN 總線仲裁機制..................176
18.4 CAN 應用開發............................177
18.4.1 套接字創建與綁定 ...........177
18.4.2 數據發送應用 ...................178
18.4.3 數據接收應用 ...................179
18.5 小結................................................181
第 19 章 網絡設備.......................................182
19.1 網絡設備概述.............................182
19.2 以太網接口..................................184
19.3 網絡體系架構.............................188
19.4 數據封裝與解封裝....................190
19.5 網絡設備驅動框架....................191
19.6 網絡設備驅動開發....................194
19.6.1 註冊/註銷網絡設備驅動 ...194
19.6.2 初始化網絡設備 ...............195
19.6.3 打開/關閉網絡設備 ..........196
19.6.4 數據收發流程 ...................197
19.7 網絡應用編程.............................199
19.7.1 TCP 套接字編程...............199
19.7.2 UDP 套接字編程 ..............201
19.8 小結................................................204
第 20 章 IIO 子系統.................................... 205
20.1 IIO 子系統概述 ......................... 205
20.1.1 IIO 核心結構體介紹......... 205
20.1.2 IIO 設備註冊..................... 208
20.2 使用sysfs接口操作ADC設備............................ 209
20.3 基於IIO的ADC設備驅動開發實戰........................ 210
20.3.1 IIO API 函數介紹 ............. 210
20.3.2 ADC 設備驅動程序編寫.... 211
20.4 小結................................................ 212
第 21 章 USB 子系統 ................................ 213
21.1 USB 簡介 ..................................... 213
21.2 USB 協議介紹............................ 214
21.2.1 USB 描述符 ...................... 214
21.2.2 USB 通信數據格式 .......... 218
21.2.3 USB 枚舉 .......................... 222
21.3 USB 驅動框架............................ 223
21.4 USB 設備驅動............................ 224
21.4.1 USB 設備驅動框架 .......... 224
21.4.2 USB 請求塊 ...................... 226
21.4.3 probe 和 disconnect 函數... 228
21.5 Gadget Function 驅動................ 231
21.6 小結................................................ 232
第 22 章 塊設備........................................... 233
22.1 塊設備簡介.................................. 233
22.1.1 什麼是塊設備....................233
22.1.2 常見存儲介質....................234
22.2 文件系統與存儲設備................236
22.2.1 什麼是文件系統................236
22.2.2 文件系統的種類................237
22.3 塊設備驅動框架.........................238
22.3.1 通用塊層............................238
22.3.2 I/O 調度層 .........................240
22.3.3 塊設備驅動層....................240
22.4 塊設備驅動開發.........................241
22.4.1 register_blkdev()函數 ........241
22.4.2 unregister_blkdev()函數 ....241
22.4.3 blk_mq_init_sq_queue()函數.............241
22.4.4 blk_cleanup_queue()函數....242
22.4.5 set_capacity()函數 .............242
22.4.6 add_disk()函數...................242
22.4.7 blk_mq_start_request()函數..............242
22.4.8 blk_rq_pos()函數...............243
22.4.9 blk_rq_cur_bytes()函數.....243
22.4.10 bio_data()函數 .................243
22.4.11 blk_update_request()函數.............243
22.4.12 blk_mq_end_request() 函數..................243
22.4.13 alloc_disk 宏 ....................244
22.4.14 rq_data_dir 宏 ..................244
22.4.15 vmem 虛擬塊設備驅動的實現.................244
22.5 小結.........................................246

