Linux 設備驅動開發 (Linux Device Driver Development)

John Madieu 袁鵬飛,劉壽永譯

立即出貨

  • Linux 設備驅動開發 (Linux Device Driver Development)-preview-1
  • Linux 設備驅動開發 (Linux Device Driver Development)-preview-2
Linux 設備驅動開發 (Linux Device Driver Development)-preview-1

買這商品的人也買了...

相關主題

商品描述

本書講解了Linux驅動開發的基礎知識以及所用到的開發環境,全書分為22章,其內容涵蓋了各種Linux子系統,
包含內存管理、PWM、RTC、IIO和IRQ管理等,還講解了直接內存訪問和網絡設備驅動程序的實用方法。
在學完本書之後,讀者將掌握設備驅動開發環境的概念,並可以從零開始為任何硬件設備編寫驅動程序。

閱讀本書需要具備基本的C語言程序設計能力,且熟悉Linux基本命令。本書主要是為嵌入式工程師、
Linux系統管理員、開發人員和內核黑客而設計的。
無論是軟件開發人員,還是系統架構師或製造商,
只要願意深入研究Linux驅動程序開發,閱讀本書後都將有所收獲。

作者簡介

John Madieu

是嵌入式Linux和內核研發工程師,居住在法國巴黎。
他主要為自動化、運輸、醫療、能源和軍事等領域的公司開發驅動程序和開發板支持包(Board Support Packages,BSP)。
他目前就職於一家法國公司EXPEMB,該公司是基於模塊化計算機的電子開發板設計和嵌入式Linux解決方案的先驅。
同時,他還是一位開源和嵌入式系統愛好者,堅信通過知識分享能夠學到更多的知識。

目錄大綱

第 1章 內核開發簡介 1
1.1 環境設置 1
1.1.1 獲取源代碼 2
1.1.2 內核配置 4
1.1.3 構建自己的內核 4
1.2 內核約定 6
1.2.1 編碼風格 6
1.2.2 內核結構分配和初始化 7
1.2.3 類、對象、面向對象的編程 7
1.3 總結 8

第 2章 設備驅動程序基礎 9
2.1 內核空間和用戶空間 9
2.1.1 模塊的概念 10
2.1.2 模塊依賴 10
2.1.3 模塊的加載和卸載 11
2.2 驅動程序框架 13
2.2.1 模塊的入點和出點 14
2.2.2 模塊信息 16
2.3 錯誤和消息打印 18
2.3.1 錯誤處理 19
2.3.2 處理空指針錯誤 21
2.3.3 消息打印—— printk() 22
2.4 模塊參數 24
2.5 構建第 一個模塊 25
2.5.1 模塊的makefile 26
2.5.2 內核樹內 27
2.5.3 內核樹外 29
2.5.4 構建模塊 29
2.6 總結 30

第3章 內核工具和輔助函數 31
3.1 理解宏container_of 31
3.2 鏈表 33
3.2.1 創建和初始化鏈表 35
3.2.2 創建鏈表節點 36
3.2.3 添加鏈表節點 36
3.2.4 刪除鏈表節點 37
3.2.5 鏈表遍歷 37
3.3 內核的睡眠機制 38
3.4 延遲和定時器管理 41
3.4.1 標準定時器 41
3.4.2 高精度定時器(HRT) 44
3.4.3 動態Tick/Tickless內核 46
3.4.4 內核中的延遲和睡眠 46
3.5 內核的鎖機制 47
3.5.1 互斥鎖 47
3.5.2 自旋鎖 49
3.6 工作延遲機制 51
3.6.1 Softirq和Ksoftirqd 51
3.6.2 Tasklet 53
3.6.3 Tasklet調度 54
3.6.4 工作隊列 56
3.6.5 內核線程 62
3.7 內核中斷機制 62
3.7.1 註冊中斷處理程序 62
3.7.2 下半部的概念 65
3.8 線程化中斷 68
3.9 從內核調用用戶空間應用程序 71
3.10 總結 72

第4章 字符設備驅動程序 73
4.1 主設備和次設備的概念 73
4.2 設備文件操作 76
4.3 分配和註冊字符設備 77
4.4 寫文件操作 79
4.4.1 內核空間和用戶空間數據交換 79
4.4.2 open方法 80
4.4.3 release方法 81
4.4.4 write方法 82
4.4.5 read方法 84
4.4.6 llseek方法 86
4.4.7 poll方法 88
4.4.8 ioctl方法 91
4.4.9 填充file_operations結構 95
4.5 總結 95

第5章 平臺設備驅動程序 96
5.1 平臺驅動程序 97
5.2 平臺設備 100
5.3 設備、驅動程序和總線匹配 105
5.4 總結 113

第6章 設備樹的概念 114
6.1 設備樹機制 114
6.1.1 命名約定 115
6.1.2 別名、標簽和phandle 115
6.1.3 DT編譯器 117
6.2 表示和尋址設備 117
6.2.1 SPI和I2C尋址 118
6.2.2 平臺設備尋址 119
6.3 處理資源 120
6.3.1 命名資源的概念 121
6.3.2 訪問寄存器 122
6.3.3 處理中斷 123
6.3.4 提取特定應用數據 124
6.4 平臺驅動程序和DT 127
6.4.1 OF匹配風格 127
6.4.2 匹配風格混合 132
6.4.3 平臺數據與DT 136
6.5 總結 137

第7章 I2C客戶端驅動程序 138
7.1 驅動程序架構 139
7.1.1 i2c_driver結構 139
7.1.2 驅動程序的初始化和註冊 142
7.1.3 驅動程序和設備的配置 142
7.2 訪問客戶端 143
7.2.1 普通I2C通信 143
7.2.2 系統管理總線(SMBus)兼容函數 145
7.2.3 在開發板配置文件中實例化I2C設備(棄用的舊方式) 146
7.3 I2C和設備樹 147
7.3.1 定義和註冊I2C驅動程序 147
7.3.2 在設備樹中實例化I2C設備——新方法 149
7.3.3 小結 149
7.4 總結 150

第8章 SPI設備驅動程序 151
8.1 驅動程序架構 151
8.1.1 設備結構 152
8.1.2 spi_driver結構 154
8.1.3 驅動程序的初始化和註冊 156
8.1.4 驅動程序和設備配置 157
8.2 訪問和與客戶端通信 161
8.3 小結 166
8.4 SPI用戶模式驅動程序 166
8.5 總結 170

第9章 Regmap API ——寄存器映射抽象 171
9.1 使用Regmap API編程 172
9.1.1 regmap_config結構 172
9.1.2 Regmap初始化 175
9.1.3 設備訪問函數 177
9.1.4 Regmap和緩存 180
9.1.5 小結 181
9.1.6 Regmap示例 182
9.2 總結 184

第 10章 IIO框架 185
10.1 IIO數據結構 186
10.1.1 Iio_dev數據結構 186
10.1.2 iio_info結構 190
10.1.3 IIO通道 190
10.1.4 小結 196
10.2 觸發緩沖區支持 199
10.2.1 IIO觸發器和sysfs(用戶空間) 202
10.2.2 IIO緩沖區 206
10.2.3 小結 208
10.3 IIO數據訪問 214
10.3.1 單次捕獲 214
10.3.2 緩沖區數據訪問 214
10.4 IIO工具 216
10.5 總結 217

第 11章 內核內存管理 218
11.1 系統內存佈局——內核空間和用戶空間 219
11.1.1 內核地址——低端和高端內存概念 221
11.1.2 用戶空間尋址 222
11.1.3 虛擬內存區域 225
11.2 地址轉換和MMU 227
11.3 內存分配機制 232
11.3.1 頁面分配器 233
11.3.2 Slab分配器 235
11.3.3 kmalloc分配系列 238
11.3.4 vmalloc分配器 240
11.3.5 後台的進程內存分配 242
11.4 使用I/O內存訪問硬件 244
11.4.1 PIO設備訪問 244
11.4.2 MMIO設備訪問 245
11.5 內存(重)映射 248
11.5.1 kmap 248
11.5.2 映射內核內存到用戶空間 249
11.6 Linux緩存系統 253
11.6.1 什麽是緩存 253
11.6.2 為什麽數據延遲寫入磁盤 255
11.7 設備管理的資源—— Devres 256
11.8 總結 257

第 12章 DMA ——直接內存訪問 258
12.1 設置DMA映射 258
12.1.1 緩存一致性和DMA 258
12.1.2 DMA映射 259
12.2 完成的概念 263
12.3 DMA引擎API 264
12.3.1 分配DMA從通道 265
12.3.2 設置從設備和控制器指定參數 266
12.3.3 獲取事務描述符 269
12.3.4 提交事務 270
12.3.5 發布待處理DMA請求並等待回調通知 271
12.4 總結—— NXP SDMA(i.MX6) 272
12.5 DMA DT綁定 277
12.6 總結 278

第 13章 Linux設備模型 279
13.1 LDM數據結構 279
13.1.1 總線 280
13.1.2 設備驅動程序 285
13.1.3 設備 287
13.2 深入剖析LDM 289
13.2.1 kobject結構 289
13.2.2 kobj_type 291
13.2.3 內核對象集合 293
13.2.4 屬性 294
13.3 設備模型和sysfs 296
13.3.1 sysfs文件和屬性 297
13.3.2 允許輪詢sysfs屬性文件 303
13.4 總結 304

第 14章 引腳控制和GPIO子系統 305
14.1 引腳控制子系統 305
14.2 GPIO子系統 310
14.2.1 基於整數的GPIO接口:傳統方法 310
14.2.2 基於描述符的GPIO接口:新的推薦方式 315
14.2.3 GPIO接口和設備樹 322
14.2.4 GPIO和sysfs 327
14.3 總結 329

第 15章 GPIO控制器驅動程序—— gpio_chip 330
15.1 驅動程序體系結構和數據結構 330
15.2 引腳控制器指南 334
15.3 GPIO控制器的sysfs接口 335
15.4 GPIO控制器和DT 335
15.5 總結 336

第 16章 高級IRQ管理 337
16.1 中斷復用和中斷控制器 339
16.2 高級外設IRQ管理 347
16.3 中斷請求和傳播 349
16.3.1 鏈接IRQ 351
16.3.2 案例研究—— GPIO和IRQ芯片 351
16.4 總結 356

第 17章 輸入設備驅動程序 357
17.1 輸入設備結構 357
17.2 分配並註冊輸入設備 360
17.3 產生和報告輸入事件 364
17.4 用戶空間接口 366
17.5 回顧 368
17.6 總結 376

第 18章 RTC驅動程序 377
18.1 RTC框架數據結構 377
18.2 RTC和用戶空間 387
18.2.1 sysfs接口 387
18.2.2 hwclock工具 388
18.3 總結 389

第 19章 PWM驅動程序 390
19.1 PWM控制器驅動程序 391
19.1.1 驅動程序示例 393
19.1.2 PWM控制器綁定 396
19.2 PWM消費者接口 397
19.3 通過sysfs接口使用PWM 401
19.4 總結 402

第 20章 調節器框架 403
20.1 PMIC/生產者驅動程序接口 404
20.1.1 驅動程序數據結構 404
20.1.2 驅動程序方法 412
20.1.3 驅動程序示例 418
20.2 調節器消費者接口 421
20.2.1 調節器設備請求 422
20.2.2 控制調節器設備 423
20.3 調節器綁定 425
20.4 總結 426

第 21章 幀緩沖驅動程序 427
21.1 驅動程序數據結構 428
21.2 設備方法 431
21.3 驅動程序方法 434
21.3.1 fb_ops剖析 436
21.3.2 總結 440
21.4 用戶空間的幀緩沖 440
21.5 總結 442

第 22章 網絡接口卡驅動程序 443
22.1 驅動程序數據結構 443
22.1.1 套接字緩沖區結構 444
22.1.2 網絡接口結構 446
22.2 設備方法 448
22.2.1 打開和關閉 449
22.2.2 數據包處理 452
22.2.3 驅動程序示例 457
22.2.4 狀態和控制 460
22.3 驅動程序方法 463
22.3.1 probe函數 464
22.3.2 模塊卸載 466
22.4 總結 466