linux設備驅動開發(2022年清華大學出版社出版書籍)

本詞條是多義詞,共2個義項
更多義項 ▼ 收起列表 ▲

《Linux設備驅動開發》是清華大學出版社於2022年出版的書籍,作者是[美]約翰·馬德奧

基本介紹

  • 中文名:linux設備驅動開發
  • 作者:[美]約翰·馬德奧
  • 譯者:李強
  • 出版時間:2022年12月1日
  • 出版社清華大學出版社
  • ISBN:9787302619024
  • 定價:149 元
  • 開本:16 開 
  • 裝幀:平裝 
內容簡介,圖書目錄,

內容簡介

《Linux設備驅動開發》本書詳細闡述了與Linux設備驅動開發相關的基本解決方案,主要包括Linux核心概念、regmap API套用、MFD子系統和syscon API、通用時鐘框架、ALSA SoC框架、V4L2和視頻採集、集成V4L2異步和媒體控制器框架、V4L2 API、Linux核心電源管理、PCI設備驅動、NVMEM框架、看門狗設備驅動、Linux核心調試技巧和**實踐等內容。此外,本書還提供了相應的示例、代碼,以幫助讀者進一步理解相關方案的實現過程。 本書適合作為高等院校計算機及相關專業的教材和教學參考書,也可作為相關開發人員的自學用書和參考手冊。 本書詳細闡述了與Linux設備驅動開發相關的基本解決方案,主要包括Linux核心概念、regmap API套用、MFD子系統和syscon API、通用時鐘框架、ALSA SoC框架、V4L2和視頻採集、集成V4L2異步

圖書目錄

第1篇 用於嵌入式設備驅動程式開發的核心核心框架
第1章 嵌入式開發人員需要掌握的Linux核心概念 3
1.1 技術要求 3
1.2 核心鎖API和共享對象 3
1.2.1 自旋鎖 4
1.2.2 禁用中斷與僅禁用搶占 8
1.2.3 互斥鎖 8
1.2.4 try-lock方法 11
1.3 Linux核心中的等待、感知和阻塞 13
1.3.1 等待活動完成或狀態改變 13
1.3.2 Linux核心等待佇列 15
1.4 工作延遲機制 19
1.4.1 softIRQ 20
1.4.2 關於ksoftirqd 24
1.4.3 tasklet 25
1.4.4 工作佇列 28
1.4.5 核心共享佇列 31
1.4.6 新的工作佇列 32
1.4.7 並發管理的工作佇列 33
1.5 Linux核心中斷管理 37
1.5.1 中斷的狀態 37
1.5.2 中斷處理流程 38
1.5.3 設計中斷處理程式 40
1.5.4 中斷的標誌 42
1.5.5 中斷的返回值 44
1.5.6 關於中斷的一些注意事項 45
1.5.7 上半部和下半部的概念 46
1.5.8 執行緒中斷處理程式 48
1.5.9 請求一個上下文中斷 53
1.5.10 使用工作佇列延遲下半部 55
1.5.11 從中斷處理程式中鎖定 58
1.6 小結 61
第2章 regmap API套用 63
2.1 技術要求 63
2.2 regmap及其數據結構 64
2.2.1 struct regmap_config結構體中的欄位 65
2.2.2 訪問設備暫存器 69
2.2.3 一次讀/寫多個暫存器 71
2.2.4 更新暫存器中的位 72
2.3 regmap和IRQ管理 73
2.3.1 Linux核心IRQ管理的結構 73
2.3.2 創建映射 74
2.3.3 struct irq_domain_ops 76
2.3.4 irq_domain_ops.map() 77
2.3.5 irq_domain_ops.xlate() 77
2.4 連結IRQ 78
2.4.1 鏈式中斷 78
2.4.2 嵌套中斷 83
2.4.3 irqchip和gpiolib API—新一代 85
2.4.4 基於gpiochip的鏈式IRQ晶片 87
2.4.5 基於gpiochip的嵌套IRQ晶片 89
2.5 regmap IRQ API和數據結構 91
2.5.1 regmap IRQ數據結構 91
2.5.2 regmap IRQ API 95
2.5.3 regmap IRQ API示例 98
2.6 小結 102
第3章 深入研究MFD子系統和syscon API 103
3.1 技術要求 103
3.2 MFD子系統和syscon API 104
3.2.1 da9055設備驅動程式示例 104
3.2.2 max8925設備驅動程式示例 113
3.3 MFD設備的設備樹綁定 116
3.4 了解syscon和simple-mfd 119
3.4.1 syscon API 119
3.4.2 simple-mfd 123
3.5 小結 125
第4章 通用時鐘框架 127
4.1 技術要求 128
4.2 CCF數據結構和接口 128
4.2.1 了解struct clk_hw及其依賴項 129
4.2.2 註冊/取消註冊時鐘提供者 131
4.2.3 將時鐘公開給使用者 135
4.2.4 時鐘提供者設備樹節點及其相關機制 136
4.2.5 了解of_parse_phandle_with_args() API 138
4.2.6 了解__of_clk_get_from_provider() API 140
4.2.7 時鐘解碼回調 141
4.3 編寫時鐘提供者驅動程式 145
4.3.1 有關時鐘提供者驅動程式的基礎知識 145
4.3.2 提供時鐘操作 149
4.3.3 clk_hw.init.flags中的時鐘標誌 152
4.3.4 固定頻率時鐘案例研究及其操作 154
4.3.5 通用簡化注意事項 156
4.3.6 固定頻率時鐘設備綁定 158
4.3.7 PWM時鐘 159
4.3.8 固定倍頻時鐘驅動程式及其操作 160
4.3.9 固定倍頻時鐘的設備樹綁定 162
4.3.10 門控時鐘及其操作 162
4.3.11 基於I2C/SPI的門控時鐘 164
4.3.12 GPIO門控時鐘 165
4.3.13 多選一時鐘及其操作 165
4.3.14 基於I2C/SPI的多選一時鐘 170
4.3.15 GPIO多選一時鐘 170
4.3.16 分頻器時鐘及其操作 172
4.3.17 複合時鐘及其操作 176
4.3.18 綜合概述 177
4.4 時鐘使用者API 179
4.4.1 獲取和釋放時鐘 180
4.4.2 準備/取消準備時鐘 180
4.4.3 啟用/禁用 181
4.4.4 頻率函式 181
4.4.5 父函式 182
4.4.6 綜合概述 182
4.5 小結 182
第2篇 嵌入式Linux系統中的多媒體和節能
第5章 ALSA SoC框架—利用編解碼器和平台類驅動程式 185
5.1 技術要求 186
5.2 ASoC簡介 186
5.2.1 ASoC數字音頻接口 187
5.2.2 ASoC子元素 187
5.3 編寫編解碼器類驅動程式 189
5.3.1 編解碼器驅動程式的實例結構 190
5.3.2 編解碼器DAI和PCM配置 192
5.3.3 DAI操作 193
5.3.4 採集和回放硬體配置 196
5.3.5 控制項的概念 197
5.3.6 控制項命名約定 199
5.3.7 控制元數據 200
5.3.8 定義kcontrol 200
5.3.9 設定一個簡單開關 202
5.3.10 設定帶有音量級別的開關 203
5.3.11 立體聲控制項 203
5.3.12 帶音量級別的立體聲控制項 203
5.3.13 混音器控制項 204
5.3.14 定義有多個輸入的控制項 204
5.4 DAPM概念 205
5.4.1 關於widget 205
5.4.2 定義widget 207
5.4.3 編解碼域定義 207
5.4.4 定義平台域widget 208
5.4.5 定義音頻路徑域widget 209
5.4.6 定義音頻流域 211
5.4.7 路徑的概念—widget之間的連線器 213
5.4.8 路由的概念—widget互連 214
5.4.9 定義DAPM kcontrol 215
5.4.10 創建widget和路由 217
5.5 編解碼器組件註冊 222
5.6 編寫平台類驅動程式 224
5.6.1 CPU DAI驅動程式 225
5.6.2 平台DMA驅動程式 226
5.6.3 音頻DMA接口 227
5.6.4 PCM硬體配置 230
5.7 小結 233
第6章 ALSA SoC框架—深入了解機器類驅動程式 235
6.1 技術要求 235
6.2 機器類驅動程式介紹 236
6.2.1 機器類驅動程式的開發流程 236
6.2.2 DAI連結 237
6.2.3 獲取CPU和編解碼器節點 239
6.3 機器路由 241
6.3.1 編解碼器引腳 241
6.3.2 板卡接口 242
6.3.3 機器路由 243
6.3.4 設備樹路由 243
6.3.5 靜態路由 244
6.4 時鐘和格式注意事項 245
6.4.1 時鐘和格式設定輔助函式 245
6.4.2 格式 246
6.4.3 時鐘源 247
6.4.4 時鐘分頻器 247
6.4.5 時鐘和格式設定的典型實現 247
6.5 音效卡註冊 249
6.6 利用simple-card機器驅動程式 252
6.6.1 simple-audio機器驅動程式 252
6.6.2 無編解碼器音效卡 253
6.7 小結 254
第7章 V4L2和視頻採集設備驅動程式揭秘 255
7.1 技術要求 255
7.2 框架架構和主要數據結構 255
7.2.1 V4L2架構簡介 256
7.2.2 初始化和註冊V4L2設備 257
7.3 橋接視頻設備驅動程式 258
7.3.1 struct video_device結構體 259
7.3.2 初始化和註冊視頻設備 262
7.3.3 視頻設備檔案操作 264
7.3.4 V4L2 ioctl處理 267
7.3.5 videobuf2接口和API 269
7.3.6 緩衝區的概念 269
7.3.7 平面的概念 271
7.3.8 佇列的概念 272
7.3.9 與特定驅動程式相關的流傳輸回調函式 274
7.3.10 初始化和釋放vb2佇列 277
7.4 關於子設備 278
7.4.1 子設備數據結構體 279
7.4.2 子設備初始化 282
7.4.3 子設備操作 284
7.4.4 核心操作結構 285
7.4.5 視頻操作結構 286
7.4.6 感測器操作結構 287
7.4.7 調用子設備操作 288
7.4.8 子設備的註冊和註銷方式 289
7.5 V4L2控制項基礎結構 290
7.5.1 標準控制項對象 290
7.5.2 控制項處理程式 292
7.5.3 攝像頭感測器驅動程式示例 294
7.5.4 關於控制項繼承 297
7.6 小結 297
第8章 集成V4L2異步和媒體控制器框架 299
8.1 技術要求 299
8.2 V4L2異步接口和圖綁定的概念 299
8.2.1 圖綁定 300
8.2.2 連線埠和端點表示 300
8.2.3 端點連結 301
8.2.4 V4L2異步和面向圖的API 302
8.2.5 從設備樹API到通用fwnode圖API 302
8.2.6 V4L2固件節點API 309
8.2.7 V4L2 fwnode或媒體匯流排類型 311
8.2.8 BT656和並行匯流排 312
8.2.9 MIPI CSI-2匯流排 313
8.2.10 CPP2和MIPI CSI-1匯流排 314
8.2.11 匯流排猜測 315
8.2.12 V4L2異步模式 315
8.2.13 異步模式工作原理 318
8.2.14 異步橋接和子設備探測示例 321
8.3 Linux媒體控制器框架 325
8.3.1 媒體控制器抽象模型 325
8.3.2 V4L2設備抽象 327
8.3.3 媒體控制器數據結構 328
8.3.4 在驅動程式中集成媒體控制器支持 333
8.3.5 初始化並註冊接口和實體 334
8.3.6 媒體實體操作 335
8.3.7 媒體匯流排的概念 335
8.3.8 註冊媒體設備 340
8.3.9 來自用戶空間的媒體控制器 341
8.3.10 使用media-ctl 341
8.3.11 帶有OV2680的WaRP7示例 344
8.4 小結 351
第9章 從用戶空間利用V4L2 API 353
9.1 技術要求 353
9.2 從用戶空間看V4L2 353
9.2.1 V4L2用戶空間API 353
9.2.2 常用ioctl命令 354
9.2.3 在用戶空間中使用V4L2 API的示例 356
9.3 視頻設備打開和屬性管理 357
9.3.1 打開和關閉設備 357
9.3.2 查詢設備功能 357
9.4 緩衝區管理 359
9.4.1 圖像(緩衝區)格式 360
9.4.2 請求緩衝區 364
9.4.3 請求用戶指針緩衝區 364
9.4.4 請求記憶體可映射緩衝區 366
9.4.5 請求DMABUF緩衝區 367
9.4.6 請求讀/寫I/O記憶體 369
9.4.7 將緩衝區加入佇列並啟用流傳輸 369
9.4.8 主緩衝區的概念 370
9.4.9 將用戶指針緩衝區加入佇列 370
9.4.10 將記憶體可映射緩衝區加入佇列 371
9.4.11 將DMABUF緩衝區加入佇列 371
9.4.12 啟用流傳輸 372
9.4.13 將緩衝區移出佇列 373
9.4.14 將記憶體映射緩衝區移出佇列 373
9.4.15 將用戶指針緩衝區移出佇列 375
9.4.16 讀/寫I/O 376
9.5 V4L2用戶空間工具 376
9.5.1 關於v4l2-ctl 376
9.5.2 列出視頻設備及其功能 377
9.5.3 更改設備屬性 377
9.5.4 設定像素格式、解析度和幀速率 379
9.5.5 採集幀和流傳輸 380
9.6 在用戶空間中調試V4L2 382
9.6.1 啟用框架調試 382
9.6.2 V4L2合規性驅動程式測試 384
9.7 小結 385
第10章 Linux核心電源管理 387
10.1 技術要求 387
10.2 基於Linux系統的電源管理概念 388
10.2.1 運行時電源管理 389
10.2.2 動態電源管理接口 389
10.3 主要電源管理框架詳解 389
10.3.1 CPU Idle框架 389
10.3.2 CPUFreq框架 392
10.3.3 Thermal框架 394
10.4 系統電源管理休眠狀態 395
10.4.1 掛起到空閒 395
10.4.2 通電待機 396
10.4.3 掛起到記憶體 396
10.4.4 掛起到磁碟 397
10.5 為設備驅動程式添加電源管理功能 399
10.5.1 設備和電源管理運算元據結構 399
10.5.2 實現運行時電源管理功能 401
10.5.3 驅動程式中的運行時電源管理 402
10.5.4 運行時電源管理的同步和異步操作 404
10.5.5 自動掛起 404
10.6 綜合套用 405
10.6.1 probe函式中的電源管理機制 405
10.6.2 讀取函式中的電源管理調用 407
10.6.3 卸載模組時的電源管理方法 409
10.6.4 運行時電源管理回調函式執行的一般規則 410
10.6.5 電源域的概念 410
10.7 系統掛起和恢復順序 411
10.7.1 掛起階段 411
10.7.2 恢復階段 412
10.7.3 實現系統休眠功能 412
10.8 系統喚醒源 415
10.8.1 喚醒源的數據結構 415
10.8.2 使設備成為喚醒源 417
10.8.3 喚醒功能激活實例 418
10.8.4 IRQ處理程式 419
10.8.5 喚醒源和sysfs 421
10.8.6 關於IRQF_NO_SUSPEND標誌 422
10.9 小結 422
第3篇 與其他Linux核心子系統保持同步
第11章 編寫PCI設備驅動程式 425
11.1 技術要求 425
11.2 PCI匯流排和接口介紹 426
11.2.1 術語 427
11.2.2 PCI匯流排枚舉、設備配置和定址 428
11.2.3 設備識別 428
11.2.4 匯流排枚舉 428
11.3 PCI地址空間 432
11.3.1 PCI配置空間 432
11.3.2 PCI I/O地址空間 433
11.3.3 PCI記憶體地址空間 433
11.4 BAR的概念 433
11.5 中斷分配 434
11.5.1 PCI傳統INT-X中斷 434
11.5.2 基於訊息的中斷類型 435
11.5.3 MSI機制 436
11.5.4 MSI-X機制 437
11.5.5 傳統INTx模擬 437
11.6 Linux Kernel PCI子系統 438
11.7 PCI數據結構 439
11.7.1 實例化PCI設備的結構體 439
11.7.2 用於識別PCI設備的結構體 441
11.7.3 實例化PCI設備驅動程式的結構體 443
11.7.4 註冊PCI驅動程式 444
11.8 PCI驅動程式結構體概述 445
11.8.1 啟用設備 445
11.8.2 匯流排控制能力 446
11.8.3 訪問配置暫存器 447
11.8.4 訪問記憶體映射I/O資源 448
11.8.5 訪問I/O連線埠資源 451
11.8.6 處理中斷 453
11.8.7 傳統INTx IRQ分配 455
11.8.8 模擬INTx IRQ調和 457
11.8.9 關於鎖定的注意事項 457
11.8.10 關於傳統API的簡要說明 457
11.9 PCI和直接記憶體訪問 458
11.9.1 關於DMA緩衝區 459
11.9.2 PCI一致DMA映射 460
11.9.3 流式DMA映射 462
11.9.4 單緩衝區映射 462
11.9.5 分散/聚集映射 464
11.10 小結 466
第12章 利用NVMEM框架 467
12.1 技術要求 467
12.2 NVMEM數據結構和API 468
12.2.1 NVMEM硬體抽象數據結構 468
12.2.2 NVMEM設備的運行時配置數據結構 468
12.2.3 NVMEM數據單元的數據結構 470
12.3 編寫NVMEM提供者驅動程式 472
12.3.1 NVMEM設備的註冊和註銷 472
12.3.2 實時時鐘設備中的NVMEM存儲器 473
12.3.3 DS1307實時時鐘驅動程式示例 474
12.3.4 實現NVMEM讀/寫回調函式 475
12.3.5 NVMEM提供者的設備樹綁定 476
12.4 NVMEM使用者驅動程式API 477
12.4.1 NVMEM使用者API 477
12.4.2 用戶空間中的NVMEM 478
12.5 小結 480
第13章 看門狗設備驅動程式 481
13.1 技術要求 481
13.2 看門狗數據結構和API 481
13.2.1 表示看門狗設備的結構體 482
13.2.2 表示看門狗信息的結構體 483
13.2.3 表示看門狗操作的結構體 485
13.2.4 註冊/註銷看門狗設備 486
13.2.5 處理預逾時和調控器 488
13.2.6 基於GPIO的看門狗 489
13.3 看門狗用戶空間接口 491
13.3.1 啟動和停止看門狗 491
13.3.2 傳送保持活動的ping 492
13.3.3 獲取看門狗的功能和ID 493
13.3.4 設定和獲取逾時和預逾時 493
13.3.5 獲取剩餘的時間 494
13.3.6 獲取(啟動/重啟)狀態 494
13.3.7 看門狗sysfs接口 496
13.3.8 處理預逾時事件 497
13.4 小結 497
第14章 Linux核心調試技巧和最佳實踐 499
14.1 技術要求 499
14.2 了解Linux核心發布流程 499
14.3 Linux核心開發技巧 501
14.3.1 訊息列印 502
14.3.2 核心日誌級別 502
14.3.3 核心日誌緩衝區 504
14.3.4 添加計時信息 505
14.4 Linux核心跟蹤和性能分析 506
14.4.1 使用Ftrace檢測代碼 506
14.4.2 可用的tracer 508
14.4.3 function tracer 509
14.4.4 function_graph tracer 510
14.4.5 函式過濾器 512
14.4.6 跟蹤事件 513
14.4.7 使用Ftrace接口跟蹤特定進程 515
14.5 Linux核心調試技巧 516
14.5.1 oops和恐慌分析 516
14.5.2 轉儲oops跟蹤訊息 519
14.5.3 使用objdump識別核心模組中的錯誤代碼行 520
14.6 小結 521

相關詞條

熱門詞條

聯絡我們