本書主要介紹ARM開發(fā)的相關(guān)知識(shí),詳細(xì)講解常用的ARM指令及如何基于ARM架構(gòu)的外設(shè)編寫驅(qū)動(dòng)程序,并分析了開源軟件U-Boot的啟動(dòng)源代碼和網(wǎng)絡(luò)協(xié)議棧。
本書第1~4章為基礎(chǔ)篇,主要介紹CPU與ARM、搭建環(huán)境、ARM編程、異常等;第5~13章為編程篇,主要介紹基于Exynos 4412的常用外設(shè)的工作原理及驅(qū)動(dòng)程序編寫等;第14~17章為應(yīng)用篇,主要介紹開源軟件U-Boot的使用及啟動(dòng)程序,并分析網(wǎng)卡DM9000AE的驅(qū)動(dòng)和網(wǎng)絡(luò)協(xié)議棧;以及關(guān)于匯編的兩點(diǎn)補(bǔ)充。
本書適合從事嵌入式開發(fā)的工程師和有一定計(jì)算機(jī)基礎(chǔ)和C語言編程經(jīng)驗(yàn)的初學(xué)者學(xué)習(xí)參考。
1.循序漸進(jìn),由淺入深:本書從開發(fā)環(huán)境的安裝和配置及ARM基本指令等相關(guān)基礎(chǔ)知識(shí)開始講解,再詳細(xì)說明硬件的功能原理,最后介紹U-Boot的使用及啟動(dòng)程序,使讀者將ARM相關(guān)知識(shí)點(diǎn)融會(huì)貫通。
2.實(shí)例豐富,內(nèi)容翔實(shí):包含大量匯編實(shí)例,且所有匯編指令都在KEIL軟件中測試過;硬件裸機(jī)驅(qū)動(dòng)源程序均在開發(fā)板上調(diào)試過,并有詳細(xì)的分析注解;U-Boot的啟動(dòng)源程序和U-Boot中的網(wǎng)絡(luò)協(xié)議棧也有詳細(xì)的程序注解,結(jié)合硬件原理圖、用戶手冊說明硬件功能原理,逐個(gè)分析9種硬件驅(qū)動(dòng)編程方法,方便讀者復(fù)現(xiàn)實(shí)例并進(jìn)行學(xué)以致用。
3.提供配套電子資源:本書提供了配套的安裝工具、源程序、PPT課件等電子資源,方便讀者學(xué)習(xí)和使用。
4.作者團(tuán)隊(duì)專業(yè):本書作者團(tuán)隊(duì)具有嵌入式軟件開發(fā)多年的經(jīng)驗(yàn)和豐富的計(jì)算機(jī)網(wǎng)絡(luò)、ARM、基于Linux的驅(qū)動(dòng)開發(fā)等專業(yè)技能,得到了廣泛認(rèn)可和好評。
5.參考價(jià)值高:ARM架構(gòu)已成為全球重要的科技公司之一,基于ARM架構(gòu)開發(fā)產(chǎn)品的相關(guān)工作非常熱門,本書介紹的相關(guān)知識(shí)點(diǎn)對于對嵌入式開發(fā)感興趣的人員非常有參考價(jià)值。
彭丹,碩士,“一口Linux”公眾號創(chuàng)始人,南京六九零二科技有限公司高級嵌入式驅(qū)動(dòng)工程師。從事嵌入式軟件開發(fā)工作16年。精通計(jì)算機(jī)網(wǎng)絡(luò)、ARM、基于Linux的驅(qū)動(dòng)開發(fā)。獲得多項(xiàng)科技發(fā)明授權(quán)、多篇軟件文章等。
周海濤,碩士,長期從事網(wǎng)絡(luò)安全和信息化建設(shè)相關(guān)工作,著有多篇論文,江蘇省第六期333高層次人才培養(yǎng)工程培養(yǎng)對象。
第 1章 ARM與CPU 1
1.1 ARM公司 1
1.2 ARM內(nèi)核與架構(gòu) 4
1.2.1 ARM內(nèi)核 4
1.2.2 ARM架構(gòu) 5
1.2.3 指令集 7
1.2.4 ARM處理器分類 9
1.2.5 什么是SoC? 11
1.2.6 Exynos 4412 SCP 15
1.2.7 ARM授權(quán) 17
1.2.8 總結(jié) 18
1.3 計(jì)算機(jī)重要貢獻(xiàn)者 18
1.4 CPU架構(gòu) 22
1.4.1 馮諾依曼架構(gòu) 22
1.4.2 哈佛架構(gòu) 23
1.4.3 CPU組成 25
1.5 指令的運(yùn)行 30
1.6 ARM技術(shù)特征 31
1.7 ARM工作模式 32
1.8 ARM寄存器 33
1.8.1 寄存器分類 33
1.8.2 CPSR格式詳解 36
1.9 協(xié)處理器 37
1.10 Jzelle 38
1.11 指令流水線 39
1.11.1 3級流水線 39
1.11.2 指令對流水線影響 40
第 2章 搭建環(huán)境 44
2.1 KEIL安裝 44
2.1.1 ARM集成開發(fā)環(huán)境 44
2.1.2 KEIL、MDK、uVision、ARM之間的關(guān)系 45
2.1.3 安裝Keil 46
2.1.4 創(chuàng)建第 一個(gè)工程 49
2.1.5 編譯代碼 52
2.1.6 如何debug代碼? 53
2.2 GNU編譯環(huán)境搭建 56
2.2.1 安裝VMware Workstation 57
2.2.2 安裝ubuntu 62
2.3 交叉編譯工具安裝 67
第3章 ARM編程 70
3.1 ARM指令格式 71
3.2 數(shù)據(jù)處理指令 72
3.2.1 MOV指令 72
3.2.2 移位操作 75
3.2.3 CMP指令 76
3.2.4 TST指令 77
3.2.5 算數(shù)運(yùn)算指令 78
3.3 跳轉(zhuǎn)指令 81
3.4 程序狀態(tài)寄存器訪問 84
3.4.1 MRS指令 84
3.4.2 MSR指令 85
3.4.3 舉例 85
3.5 LDR/STR指令 91
3.5.1 LDR指令 91
3.5.2 STR指令 92
3.5.3 LDRB指令 93
3.5.4 LDRH指令 93
3.6 ARM尋址方式 94
3.7 LDREX/STREX指令 103
3.8 MDK與GNU 106
3.9 GNU書寫風(fēng)格 108
3.9.1 標(biāo)號symbol(或label) 108
3.9.2 常數(shù) 109
3.9.3 特殊字符和語法 109
3.9.4 語句格式 110
3.9.5 分段 110
3.9.6 定義入口點(diǎn) 112
3.10 偽操作 112
3.10.1 數(shù)據(jù)定義偽操作 112
3.10.2 .align .end .include .incbin偽操作 113
3.10.3 .rept偽操作 114
3.10.4 macro宏定義 114
3.10.5 .if偽操作 115
3.10.6 .global/.type/.title/.list偽操作 115
3.10.7 雜項(xiàng)偽操作標(biāo)識(shí)符 116
3.10.8 偽指令 118
3.13 GNU代碼的編譯 119
3.13.1 交叉編譯工具 119
3.13.2. 交叉編譯工具命名規(guī)則 119
3.13.3 代碼編譯過程 120
3.13.3 編譯選項(xiàng) 122
3.13.4 ELF與bin 126
3.13.5 編譯舉例 127
3.14 ATPCS和AAPCS 132
3.15 內(nèi)聯(lián)匯編 135
3.16 C語言和匯編相互調(diào)用舉例 137
第4章 異常(Exception) 139
4.1 異;A(chǔ)知識(shí) 139
4.2 異常處理 141
4.2.1 異常發(fā)生后硬件操作 141
4.2.2 異常向量表 142
4.2.3 保存執(zhí)行現(xiàn)場 143
4.2.4 異常處理的返回 144
4.2.5 異;謴(fù) 146
4.3 IRQ中斷異常 146
4.3.1 中斷概念 146
4.3.2 中斷處理流程 147
4.4 軟中斷 148
4.4.1 SWI指令 148
4.4.2 BKPT指令 148
4.4.3 舉例 149
4.4.4 如何同時(shí)跳轉(zhuǎn)并切換模式? 151
4.4.5 如何獲取中斷號? 151
第5章 GPIO及LED 152
5.1 GPIO 153
5.1.1 Exynos 4412 GPIO特性 153
5.1.2 LED燈電路圖 154
5.1.3 如何操作GPIO? 155
5.2 LED驅(qū)動(dòng)編寫 157
5.2.1 匯編代碼 157
5.2.2 c語言實(shí)現(xiàn) 158
5.2.3 燒寫代碼 161
第6章 PWM 162
6.1 PWM基礎(chǔ)知識(shí) 162
6.2 Exynos 4412 PWM 164
6.2.1 Exynos 4412 PWM特性 165
6.2.2 PWM工作步驟 166
6.3 蜂鳴器驅(qū)動(dòng)編寫 167
6.3.1 參考電路 167
6.3.2 寄存器 168
6.3.3 代碼實(shí)現(xiàn) 172
第7章 中斷、key 173
7.1 GIC 173
7.1.1 分發(fā)器 174
7.1.2 CPU接口 176
7.1.3 中斷分類 176
7.1.4 中斷處理 179
7.2 key驅(qū)動(dòng)編寫 180
7.2.1 電路圖 180
7.2.2 配置按鍵為中斷觸發(fā)方式 181
7.2.3 寄存器 183
7.2.4 代碼實(shí)現(xiàn) 188
7.3 輪詢方式 190
第8章 UART 192
8.1 UART概述 192
8.1.1 UART通信方式 192
8.1.2 UART幀格式 195
8.2 Exynos 4412 UART控制器 196
8.2.1 UART特性 197
8.2.2 UART內(nèi)部功能模塊 197
8.2.3 時(shí)鐘源 200
8.4 驅(qū)動(dòng)編寫 200
8.4.1 參考電路 200
8.4.2 UART寄存器 202
8.4.3 代碼實(shí)現(xiàn) 206
8.5 移植printf() 209
第9章 RTC詳解 209
9.1 Exynos 4412 RTC 210
9.1.1 Exynos 4412 RTC特性 210
9.1.2 RTC Block 210
9.1.3 備用電池 211
9.1.4 晶振 211
9.2 RTC寄存器 212
9.3 RTC操作 214
9.4 代碼實(shí)現(xiàn) 219
第 10章 看門狗 222
10.1 Exynos 4412 看門狗 222
10.1.1 看門狗定時(shí)器模塊圖 223
10.1.2 工作原理 223
10.2 驅(qū)動(dòng)編寫 224
10.2.1 看門狗軟件程序設(shè)計(jì)流程 224
10.2.2 看門狗寄存器 224
10.2.3 代碼實(shí)現(xiàn) 226
第 11章 ADC 227
11.1 信號基礎(chǔ)知識(shí) 228
11.1.1 信號分類 228
11.1.2 數(shù)字信號優(yōu)點(diǎn) 229
11.1.4 PCM脈沖編碼調(diào)制 229
11.2 Exynos 4412 ADC控制器 231
11.2.1 Exynos 4412 ADC控制器特性 231
11.2.2 寄存器 232
11.2.3 Combiner中斷控制器 234
11.2.4 A/D轉(zhuǎn)換的轉(zhuǎn)換時(shí)間計(jì)算 236
11.3 驅(qū)動(dòng)編寫 236
11.3.1 參考電路 236
11.3.2 代碼實(shí)例 238
第 12章 I2C 241
12.1 I2C協(xié)議 241
12.1.1 開始和停止條件 241
12.1.2 數(shù)據(jù)有效性 243
12.1.3 數(shù)據(jù)傳輸格式 243
12.1.4 數(shù)據(jù)傳輸格式 245
12.2 Exynos 4412 I2C控制器 245
12.2.1 Exynos 4412 I2C控制器綜述 245
12.2.2 Exynos 4412 I2C總線接口特性 246
12.2.3 I2C數(shù)據(jù)讀寫格式 247
12.2.3 數(shù)據(jù)讀寫流程 248
12.2.4 寄存器 252
12.2.5 寄存器使用規(guī)則 255
12.3 MPU6050及驅(qū)動(dòng)編寫 255
12.3.1 MPU6050 255
12.3.2 參考電路 258
12.3.3 MPU6050內(nèi)部寄存器 259
12.3.4 代碼實(shí)例: 260
第 13章 SPI 264
13.1 SPI基礎(chǔ)知識(shí) 264
13.1.1 SPI特點(diǎn) 264
13.1.2 極性和相位 268
13.1.3 采樣波形 268
13.1.4 如何設(shè)置極性和相位 270
13.1.5 數(shù)據(jù)交換(Data Exchanges) 271
13.2 Exynos 4412 SPI控制器 272
13.3 SPI操作 274
13.3.1 參考電路 274
13.3.2 寄存器 275
13.3.3 SPI初始化流程 278
13.3.4 收發(fā)數(shù)據(jù)流程 282
13.4 MCP2515 283
13.4.1 MCP2515簡介 283
13.4.2 MCP2515特性 283
13.4.3 結(jié)構(gòu)框圖 284
13.4.4 SPI 協(xié)議模塊 285
13.4.5 SPI 指令集 285
13.4.6 CAN初始化 289
13.4.7 CAN緩沖區(qū) 296
13.4.8 數(shù)據(jù)發(fā)送 296
13.4.9 CAN數(shù)據(jù)的接收 298
17.6.7 MCP2515驅(qū)動(dòng)實(shí)現(xiàn) 300
第 14章 U-Boot 304
14.1 Bootloader 304
14.1.1 概念 304
14.1.2 分類 305
14.1.3 Bootloader對不同CPU架構(gòu)支持 306
14.2 U-Boot概述 307
14.2.1 U-Boot概念 307
14.2.2 U-Boot的特性 307
14.2.3 工作模式 308
14.2.4 U-Boot常用命令 309
14.2.5 配置舉例 312
14.3 U-Boot移植步驟 313
14.3.1 U-Boot源碼簡介 313
14.3.2 U-boot源碼配置 316
14.3.3 U-Boot源碼編譯 319
14.4 U-Boot硬件驅(qū)動(dòng)移植 321
14.4.1 實(shí)現(xiàn)串口輸出 321
14.4.2 網(wǎng)卡驅(qū)動(dòng)移植 322
14.4.3 FLASH移植 (EMMC) 325
14.5 SD卡制作 331
14.5.1 編寫腳本 331
14.5.2 sd卡制作 334
14.5.3 通過sd卡啟動(dòng)燒寫U-Boot 334
14.5.4 網(wǎng)絡(luò)燒寫U-Boot 336
第 15章、U-Boot代碼啟動(dòng)分析 337
15.1 內(nèi)核啟動(dòng)流程概述 337
15.1.1 U-boot啟動(dòng)加載linux內(nèi)核一般流程 337
15.1.2 Exynos 4412內(nèi)存布局 339
15.1.3 Booting Sequence 340
15.1.4 SD卡鏡像布局 342
15.1.5 lds文件 343
15.2 U-Boot啟動(dòng)流程代碼詳解 344
15.2.1 U-Boot啟動(dòng)代碼流程 344
15.2.2 U-Boot啟動(dòng)詳解 346
15.3 U-Boot啟動(dòng)的幾個(gè)關(guān)鍵問題 364
第 16章 網(wǎng)卡DM9000x 365
16.1 網(wǎng)卡概述 365
16.2 DM9000AE 366
16.2.1 DM9000AE概述 366
16.2.2 模塊圖 367
16.2.3 引腳說明 368
16.2.4 DM9000AE內(nèi)部寄存器 372
16.3 SROM 控制器 378
16.3.1 概念 378
16.3.2 寄存器SROM_BW、SROM_BC1 378
16.3.3 配置為SROM模式 383
16.3.4 SROM初始化 388
16.4 DM9000AE驅(qū)動(dòng)分析 392
16.4.1 網(wǎng)卡注冊 392
16.4.2 網(wǎng)卡注冊代碼分析 394
16.4.5 網(wǎng)卡的初始化 398
16.4.6 數(shù)據(jù)的發(fā)送 402
16.4.7 數(shù)據(jù)的接收 404
16.4.4 網(wǎng)卡注銷 406
16.5 U-Boot中網(wǎng)絡(luò)協(xié)議棧 407
16.5.1 網(wǎng)絡(luò)協(xié)議棧架構(gòu) 407
16.5.2 DNS協(xié)議詳解 408
第 17章 關(guān)于匯編的兩點(diǎn)補(bǔ)充 420
17.1 為什么使用結(jié)構(gòu)體效率會(huì)高? 420
17.1.1 定義多個(gè)全局變量 420
17.1.2 使用結(jié)構(gòu)體 423
17.1.3 literal pool 424
17.1.4 繼續(xù)優(yōu)化 425
17.2 位置無關(guān)碼 426
17.2.1 為什么需要位置無關(guān)碼? 426
17.2.2 如何編寫位置無關(guān)碼 427
17.2.3 舉例 427
17.2.4 總結(jié) 431
17.2.5 思考題 432