第1章 嵌入式Linux开发环境 1
1.1 嵌入式介绍 1
1.1.1 嵌入式系统定义 1
1.1.2 嵌入式操作系统 1
1.1.3 常见的嵌入式操作系统 3
1.2 虚拟机及Linux系统安装 5
1.2.1 安装VMware Workstation软件 5
1.2.2 在VMware Workstation虚拟机安装Red Hat Linux系统 6
1.3 Linux常用命令 13
1.3.1 系统询问命令 13
1.3.2 文件操作命令 14
1.3.3 目录操作命令 15
1.3.4 口令、权限命令 16
1.3.5 文件压缩命令 17
1.3.6 网络相关命令 18
1.3.7 其他命令 18
1.4 Linux下的编辑工具 19
1.4.1 编辑器分类 19
1.4.2 VIM的使用 19
1.5 主机开发环境的配置 23
1.5.1 超级终端配置图解 23
1.5.2 Minicom配置 26
1.5.3 TFTP服务 28
1.5.4 NFS服务 29
1.5.5 Telnet服务 30
1.6 Red Hat下通过安装镜像文件使用yum安装软件 30
1.6.1 修改yum配置文件 30
1.6.2 安装卸载软件的方法 30
1.7 Makefile编写规则 31
1.7.1 Makefile简介 31
1.7.2 Makefile的基本结构 31
1.7.3 Makefile中的变量 33
1.7.4 Makefile的隐含规则 34
1.8 交叉编译工具基础知识 35
1.8.1 交叉编译工具链的安装 36
1.8.2 arm-linux-gcc选项 37
1.8.3 arm-linux-ld选项 38
1.8.4 arm-linux-objcopy 39
1.8.5 arm-linux-objdump 39
1.9 小知识 39
第2章 BootLoader移植与开发 41
2.1 U-Boot的目录结构 41
2.1.1 BootLoader简介 41
2.1.2 常用BootLoader介绍 42
2.1.3 U-Boot 1.3.4 目录介绍 43
2.2 U-Boot的制作过程 44
2.3 U-Boot运行过程 57
2.3.1 程序启动过程 57
2.3.2 U-Boot的两个阶段 58
2.4 U-Boot源码分析 59
2.5 U-Boot应用:主要用于启动内核进行准备工作 90
2.5.1 U-Boot的应用 90
2.5.2 BootLoader与内核的交互 90
2.6 U-Boot的重要数据结构 90
2.6.1 gd全局数据变量指针 91
2.6.2 bd电路板数据指针 91
2.6.3 环境变量指针 92
2.6.4 设备相关设置 92
2.6.5 命令结构体类型定义 93
第3章 Linux内核裁剪 95
3.1 嵌入式Linux内核启动过程 95
3.1.1 Linux版本及特点 95
3.1.2 内核代码初始化分析 96
3.1.3 setup_arch()函数分析 99
3.1.4 rest_init()函数分析 102
3.1.5 挂接根文件系统 104
3.1.6 初始化设备驱动程序 105
3.2 Linux内核源码目录介绍 108
3.3 Linux内核配置系统分析 110
3.3.1 内核中的Kconfig文件介绍 112
3.3.2 Linux内核源码Makefile文件分析 113
3.4 针对S3C2440开发板移植内核的过程 115
3.5 添加驱动程序到内核源码 120
第4章 根文件系统移植与制作 122
4.1 分析Linux文件系统层次标准 122
4.2 根文件系统各目录作用 122
4.3 移植Busybox开源代码、构造根文件系统 123
4.3.1 Busybox的诞生 123
4.3.2 Busybox许可证 124
4.3.3 POSIX环境 124
4.4 制作Linux根文件系统 125
4.4.1 下载并配置安装Busybox 125
4.4.2 完善根文件系统 128
4.4.3 通过NFS服务测试文件系统 130
第5章 Linux驱动介绍 131
5.1 驱动原理 131
5.2 内核模块的主要相关命令 131
5.3 设备分类 131
5.4 设备驱动程序工作原理 132
5.5 应用程序、库、内核、驱动程序的软件关系 132
5.6 Linux驱动程序开发步骤 132
5.7 驱动程序的加载和卸载 133
5.8 关键概念 133
5.8.1 不可剥夺型内核(non-preemptive kernel)(分时操作系统内核) 133
5.8.2 可剥夺型内核(preemptive kernel)(实时操作系统内核) 134
5.8.3 可重入函数 134
5.8.4 资源 134
5.8.5 共享资源 134
5.8.6 代码的临界段 134
5.8.7 实时系统的特点 134
5.8.8 死锁 135
5.8.9 Linux的进程状态描述 135
5.8.1 0 Linux内核的三种调度方法 135
5.8.1 1 所有任务都采用Linux分时调度策略时 136
5.8.1 2所有任务都采用FIFO调度策略时 136
5.8.1 3所有任务都采用RR调度策略时 137
5.8.1 4进程调度依据(系统进程调度原理) 137
5.8.1 5描述进程的数据结构task_struct(任务结构体) 139
5.8.1 6 Linux使用内核函数goodness()对进程进行加权处理 139
5.9 中断与异常 141
5.9.1 Linux异常处理体系结构概述 141
5.9.2 中断注册方法 144
5.1 0并发和竞态 144
5.1 0.1 并发及其管理 145
5.1 0.2 信号量和互斥体 145
5.1 0.3 自旋锁 147
第6章 字符设备驱动开发 150
6.1 主设备号和次设备号 150
6.2 重要数据结构 150
6.2.1 file_operations结构 150
6.2.2 file结构 154
6.3 字符设备注册方式 154
6.3.1 早期版本的字符设备注册(2.6 版本以前) 154
6.3.2 杂项(miscdevice)设备注册 155
6.3.3 Linux 2.6 的版本设备注册 155
6.4 打印信息 164
6.5 高级字符驱动程序操作 165
6.5.1 ioctl 165
6.5.2 定位设备(llseek实现) 167
6.5.3 休眠 167
6.5.4 阻塞和非阻塞操作 169
6.5.5 poll和select 170
6.5.6 与read和write的交互 171
6.5.7 刷新待处理输出 172
6.6 异步通知 172
6.7 内核同步机制 174
6.7.1 原子操作 174
6.7.2 信号量(semaphore) 176
6.7.3 自旋锁(spinlock) 177
第7章 LED驱动开发与应用编程 182
7.1 LED驱动程序(xyd2440_leds.c) 182
7.2 LED驱动程序的Makefile 185
7.3 LED驱动测试程序(leds_app.c) 185
7.4 操作步骤 186
第8章 按键驱动开发与应用编程 188
8.1 按键的硬件原理 188
8.2 按键驱动中的数据结构 188
8.3 按键驱动的模块加载函数和卸载函数 189
8.4 按键设备驱动中断处理程序 190
8.5 按键设备驱动的打开函数和释放函数 190
8.6 按键设备驱动的读函数 192
8.7 按键驱动程序范例 193
8.8 操作步骤 199
第9章 LCD驱动开发实例分析 201
9.1 FrameBuffer的原理 201
9.2 FrameBuffer在Linux中的实现和机制 202
9.3 Linux内核中的platform机制 207
9.4 S3C2440 LCD驱动分析 209
9.5 S3C2440LCD驱动移动移植 228
9.5.1 代码修改 228
9.5.2 修改Kconfig——添加新屏支持到内核菜单 231
9.5.3 修改内核配置 232
9.6 FrameBuffer应用例子 234
9.6.1 应用程序源码 234
9.6.2 操作步骤 235
第10章 输入子系统和触摸屏 237
10.1 认识输入子系统 237
10.1.1 为什么需要输入子系统 237
10.1.2 相关API 237
10.1.3 一个简单的按键驱动的例子 240
10.2 触摸屏驱动分析 241
10.2.1 Linux内核定时器 241
10.2.2 触摸屏驱动代码分析 243
10.3 触摸屏的校准 249
10.3.1 触摸屏的校准介绍 249
10.3.2 tslib库的编译使用 250
10.3.3 将tslib校准引用到自己的项目中 251
第11章 网络驱动开发与应用编程 253
11.1 TCP/IP概述 253
11.1.1 TCP/IP族 254
11.1.2 TCP和UDP 254
11.2 TCP/IP网络基础编程 255
11.2.1 socket概述 255
11.2.2 地址及顺序处理 256
11.2.3 socket基础编程 261
11.3 DM9000网卡驱动程序移植 273
11.3.1 DM9000网卡特性 273
11.3.2 DM9000网卡与S3C2440硬件连接 274
11.3.3 DM9000与开发板接口定义 275
11.3.4 DM9000驱动移植到S3C2440的步骤 276
11.4 DM9000网卡驱动源码解析 278
11.4.1 两个重要的结构体的简单介绍:sk_buff和net_device 278
11.4.2 驱动代码具体分析 285
11.4.3 dm9000_netdev_ops和dm9000_ethtod_ops 286
11.4.4 平台设备驱动的结构体定义 288
11.4.5 驱动初始化函数 288
11.4.6 probe函数 289
11.4.7 remove函数:设备的删除函数 304
11.4.8 打开、关闭函数和操作函数 305
第12章 基于Qt Creator环境的Qt开发 321
12.1 概要说明 321
12.2 安装步骤 321
12.3 QtCreator测试 325
12.4 Qt Ctreator中配置ARM版本交叉编译环境 328
12.5 交叉编译ARM版本Qt4程序 332
第13章 产品封装、发布 335
13.1 Linux内核镜像格式 335
13.2 Linux内核镜像的产生过程 336
13.3 嵌入式Linux常用文件系统 336
13.4 制作常用的文件系统镜像 338
13.4.1 制作Cramfs文件系统和部署 338
13.4.2 制作JFFS2文件系统镜像和部署 339
13.4.3 制作YAFFS2文件系统镜像和部署 340
第14章 S3C6410平台Linux环境搭建 342
14.1 概述 342
14.2 编译器的安装 342
14.3 编译U-Boot和内核 342
14.3.1 编译U-Boot 342
14.3.2 编译内核 343
14.4 烧写内核到NAND Flash 344
14.4.1 制作用于一键烧写Linux的SD卡 344
14.4.2 烧写Linux到开发板的NAND Flash中 347
14.5 文件程序或文件下载到开发板中 350
14.5.1 通过超级终端下载 350
14.5.2 通过SD卡复制 352
附录A Linux开发平台硬件介绍 355
A.1 S3C2440系列芯片介绍 355
A.2 S3C2440开发板硬件设计说明 357
A.2.1 电源设计 357
A.2.2 复位电路 358
A.2.3 系统时钟电路 358
A.2.4 JTAG接口电路 358
A.2.5 GPIO电路、指示灯电路、按键电路 359
A.2.6 蜂鸣器电路 360
A.2.7 串口电路 360
A.2.8 A/D和D/A电路 361
A.2.9 外部Flash芯片 362
A.2.10 SD卡接口电路 362
A.2.11 SDARM芯片模块 363
A.2.12 NOR Flash芯片模块 364
A.2.13 NAND Flash芯片模块 364
A.2.14 USB接口 365
A.2.15 网络模块 365
A.2.16 音频输入与输出电路 365
A.2.17 LCD接口和CMOS摄像接口 367
A.2.18 系统总线接口 368
A.2.19 开发板完整原理图 368
附录B JTAG仿真调试器下载程序的过程 369
附录C J-Link仿真调试器的使用 371
附录D Linux常用命令介绍 375
参考文献 377