第 1章 ARM与CPU 1
1.1 ARM公司 1
1.2 ARM内核与架构 4
1.2.1 ARM内核 4
1.2.2 ARM架构 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授权 17
1.2.8 总结 18
1.3 计算机重要贡献者 18
1.4 CPU架构 22
1.4.1 冯诺依曼架构 22
1.4.2 哈佛架构 23
1.4.3 CPU组成 25
1.5 指令的运行 30
1.6 ARM技术特征 31
1.7 ARM工作模式 32
1.8 ARM寄存器 33
1.8.1 寄存器分类 33
1.8.2 CPSR格式详解 36
1.9 协处理器 37
1.10 Jzelle 38
1.11 指令流水线 39
1.11.1 3级流水线 39
1.11.2 指令对流水线影响 40
第 2章 搭建环境 44
2.1 KEIL安装 44
2.1.1 ARM集成开发环境 44
2.1.2 KEIL、MDK、uVision、ARM之间的关系 45
2.1.3 安装Keil 46
2.1.4 创建第 一个工程 49
2.1.5 编译代码 52
2.1.6 如何debug代码? 53
2.2 GNU编译环境搭建 56
2.2.1 安装VMware Workstation 57
2.2.2 安装ubuntu 62
2.3 交叉编译工具安装 67
第3章 ARM编程 70
3.1 ARM指令格式 71
3.2 数据处理指令 72
3.2.1 MOV指令 72
3.2.2 移位操作 75
3.2.3 CMP指令 76
3.2.4 TST指令 77
3.2.5 算数运算指令 78
3.3 跳转指令 81
3.4 程序状态寄存器访问 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书写风格 108
3.9.1 标号symbol(或label) 108
3.9.2 常数 109
3.9.3 特殊字符和语法 109
3.9.4 语句格式 110
3.9.5 分段 110
3.9.6 定义入口点 112
3.10 伪操作 112
3.10.1 数据定义伪操作 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 杂项伪操作标识符 116
3.10.8 伪指令 118
3.13 GNU代码的编译 119
3.13.1 交叉编译工具 119
3.13.2. 交叉编译工具命名规则 119
3.13.3 代码编译过程 120
3.13.3 编译选项 122
3.13.4 ELF与bin 126
3.13.5 编译举例 127
3.14 ATPCS和AAPCS 132
3.15 内联汇编 135
3.16 C语言和汇编相互调用举例 137
第4章 异常(Exception) 139
4.1 异常基础知识 139
4.2 异常处理 141
4.2.1 异常发生后硬件操作 141
4.2.2 异常向量表 142
4.2.3 保存执行现场 143
4.2.4 异常处理的返回 144
4.2.5 异常恢复 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 如何同时跳转并切换模式? 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驱动编写 157
5.2.1 汇编代码 157
5.2.2 c语言实现 158
5.2.3 烧写代码 161
第6章 PWM 162
6.1 PWM基础知识 162
6.2 Exynos 4412 PWM 164
6.2.1 Exynos 4412 PWM特性 165
6.2.2 PWM工作步骤 166
6.3 蜂鸣器驱动编写 167
6.3.1 参考电路 167
6.3.2 寄存器 168
6.3.3 代码实现 172
第7章 中断、key 173
7.1 GIC 173
7.1.1 分发器 174
7.1.2 CPU接口 176
7.1.3 中断分类 176
7.1.4 中断处理 179
7.2 key驱动编写 180
7.2.1 电路图 180
7.2.2 配置按键为中断触发方式 181
7.2.3 寄存器 183
7.2.4 代码实现 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内部功能模块 197
8.2.3 时钟源 200
8.4 驱动编写 200
8.4.1 参考电路 200
8.4.2 UART寄存器 202
8.4.3 代码实现 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 代码实现 219
第 10章 看门狗 222
10.1 Exynos 4412 看门狗 222
10.1.1 看门狗定时器模块图 223
10.1.2 工作原理 223
10.2 驱动编写 224
10.2.1 看门狗软件程序设计流程 224
10.2.2 看门狗寄存器 224
10.2.3 代码实现 226
第 11章 ADC 227
11.1 信号基础知识 228
11.1.1 信号分类 228
11.1.2 数字信号优点 229
11.1.4 PCM脉冲编码调制 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转换的转换时间计算 236
11.3 驱动编写 236
11.3.1 参考电路 236
11.3.2 代码实例 238
第 12章 I2C 241
12.1 I2C协议 241
12.1.1 开始和停止条件 241
12.1.2 数据有效性 243
12.1.3 数据传输格式 243
12.1.4 数据传输格式 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数据读写格式 247
12.2.3 数据读写流程 248
12.2.4 寄存器 252
12.2.5 寄存器使用规则 255
12.3 MPU6050及驱动编写 255
12.3.1 MPU6050 255
12.3.2 参考电路 258
12.3.3 MPU6050内部寄存器 259
12.3.4 代码实例: 260
第 13章 SPI 264
13.1 SPI基础知识 264
13.1.1 SPI特点 264
13.1.2 极性和相位 268
13.1.3 采样波形 268
13.1.4 如何设置极性和相位 270
13.1.5 数据交换(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 收发数据流程 282
13.4 MCP2515 283
13.4.1 MCP2515简介 283
13.4.2 MCP2515特性 283
13.4.3 结构框图 284
13.4.4 SPI 协议模块 285
13.4.5 SPI 指令集 285
13.4.6 CAN初始化 289
13.4.7 CAN缓冲区 296
13.4.8 数据发送 296
13.4.9 CAN数据的接收 298
17.6.7 MCP2515驱动实现 300
第 14章 U-Boot 304
14.1 Bootloader 304
14.1.1 概念 304
14.1.2 分类 305
14.1.3 Bootloader对不同CPU架构支持 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硬件驱动移植 321
14.4.1 实现串口输出 321
14.4.2 网卡驱动移植 322
14.4.3 FLASH移植 (EMMC) 325
14.5 SD卡制作 331
14.5.1 编写脚本 331
14.5.2 sd卡制作 334
14.5.3 通过sd卡启动烧写U-Boot 334
14.5.4 网络烧写U-Boot 336
第 15章、U-Boot代码启动分析 337
15.1 内核启动流程概述 337
15.1.1 U-boot启动加载linux内核一般流程 337
15.1.2 Exynos 4412内存布局 339
15.1.3 Booting Sequence 340
15.1.4 SD卡镜像布局 342
15.1.5 lds文件 343
15.2 U-Boot启动流程代码详解 344
15.2.1 U-Boot启动代码流程 344
15.2.2 U-Boot启动详解 346
15.3 U-Boot启动的几个关键问题 364
第 16章 网卡DM9000x 365
16.1 网卡概述 365
16.2 DM9000AE 366
16.2.1 DM9000AE概述 366
16.2.2 模块图 367
16.2.3 引脚说明 368
16.2.4 DM9000AE内部寄存器 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驱动分析 392
16.4.1 网卡注册 392
16.4.2 网卡注册代码分析 394
16.4.5 网卡的初始化 398
16.4.6 数据的发送 402
16.4.7 数据的接收 404
16.4.4 网卡注销 406
16.5 U-Boot中网络协议栈 407
16.5.1 网络协议栈架构 407
16.5.2 DNS协议详解 408
第 17章 关于汇编的两点补充 420
17.1 为什么使用结构体效率会高? 420
17.1.1 定义多个全局变量 420
17.1.2 使用结构体 423
17.1.3 literal pool 424
17.1.4 继续优化 425
17.2 位置无关码 426
17.2.1 为什么需要位置无关码? 426
17.2.2 如何编写位置无关码 427
17.2.3 举例 427
17.2.4 总结 431
17.2.5 思考题 432
展开