嵌入式Linux設(shè)備驅(qū)動(dòng)程序開(kāi)發(fā)指南
定 價(jià):159 元
- 作者:(西)阿爾貝托·利貝拉爾·德·洛斯里奧斯(Alberto Liberty de Los Rios)著;文洋[等]譯
- 出版時(shí)間:2021/6/1
- ISBN:9787111684558
- 出 版 社:機(jī)械工業(yè)出版社
- 中圖法分類:TP316.85
- 頁(yè)碼:18,532頁(yè)
- 紙張:膠版紙
- 版次:1
- 開(kāi)本:16K
嵌入式微處能強(qiáng)大、節(jié)能和低成本與嵌入式Linux系統(tǒng)的靈活性結(jié)合,促使業(yè)界許多公司基于嵌入式微處理器開(kāi)發(fā)出了很多新產(chǎn)品。本書(shū)教讀者基于設(shè)備樹(shù)嵌入式Linux系統(tǒng)如何開(kāi)發(fā)設(shè)備驅(qū)動(dòng)程序。讀者將學(xué)不同類型的Linux驅(qū)動(dòng)程序,以及與內(nèi)核和用戶空間交互的應(yīng)用程序程序接口(API)和方法。本書(shū)以實(shí)戰(zhàn)為核心,闡述了Linux內(nèi)核基礎(chǔ)知識(shí),將編寫(xiě)大約30個(gè)驅(qū)動(dòng)程序并移植到三種不同的微處理器上。本書(shū)在實(shí)驗(yàn)部分中基于NXP i.MX7D、Microchip SAMA5D2和Broadcom BCM283種不同微處理器詳細(xì)闡述了驅(qū)動(dòng)程序的開(kāi)發(fā)的實(shí)現(xiàn),讀者可參考實(shí)驗(yàn)部分選擇開(kāi)發(fā)和測(cè)試自己的驅(qū)動(dòng)程序。在閱讀本書(shū)之前,建議讀者先購(gòu)買(mǎi)一個(gè)基于這些微處理器之一的開(kāi)發(fā)板,板上至少應(yīng)有一個(gè)SPI和I2C控制器,例如Raerry Pi3模型B板。
Alberto Liberty是Arrow Electronics的現(xiàn)場(chǎng)應(yīng)用工程師,在嵌入式系統(tǒng)方面有超過(guò)15年的經(jīng)驗(yàn)。在過(guò)去的幾年里,他一直在Arrow公司支持高端處理器和FPGA產(chǎn)品。Alberto也是Linux愛(ài)好者,在過(guò)去的幾年里,他舉辦了多場(chǎng)關(guān)于嵌入式Linux與Linux設(shè)備驅(qū)動(dòng)程序的技術(shù)研討會(huì)和實(shí)踐講Alberto的專業(yè)技能括多媒體芯片(SoC)和嵌入式實(shí)時(shí)操作系統(tǒng)(RTOS)。他目前居住在西班牙馬德里,他大的愛(ài)好是和女兒一起在馬德里市中心散步,他還喜歡閱讀電影雜志和觀看科幻電影。
譯者序
前言
作者簡(jiǎn)介
第1章 構(gòu)建系統(tǒng)1
1.1 引導(dǎo)加載程序1
1.2 Linux內(nèi)核3
1.3 系統(tǒng)調(diào)用接口和C運(yùn)行時(shí)庫(kù)6
1.4 系統(tǒng)共享庫(kù)7
1.5 根文件系統(tǒng)8
1.6 Linux啟動(dòng)過(guò)程9
1.7 構(gòu)建嵌入式Linux系統(tǒng)10
1.8 設(shè)置以太網(wǎng)通信11
1.9 為NXP i.MX7D處理器構(gòu)建嵌入式Linux系統(tǒng)11
1.9.1 簡(jiǎn)介12
1.9.2 主機(jī)軟12
1.9.3 設(shè)置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服務(wù)器20
1.9.8 安裝NFS服務(wù)器20
1.9.9 設(shè)置U-Boot環(huán)境變量21
1.10 為Microchip SAMA5D2處理器構(gòu)建嵌入式Linux系統(tǒng)21
1.10.1 簡(jiǎn)介22
1.10.2 主機(jī)軟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服務(wù)器27
1.10.7 安裝NFS服務(wù)器27
1.10.8 設(shè)置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 用于開(kāi)發(fā)Linux驅(qū)動(dòng)程序的Eclipse配置38
第2章 Linux設(shè)備與驅(qū)動(dòng)模型42
2.1線核心驅(qū)動(dòng)42
2.2線控制器驅(qū)動(dòng)45
2.3 設(shè)備驅(qū)動(dòng)45
2.4 設(shè)備樹(shù)簡(jiǎn)介46
第3章 最簡(jiǎn)驅(qū)動(dòng)程序50
3.1 許可證51
3.2 實(shí)驗(yàn)3-1:“helloworld”模塊51
3.3 代碼清單3-1:helloworld_imx.c52
3.4 代碼清單3-2:Makefile52
3.5 helloworld_imx.ko演示53
3.6 實(shí)驗(yàn)3-2:“帶參數(shù)的helloworld”模塊53
3.7 代碼清單3-3:helloworld_imx_with_parameters.c54
3.8 helloworld_imx_with_parameters.ko演示54
3.9 實(shí)驗(yàn)3-3:“helloworld計(jì)時(shí)”模塊55
3.10 代碼清單3-4:helloworld_imx_with_timing.c55
3.11 helloworld_imx_with_timing.ko演示56
第4章 字符設(shè)備驅(qū)動(dòng)57
4.1 實(shí)驗(yàn)4-1:“helloworld字符設(shè)備”模塊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 使用設(shè)備文件系統(tǒng)創(chuàng)建設(shè)備文件67
4.8 實(shí)驗(yàn)4-2:“class字符設(shè)備”模塊68
4.9 代碼清單4-4:helloworld_imx_class_driver.c70
4.10 helloworld_imx_class_driver.ko演示72
4.11 雜項(xiàng)字符設(shè)備驅(qū)動(dòng)72
4.12 實(shí)驗(yàn)4-3:“雜項(xiàng)字符設(shè)備”模塊73
4.13 代碼清單4-5:misc_imx_driver.c74
4.14 misc_imx_driver.ko演示75
第5章臺(tái)設(shè)備驅(qū)動(dòng)76
5.1 實(shí)驗(yàn)5-1:臺(tái)設(shè)備”模塊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 設(shè)備樹(shù)引腳控制器綁定92
5.9 GPIO 控制器驅(qū)動(dòng)96
5.10 GPIO描述符使用者接口98
5.10.1 獲取和釋放GPIO98
5.10.2 使用GPIO99
5.10.3 GPIO映射到中斷99
5.10.4 GPIO設(shè)備樹(shù)100
5.11 在內(nèi)核和用戶態(tài)之間交換數(shù)據(jù)100
5.12 MMIO(I/O)設(shè)備訪問(wèn)101
5.13 實(shí)驗(yàn)5-2:“RGB LE臺(tái)設(shè)備”模塊103
5.13.1 i.MX7D處理器的硬件描述103
5.13.2 SAMA5D2處理器的硬件描述105
5.13.3 BCM2837處理器的硬件描述107
5.13.4 i.MX7D處理器的設(shè)備樹(shù)107
5.13.5 SAMA5D2處理器的設(shè)備樹(shù)111
5.13.6 BCM2837處理器的設(shè)備樹(shù)114
5.13.7 “RGB LE臺(tái)設(shè)備”模塊的代碼描述115
5.14 代碼清單5-2:ledRGB_sam_platform.c119
5.15 ledRGB_sam_platform.ko演示124
5.16臺(tái)驅(qū)動(dòng)資源124
5.17 Linux LED類126
5.18 實(shí)驗(yàn)5-3:“RGB LED類”模塊128
5.18.1 i.MX7D、SAMA5D2和BCM2837處理器的設(shè)備樹(shù)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)中臺(tái)設(shè)備驅(qū)動(dòng)137
5.22 用戶定義的I/O:UIO139
5.22.1 UIO如何運(yùn)轉(zhuǎn)140
5.22.2 內(nèi)核中的UIO API141
5.23 實(shí)驗(yàn)5-4:“LED UI臺(tái)”模塊142
5.23.1 i.MX7D、SAMA5D2和BCM2837處理器的設(shè)備樹(shù)143
5.23.2 “LED UI臺(tái)”模塊的代碼描述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ū)動(dòng)151
6.1 Linux I2C 子系統(tǒng)152
6.2 編寫(xiě)I2C 從端驅(qū)動(dòng)155
6.2.1 注冊(cè)I2C從端驅(qū)動(dòng)155
6.2.2 在設(shè)備樹(shù)中聲明I2C設(shè)備157
6.3 實(shí)驗(yàn)6-1:“I2C I/O 擴(kuò)展設(shè)備”模塊159
6.3.1 i.MX7D處理器的硬件描述159
6.3.2 SAMA5D2 處理器的硬件描述159
6.3.3 BCM2837處理器的硬件描述160
6.3.4 i.MX7D處理器的設(shè)備樹(shù)161
6.3.5 SAMA5D2處理器的設(shè)備樹(shù)162
6.3.6 BCM2837處理器的設(shè)備樹(shù)163
6.3.7 “I2C I/O擴(kuò)展設(shè)備”模塊的代碼描述164
6.4 代碼清單6-1:io_imx_expander.c167
6.5 io_imx_expander.ko演示170
6.6 sysfs文件系統(tǒng)171
6.7 實(shí)驗(yàn)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處理器的設(shè)備樹(shù)177
6.7.5 SAMA5D2處理器的設(shè)備樹(shù)178
6.7.6 BCM2837處理器的設(shè)備樹(shù)180
6.7.7 ACPI和設(shè)備樹(shù)的統(tǒng)一設(shè)備屬性接口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章 處理設(shè)備驅(qū)動(dòng)中的中斷194
7.1 GPIO控制器在Linux內(nèi)核的中斷域196
7.2 設(shè)備樹(shù)中斷處理203
7.3 在Linux設(shè)備驅(qū)動(dòng)中申請(qǐng)中斷206
7.4 實(shí)驗(yàn)7-1:“按鈕中斷設(shè)備”模塊207
7.4.1 i.MX7D處理器的硬件描述208
7.4.2 SAMA5D2處理器的硬件描述208
7.4.3 BCM2837處理器的硬件描述208
7.4.4 i.MX7D 處理器的設(shè)備樹(shù)208
7.4.5 SAMA5D2 處理器的設(shè)備樹(shù)209
7.4.6 BCM2837 處理器的設(shè)備樹(shù)210
7.4.7 “按鈕中斷設(shè)備”模塊的代碼描述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 定時(shí)器218
7.7.4 線程化的中斷221
7.7.5 工作隊(duì)列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 實(shí)驗(yàn)7-2:“睡眠設(shè)備”模塊229
7.10.1 i.MX7D處理器的設(shè)備樹(shù)230
7.10.2 SAMA5D2處理器的設(shè)備樹(shù)231
7.10.3 BCM2837處理器的設(shè)備樹(shù)232
7.10.4 “睡眠設(shè)備”模塊的代碼描述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 實(shí)驗(yàn)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 處理器的設(shè)備樹(shù)242
7.14.5 SAMA5D2處理器的設(shè)備樹(shù)245
7.14.6 BCM2837處理器的設(shè)備樹(shù)247
7.14.7 “keyled類”模塊的代碼描述249
7.15 代碼清單7-3:keyled_imx_class.c255
7.16 keyled_imx_class.ko演示264
第8章 在Linux驅(qū)動(dòng)中分配內(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 頁(yè)面分配器275
8.5.2 頁(yè)面分配器接口275
8.5.3 SLAB分配器276
8.5.4 SLAB分配器接口278
8.5.5 kmalloc內(nèi)存分配器279
8.6 實(shí)驗(yàn)8-1:“鏈表內(nèi)存分配”模塊280
8.7 代碼清單8-1:linkedlist_imx_platform.c283
8.8 linkedlist_imx_platform.ko演示287
第9章 在Linux設(shè)備驅(qū)動(dòng)中使用DMA288
9.1 緩存一致性288
9.2 Linux DMA引擎API289
9.3 實(shí)驗(yàn)9-1:“流式DMA”模塊295
9.4 代碼清單9-dma_imx_m2m.c302
9.5 sdma_imx_m2m.ko演示 306
9.6 DMA分散/聚集映射306
9.7 實(shí)驗(yàn)9-2:“分散/聚集DMA設(shè)備”模塊 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 實(shí)驗(yàn)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)設(shè)備驅(qū)動(dòng)框架325
10.1 輸入子系統(tǒng)驅(qū)動(dòng)程序326
10.2 實(shí)驗(yàn)10-1:“輸入子系統(tǒng)加速度計(jì)”模塊327
10.2.1 設(shè)備樹(shù)329
10.2.2 使用I2C交互的輸入框架330
10.2.3 使用輸入設(shè)備的輸入框架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 編寫(xiě)SPI從設(shè)備驅(qū)動(dòng)程序 342
10.7.1 注冊(cè)SPI從設(shè)備驅(qū)動(dòng)程序 342
10.7.2 在設(shè)備樹(shù)中聲明SPI設(shè)備343
10.8 實(shí)驗(yàn)10-2:“SPI加速度計(jì)輸入設(shè)備”模塊346
10.8.1 i.MX7D 處理器的硬件描述347
10.8.2 SAMA5D2處理器的硬件描述 347
10.8.3 BCM2837處理器的硬件描述 348
10.8.4 i.MX7D處理器的設(shè)備樹(shù)348
10.8.5 SAMA5D2處理器的設(shè)備樹(shù) 349
10.8.6 BCM2837處理器的設(shè)備樹(shù)