第1章 嵌入式系统概述 1
1.1 嵌入式系统简介 1
1.1.1 嵌入式系统 1
1.1.2 嵌入式系统的特点 2
1.1.3 嵌入式系统的发展趋势 2
1.2 嵌入式系统中的处理器 4
1.2.1 微处理器 4
1.2.2 微控制器 4
1.2.3 数字信号处理器 5
1.2.4 嵌入式片上系统 5
1.3 嵌入式系统中的软件系统 5
1.3.1 嵌入式系统中的软件系统 5
1.3.2 嵌入式系统软件开发的一般过程 6
1.3.3 嵌入式应用程序的开发 6
1.4 本章小结 6
第2章 快速体验——目标板 7
2.1 目标板结构 7
2.2 ARM初体验 8
2.2.1 测试ARM处理器 8
2.2.2 安装ADS 1.2 9
2.2.3 安装Multi-ICE和配置AXD 10
2.2.4 ADS的简单使用 12
2.2.5 使用Telnet和ftp 15
2.3 本章小结 16
第3章 ARM的内部资源 17
3.1 S3C2440微处理器 17
3.1.1 主要结构 17
3.1.2 片内资源 18
3.1.3 体系结构 18
3.2 S3C2440存储器映射 18
3.2.1 bank0总线宽度 18
3.2.2 nWAIT引脚的作用 19
3.2.3 nXBREQ/nXBACK引脚操作 19
3.3 S3C2440内部资源详解 20
3.3.1 Cache高速缓存 20
3.3.2 时钟和电源管理 20
3.3.3 中断控制器 22
3.3.4 脉冲带宽调制定时器(PWM) 23
3.3.5 实时时钟(RTC) 23
3.3.6 通用I/O端口 24
3.3.7 LCD控制器 24
3.3.8 UART控制器 25
3.3.9 A/D转换和触摸屏接口 25
3.3.10 看门狗定时器 26
3.3.11 IIC总线接口 26
3.3.12 AC97音频解码器接口 27
3.3.13 USB设备控制器 27
3.3.14 SD接口 27
3.3.15 SPI接口 28
3.3.16 相机接口 28
3.3.17 工作电压 29
3.4 本章小结 29
第4章 熟悉ARM处理器 30
4.1 为什么用ARM 30
4.2 ARM公司简介 30
4.3 ARM微处理器系列 30
4.3.1 ARM7微处理器 30
4.3.2 ARM9微处理器 31
4.3.3 ARM10微处理器 31
4.3.4 ARM11微处理器 32
4.4 ARM微处理器的结构 32
4.4.1 体系结构 32
4.4.2 寄存器结构 33
4.4.3 指令结构 33
4.5 ARM微处理器的选择 33
4.5.1 内核的选择 33
4.5.2 工作频率的选择 33
4.5.3 芯片内存储器的选择 33
4.5.4 片内外围电路的选择 34
4.6 ARM的指令集概述 34
4.6.1 ARM微处理器的指令分类和格式 34
4.6.2 指令的条件域 35
4.7 ARM指令的寻址方式 36
4.7.1 立即寻址 36
4.7.2 寄存器寻址 36
4.7.3 寄存器间接寻址 36
4.7.4 基址变址寻址 36
4.7.5 多寄存器寻址 37
4.7.6 相对寻址 37
4.7.7 堆栈寻址 37
4.8 ARM指令集详解 37
4.8.1 跳转指令 38
4.8.2 数据处理指令 38
4.8.3 乘法指令与乘加指令 42
4.8.4 程序状态寄存器访问指令 44
4.8.5 加载/存储指令 45
4.8.6 批量数据加载/存储指令 47
4.8.7 数据交换指令 47
4.8.8 移位指令 48
4.8.9 协处理器指令 49
4.8.10 异常产生指令 51
4.9 本章小结 51
第5章 熟悉ADS集成开发环境 52
5.1 命令行开发工具 52
5.1.1 armcc介绍 52
5.1.2 armcc用法详解 53
5.1.3 armlink介绍 54
5.1.4 armlink用法详解 54
5.1.5 ARM运行时库 54
5.1.6 CodeWarrior集成开发环境 55
5.1.7 ADS调试器 56
5.1.8 实用程序 57
5.1.9 支持的软件 57
5.2 使用ADS创建工程 57
5.2.1 建立一个工程 58
5.2.2 编译和链接工程 60
5.2.3 target设置选项 60
5.2.4 Language Settings 61
5.2.5 Linker设置 62
5.2.6 ARM fromELF工具 63
5.2.7 命令行下编译工程 64
5.3 使用AXD调试代码 65
5.3.1 打开调试文件 65
5.3.2 查看存储器内容 65
5.3.3 设置断点 66
5.3.4 查看变量值 67
5.4 本章小结 67
第6章 ARM的外部电路 68
6.1 核心板电路 68
6.1.1 晶振电路 68
6.1.2 复位电路 69
6.1.3 启动配置电路 69
6.1.4 FLASH接口 69
6.1.5 SDRAM接口 70
6.2 底板电路 73
6.2.1 电源电路 73
6.2.2 串口电路 74
6.2.3 USB接口 74
6.2.4 以太网接口 76
6.2.5 JTAG调试接口 76
6.2.6 音频接口 76
6.2.7 LCD接口 77
6.2.8 SD卡接口 78
6.3 本章小结 79
第7章 嵌入式操作系统概述 80
7.1 操作系统的结构和功能 80
7.2 进程管理 81
7.2.1 进程的描述 82
7.2.2 进程的调度 82
7.3 存储管理 83
7.3.1 存储器的体系结构 83
7.3.2 内存管理的基本概念 84
7.3.3 连续分配存储管理方式 84
7.3.4 页式存储管理方式 86
7.4 文件管理 87
7.4.1 文件 88
7.4.2 目录 89
7.4.3 EXT2文件系统 89
7.5 设备管理 92
7.5.1 设备的分类 92
7.5.2 数据传输控制方式 93
7.5.3 中断处理 93
7.5.4 设备驱动程序 94
7.6 嵌入式操作系统的特点 95
7.6.1 嵌入式操作系统的发展 95
7.6.2 嵌入式操作系统的优势 96
7.6.3 嵌入式操作系统的分类 96
7.7 常见的嵌入式操作系统 97
7.7.1 VxWorks 97
7.7.2 pSOS 97
7.7.3 Palm OS 98
7.7.4 QNX 98
7.7.5 Windows CE 99
7.7.6 μC/OS-Ⅱ 100
7.7.7 嵌入式Linux 100
7.8 本章小结 101
第8章 快速体验——构建开发环境 102
8.1 交叉开发环境介绍 102
8.2 主机与目标板的连接方式 103
8.2.1 串口通信接口 103
8.2.2 以太网接口 104
8.2.3 USB接口 104
8.2.4 JTAG接口 105
8.3 建立主机开发环境 105
8.3.1 Ubuntu 6.06的安装 105
8.3.2 Minicom的安装配置 107
8.3.3 Tftp服务的安装配置 109
8.3.4 NFS的安装配置 110
8.3.5 建立交叉工具链 112
8.4 启动目标板系统 116
8.4.1 Bootloader和Kernel 117
8.4.2 根文件系统 118
8.5 本章小结 119
第9章 Linux使用基础 120
9.1 Linux的基本概念 120
9.1.1 文件 120
9.1.2 目录 120
9.1.3 分区 121
9.1.4 挂载 122
9.1.5 用户系统 122
9.1.6 用户权限 122
9.1.7 shell 123
9.1.8 环境变量 124
9.2 Linux的命令行 124
9.2.1 执行命令 124
9.2.2 参数 125
9.2.3 重定向符号 125
9.2.4 获取帮助 125
9.3 Linux的常用命令 127
9.3.1 文件管理 127
9.3.2 内容管理 130
9.3.3 权限管理 131
9.3.4 备份压缩 132
9.3.5 系统设置 133
9.3.6 进程控制 136
9.3.7 网络设置 138
9.4 本章小结 139
第10章 Boot Loader 140
10.1 Boot Loader的概念 140
10.1.1 Boot Loader所支持的嵌入式体系 141
10.1.2 Boot Loader的安装位置 141
10.1.3 Boot Loader的启动过程 142
10.1.4 Boot Loader与主机的通信 142
10.1.5 Boot Loader的操作模式 142
10.2 Boot Loader的基本结构 143
10.2.1 Boot Loader的stagel 143
10.2.2 Boot Loader的stage2 144
10.3 vivi简介 149
10.3.1 vivi的体系架构 149
10.3.2 vivi启动的第一阶段 150
10.3.3 vivi启动的第二阶段 154
10.4 vivi的基本命令 158
10.4.1 mem命令 158
10.4.2 load命令 159
10.4.3 part命令 159
10.4.4 param命令 160
10.4.5 boot命令 160
10.4.6 go命令 161
10.4.7 bon命令 161
10.4.8 reset命令 161
10.4.9 help命令 162
10.5 U-Boot简介 162
10.5.1 U-Boot的特点 162
10.5.2 U-Boot的目录结构 163
10.5.3 U-Boot的启动过程 163
10.5.4 U-Boot的移植 165
10.6 U-Boot的基本命令 167
10.6.1 设置环境变量 167
10.6.2 数据通信 167
10.6.3 存储器操作 168
10.6.4 系统引导 168
10.6.5 其他 169
10.7 本章小结 169
第11章 Linux内核移植 170
11.1 Linux内核结构 170
11.2 Linux源码结构 171
11.2.1 arch目录 172
11.2.2 drivers目录 172
11.2.3 fs目录 173
11.2.4 其他目录 174
11.3 内核编译 175
11.3.1 编译准备 175
11.3.2 设置flash分区 176
11.3.3 配置内核 178
11.4 内核配置选项 180
11.4.1 常规设置 180
11.4.2 模块和块设备层 182
11.4.3 CPU类型 183
11.4.4 电源管理 185
11.4.5 总线和网络 187
11.4.6 驱动 188
11.4.7 文件系统 195
11.4.8 其他 198
11.5 下载内核 200
11.6 内核调试 201
11.6.1 内核调试步骤 201
11.6.2 常见内核问题 202
11.7 本章小结 203
第12章 嵌入式Linux文件系统 204
12.1 嵌入式文件系统基础 204
12.1.1 NOR型Flash存储器 204
12.1.2 NAND型Flash存储器 205
12.1.3 MTD简介 206
12.1.4 日志型文件系统 207
12.1.5 BusyBox 208
12.2 CramFS文件系统 210
12.2.1 CramFS文件系统的特性 210
12.2.2 CramFS文件系统映像文件的结构 211
12.2.3 CramFS文件系统的工作原理 211
12.2.4 CramFS文件系统的初始化过程 212
12.2.5 CramFS文件系统的制作 213
12.2.6 CramFS文件系统的挂载流程 216
12.3 YAFFS文件系统 216
12.3.1 YAFFS文件系统的数据存储方式 217
12.3.2 YAFFS文件系统的工作原理 218
12.3.3 YAFFS文件系统对MTD的依赖性 219
12.3.4 YAFFS文件系统驱动的安装流程 221
12.3.5 YAFFS文件系统的制作 222
12.4 JFFS文件系统 223
12.4.1 JFFS1文件系统简介 224
12.4.2 JFFS2文件系统简介 225
12.4.3 JFFS3文件系统简介 227
12.4.4 JFFS2文件系统的工作原理 227
12.4.5 JFFS2文件系统的制作 230
12.5 基于RAM的文件系统 231
12.5.1 Ramdisk文件系统 231
12.5.2 RamFS/TmpFS文件系统 232
12.6 嵌入式文件系统的设计 233
12.6.1 文件系统格式选择的基本策略 233
12.6.2 混合型文件系统格式设计方法 234
12.7 本章小结 235
第13章 嵌入式Linux C语言开发工具 236
13.1 编辑器VIM 236
13.1.1 VIM的编辑模式 236
13.1.2 VIM的进入与退出 238
13.1.3 光标的移动 239
13.1.4 删除和恢复 239
13.1.5 复制和粘贴 240
13.1.6 查找和替换 240
13.1.7 网络资源 241
13.2 编译器GCC 242
13.2.1 GCC的编译流程 242
13.2.2 GCC的常用编译选项 245
13.2.3 实例分析 248
13.3 调试器GDB 250
13.3.1 GDB使用概述 250
13.3.2 GDB的使用流程 251
13.3.3 GdbServer远程调试 253
13.4 工程管理Make 255
13.4.1 Makefile文件介绍 255
13.4.2 Makefile的规则 256
13.4.3 Makefile的变量 258
13.4.4 Make命令的使用 260
13.4.5 使用自动工具生成Makefile 261
13.5 集成开发环境Eclipse 263
13.5.1 Eclipse的安装 263
13.5.2 Eclipse的界面简介 264
13.5.3 创建Hello项目 265
13.5.4 调试Hello项目 267
13.5.5 使用CVS进行版本管理 267
13.6 本章小结 271
第14章 快速体验——嵌入式C语言开发流程 272
14.1 命令行下的开发流程 272
14.1.1 编写代码 272
14.1.2 编译程序 274
14.1.3 运行程序 275
14.1.4 交叉编译 275
14.1.5 编写Makefile 276
14.2 基于Eclipse的开发流程 277
14.2.1 下载和安装Eclipse 277
14.2.2 新建工程 278
14.2.3 编写代码 279
14.2.4 编译工程 280
14.2.5 运行程序 281
14.3 本章小结 281
第15章 嵌入式Linux C语言基础 282
15.1 C语言概述 282
15.1.1 C语言的特点 282
15.1.2 C语言程序的总体结构 282
15.1.3 C语言的语句 283
15.1.4 C语言的关键字 284
15.1.5 C语言程序设计步骤 284
15.2 数据类型 284
15.2.1 基本数据类型 284
15.2.2 常量与变量 285
15.2.3 整型数据、实型数据 285
15.2.4 字符型数据 286
15.3 运算符 287
15.3.1 算术运算符 287
15.3.2 关系和逻辑运算符 287
15.3.3 位操作符 288
15.3.4 ?操作符 288
15.3.5 表达式的优先级 288
15.4 表达式 289
15.4.1 类型转换 289
15.4.2 构成符cast和可读性 289
15.5 流程控制 289
15.5.1 格式输入输出 289
15.5.2 顺序程序设计 292
15.5.3 选择结构设计 293
15.5.4 循环结构设计 294
15.6 函数 296
15.6.1 概述 296
15.6.2 函数定义的一般形式 297
15.6.3 函数的参数和函数的值 297
15.6.4 函数的调用 298
15.6.5 局部变量和全局变量 299
15.7 数组、指针 300
15.7.1 数组 300
15.7.2 指针的基本概念 302
15.7.3 指针与数组 304
15.7.4 指针与字符串 306
15.7.5 指针与函数 307
15.7.6 指针其他用法 308
15.7.7 动态内存管理 308
15.8 复杂数据结构 309
15.8.1 结构体定义 309
15.8.2 结构体使用 310
15.8.3 链表 312
15.8.4 枚举类型 313
15.8.5 共用体类型 313
15.9 本章小结 313
第16章 嵌入式Linux C语言标准库 314
16.1 Glibc简介 314
16.2 字符测试和数据转换函数 316
16.2.1 字符测试函数 316
16.2.2 数据转换函数 317
16.3 基本I/O函数 318
16.3.1 open()函数 319
16.3.2 close()函数 320
16.3.3 read()函数和write()函数 320
16.3.4 其他函数 321
16.4 标准I/O函数 322
16.4.1 fopen()函数 322
16.4.2 fclose()函数 323
16.4.3 fread()函数和fwrite()函数 324
16.4.4 printf()函数和scanf()函数 325
16.4.5 其他函数 326
16.5 内存配置及字符串处理函数 326
16.5.1 内存分配函数 327
16.5.2 memXXX函数 327
16.5.3 strXXX函数 330
16.5.4 释放内存的函数 331
16.5.5 动态内存分配的实例 332
16.6 日期时间函数 334
16.6.1 时间的定义 334
16.6.2 日历时间 334
16.6.3 时钟计时单元 336
16.6.4 格式化日期和时间 337
16.6.5 自定义时间格式 337
16.7 其他函数 339
16.7.1 错误处理函数 339
16.7.2 系统日志函数 342
16.7.3 环境管理函数 344
16.8 本章小结 345
第17章 嵌入式Linux的多任务编程 346
17.1 什么是多任务 346
17.1.1 对话级多任务 346
17.1.2 进程级多任务 347
17.1.3 线程级多任务 347
17.1.4 多任务处理的特点 348
17.2 进程 349
17.2.1 进程的概念 350
17.2.2 进程的数据结构 351
17.2.3 进程的创建 353
17.2.4 文件描述符共享 355
17.2.5 vfork()函数 357
17.2.6 exec()函数族 357
17.2.7 执行新程序 359
17.2.8 进程的终止 361
17.2.9 进程的退出状态 363
17.2.10 Zombie进程 365
17.3 线程 366
17.3.1 线程的概念 366
17.3.2 线程的创建 367
17.3.3 线程的终止 368
17.3.4 线程的基本属性 370
17.3.5 线程属性的修改 371
17.3.6 线程的扩展属性 374
17.4 线程池 377
17.4.1 线程池的工作原理 377
17.4.2 线程池的实现 378
17.4.3 工作状态的记录 383
17.4.4 线程池的测试 386
17.5 本章小结 387
第18章 多任务间通信和同步 388
18.1 信号 388
18.1.1 信号的概念 388
18.1.2 信号的产生 390
18.1.3 kill()函数和raise()函数 390
18.1.4 alarm()函数和pause()函数 391
18.1.5 about()函数 392
18.1.6 信号的处理 392
18.1.7 signal()函数 392
18.1.8 sigaction()函数 393
18.1.9 信号集 395
18.1.10 sigprocmask()函数 396
18.1.11 sigpending()函数 396
18.1.12 sigsuspend()函数 396
18.2 管道 398
18.2.1 管道的相关概念 398
18.2.2 管道的创建 398
18.2.3 多进程中的管道通信 400
18.2.4 管道的应用实例 401
18.2.5 FIFO的相关概念 402
18.2.6 FIFO的创建 403
18.2.7 FIFO的读写规则 404
18.2.8 FIFO的应用实例 405
18.3 共享内存 407
18.3.1 系统调用mmap() 408
18.3.2 系统调用munmap() 408
18.3.3 系统调用msync() 409
18.3.4 mmap()的应用实例 409
18.4 System V共享内存 411
18.4.1 系统调用shmget() 411
18.4.2 系统调用shmat() 412
18.4.3 系统调用shmdt() 412
18.4.4 System V共享内存的应用实例 412
18.5 消息队列 413
18.5.1 系统调用msgget() 413
18.5.2 系统调用msgsnd() 414
18.5.3 系统调用msgrcv() 414
18.5.4 系统调用msgctl() 415
18.5.5 消息队列的应用实例 415
18.6 System V信号量 417
18.6.1 系统调用semget() 417
18.6.2 系统调用semop() 418
18.6.3 系统调用semctl() 419
18.6.4 System V信号量的应用实例 419
18.7 POSIX信号量 421
18.7.1 系统调用sem_init() 422
18.7.2 系统调用sem_wait() 422
18.7.3 系统调用sem_post() 422
18.7.4 系统调用sem_destory()函数 422
18.7.5 POSIX信号量的应用实例 422
18.8 互斥锁 424
18.8.1 系统调用pthread_mutex_init() 424
18.8.2 系统调用pthread_mutex_lock() 424
18.8.3 系统调用pthread_mutex_trylock() 424
18.8.4 系统调用pthread_mutex_unlock() 425
18.8.5 系统调用pthread_mutex_destory() 425
18.8.6 互斥锁的应用实例 425
18.9 条件变量 427
18.9.1 系统调用pthread_cond_init() 428
18.9.2 系统调用pthread_cond_wait() 428
18.9.3 系统调用pthread_cond_timedwait() 428
18.9.4 系统调用pthread_cond_signal() 428
18.9.5 系统调用pthread_cond_broadsignal() 428
18.9.6 系统调用pthread_cond_destroy() 428
18.9.7 条件变量的应用实例 429
18.10 本章小结 430
第19章 设备驱动开发基础 431
19.1 Linux设备管理和驱动概述 431
19.1.1 Linux设备的分类 431
19.1.2 设备驱动程序的作用 431
19.1.3 访问设备的实现 432
19.1.4 Linux设备控制方式 432
19.2 Linux设备驱动开发流程 434
19.2.1 构造和运行模块 434
19.2.2 字符设备驱动编写 435
19.2.3 字符设备驱动示例 437
19.2.4 并发控制 440
19.2.5 阻塞与非阻塞 445
19.2.6 select和poll 449
19.2.7 中断处理 451
19.2.8 内存与I/O操作 452
19.3 块设备驱动编写 457
19.3.1 块设备的I/O操作特点 457
19.3.2 block_device_operations结构体 457
19.3.3 gendisk结构体 458
19.3.4 request结构体 459
19.3.5 request操作函数 462
19.3.6 bio结构体 464
19.3.7 注册与注销 466
19.3.8 加载与卸载 466
19.3.9 打开与释放 468
19.3.10 ioctl函数 469
19.3.11 I/O请求处理 469
19.4 本章小结 472
第20章 嵌入式Linux的网络编程 473
20.1 TCP/IP协议 473
20.2 TCP协议 474
20.2.1 TCP连接建立的过程 474
20.2.2 TCP连接的标识 474
20.2.3 关闭TCP连接 475
20.3 UDP协议 475
20.4 socket简介 475
20.4.1 socket的定义 476
20.4.2 socket的类型 476
20.5 TCP Server程序设计 476
20.5.1 TCP的通信过程 476
20.5.2 TCP Server程序 477
20.5.3 网络地址的表示 478
20.5.4 建立socket 479
20.5.5 绑定本地地址 479
20.5.6 字节顺序转换 480
20.5.7 IP地址转换 481
20.5.8 Listen()函数 481
20.5.9 等待连接 482
20.5.10 数据通信 483
20.5.11 关闭套接字 484
20.6 TCP Client程序设计 485
20.6.1 DNS操作 486
20.6.2 连接服务器 487
20.6.3 测试实例 488
20.7 UDP通信的程序设计 489
20.7.1 UDP的通信过程 489
20.7.2 UDP通信服务器端 490
20.7.3 UDP通信客户端 491
20.8 多线程文件服务器 493
20.8.1 文件服务器主程序 493
20.8.2 动态分配监听端口 495
20.8.3 多线程服务器的实现 495
20.8.4 大数据量的读写函数 496
20.8.5 客户端测试例程 499
20.8.6 编译和测试 501
20.9 PROXY源代码分析 501
20.9.1 主函数main() 502
20.9.2 参数处理函数parse_args() 504
20.9.3 守护进程函数daemonize() 505
20.9.4 代理服务函数do_proxy() 507
20.9.5 错误信息函数errorout() 510
20.10 本章小结 510
第21章 MiniGUI图形界面设计 511
21.1 MiniGUI概述 511
21.1.1 MiniGUI的特点 511
21.1.2 MiniGUI v1.3.3软件包 512
21.1.3 MiniGUI运行模式 512
21.2 MiniGUI的安装和使用 514
21.2.1 安装MiniGUI库 514
21.2.2 安装MiniGUI的资源 515
21.2.3 配置MiniGUI 515
21.2.4 编译应用程序例子 516
21.2.5 交叉编译MiniGUI库 516
21.2.6 交叉编译例程 517
21.2.7 QVFB图形引擎 518
21.2.8 FrameBuffer图形引擎 519
21.3 利用Eclipse编写MiniGUI程序 520
21.3.1 建立vacs工程 520
21.3.2 配置编译选项 521
21.3.3 配置外部工具QVFB 522
21.3.4 运行vacs 523
21.3.5 调试vacs 523
21.4 MiniGUI的编程基础 524
21.4.1 头文件 525
21.4.2 程序入口 525
21.4.3 创建和显示主窗口 526
21.4.4 进入消息循环 526
21.4.5 窗口过程函数 528
21.4.6 屏幕输出 528
21.4.7 程序的退出 528
21.5 消息循环和窗口过程 529
21.5.1 消息处理函数 529
21.5.2 重要的消息 530
21.5.3 窗口及窗口过程 530
21.6 对话框和控件编程 531
21.6.1 控件的概念 531
21.6.2 预定义控件 532
21.6.3 自定义控件 534
21.6.4 控件子类化 535
21.6.5 对话框和对话框模板 536
21.6.6 模态和非模态对话框 538
21.7 图形设备接口 539
21.7.1 图形设备上下文 539
21.7.2 矩形操作和区域操作 540
21.7.3 像素值和调色板 542
21.7.4 位图操作函数 543
21.7.5 字体和文本输出 544
21.7.6 绘制图形 546
21.8 其他功能 547
21.8.1 读写配置文件 548
21.8.2 定点数运算 548
21.9 MiniQQ界面设计 549
21.9.1 登录窗口 551
21.9.2 好友列表窗口 554
21.9.3 聊天窗口 558
21.9.4 其他 559
21.10 本章小结 560
第22章 CAN总线驱动设计 561
22.1 CAN总线介绍 561
22.2 SJA1000介绍 561
22.2.1 SJA1000的特性 561
22.2.2 SJA1000内部原理 562
22.2.3 SJA1000管脚说明 563
22.3 SJA1000寄存器介绍 564
22.3.1 控制寄存器CR 564
22.3.2 命令寄存器CMR 565
22.3.3 状态寄存器SR 566
22.3.4 中断寄存器IR 567
22.3.5 发送缓冲器 568
22.3.6 接收缓冲器 568
22.3.7 验收滤波器 569
22.4 SJA1000与S3C2440连接 569
22.5 SJA1000的驱动程序 571
22.5.1 驱动程序源代码 571
22.5.2 测试的操作方法 579
22.6 本章小结 580
第23章 SD卡驱动设计 581
23.1 SD卡概述及协议 581
23.1.1 SD卡概述 581
23.1.2 SD卡协议 582
23.2 SD卡驱动设计 583
23.2.1 块设备驱动设计 583
23.2.2 SD卡驱动程序分析 584
23.2.3 SD卡驱动程序设计 585
23.3 本章小结 588
第24章 网络驱动设计 589
24.1 Linux网络设备概述 589
24.2 DM9000芯片介绍 590
24.3 重要数据结构 591
24.3.1 通用部分 591
24.3.2 硬件相关部分 591
24.3.3 物理层相关数据 592
24.3.4 网络层协议相关部分 592
24.3.5 服务处理部分 593
24.4 网络设备初始化 593
24.5 激活和关闭网络设备 595
24.6 中断控制的实现 596
24.7 发送过程的实现 598
24.8 接收过程的实现 599
24.8.1 sk_buff结构 599
24.8.2 接收函数的实现 601
24.9 其他接口函数 602
24.10 本章小结 602
第25章 综合案例——嵌入式B超 603
25.1 系统终端的结构设计 603
25.1.1 总体结构 603
25.1.2 显示控制芯片选型 604
25.2 系统终端的软件设计 604
25.2.1 U-Boot 604
25.2.2 嵌入式Linux移植 605
25.2.3 MiniGUI移植 605
25.3 FPGA与ARM接口设计 608
25.3.1 硬件连接 608
25.3.2 FPGA驱动程序设计 608
25.4 显示芯片的连接与控制 610
25.4.1 选择SM501的原因 610
25.4.2 SM501驱动程序设计 610
25.5 超声动态图像的实时显示 612
25.5.1 图像动态显示 612
25.5.2 坐标转换和灰度插值 612
25.6 图形界面的结构 614
25.6.1 需求分析 614
25.6.2 总体结构 614
25.6.3 网络通信 615
25.6.4 多线程编程 615
25.7 操作界面设计 616
25.7.1 区域分配 616
25.7.2 键盘响应 616
25.7.3 控件设计 617
25.8 测量模块设计 618
25.8.1 椭圆的画法 619
25.8.2 椭圆测量周长和面积 620
25.8.3 轨迹法测量面积 620
25.9 本章小结 620