本教程是面向嵌入式Linux學(xué)習(xí)和產(chǎn)品開發(fā)的入門教程,分上下兩冊。本書為下冊,分3篇,共16章,內(nèi)容涵蓋Linux內(nèi)核、設(shè)備驅(qū)動、系統(tǒng)整合和產(chǎn)品化等方面。其中,設(shè)備驅(qū)動部分是重點(diǎn)內(nèi)容,從模塊編寫開始,深入淺出地講述了驅(qū)動編寫的各個方面;之后以Linux子系統(tǒng)為單位,分別講述了各常用外設(shè)的驅(qū)動編寫或移植,如LED、GPIO、I2C、SPI、Input子系統(tǒng)、串口、聲卡、WiFi網(wǎng)卡和3G模塊等。
本 書由淺入深,結(jié)構(gòu)合理,實用性強(qiáng),提供的范例稍加改動即可應(yīng)用于實際項目。閱讀本書需要有一定Linux使用基礎(chǔ),適合于準(zhǔn)備往驅(qū)動方向發(fā)展的嵌入式Linux開發(fā)工程師,也可作為高校非計算機(jī)專業(yè)高年級學(xué)生學(xué)習(xí)嵌入式Linux驅(qū)動的參考教材。
第1篇 嵌入式Linux內(nèi)核驅(qū)動開發(fā)
第1章 Linux內(nèi)核裁剪和定制………………………………………………………… 3
1.1 Linux內(nèi)核開發(fā)簡介…………………………………………………………… 3
1.2 Linux源碼閱讀工具…………………………………………………………… 3
1.2.1 SourceInsight……………………………………………………………… 4
1.2.2 Eclipse ……………………………………………………………………… 6
1.2.3 Vim+ctags+cscope ……………………………………………………… 8
1.2.4 LXR ………………………………………………………………………… 8
1.3 Linux內(nèi)核源碼………………………………………………………………… 10
1.3.1 目錄樹概覽………………………………………………………………… 10
1.3.2 快速確定主板關(guān)聯(lián)代碼…………………………………………………… 12
1.4 Linux內(nèi)核中的Makefile文件………………………………………………… 14
1.4.1 頂層Makefile …………………………………………………………… 15
1.4.2 子目錄的Makefile ……………………………………………………… 16
1.5 Linux內(nèi)核中的Kconfig文件………………………………………………… 17
1.5.1 Kconfig基本語法………………………………………………………… 17
1.5.2 配置項和配置開關(guān)………………………………………………………… 20
1.6 配置和編譯Linux內(nèi)核……………………………………………………… 21
1.6.1 快速配置內(nèi)核……………………………………………………………… 21
1.6.2 內(nèi)核配置詳情……………………………………………………………… 23
1.6.3 編譯內(nèi)核…………………………………………………………………… 32
1.6.4 運(yùn)行內(nèi)核…………………………………………………………………… 37
1.7 Linux內(nèi)核裁剪實例…………………………………………………………… 38
1.7.1 GPIO子系統(tǒng)配置………………………………………………………… 38
1.7.2 LED子系統(tǒng)配置………………………………………………………… 39
1.7.3 串口配置…………………………………………………………………… 40
1.7.4 USBHost驅(qū)動配置……………………………………………………… 40
1.7.5 USBGadget驅(qū)動配置…………………………………………………… 42
1.7.6 SD/MMC驅(qū)動配置……………………………………………………… 43
1.7.7 網(wǎng)卡驅(qū)動配置……………………………………………………………… 44
1.7.8 NFSClient配置………………………………………………………… 45
1.7.9 PPP撥號配置…………………………………………………………… 45
1.7.10 MTD配置……………………………………………………………… 46
1.7.11 UBIFS文件系統(tǒng)配置…………………………………………………… 47
1.7.12 CAN 驅(qū)動配置…………………………………………………………… 47
1.8 EPC-28x平臺內(nèi)核快速編譯………………………………………………… 48
第2章 Linux設(shè)備驅(qū)動基礎(chǔ)………………………………………………………… 49
2.1 Linux內(nèi)核模塊………………………………………………………………… 49
2.1.1 Linux和模塊……………………………………………………………… 49
2.1.2 編寫內(nèi)核模塊……………………………………………………………… 49
2.1.3 最簡單的內(nèi)核模塊………………………………………………………… 53
2.1.4 帶參數(shù)的內(nèi)核模塊………………………………………………………… 54
2.2 Linux設(shè)備……………………………………………………………………… 56
2.2.1 Linux設(shè)備和分類………………………………………………………… 56
2.2.2 設(shè)備節(jié)點(diǎn)和設(shè)備號………………………………………………………… 56
2.2.3 設(shè)備的注冊和注銷………………………………………………………… 60
2.3 Linux設(shè)備和驅(qū)動……………………………………………………………… 62
2.3.1 驅(qū)動在Linux中的地位………………………………………………… 62
2.3.2 驅(qū)動的基本要素…………………………………………………………… 62
2.3.3 驅(qū)動和應(yīng)用程序的差別…………………………………………………… 63
2.3.4 驅(qū)動的入口和出口………………………………………………………… 63
2.3.5 支持udev設(shè)備管理方法………………………………………………… 65
2.3.6 設(shè)備驅(qū)動的操作方法……………………………………………………… 70
2.4 字符驅(qū)動框架…………………………………………………………………… 74
2.4.1 字符驅(qū)動框架……………………………………………………………… 74
2.4.2 測試程序…………………………………………………………………… 78
2.5 第一個完整意義上的驅(qū)動……………………………………………………… 80
2.5.1 ioctl命令………………………………………………………………… 80
2.5.2 內(nèi)核空間的ioctl ………………………………………………………… 82
2.5.3 用戶空間的ioctl ………………………………………………………… 82
2.5.4 LED驅(qū)動范例…………………………………………………………… 82
2.6 內(nèi)核/用戶空間的數(shù)據(jù)交換…………………………………………………… 88
2.6.1 檢查地址的合法性………………………………………………………… 88
2.6.2 往用戶空間傳遞數(shù)據(jù)……………………………………………………… 88
2.6.3 從用戶空間獲取數(shù)據(jù)……………………………………………………… 90
2.6.4 支持讀/寫的驅(qū)動范例…………………………………………………… 91
2.7 在驅(qū)動中使用中斷……………………………………………………………… 96
2.7.1 申請和釋放中斷…………………………………………………………… 96
2.7.2 中斷處理程序編寫………………………………………………………… 98
2.7.3 按鍵驅(qū)動…………………………………………………………………… 99
2.8 混雜設(shè)備驅(qū)動編程…………………………………………………………… 103
2.8.1 混雜設(shè)備和驅(qū)動………………………………………………………… 103
2.8.2 混雜設(shè)備驅(qū)動框架……………………………………………………… 104
2.9 I/O內(nèi)存訪問………………………………………………………………… 107
2.9.1 靜態(tài)I/O映射…………………………………………………………… 107
2.9.2 動態(tài)I/O映射…………………………………………………………… 110
2.9.3 I/O內(nèi)存訪問函數(shù)……………………………………………………… 110
2.10 Linux設(shè)備驅(qū)動模型………………………………………………………… 111
2.10.1 設(shè) 備…………………………………………………………………… 111
2.10.2 驅(qū) 動…………………………………………………………………… 113
2.10.3 總 線…………………………………………………………………… 114
2.10.4 類………………………………………………………………………… 115
2.11 平臺設(shè)備和驅(qū)動……………………………………………………………… 117
2.11.1 資 源…………………………………………………………………… 117
2.11.2 平臺設(shè)備………………………………………………………………… 119
2.11.3 平臺驅(qū)動………………………………………………………………… 122
2.11.4 平臺驅(qū)動與普通驅(qū)動的差異…………………………………………… 123
2.11.5 平臺驅(qū)動范例…………………………………………………………… 124
第3章 LED 子系統(tǒng)和驅(qū)動………………………………………………………… 131
3.1 LED子系統(tǒng)驅(qū)動簡介………………………………………………………… 131
3.2 LED子系統(tǒng)的分層結(jié)構(gòu)……………………………………………………… 131
3.3 LED設(shè)備的實現(xiàn)……………………………………………………………… 132
3.4 i.MX28平臺的LED設(shè)備…………………………………………………… 135
第4章 GPIO 驅(qū)動…………………………………………………………………… 138
4.1 GPIOLIB簡介………………………………………………………………… 138
4.2 GPIOLIB的內(nèi)核接口………………………………………………………… 138
4.3 GPIOLIB的實現(xiàn)方法………………………………………………………… 139
4.4 驅(qū)動示例……………………………………………………………………… 141
第5章 輸入子系統(tǒng)和按鍵驅(qū)動……………………………………………………… 149
5.1 輸入子系統(tǒng)…………………………………………………………………… 149
5.1.1 輸入子系統(tǒng)構(gòu)成………………………………………………………… 149
5.1.2 各事件管理器詳解……………………………………………………… 152
5.1.3 設(shè)備驅(qū)動………………………………………………………………… 154
5.2 驅(qū)動實現(xiàn)……………………………………………………………………… 158
5.2.1 電路和原理……………………………………………………………… 158
5.2.2 按鍵驅(qū)動實現(xiàn)…………………………………………………………… 159
第6章 I2C總線和外設(shè)驅(qū)動………………………………………………………… 165
6.1 I2C子系統(tǒng)…………………………………………………………………… 165
6.1.1 I2C子系統(tǒng)的設(shè)計思路………………………………………………… 165
6.1.2 I2C子系統(tǒng)的實現(xiàn)……………………………………………………… 169
6.1.3 I2C子系統(tǒng)在/sys文件系統(tǒng)的信息…………………………………… 176
6.2 I2C驅(qū)動實現(xiàn)示例…………………………………………………………… 177
6.2.1 FM24C02A 驅(qū)動的設(shè)計思路…………………………………………… 177
6.2.2 添加FM24C02A 設(shè)備…………………………………………………… 178
6.2.3 實現(xiàn)FM24C02A 驅(qū)動…………………………………………………… 178
6.2.4 實現(xiàn)I2C驅(qū)動…………………………………………………………… 178
第7章 SPI總線和外設(shè)驅(qū)動………………………………………………………… 185
7.1 硬件連接……………………………………………………………………… 185
7.2 SPI驅(qū)動架構(gòu)簡析…………………………………………………………… 185
7.2.1 SPI核心層……………………………………………………………… 186
7.2.2 SPI主控制器驅(qū)動層…………………………………………………… 186
7.2.3 SPI設(shè)備驅(qū)動層………………………………………………………… 187
7.2.4 SPI數(shù)據(jù)傳輸…………………………………………………………… 191
7.3 SPINORFlash驅(qū)動………………………………………………………… 193
7.3.1 驅(qū)動實現(xiàn)………………………………………………………………… 194
7.3.2 配置和編譯……………………………………………………………… 195
7.3.3 測試塊設(shè)備……………………………………………………………… 196
7.4 SPI數(shù)碼管顯示驅(qū)動………………………………………………………… 197
7.4.1 電路原理………………………………………………………………… 197
7.4.2 驅(qū)動實現(xiàn)………………………………………………………………… 198
7.4.3 驅(qū)動編譯和測試………………………………………………………… 202
第8章 UART和SC16IS752驅(qū)動…………………………………………………… 204
8.1 UART驅(qū)動簡析……………………………………………………………… 204
8.1.1 重要數(shù)據(jù)結(jié)構(gòu)…………………………………………………………… 204
8.1.2 UART驅(qū)動API………………………………………………………… 208
8.2 SC16IS752芯片和電路原理………………………………………………… 210
8.2.1 SC16IS752芯片介紹…………………………………………………… 210
8.2.2 電路原理………………………………………………………………… 212
8.2.3 驅(qū)動移植思路…………………………………………………………… 212
8.3 I2C接口驅(qū)動實現(xiàn)…………………………………………………………… 212
8.3.1 定義i2c_device_id ……………………………………………………… 212
8.3.2 添加注冊I2C設(shè)備……………………………………………………… 213
8.3.3 I2C驅(qū)動實現(xiàn)…………………………………………………………… 214
8.4 UART相關(guān)驅(qū)動……………………………………………………………… 214
8.4.1 信息描述和數(shù)據(jù)結(jié)構(gòu)…………………………………………………… 214
8.4.2 底層操作函數(shù)和實現(xiàn)…………………………………………………… 215
8.4.3 probe函數(shù)和實現(xiàn)……………………………………………………… 219
8.4.4 uart_ops函數(shù)和實現(xiàn)…………………………………………………… 221
8.4.5 中斷處理………………………………………………………………… 230
8.5 串口測試……………………………………………………………………… 234
第9章 SGTL5000聲卡驅(qū)動移植…………………………………………………… 235
9.1 背景交代……………………………………………………………………… 235
9.2 電路原理圖…………………………………………………………………… 235
9.3 驅(qū)動移植……………………………………………………………………… 237
9.3.1 引腳設(shè)置………………………………………………………………… 237
9.3.2 添加SGTL5000I2C設(shè)備……………………………………………… 238
9.3.3 配置和編譯……………………………………………………………… 239
9.3.4 修正播放音頻的問題…………………………………………………… 239
9.4 音頻接口操作………………………………………………………………… 242
第10章 AP6181無線網(wǎng)卡驅(qū)動移植……………………………………………… 247
10.1 硬件原理圖…………………………………………………………………… 247
10.2 驅(qū)動移植……………………………………………………………………… 248
10.2.1 修改引腳功能…………………………………………………………… 248
10.2.2 添加mmc設(shè)備………………………………………………………… 250
10.2.3 添加驅(qū)動源碼…………………………………………………………… 252
10.2.4 添加喚醒中斷…………………………………………………………… 252
10.2.5 添加上下電控制………………………………………………………… 253
10.2.6 修改內(nèi)核配置文件……………………………………………………… 254
10.2.7 配置內(nèi)核………………………………………………………………… 255
10.2.8 編譯內(nèi)核、模塊驅(qū)動…………………………………………………… 256
10.3 使用網(wǎng)卡……………………………………………………………………… 256
10.3.1 加載驅(qū)動模塊…………………………………………………………… 256
10.3.2 連接到AP ……………………………………………………………… 257
第11章 SIM6320-PCIE3G模塊驅(qū)動移植…………………………………………… 260
11.1 驅(qū)動移植……………………………………………………………………… 260
11.1.1 添加驅(qū)動源碼…………………………………………………………… 260
11.1.2 配置內(nèi)核………………………………………………………………… 260
11.2 PPP撥號上網(wǎng)……………………………………………………………… 262
第12章 嵌入式Linux和Bootloader ……………………………………………… 267
第13章 嵌入式Linux文件系統(tǒng)…………………………………………………… 290
第14章 Buildroot …………………………………………………………………… 301
第15章 OpenWRT ………………………………………………………………… 313
第3篇 產(chǎn)品化和創(chuàng)意
第16章 產(chǎn)品化和創(chuàng)意……………………………………………………………… 319
參考文獻(xiàn) ……………………………………………………………………………… 334