嵌入式Linux設備驅動程式開發指南(原書第2版)

嵌入式Linux設備驅動程式開發指南(原書第2版)

《嵌入式Linux設備驅動程式開發指南(原書第2版)》是2021年機械工業出版社出版的圖書,作者是[西]阿爾貝托·利貝拉爾·德·洛斯里奧斯(A)。本書以實戰為核心,闡述了Linux核心基礎知識,將編寫大約30個驅動程式並移植到三種不同的微處理器上。

基本介紹

  • 中文名:嵌入式Linux設備驅動程式開發指南(原書第2版)
  • 作者:[西]阿爾貝托·利貝拉爾·德·洛斯里奧斯(A)
  • 出版社:機械工業出版社
  • ISBN:9787111684558 
內容簡介,圖書目錄,作者簡介,

內容簡介

嵌入式微處理器功能強大、節能和低成本與嵌入式Linux系統的靈活性結合,促使業界許多公司基於嵌入式微處理器開發出了很多新產品。本書教讀者基於設備樹嵌入式Linux系統如何開發設備驅動程式。讀者將學習編寫不同類型的Linux驅動程式,以及與核心和用戶空間互動的應用程式程式接口(API)和方法。本書以實戰為核心,闡述了Linux核心基礎知識,將編寫大約30個驅動程式並移植到三種不同的微處理器上。本書在實驗部分中基於NXP i.MX7D、Microchip SAMA5D2和Broadcom BCM2837三種不同微處理器詳細闡述了驅動程式的開發的實現,讀者可參考實驗部分選擇開發和測試自己的驅動程式。在閱讀本書之前,建議讀者先購買一個基於這些微處理器之一的開發板,板上至少應有一個SPI和I2C控制器,例如Raspberry Pi3模型B板。

圖書目錄

譯者序
前言
作者簡介
第1章 構建系統1
1.1 引導載入程式1
1.2 Linux核心3
1.3 系統調用接口和C運行時庫6
1.4 系統共享庫7
1.5 根檔案系統8
1.6 Linux啟動過程9
1.7 構建嵌入式Linux系統10
1.8 設定乙太網通信11
1.9 為NXP i.MX7D處理器構建嵌入式Linux系統11
1.9.1 簡介12
1.9.2 主機軟體包12
1.9.3 設定repo工具13
1.9.4 Yocto工程的安裝和映像構建13
1.9.5 Yocto 之外的工作15
1.9.6 構建Linux核心18
1.9.7 安裝TFTP伺服器20
1.9.8 安裝NFS伺服器20
1.9.9 設定U-Boot環境變數21
1.10 為Microchip SAMA5D2處理器構建嵌入式Linux系統21
1.10.1 簡介22
1.10.2 主機軟體包22
1.10.3 Yocto工程的安裝和映像構建22
1.10.4 Yocto 之外的工作25
1.10.5 構建Linux核心25
1.10.6 安裝TFTP伺服器27
1.10.7 安裝NFS伺服器27
1.10.8 設定U-Boot環境變數28
1.11 為Broadcom BCM2837處理器構建Linux嵌入式系統28
1.11.1 Raspbian28
1.11.2 構建Linux核心29
1.11.3 將檔案複製到Raspberry Pi31
1.12 使用Eclipse33
1.12.1 用於核心源碼的Eclipse配置33
1.12.2 用於開發Linux驅動程式的Eclipse配置38
第2章 Linux設備與驅動模型42
2.1 匯流排核心驅動42
2.2 匯流排控制器驅動45
2.3 設備驅動45
2.4 設備樹簡介46
第3章 簡驅動程式50
3.1 許可證51
3.2 實驗3-1:“helloworld”模組51
3.3 代碼清單3-1:helloworld_imx.c52
3.4 代碼清單3-2:Makefile52
3.5 helloworld_imx.ko演示53
3.6 實驗3-2:“帶參數的helloworld”模組53
3.7 代碼清單3-3:helloworld_imx_with_parameters.c54
3.8 helloworld_imx_with_parameters.ko演示54
3.9 實驗3-3:“helloworld計時”模組55
3.10 代碼清單3-4:helloworld_imx_with_timing.c55
3.11 helloworld_imx_with_timing.ko演示56
第4章 字元設備驅動57
4.1 實驗4-1:“helloworld字元設備”模組59
4.2 代碼清單4-1:helloworld_imx_char_driver.c63
4.3 代碼清單4-2:Makefile65
4.4 代碼清單 4-3:ioctl_test.c65
4.5 helloworld_imx_char_driver.ko演示66
4.6 將模組添加到核心構建66
4.7 使用設備檔案系統創建設備檔案67
4.8 實驗4-2:“class字元設備”模組68
4.9 代碼清單4-4:helloworld_imx_class_driver.c70
4.10 helloworld_imx_class_driver.ko演示72
4.11 雜項字元設備驅動72
4.12 實驗4-3:“雜項字元設備”模組73
4.13 代碼清單4-5:misc_imx_driver.c74
4.14 misc_imx_driver.ko演示75
第5章 平台設備驅動76
5.1 實驗5-1:“平台設備”模組78
5.2 代碼清單5-1:hellokeys_imx.c81
5.3 hellokeys_imx.ko演示82
5.4 操作硬體的文檔82
5.5 硬體命名約定83
5.6 引腳控制器84
5.7 引腳控制子系統86
5.8 設備樹引腳控制器綁定92
5.9 GPIO 控制器驅動96
5.10 GPIO描述符使用者接口98
5.10.1 獲取和釋放GPIO98
5.10.2 使用GPIO99
5.10.3 GPIO映射到中斷99
5.10.4 GPIO設備樹100
5.11 在核心和用戶態之間交換數據100
5.12 MMIO(記憶體映射I/O)設備訪問101
5.13 實驗5-2:“RGB LED平台設備”模組103
5.13.1 i.MX7D處理器的硬體描述103
5.13.2 SAMA5D2處理器的硬體描述105
5.13.3 BCM2837處理器的硬體描述107
5.13.4 i.MX7D處理器的設備樹107
5.13.5 SAMA5D2處理器的設備樹111
5.13.6 BCM2837處理器的設備樹114
5.13.7 “RGB LED平台設備”模組的代碼描述115
5.14 代碼清單5-2:ledRGB_sam_platform.c119
5.15 ledRGB_sam_platform.ko演示124
5.16 平台驅動資源124
5.17 Linux LED類126
5.18 實驗5-3:“RGB LED類”模組128
5.18.1 i.MX7D、SAMA5D2和BCM2837處理器的設備樹128
5.18.2 “RGB LED類”模組的代碼描述130
5.19 代碼清單5.3:ledRGB_sam_class_platform.c134
5.20 ledRGB_sam_class_platform.ko演示137
5.21 用戶態中的平台設備驅動137
5.22 用戶定義的I/O:UIO139
5.22.1 UIO如何運轉140
5.22.2 核心中的UIO API141
5.23 實驗5-4:“LED UIO平台”模組142
5.23.1 i.MX7D、SAMA5D2和BCM2837處理器的設備樹143
5.23.2 “LED UIO平台”模組的代碼描述144
5.24 代碼清單5-4:led_sam_UIO_platform.c146
5.25 代碼清單5-5:UIO_app.c148
5.26 led_sam_UIO_platform.ko及UIO_app演示150
第6章 I2C從端驅動151
6.1 Linux I2C 子系統152
6.2 編寫I2C 從端驅動155
6.2.1 註冊I2C從端驅動155
6.2.2 在設備樹中聲明I2C設備157
6.3 實驗6-1:“I2C I/O 擴展設備”模組159
6.3.1 i.MX7D處理器的硬體描述159
6.3.2 SAMA5D2 處理器的硬體描述159
6.3.3 BCM2837處理器的硬體描述160
6.3.4 i.MX7D處理器的設備樹161
6.3.5 SAMA5D2處理器的設備樹162
6.3.6 BCM2837處理器的設備樹163
6.3.7 “I2C I/O擴展設備”模組的代碼描述164
6.4 代碼清單6-1:io_imx_expander.c167
6.5 io_imx_expander.ko演示170
6.6 sysfs檔案系統171
6.7 實驗6-2:“I2C多顯LED”模組174
6.7.1 i.MX7D處理器的硬體描述175
6.7.2 SAMA5D2處理器的硬體描述176
6.7.3 BCM2837處理器的硬體描述176
6.7.4 i.MX7D處理器的設備樹177
6.7.5 SAMA5D2處理器的設備樹178
6.7.6 BCM2837處理器的設備樹180
6.7.7 ACPI和設備樹的統一設備屬性接口181
6.7.8 “I2C多顯LED”模組的代碼描述182
6.8 代碼清單6-2:ltc3206_imx_led_class.c186
6.9 ltc3206_imx_led_class.ko演示192
第7章 處理設備驅動中的中斷194
7.1 GPIO控制器在Linux核心的中斷域196
7.2 設備樹中斷處理203
7.3 在Linux設備驅動中申請中斷206
7.4 實驗7-1:“按鈕中斷設備”模組207
7.4.1 i.MX7D處理器的硬體描述208
7.4.2 SAMA5D2處理器的硬體描述208
7.4.3 BCM2837處理器的硬體描述208
7.4.4 i.MX7D 處理器的設備樹208
7.4.5 SAMA5D2 處理器的設備樹209
7.4.6 BCM2837 處理器的設備樹210
7.4.7 “按鈕中斷設備”模組的代碼描述211
7.5 代碼清單7-1:int_imx_key.c213
7.6 int_imx_key.ko演示215
7.7 延遲工作215
7.7.1 軟中斷216
7.7.2 tasklet217
7.7.3 定時器218
7.7.4 執行緒化的中斷221
7.7.5 工作佇列223
7.8 核心中的鎖226
7.8.1 鎖和單處理器核心227
7.8.2 在中斷和進程上下文之間共享自旋鎖227
7.8.3 在用戶上下文使用鎖227
7.9 核心中的睡眠228
7.10 實驗7-2:“睡眠設備”模組229
7.10.1 i.MX7D處理器的設備樹230
7.10.2 SAMA5D2處理器的設備樹231
7.10.3 BCM2837處理器的設備樹232
7.10.4 “睡眠設備”模組的代碼描述233
7.11 代碼清單7-2:int_imx_key_wait.c236
7.12 int_imx_key_wait.ko演示239
7.13 核心執行緒239
7.14 實驗7-3:“keyled類”模組240
7.14.1 i.MX7D處理器的硬體描述240
7.14.2 SAMA5D2處理器的硬體描述241
7.14.3 BCM2837處理器的硬體描述241
7.14.4 i.MX7D 處理器的設備樹242
7.14.5 SAMA5D2處理器的設備樹245
7.14.6 BCM2837處理器的設備樹247
7.14.7 “keyled類”模組的代碼描述249
7.15 代碼清單7-3:keyled_imx_class.c255
7.16 keyled_imx_class.ko演示264
第8章 在Linux驅動中分配記憶體266
8.1 查詢ARM的MMU轉換表267
8.2 Linux地址的類型271
8.3 用戶進程的虛擬地址到物理地址的映射273
8.4 核心的虛擬地址到物理地址的映射273
8.5 核心記憶體分配器275
8.5.1 頁面分配器275
8.5.2 頁面分配器接口275
8.5.3 SLAB分配器276
8.5.4 SLAB分配器接口278
8.5.5 kmalloc記憶體分配器279
8.6 實驗8-1:“鍊表記憶體分配”模組280
8.7 代碼清單8-1:linkedlist_imx_platform.c283
8.8 linkedlist_imx_platform.ko演示287
第9章 在Linux設備驅動中使用DMA288
9.1 快取一致性288
9.2 Linux DMA引擎API289
9.3 實驗9-1:“流式DMA”模組295
9.4 代碼清單9-1:sdma_imx_m2m.c302
9.5 sdma_imx_m2m.ko演示 306
9.6 DMA分散/聚集映射306
9.7 實驗9-2:“分散/聚集DMA設備”模組 307
9.8 代碼清單9-2:sdma_imx_sg_m2m.c310
9.9 sdma_imx_sg_m2m.ko演示 315
9.10 用戶態DMA315
9.11 實驗9-3:“用戶態DMA”模組317
9.12 代碼清單9-3:sdma_imx_mmap.c319
9.13 代碼清單9-4:sdma.c323
9.14 sdma_imx_mmap.ko演示324
第10章 輸入子系統設備驅動框架325
10.1 輸入子系統驅動程式326
10.2 實驗10-1:“輸入子系統加速度計”模組327
10.2.1 設備樹329
10.2.2 使用I2C互動的輸入框架330
10.2.3 使用輸入設備的輸入框架331
10.3 代碼清單10-1:i2c_imx_accel.c334
10.4 i2c_imx_accel.ko演示336
10.5 在Linux中使用SPI337
10.6 Linux的SPI子系統339
10.7 編寫SPI從設備驅動程式 342
10.7.1 註冊SPI從設備驅動程式 342
10.7.2 在設備樹中聲明SPI設備343
10.8 實驗10-2:“SPI加速度計輸入設備”模組346
10.8.1 i.MX7D 處理器的硬體描述347
10.8.2 SAMA5D2處理器的硬體描述 347
10.8.3 BCM2837處理器的硬體描述 348
10.8.4 i.MX7D處理器的設備樹348
10.8.5 SAMA5D2處理器的設備樹 349
10.8.6 BCM2837處理器的設

作者簡介

Alberto Liberty是Arrow Electronics的現場套用工程師,在嵌入式系統方面有超過15年的經驗。在過去的幾年裡,他一直在Arrow公司支持高端處理器和FPGA產品。Alberto也是Linux愛好者,在過去的幾年裡,他舉辦了多場關於嵌入式Linux與Linux設備驅動程式的技術研討會和實踐講習班。Alberto的專業技能還包括多媒體晶片(SoC)和嵌入式實時作業系統(RTOS)。他目前居住在西班牙馬德里,他的愛好是和女兒一起在馬德里市中心散步,他還喜歡閱讀電影雜誌和觀看科幻電影。

相關詞條

熱門詞條

聯絡我們