嵌入式Linux設備驅(qū)動程序開發(fā)指南
定 價:159 元
- 作者:(西)阿爾貝托·利貝拉爾·德·洛斯里奧斯(Alberto Liberty de Los Rios)著;文洋[等]譯
- 出版時間:2021/6/1
- ISBN:9787111684558
- 出 版 社:機械工業(yè)出版社
- 中圖法分類:TP316.85
- 頁碼:18,532頁
- 紙張:膠版紙
- 版次:1
- 開本:16K
嵌入式微處能強大、節(jié)能和低成本與嵌入式Linux系統(tǒng)的靈活性結(jié)合,促使業(yè)界許多公司基于嵌入式微處理器開發(fā)出了很多新產(chǎn)品。本書教讀者基于設備樹嵌入式Linux系統(tǒng)如何開發(fā)設備驅(qū)動程序。讀者將學不同類型的Linux驅(qū)動程序,以及與內(nèi)核和用戶空間交互的應用程序程序接口(API)和方法。本書以實戰(zhàn)為核心,闡述了Linux內(nèi)核基礎(chǔ)知識,將編寫大約30個驅(qū)動程序并移植到三種不同的微處理器上。本書在實驗部分中基于NXP i.MX7D、Microchip SAMA5D2和Broadcom BCM283種不同微處理器詳細闡述了驅(qū)動程序的開發(fā)的實現(xiàn),讀者可參考實驗部分選擇開發(fā)和測試自己的驅(qū)動程序。在閱讀本書之前,建議讀者先購買一個基于這些微處理器之一的開發(fā)板,板上至少應有一個SPI和I2C控制器,例如Raerry Pi3模型B板。
Alberto Liberty是Arrow Electronics的現(xiàn)場應用工程師,在嵌入式系統(tǒng)方面有超過15年的經(jīng)驗。在過去的幾年里,他一直在Arrow公司支持高端處理器和FPGA產(chǎn)品。Alberto也是Linux愛好者,在過去的幾年里,他舉辦了多場關(guān)于嵌入式Linux與Linux設備驅(qū)動程序的技術(shù)研討會和實踐講Alberto的專業(yè)技能括多媒體芯片(SoC)和嵌入式實時操作系統(tǒng)(RTOS)。他目前居住在西班牙馬德里,他大的愛好是和女兒一起在馬德里市中心散步,他還喜歡閱讀電影雜志和觀看科幻電影。
譯者序
前言
作者簡介
第1章 構(gòu)建系統(tǒng)1
1.1 引導加載程序1
1.2 Linux內(nèi)核3
1.3 系統(tǒng)調(diào)用接口和C運行時庫6
1.4 系統(tǒng)共享庫7
1.5 根文件系統(tǒng)8
1.6 Linux啟動過程9
1.7 構(gòu)建嵌入式Linux系統(tǒng)10
1.8 設置以太網(wǎng)通信11
1.9 為NXP i.MX7D處理器構(gòu)建嵌入式Linux系統(tǒng)11
1.9.1 簡介12
1.9.2 主機軟12
1.9.3 設置repo工具13
1.9.4 Yocto工程的安裝和映像構(gòu)建13
1.9.5 Yocto 之外的工作15
1.9.6 構(gòu)建Linux內(nèi)核18
1.9.7 安裝TFTP服務器20
1.9.8 安裝NFS服務器20
1.9.9 設置U-Boot環(huán)境變量21
1.10 為Microchip SAMA5D2處理器構(gòu)建嵌入式Linux系統(tǒng)21
1.10.1 簡介22
1.10.2 主機軟22
1.10.3 Yocto工程的安裝和映像構(gòu)建22
1.10.4 Yocto 之外的工作25
1.10.5 構(gòu)建Linux內(nèi)核25
1.10.6 安裝TFTP服務器27
1.10.7 安裝NFS服務器27
1.10.8 設置U-Boot環(huán)境變量28
1.11 為Broadcom BCM2837處理器構(gòu)建Linux嵌入式系統(tǒng)28
1.11.1 Raian28
1.11.2 構(gòu)建Linux內(nèi)核29
1.11.3 將文件到Raerry Pi31
1.12 使用Eclipse33
1.12.1 用于內(nèi)核源碼的Eclipse配置33
1.12.2 用于開發(fā)Linux驅(qū)動程序的Eclipse配置38
第2章 Linux設備與驅(qū)動模型42
2.1線核心驅(qū)動42
2.2線控制器驅(qū)動45
2.3 設備驅(qū)動45
2.4 設備樹簡介46
第3章 最簡驅(qū)動程序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:“帶參數(shù)的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章 字符設備驅(qū)動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 將模塊添加到內(nèi)核構(gòu)建66
4.7 使用設備文件系統(tǒng)創(chuàng)建設備文件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 雜項字符設備驅(qū)動72
4.12 實驗4-3:“雜項字符設備”模塊73
4.13 代碼清單4-5:misc_imx_driver.c74
4.14 misc_imx_driver.ko演示75
第5章臺設備驅(qū)動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 引腳控制子系統(tǒng)86
5.8 設備樹引腳控制器綁定92
5.9 GPIO 控制器驅(qū)動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 在內(nèi)核和用戶態(tài)之間交換數(shù)據(jù)100
5.12 MMIO(I/O)設備訪問101
5.13 實驗5-2:“RGB LE臺設備”模塊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 LE臺設備”模塊的代碼描述115
5.14 代碼清單5-2:ledRGB_sam_platform.c119
5.15 ledRGB_sam_platform.ko演示124
5.16臺驅(qū)動資源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 用戶態(tài)中臺設備驅(qū)動137
5.22 用戶定義的I/O:UIO139
5.22.1 UIO如何運轉(zhuǎn)140
5.22.2 內(nèi)核中的UIO API141
5.23 實驗5-4:“LED UI臺”模塊142
5.23.1 i.MX7D、SAMA5D2和BCM2837處理器的設備樹143
5.23.2 “LED UI臺”模塊的代碼描述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從端驅(qū)動151
6.1 Linux I2C 子系統(tǒng)152
6.2 編寫I2C 從端驅(qū)動155
6.2.1 注冊I2C從端驅(qū)動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文件系統(tǒng)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和設備樹的統(tǒng)一設備屬性接口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章 處理設備驅(qū)動中的中斷194
7.1 GPIO控制器在Linux內(nèi)核的中斷域196
7.2 設備樹中斷處理203
7.3 在Linux設備驅(qū)動中申請中斷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 內(nèi)核中的鎖226
7.8.1 鎖和單處理器內(nèi)核227
7.8.2 在中斷程上下文之間共享自旋鎖227
7.8.3 在用戶上下文使用鎖227
7.9 內(nèi)核中的睡眠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 內(nèi)核線程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驅(qū)動中分配內(nèi)存266
8.1 查詢ARM的MMU轉(zhuǎn)換表267
8.2 Linux地址的類型271
8.3 用程的虛擬地址到物理地址的映射273
8.4 內(nèi)核的虛擬地址到物理地址的映射273
8.5 內(nèi)核內(nèi)存分配器275
8.5.1 頁面分配器275
8.5.2 頁面分配器接口275
8.5.3 SLAB分配器276
8.5.4 SLAB分配器接口278
8.5.5 kmalloc內(nèi)存分配器279
8.6 實驗8-1:“鏈表內(nèi)存分配”模塊280
8.7 代碼清單8-1:linkedlist_imx_platform.c283
8.8 linkedlist_imx_platform.ko演示287
第9章 在Linux設備驅(qū)動中使用DMA288
9.1 緩存一致性288
9.2 Linux DMA引擎API289
9.3 實驗9-1:“流式DMA”模塊295
9.4 代碼清單9-dma_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 用戶態(tài)DMA315
9.11 實驗9-3:“用戶態(tài)DMA”模塊317
9.12 代碼清單9-3:sdma_imx_mmap.c319
9.13 代碼清單9-4:sdma.c323
9.dma_imx_mmap.ko演示324
第10章 輸入子系統(tǒng)設備驅(qū)動框架325
10.1 輸入子系統(tǒng)驅(qū)動程序326
10.2 實驗10-1:“輸入子系統(tǒng)加速度計”模塊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子系統(tǒng)339
10.7 編寫SPI從設備驅(qū)動程序 342
10.7.1 注冊SPI從設備驅(qū)動程序 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處理器的設備樹