本书详细介绍了嵌入式Linux系统的方方面面,从嵌入式系统的发展、环境的搭建、相关的理论基础知识,再到深入地讲解嵌入式系统的开发,由易到难详细讲解了嵌入式系统开发的流程。本书分为4篇。第1篇是嵌入式Linux系统基础篇,主要介绍了嵌入式系统的发展,搭建嵌入式Linux系统环境,Linux程序开发基础和嵌入式Linux设备驱动开发基础等知识。第2篇是嵌入式Linux设备驱动核心理论篇,讲解了Linux设备驱动的一些基本理论知识,有并发竞态、阻塞非阻塞、驱动延迟操作、内存分配中断处理以及工程开发等相关知识。第3篇是字符设备驱动篇,主要讲解Linux字符设备驱动的相关内容,如基于内存的字符设备、按键控制led字符驱动、温度传感器、MP3播放器和动态图像系统开发。第4篇是块设备驱动篇,内容包括块设备驱动程序的开发、基于ramdisk的虚拟块设备驱动以及SD卡块设备驱动。
本书是一本面向嵌入式Linux初学者的一本书,全书基于一块经典开发板——友善之臂的mini2440,在最新版本的Linux内核代码中都可以找到这块开发板的支持代码,是初学者学习嵌入式Linux入门的经典开发板。本书编者也是从这块开发板一步一步学习至今的。整本书是以一个初学者的心态来进行学习的,同时又以一个刚刚进阶的开发者来叙述,书中总结了编学习嵌入式Linux的点点滴滴,其中有笔者对嵌入式Linux的学习见解和曾经做过的项目。
第1章嵌入式Linux系统简介1
1.1嵌入式与Linux系统概述1
1.1.1Linux操作系统及其发展1
1.1.2Linux发行版本2
1.2Windows与Linux文件系统的异同4
1.2.1Linux文件系统类型4
1.2.2Windows与Linux文件系统的相同点5
1.2.3Windows与Linux文件系统的不同点5
1.3Linux文件类型与属性7
1.3.1Linux文件类型7
1.3.2Linux文件属性7
1.4嵌入式Linux常用命令及工具8
1.4.1Linux常用命令8
1.4.2嵌入式Linux常用工具9
小结10
第2章搭建嵌入式Linux学习环境12
2.1硬件开发平台12
2.1.1mini2440开发板硬件资源12
2.1.2外围设备14
2.2软件开发平台搭建14
2.2.1tftp服务器与nfs服务器搭建15
2.2.2交叉编译工具16
2.2.3uboot的移植17
2.2.4Linux内核移植18
2.2.5Linux根文件系统移植19
小结23
第3章Linux应用程序学习24
3.1Linuxshell脚本24
3.1.1语法24
3.1.2变量25
3.1.3shell脚本语句26
3.1.4注释27
3.2Linux下makefile的编写27
3.3Linux文件编程28
3.3.1文件与目录29
3.3.2系统调用30
3.3.3标准I/O库32
3.4线程34
3.4.1线程优点34
3.4.2线程分类35
3.4.3线程实现35
3.5网络编程37
3.5.1TCP/IP协议37
3.5.2TCP和UDP38
3.5.3套接字39
小结40
第4章嵌入式Linux设备驱动开发基础41
4.1嵌入式Linux设备驱动的概述41
4.1.1Linux设备驱动的作用41
4.1.2Linux设备驱动的分类及特点42
4.2处理器与储存器42
4.2.1处理器42
4.2.2存储器43
4.3接口45
4.3.1串口46
4.3.2I2C46
4.3.3USB47
4.3.4以太网接口48
4.4Linux内核模块49
小结50
第5章Linux设备驱动之并发与竞态51
5.1并发及其管理51
5.2自旋锁52
5.2.1自旋锁API52
5.2.2自旋锁基本使用模式53
5.2.3其他自旋锁函数54
5.2.4读者/写者自旋锁55
5.2.5Linux内核自旋锁55
5.3信号量与互斥体57
5.3.1信号量57
5.3.2互斥体62
5.4原子操作64
5.4.1原子整数操作64
5.4.2原子位操作65
5.5中断屏蔽65
小结66
第6章Linux设备驱动中的阻塞与非阻塞I/O67
6.1阻塞与非阻塞I/O67
6.1.1休眠68
6.1.2等待队列68
6.1.3阻塞和非阻塞操作70
6.2轮询操作70
6.2.1轮询概述71
6.2.2Linux应用程序中的轮询编程——select()71
6.2.3Linux设备驱动中的轮询编程——poll()73
小结75
第7章Linux设备驱动之时间、延迟及延缓操作76
7.1Linux内核时间76
7.1.1处理器特定的寄存器76
7.1.2延迟操作77
7.2内核定时器78
7.3tasklet80
7.4工作队列82
小结84
第8章Linux设备驱动之内存分配与I/O访问85
8.1内存空间与I/O空间85
8.2内存管理85
8.3内存分配88
8.3.1kmalloc与vmalloc88
8.3.2get_free_page和相关函数89
8.4设备I/O端口和I/O内存的访问90
8.4.1I/O寄存器和常规内存90
8.4.2操作I/O端口(申请,访问,释放)91
8.4.3操作I/O内存(申请,映射,访问,释放)92
8.4.4像I/O内存一样访问端口93
8.4.5ARM体系的I/O操作接口94
8.5I/O内存的静态映射94
小结96
第9章Linux设备驱动之中断处理97
9.1Linux中断处理程序框架97
9.1.1中断处理过程97
9.1.2Linux中断处理程序的上半部与下半部机制99
9.2Linux中断编程100
9.3中断共享103
9.4中断驱动的I/O104
小结104
第10章Linux设备驱动工程开发技术105
10.1自创建设备文件105
10.2混杂设备驱动107
10.3Linux设备模型109
10.3.1kobject和kset数据结构110
10.3.2sysfs文件系统113
10.3.3总线、设备和驱动程序114
10.4设备驱动分层思想120
小结121
第11章Linux字符设备驱动122
11.1字符设备驱动结构122
11.1.1主次设备号122
11.1.2字符设备驱动的重要数据结构124
11.2字符设备的注册和释放128
11.2.1字符设备的注册129
11.2.2字符设备的释放131
11.3字符设备驱动的一些小技巧131
小结133
第12章基于内存的简单字符设备134
12.1简单字符驱动的数据结构134
12.1.1定义字符设备驱动的设备数据结构134
12.1.2定义file_operation结构和挂接相应的系统调用函数135
12.2简单字符驱动设计136
12.2.1字符设备驱动的加载与卸载137
12.2.2字符设备驱动的打开与关闭139
12.2.3字符设备驱动的读写函数140
12.2.4字符设备驱动的llseek函数141
12.3应用程序测试142
12.3.1应用程序设计原理142
12.3.2程序代码142
12.4简单字符设备驱动运行效果143
12.4.1makefile程序的编写143
12.4.2字符设备驱动运行效果144
小结145
第13章按键控制LED字符驱动146
13.1按键和LED设备硬件接口和寄存器146
13.2按键控制LED驱动原理147
13.3按键控制LED驱动程序分析148
13.3.1按键与LED集成在一个驱动中148
13.3.2按键与LED驱动的实现156
13.4按键控制LED驱动测试171
13.5驱动程序的运行效果171
小结173
第14章基于18B20传感器的驱动开发174
14.1DS18B20温度传感器简介174
14.1.1温度传感器的工作特点175
14.1.2DS18B20的外部结构175
14.1.3DS18B20的内部结构176
14.1.4DS18B20的应用电路结构178
14.1.5DS18B20的工作原理178
14.2DS18B20温度传感器程序设计实现180
14.2.1复位程序180
14.2.2写1字节子程序182
14.2.3读1字节子程序183
14.2.4确定温度传感器的头文件和相应的数据结构185
14.2.5确定驱动要实现的功能函数和file_operation结构的挂接186
14.2.6编写加载和卸载函数186
14.2.7编写要实现的功能函数187
14.3应用程序设计195
14.4驱动运行效果197
14.4.1makefile文件的编写197
14.4.2应用程序运行效果图197
小结198
第15章MP3播放器199
15.1MP3播发器简介199
15.2按键播放MP3的原理199
15.2.1MP3播放器系统框架199
15.2.2MP3音频驱动的移植201
15.3MP3程序设计203
15.3.1按键驱动程序设计203
15.3.2MP3应用程序设计208
15.3.3最终的程序代码215
15.4MP3播放器的测试223
小结224
第16章基于motion的动态图像检测系统开发225
16.1动态图像检测系统简介225
16.2系统框图和流程图225
16.2.1系统框图226
16.2.2系统设计技术227
16.3动态监测系统程序分析228
16.3.1motion动态图像采集系统移植228
16.3.2温度采集系统231
16.3.3动态图像控制系统231
16.3.4远程监控服务系统239
16.3.5SD卡存储系统248
16.4系统测试运行效果图248
小结250
第17章块设备驱动程序251
17.1字符设备驱动与块设备驱动251
17.2块设备驱动基本框架252
17.3块设备在Linux系统中各层的调用关系252
17.4块设备驱动的重要数据结构253
17.4.1block_device_operations结构体254
17.4.2gendisk结构体255
17.4.3request与request_queue结构体255
17.4.4块I/O256
17.4.5块设备中各结构体之间的关系258
17.5块设备驱动程序分析259
小结261
第18章基于ramdisk的虚拟磁盘块设备驱动262
18.1块设备驱动程序设计262
18.2基于I/O调度器的块设备驱动程序设计262
18.3没有I/O调度器的块设备驱动程序设计265
小结267
第19章SD卡块设备驱动268
19.1SD卡概述268
19.1.1SD卡简介268
19.1.2SD卡的引脚269
19.1.3SD卡的内存组织270
19.2SD卡寄存器271
19.2.1CID寄存器271
19.2.2SD总线协议272
19.2.3SD卡指令和命令272
19.2.4块读写操作274
19.3SD卡设备驱动程序分析275
19.3.1SD卡驱动程序的重要数据结构276
19.3.2SD设备驱动分析278
19.3.3SD卡驱动在mini2440开发板的开发与移植281
19.4测试SD卡驱动程序283
19.4.1系统设计思路与步骤283
19.4.2系统测试结果285
小结286