
全书共分为14章。第1章是嵌入式系统组成简介。第2~6章描述硬件部分,以S3C2410A微处理器为主,具体描述嵌入式微处理器组成、片内功能模块原理及应用、开发板基本组成,还介绍了OMAP3530嵌入式微处理器组成及应用。第7~14章描述软件部分,针对基于S3C2410A及OMAP3530微处理器的开发板,具体描述开发系统组成、主机及目标板运行、主机开发环境配置、实验例程及驱动程序分析、目标板出厂软件烧写、UBoot及内核。书中给出的大量C语言源代码多数取自UBoot、μC/OSⅡ、Linux以及芯片厂商测试程序。实验程序均上机调试通过。
本书既可以作为高等院校计算机、软件、电子、自动化、通信等专业的本科生嵌入式系统开发课程的教材使用,还可以作为研究生的参考教材,同时可供相关技术人员参考或作为培训教材使用。
本书系统地描述Linux环境下嵌入式系统开发涉及的硬、软件基础知识。书中内容力求理论与实践相结合,注重具体实现技术与实用技术。书中主要内容已经在编者的教学过程中多次使用。
第1章对嵌入式系统作概括性介绍。
第2~6章以S3C2410A微处理器为主,具体描述嵌入式微处理器的组成、片内功能模块原理及应用、开发板基本组成,此外还介绍了OMAP3530嵌入式微处理器的组成及应用。针对片内功能模块的应用,书中给出了大量C语言源代码,这些源代码大多数取自Linux、μC/OSⅡ、UBoot以及厂商测试程序。
第7~14章具体描述基于S3C2410A开发板及OMAP3530开发板的软件开发技术,包括开发系统组成、主机及目标板运行、主机开发环境配置、实验例程及驱动程序分析、目标板出厂软件烧写,以及UBoot、内核基础知识。书中给出了大量实验程序及UBoot、Linux源代码,实验程序均上机调试通过。
附录A对Linux基础作了简单介绍。
建议在讲授计算机组成原理或微机原理后开设本课程,同时读者应该有一定的C语言基础。对于那些没有Linux基础的读者,建议先阅读附录A。
本书虽然对名词术语进行了统一处理,但有些名词术语在不至于引起读者误读或者产生歧义的情况下,并未作强行统一,例如S3C2410A、s3c2410a、S3C2410、s3c2410,SMDK2410、smdk2410,UBoot、uboot;Linux、linux等。其原因是不同章节参考的文献不同,有的名词术语出现在电路原理图、数据手册、READMY文档中,而有的是作为变量名、注释出现在不同的源代码中。
本书附录由李丽芬编写,其余部分由刘彦文编写,全书由刘彦文统稿。
另外,限于篇幅,书中没有描述指令系统及汇编语言,但在个别章节使用了汇编语言,请读者参阅参考文献\[1\]的相关内容。
特别感谢李惠林女士,在稿件交付出版社前,她对第1~14章内容进行了录入、排版和资料核对,并在统稿过程中提出了许多建议和修改意见。
感谢清华大学出版社计算机事业部袁勤勇主任对本书选题及编写工作提出的建议以及在编辑过程中付出的辛勤劳动。
还要感谢编者所在学院的领导及实验室同事所提供的实验设备及工作环境以及在工作上对编者的支持。在本书编写过程中,除了书后所列的参考文献之外,作者还参考和引用了一些公司的公开技术资料、随机资料和程序。例如参考了ARM公司、三星公司和国内的博创公司的资料,引用了UBoot、Linux、μC/OSⅡ部分源代码及芯片厂商测试程序。作者在此向这些文献的撰写者表示感谢。
由于编者水平有限,书中的错误和不当之处在所难免,敬请专家和读者批评指正。
编者2015年4月
第1章嵌入式系统组成简介1
1.1嵌入式系统简介1
1.1.1嵌入式系统定义1
1.1.2嵌入式系统发展历程1
1.1.3嵌入式系统应用举例2
1.1.4嵌入式系统特点2
1.2嵌入式系统硬件及软件组成4
1.2.1嵌入式系统硬件组成4
1.2.2嵌入式系统软件组成5
1.3主流嵌入式微处理器5
1.3.1嵌入式微处理器分类5
1.3.2主流嵌入式微处理器简介7
1.4主流嵌入式操作系统简介10
1.4.1嵌入式操作系统的主要特点10
1.4.2主流嵌入式操作系统简介11
1.5Linux支持的处理器结构简介14
1.5.1Linux对处理器的支持14
1.5.2Linux支持的处理器结构15
1.5.3μCLinux支持的处理器结构15
习题16
第2章微处理器组成及程序员模型17
2.1S3C2410A微处理器概述17
2.2S3C2410A微处理器的组成与引脚信号18
2.2.1S3C2410A微处理器的组成18
2.2.2S3C2410A芯片封装、引脚编号与引脚信号名22
2.2.3S3C2410A特殊功能寄存器简介26
2.3ARM920T核262.4ARM程序员模型26
2.4.1处理器操作状态27
2.4.2存储器格式和数据类型27
2.4.3处理器操作方式29
2.4.4寄存器29
2.4.5程序状态寄存器33
2.4.6异常34
2.4.7中断延迟39
2.4.8Reset39
2.5OMAP3530微处理器39
2.5.1OMAP3530微处理器概述40
2.5.2OMAP3530应用举例40
2.5.3OMAP3530微处理器组成42
习题44
第3章存储器控制器及Nand Flash控制器46
3.1存储器控制器46
3.1.1S3C2410A与存储器相关的特性简介46
3.1.2与存储器芯片连接的S3C2410A引脚信号及使用48
3.1.3存储器总线周期举例54
3.1.4存储器控制器特殊功能寄存器57
3.2存储器组成举例63
3.2.1使用Nor Flash芯片作为引导ROM63
3.2.2使用SDRAM芯片举例68
3.3Nand Flash芯片工作原理78
3.3.1两种引导模式78
3.3.2Nand Flash概述78
3.3.3K9F2808U0C Nand Flash芯片工作原理78
3.4Nand Flash控制器83
3.4.1Nand Flash控制器83
3.4.2Nand Flash控制器特殊功能寄存器86
3.4.3Nand Flash控制器与Nand Flash芯片连接举例87
3.5应用举例87
3.5.1UBoot对存储器控制器特殊功能寄存器初始化87
3.5.2存储器控制器与以太网控制器的连接91
3.5.3S3C44B0X与Nand Flash芯片的连接91
习题92
第4章时钟与电源管理、DMA与总线优先权95
4.1功耗管理、时钟与电源管理概述95
4.1.1微处理器功耗管理基础95
4.1.2时钟与电源管理概述96
4.1.3时钟与电源管理用到的S3C2410A引脚信号97
4.2时钟管理98
4.2.1时钟与电源管理结构框图98
4.2.2片外时钟源的选择99
4.2.3锁相环99
4.2.4时钟控制逻辑100
4.3电源管理102
4.3.1电源管理模式的转换102
4.3.24种电源管理模式103
4.3.3S3C2410A电源引脚107
4.4时钟与电源管理特殊功能寄存器及设置107
4.4.1时钟与电源管理特殊功能寄存器107
4.4.2UBoot对特殊功能寄存器的初始设置110
4.5DMA基础112
4.5.1DMA含义112
4.5.2DMAC控制输入传输举例112
4.5.3总线主设备、从设备114
4.6DMA传输114
4.6.1DMA概述114
4.6.2存储器到外设DMA传输举例115
4.6.3DMA用到的S3C2410A引脚信号117
4.7DMA请求、有限状态机和协议117
4.7.1硬件DMA请求与软件DMA请求117
4.7.2用于DMA操作的有限状态机118
4.7.3外部DMA请求/响应协议119
4.7.4Unit/Burst传输、数据尺寸与自动重装120
4.7.5外部DMA请求/响应协议传输举例121
4.8DMA特殊功能寄存器122
4.9DMA存储器到存储器传输测试举例127
4.10总线优先权130
习题131
第5章GPIO端口及中断控制器133
5.1GPIO端口概述及引脚信号133
5.1.1GPIO端口概述133
5.1.2与GPIO端口及其他寄存器相关的S3C2410A引脚信号134
5.2GPIO端口控制135
5.3GPIO端口特殊功能寄存器136
5.3.1端口A~端口H寄存器组136
5.3.2其他寄存器144
5.4GPIO端口程序举例151
5.4.1GPIO端口特殊功能寄存器在程序中定义151
5.4.2GPIO端口初始化配置153
5.4.3GPIO端口使用举例154
5.5中断控制器概述155
5.5.1与中断有关的寄存器155
5.5.2中断处理过程157
5.6中断控制器操作、中断源及中断优先权158
5.6.1中断控制器操作158
5.6.2中断源159
5.6.3中断优先权产生模块159
5.7中断控制器特殊功能寄存器161
5.8中断程序举例167
习题174
第6章片内功能模块177
6.1脉宽调制定时器177
6.1.1PWM定时器概述177
6.1.2PWM定时器操作179
6.1.3PWM定时器特殊功能寄存器184
6.1.4PWM定时器应用举例188
6.2实时时钟191
6.2.1RTC概述191
6.2.2RTC组成与操作192
6.2.3RTC特殊功能寄存器193
6.2.4RTC程序举例197
6.3看门狗定时器199
6.3.1WDT概述199
6.3.2WDT操作200
6.3.3WDT特殊功能寄存器200
6.3.4WDT程序举例202
6.4通用异步收发器205
6.4.1串行异步通信基础205
6.4.2UART组成及操作210
6.4.3UART特殊功能寄存器216
6.4.4UART与RS232C接口连接举例222
6.4.5UART程序举例224
6.4.6UART与红外收发器连接及程序举例227
6.5模数转换器与触摸屏接口229
6.5.1ADC与TS接口基础知识229
6.5.2ADC与TS接口概述232
6.5.3ADC与TS接口操作233
6.5.4ADC与TS接口特殊功能寄存器236
6.5.5ADC程序举例239
6.5.6ADC与TS接口程序举例240
6.6IIC、IIS、SPI总线接口及SD主控制器概述243
6.6.1IIC总线接口概述243
6.6.2IIS总线接口概述245
6.6.3SPI总线接口概述247
6.6.4MMC/SD/SDIO概述249
习题251
第7章Linux及嵌入式开发系统组成简介256
7.1Linux起源及发展256
7.1.1UNIX和GNU软件256
7.1.2Linux的发展257
7.2内核、shell、文件系统及实用程序258
7.2.1Linux内核258
7.2.2shell简介258
7.2.3文件系统261
7.2.4实用程序262
7.3使用Linux的理由及Linux的不足之处262
7.3.1使用Linux的理由262
7.3.2使用Linux的不足之处263
7.4Linux环境嵌入式开发系统组成简介264
7.4.1Linux环境嵌入式开发系统组成264
7.4.2主机264
7.4.3目标板264
7.4.4主机与目标板的连接264
7.4.5主机中运行的程序265
7.4.6目标板中运行的程序265
7.4.7开发系统附带的光盘文档266
7.5主机安装的Linux发行版267
7.5.1常用的Linux发行版267
7.5.2Linux发行版在主机的安装方式268
习题、操作与实验269
第8章主机及目标板的运行271
8.1终端基础知识271
8.1.1tty271
8.1.2早期的终端及终端与主机的连接271
8.1.3XWindow、GNOME及KDE简介273
8.2主机系统引导、登录及退出Linux274
8.2.1主机系统引导274
8.2.2登录Linux275
8.2.3Linux的终端276
8.2.4查看及修改用户使用的shell278
8.2.5通过退出与shell的会话退出Linux280
8.2.6关闭运行的Linux系统281
8.2.7使用帮助命令help和man281
8.3目标板初次运行283
8.3.1目标板连接的电源、端口及安装的操作系统283
8.3.2目标板引导过程简述284
8.3.3装入装载引导程序(vivi)286
8.3.4装入装载引导程序(uboot)287
8.3.5主机在Windows环境下的超级终端287
8.3.6主机在Linux环境下的minicom仿真终端(Linux
企业版4.0)290
8.3.7主机在Linux环境下的minicom仿真终端(Linux
企业版5.0)293
8.3.8在虚拟机中增添串口设备296
8.3.9装载引导程序支持的命令简介(vivi)300
8.3.10装载引导程序支持的命令简介(uboot)302
8.3.11目标板运行的Linux登录、退出讨论306
8.3.12目标板安装的Linux306
8.3.13目标板运行的Linux命令举例(S3C2410A)307
8.3.14目标板运行的Linux命令举例(OMAP3530)310
习题、操作与实验311
第9章主机开发环境配置313
9.1交叉开发平台基础313
9.1.1本地开发及交叉开发313
9.1.2GNU跨平台工具链组成314
9.1.3如何获取工具链314
9.1.4工具链的组件及GDB简介315
9.2交叉工具链安装举例316
9.2.1交叉工具链安装举例(S3C2410A)316
9.2.2交叉工具链安装举例(OMAP3530)318
9.3主机Linux环境网络配置举例(S3C2410A)321
9.3.1主机Linux环境IP地址设置322
9.3.2主机Linux环境网络防火墙设置325
9.3.3主机与目标板网络通信测试326
9.3.4主机Linux环境NFS设置328
9.3.5输入、编译、运行一个程序全过程举例332
9.4主机Linux环境网络配置举例(OMAP3530)333
9.4.1主机Linux环境IP地址设置333
9.4.2主机Linux环境网络防火墙设置335
9.4.3主机与目标板网络通信测试337
9.4.4主机Linux环境NFS设置337
9.4.5输入、编译、运行一个程序全过程举例340
习题、操作与实验342
第10章应用程序编程举例及驱动程序分析(一)343
10.1读取、转换时间函数编程举例343
10.1.1Linux查看、设置时间的命令343
10.1.2常用的读取、转换时间的函数344
10.1.3读取、转换时间的函数编程举例(S3C2410A)345
10.1.4例10.1对应的Makefile文件(S3C2410A)347
10.1.5读取、转换时间的函数编程举例(OMAP3530)348
10.1.6例10.2对应的Makefile文件(OMAP3530)348
10.1.7执行例10.2程序前的操作步骤举例(OMAP3530)349
10.2多线程编程举例350
10.2.1Linux线程概述350
10.2.2线程、互斥量、条件变量函数351
10.2.3生产者、消费者编程举例(S3C2410A)353
10.3串行端口及标准输入/输出/错误编程举例358
10.3.1Linux标准输入/输出/错误系统调用358
10.3.2Linux标准输入/输出/错误系统调用编程举例
(S3C2410A)360
10.3.3Linux标准输入/输出/错误系统调用编程举例
(OMAP3530)361
10.3.4串行端口设备与文件关联及系统调用362
10.3.5串行端口设备与文件关联及系统调用编程举例
(S3C2410A)363
10.3.6串行端口设备与文件关联及系统调用编程举例
(OMAP3530)365
10.3.7C语言标准输入/输出/错误函数367
10.3.8C语言标准输入/输出/错误函数编程举例(S3C2410A)368
10.3.9C语言标准输入/输出/错误函数编程举例(OMAP3530)369
10.4ADC应用程序编程举例(S3C2410A)369
10.4.1ADC编程基础369
10.4.2ADC应用程序编程举例371
10.5ADC驱动程序源代码分析(S3C2410A)375
10.5.1概述375
10.5.2Linux设备驱动程序概述376
10.5.3s3c2410adc.h头文件源代码分析380
10.5.4s3c2410.h_chip.h头文件源代码分析381
10.5.5s3c2410adc.c设备驱动程序源代码分析383
习题、操作、实验及编程389
第11章目标板出厂软件烧写实验(S3C2410A)392
11.1目标板出厂软件烧写概述392
11.1.1目标板出厂软件392
11.1.2Linux环境要烧写的文件392
11.1.3什么情况下烧写目标板出厂软件392
11.1.4烧写环境393
11.2目标板出厂软件烧写实验(一)393
11.2.1主机Windows环境下安装JTAG驱动程序393
11.2.2通过JTAG端口传送并烧写装载引导程序vivi394
11.2.3通过串口传送并烧写内核zImage395
11.2.4通过串口传送并烧写根文件系统root.cramfs397
11.2.5通过网口传送并烧写应用程序yaffs.tar.bz2397
11.2.6格式化闪存以及通过串口传送并烧写vivi402
11.3目标板出厂软件烧写实验(二)402
11.3.1通过网口传送并烧写内核zImage403
11.3.2通过网口传送并烧写根文件系统root.cramfs406
11.4目标板出厂软件烧写实验(三)407
11.4.1通过JTAG端口传送并烧写装载引导程序uboot407
11.4.2通过网口传送并烧写内核uImage409
11.4.3通过网口传送并烧写根文件系统root.cramfs411
11.4.4通过网口传送并烧写应用程序yaffs.tar.bz2412
11.5目标板出厂软件烧写小结413
习题、操作与实验413
第12章应用程序编程举例及驱动程序分析(二)415
12.1DAC应用程序编程举例及驱动程序分析415
12.1.1DAC硬件基础415
12.1.2DAC应用程序编程举例(S3C2410A)417
12.1.3DAC驱动程序源代码分析(S3C2410A)419
12.2PWM直流电机应用程序编程举例及驱动程序分析422
12.2.1PWM直流电机(S3C2410A)422
12.2.2编译、加载驱动程序模块(S3C2410A)423
12.2.3PWM直流电机应用程序编程举例(S3C2410A)426
12.2.4PWM直流电机驱动程序源代码分析(S3C2410A)428
12.3LED应用程序编程举例及驱动程序分析429
12.3.1七段LED概述429
12.3.28×8点阵LED显示概述432
12.3.3CPLD与七段LED、8×8点阵LED连接举例(S3C2410A)435
12.3.4七段LED、8×8点阵LED应用程序编程举例(S3C2410A)437
12.3.5LED驱动程序源代码分析(S3C2410A)439
习题、操作、实验及编程442
第13章装载引导程序443
13.1常见的装载引导程序443
13.2UBoot概述444
13.3编译、烧写、运行UBoot及装入内核446
13.3.1对标准开发板源代码进行编译、链接并烧写UBoot446
13.3.2UBoot等映像文件在开发板存储位置举例446
13.3.3加电运行UBoot及UBoot装入内核447
13.4UBoot监视命令及环境变量448
13.4.1使用命令及在源代码中配置监视命令448
13.4.2环境变量449
13.5顶层、编译过程及配置头文件举例451
13.5.1UBoot源代码顶层及编译指定的开发板451
13.5.2标准开发板配置头文件及举例453
13.6UBoot启动过程及举例456
习题、操作与实验459
第14章内核461
14.1内核简介461
14.1.1内核461
14.1.2内核在嵌入式Linux系统中的位置及内核组成461
14.2内核映像、Linux启动过程及输出信息463
14.2.1常见内核映像文件zImage和uImage463
14.2.2Linux启动过程简介464
14.2.3Linux启动期间控制台输出的信息467
14.3Linux内核源代码468
14.3.1获得内核源代码468
14.3.2Linux内核源代码树及内核469
14.4内核配置文件及配置编辑器472
14.4.1内核配置文件472
14.4.2内核配置编辑器473
14.4.3顶层.config文件内容及Kconfig文件内容举例475
14.5联编内核及联编内核模块477
14.5.1联编内核举例478
14.5.2联编内核模块举例480
14.5.3清理480
习题、操作与实验481
附录ALinux基础483
A.1用户和组483
A.1.1账户483
A.1.2与用户和组关联的文件484
A.1.3与用户和组相关的命令486
A.2文件系统及Linux常用命令488
A.2.1结构及根的基本488
A.2.2创建和删除489
A.2.3常用操作命令491
A.2.4文件类型及链接493
A.2.5文件和的权限494
A.2.6创建、修改和删除文件495
A.2.7常用文件操作命令496
A.2.8元字符500
A.3用vi输入源程序500
A.3.1vi功能简介500
A.3.2常用vi操作501
A.3.3输入、保存源程序举例502
A.4make及Makefile举例504
A.4.1make、Makefile文件内容简介504
A.4.2编译文件509
A.5主机运行用户程序举例510
A.5.1运行一个程序举例510
A.5.2输入、编译、运行程序过程总结512
习题512
附录B英汉名词术语对照表514
参考文献523