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