第1篇 系统移植基础篇 2
第1章 Linux内核介绍 2
1.1 系统调用接口 2
1.1.1 Linux系统调用 2
1.1.2 用户编程接口 2
1.1.3 系统调用与服务例程的对应关系 3
1.1.4 系统调用过程 3
1.1.5 系统调用传递的参数 4
1.2 进程管理 4
1.2.1 进程 4
1.2.2 进程描述符 5
1.2.3 进程状态 6
1.2.4 进程调度 6
1.2.5 进程地址空间 8
1.3 内存管理 10
1.3.1 内存管理技术 10
1.3.2 内存区管理 12
1.3.3 内核中获取内存的几种方式 13
1.4 虚拟文件系统 14
1.4.1 虚拟文件系统作用 14
1.4.2 文件系统的注册 15
1.4.3 文件系统的安装和卸载 16
1.5 设备驱动程序 17
1.5.1 字符设备驱动程序 17
1.5.2 块设备驱动程序 18
1.5.3 网络设备驱动程序 21
1.5.4 内存与I/O操作 22
1.6 小结 23
第2章 嵌入式Linux开发环境搭建 24
2.1 虚拟机及Linux安装 24
2.1.1 虚拟机的安装 24
2.1.2 虚拟机和主机通信设置 31
2.1.3 虚拟机与主机共享文件 35
2.1.4 虚拟机与主机文件传输 36
2.2 交叉编译工具 38
2.2.1 交叉编译工具安装 38
2.2.2 交叉编译器测试 42
2.3 超级终端和Minicom 44
2.3.1 超级终端软件的安装 44
2.3.2 配置Minicom 44
2.3.3 配置SecureCRT 47
2.4 内核、文件系统加载工具 47
2.4.1 烧写Bootloadet 47
2.4.2 内核和文件系统下载 50
2.4.3 应用程序和文件传输 50
2.5 在开发中使用网络文件系统(NFS) 54
2.5.1 虚拟机设置 54
2.5.2 虚拟机的IP地址设置 55
2.5.3 验证网络连接 58
2.5.4 设置共享目录 59
2.5.5 启动NFS服务 59
2.5.6 修改共享配置后 60
2.5.7 挂载NFS 60
2.5.8 双网卡挂载NFS 60
2.6 小结 61
第2篇 系统移植技术篇 64
第3章 Bootloader移植 64
3.1 Bootloader介绍 64
3.1.1 Bootloader与嵌入式Linux系统的关系 64
3.1.2 Bootloader基本概念 64
3.1.3 Bootloader启动过程 66
3.2 Bootloader之U-Boot 67
3.2.1 U-Boot优点 67
3.2.2 U-Boot的主要功能 67
3.2.3 U-Boot目录结构 68
3.2.4 U-Boot的编译 69
3.3 小结 69
第4章 Linux内核裁剪与移植 70
4.1 Linux内核结构 70
4.1.1 内核的主要组成部分 70
4.1.2 内核源码目录介绍 71
4.2 内核配置选项 73
4.2.1 一般选项 73
4.2.2 内核模块加载方式支持选项 74
4.2.3 系统调用、类型、特性、启动相关选项 75
4.2.4 网络协议支持相关选项 76
4.2.5 设备驱动支持相关选项 76
4.2.6 文件系统类型支持相关选项 77
4.2.7 安全相关选项 78
4.2.8 其他选项 78
4.3 内核裁剪及编译 79
4.3.1 安装内核源代码 79
4.3.2 检查编译环境设置 79
4.3.3 配置内核 80
4.3.4 编译内核 89
4.4 内核升级 90
4.4.1 准备升级内核文件 90
4.4.2 移植过程 90
4.5 小结 93
第5章 嵌入式文件系统制作 94
5.1 文件系统选择 94
5.1.1 Flash硬件方案比较 94
5.1.2 嵌入式文件系统的分层结构 95
5.2 基于Flash的文件系统 95
5.2.1 JFFS文件系统(Journalling Flash File System) 96
5.2.2 YAFFS文件系统(Yet Another Flash File System) 98
5.2.3 Cramfs文件系统(Compressed ROM File System) 101
5.2.4 Romfs文件系统(ROM File System) 102
5.3 基于RAM的文件系统 103
5.4 文件系统的制作 103
5.4.1 制作Ramdisk文件系统 104
5.4.2 制作YAFFS2文件系统 112
5.4.3 制作JFFS2文件系统 117
5.4.4 其他文件系统制作 119
5.5 小结 120
第3篇 系统移植与驱动篇 122
第6章 LCD驱动移植 122
6.1 认识LCD相关硬件原理 122
6.1.1 LCD概述 122
6.1.2 LCD控制器 123
6.1.3 LCD控制器方块图 123
6.1.4 LCD控制器操作 124
6.1.5 LCD控制寄存器 129
6.2 LCD参数设置 132
6.3 内核LCD驱动机制 133
6.3.1 FrameBuffer概述 133
6.3.2 FrameBuffer设备驱动的结构 133
6.4 Linux 2.6.32的LCD驱动源码分析 137
6.4.1 LCD驱动开发的主要工作 137
6.4.2 s3c2410fb_init()函数分析 138
6.4.3 s3c2410fb_probe()函数分析 139
6.4.4 s3c2410fb_remove()函数分析 144
6.5 移植内核中的LCD驱动 145
6.5.1 LCD硬件电路图 145
6.5.2 修改LCD源码 145
6.5.3 配置内核 150
6.6 小结 153
第7章 触摸屏驱动移植 154
7.1 触摸屏概述 154
7.1.1 触摸屏工作原理 154
7.1.2 触摸屏的主要类型 154
7.2 S3C2440 ADC接口使用 157
7.2.1 S3C2440触摸屏接口概述 157
7.2.2 S3C2440触摸屏接口操作 158
7.3 2.6内核触摸屏驱动源码分析(s3c2410_ts.c源码分析) 162
7.4 Linux内核输入子系统介绍 167
7.4.1 Input子系统概述 168
7.4.2 输入设备结构体 168
7.4.3 输入链路的创建过程 171
7.4.4 使用Input子系统 172
7.4.5 编写输入设备驱动需要完成的工作 174
7.5 触摸屏驱动移植和内核编译 175
7.5.1 修改初始化源码 175
7.5.2 修改硬件驱动源码s3c2440_ts.c 177
7.5.3 修改Kconfig和Makefile 179
7.5.4 配置编译内核 180
7.5.5 触摸屏测试程序设计 181
7.6 小结 182
第8章 USB设备驱动移植 183
8.1 USB协议 183
8.1.1 USB协议的系统主要组成部分 183
8.1.2 总线物理拓扑结构 185
8.1.3 USB设备、配置、接口、端点 185
8.1.4 USB设备状态 188
8.1.5 USB枚举过程 189
8.1.6 USB请求块(URB) 192
8.2 USB主机驱动 196
8.2.1 USB主机驱动结构和功能 196
8.2.2 主机控制器驱动(usb_hcd) 197
8.2.3 OHCI主机控制器驱动 199
8.2.4 S3C24XX OHCI主机控制器驱动实例 200
8.3 USB设备驱动 203
8.3.1 USB骨架程序分析 203
8.3.2 USB驱动移植的时钟设置 207
8.4 USB鼠标键盘驱动 208
8.4.1 USB鼠标驱动代码分析 208
8.4.2 USB键盘驱动代码分析 211
8.4.3 内核中添加USB鼠标键盘驱动 214
8.5 U盘驱动 215
8.5.1 内核配置 215
8.5.2 移植和测试 216
8.6 小结 218
第9章 网卡驱动程序移植 219
9.1 以太网概述 219
9.1.1 以太网连接 219
9.1.2 以太网技术概述 220
9.1.3 以太网的帧结构 222
9.2 网络设备驱动程序体系结构 224
9.2.1 嵌入式Linux网络驱动程序介绍 224
9.2.2 Linux网络设备驱动的体系结构 225
9.2.3 网络设备驱动程序编写方法 225
9.2.4 网络设备驱动程序应用实例 227
9.3 net_device数据结构 228
9.3.1 全局信息 228
9.3.2 硬件信息 229
9.3.3 接口信息 229
9.3.4 设备方法 232
9.3.5 公用成员 234
9.4 DM9000网卡概述 234
9.4.1 DM9000网卡总体介绍 235
9.4.2 DM9000网卡的特点 235
9.4.3 内部寄存器 236
9.4.4 功能描述 240
9.5 DM9000网卡驱动程序移植 241
9.5.1 DM9000网卡连接 241
9.5.2 驱动分析——硬件的数据结构 242
9.5.3 驱动分析——数据读写函数 243
9.5.4 驱动分析——重置网卡 243
9.5.5 驱动分析——初始化网卡 243
9.5.6 驱动分析——打开和关闭网卡 248
9.5.7 驱动分析——数据包的发送与接收 249
9.5.8 DM9000网卡驱动程序移植 251
9.6 小结 254
第10章 音频设备驱动程序移植 255
10.1 音频设备接口 255
10.1.1 PCM(脉冲编码调制)接口 255
10.1.2 IIS(Inter-IC Sound)接口 255
10.1.3 AC97(Audio Codec 1997)接口 255
10.1.4 Linux音频设备驱动框架 256
10.2 Linux音频设备驱动——OSS驱动框架 257
10.2.1 OSS驱动架构硬件 257
10.2.2 OSS驱动架构代码 257
10.2.3 OSS初始化函数oss_init() 259
10.2.4 OSS释放函数oss_cleanup() 260
10.2.5 打开设备文件函数sound_open() 261
10.2.6 录音函数sound_read() 262
10.2.7 播放函数sound_write() 263
10.2.8 控制函数sound_ioctl() 263
10.3 Linux音频设备驱动——ALSA驱动框架 265
10.3.1 card和组件 265
10.3.2 PCM设备 269
10.3.3 控制接口 272
10.3.4 AC97 API音频接口 274
10.4 音频设备应用程序编写 278
10.4.1 DSP接口编程 278
10.4.2 MIXER接口编程 281
10.4.3 ALSA应用程序编程 282
10.5 音频设备驱动移植 284
10.5.1 添加UDA1341结构体 284
10.5.2 修改录音通道 285
10.5.3 内核中添加UDA1341驱动支持 286
10.5.4 移植新内核并进行测试 287
10.6 音频播放程序madplay的移植 288
10.6.1 准备移植需要的源文件 288
10.6.2 交叉编译 288
10.6.3 移植和测试 290
10.6.4 编译中可能遇到的问题 290
10.7 小结 290
第11章 SD卡驱动移植 291
11.1 SD卡简介 291
11.1.1 SD卡系统概念 291
11.1.2 SD卡寄存器 291
11.1.3 SD功能描述 292
11.2 SD卡驱动程序分析 295
11.2.1 host驱动部分 296
11.2.2 core驱动部分 302
11.2.3 card驱动部分 307
11.3 SD卡移植步骤 310
11.3.1 添加延时和中断 310
11.3.2 配置内核 310
11.3.3 烧写新内核 312
11.4 小结 313
第12章 NandFlash驱动移植 314
12.1 NandFlash介绍 314
12.1.1 NandFlash命令介绍 314
12.1.2 NandFlash控制器 315
12.2 NandFlash驱动介绍 316
12.2.1 Nand芯片结构 316
12.2.2 NandFlash驱动分析 317
12.3 NandFlash驱动移植 323
12.3.1 内核的修改 323
12.3.2 内核的配置和编译 325
12.4 小结 326
第4篇 系统移植高级篇 328
第13章 MiniGUI与移植 328
13.1 MiniGUI在上位机中的安装 328
13.1.1 安装需要的安装文件 328
13.1.2 MiniGUI的运行模式 328
13.1.3 编译并安装MiniGUI 329
13.1.4 编译安装MiniGUI需要的图片支持库 331
13.1.5 编译MiniGUI应用程序例子 331
13.2 MiniGUI的交叉编译和移植 332
13.2.1 交叉编译MiniGUI 332
13.2.2 移植MiniGUI程序 334
13.3 小结 336
第14章 Qt开发与Qtopia移植 337
14.1 Qt安装与编程 337
14.1.1 下载安装Qt 337
14.1.2 Qt编程 338
14.1.3 使用qmake生成Makefile 340
14.2 Qtopia Core在X86平台上的安装和应用 341
14.2.1 Qtopia Core安装准备 341
14.2.2 编译Qtopia Core 343
14.2.3 Qtopia在X86平台上的应用开发 343
14.3 Qtopia Core在嵌入式Linux上的移植 347
14.3.1 Qtopia Core移植准备 347
14.3.2 交叉编译Qtopia Core 348
14.3.3 编译内核 350
14.3.4 应用程序开发 351
14.3.5 应用程序移植 354
14.4 小结 354
第15章 嵌入式数据库Berkeley DB移植 355
15.1 数据库的基本概念 355
15.1.1 利用文档和源代码 355
15.1.2 创建环境句柄 355
15.1.3 创建数据库句柄 356
15.1.4 打开数据库 357
15.1.5 DBT结构 357
15.1.6 存取数据 358
15.1.7 关闭数据库 359
15.2 Berkeley DB数据库安装 359
15.2.1 安装成C库 359
15.2.2 安装成C++库 360
15.2.3 交叉编译安装Berkeley DB 360
15.3 使用Berkeley DB数据库 362
15.3.1 代码分析 362
15.3.2 编译运行程序 365
15.4 移植Berkeley DB数据库 366
15.4.1 数据库设计 366
15.4.2 编写应用程序 366
15.4.3 调试和交叉编译应用程序 368
15.4.4 数据库的移植和测试 369
15.5 小结 369
第16章 嵌入式数据库SQLite移植 370
16.1 SQLite支持的SQL语句 370
16.1.1 数据定义语句 370
16.1.2 数据操作语句 371
16.2 SQLite数据库编译、安装和使用 371
16.2.1 安装SQLite 372
16.2.2 利用SQL语句操作SQLite数据库 372
16.2.3 利用C接口访问SQLite数据库 373
16.3 移植SQLite 376
16.3.1 交叉编译SQLite 376
16.3.2 交叉编译应用程序 377
16.4 移植SQLite数据库 377
16.4.1 文件移植 378
16.4.2 运行应用程序 378
16.4.3 测试sqlite3 379
16.5 小结 380
第17章 嵌入式Web服务器BOA移植 381
17.1 BOA介绍 381
17.1.1 BOA的功能 381
17.1.2 BOA流程分析 382
17.1.3 BOA配置信息 385
17.2 BOA编译和HTML页面测试 387
17.2.1 编译BOA源代码 387
17.2.2 设置BOA配置信息 388
17.2.3 测试BOA 388
17.3 CGI脚本测试 390
17.3.1 编写测试代码 390
17.3.2 编译测试程序 390
17.3.3 测试CGI脚本 390
17.4 BOA交叉编译与移植 391
17.4.1 交叉编译BOA 391
17.4.2 准备测试程序 391
17.4.3 配置BOA 392
17.4.4 测试 392
17.5 BOA与SQLite结合 393
17.5.1 通过CGI程序访问SQLite 393
17.5.2 编译和测试 395
17.6 小结 396
第18章 嵌入式Web服务器Thttpd移植 397
18.1 Thttpd介绍 397
18.1.1 Web服务器比较 397
18.1.2 Thttpd的特点 397
18.1.3 Thttpd核心代码分析 398
18.2 Thttpd编译和HTML页面测试 401
18.2.1 配置文件介绍 401
18.2.2 Thttpd编译 402
18.2.3 运行和测试Thttpd 402
18.3 CGI脚本测试 405
18.3.1 编写测试代码 405
18.3.2 编译测试程序 406
18.3.3 测试CGI脚本 406
18.4 Thttpd交叉编译与移植 406
18.4.1 交叉编译Thttpd 406
18.4.2 交叉编译CGI程序 407
18.4.3 移植Thttpd 407
18.4.4 测试 408
18.5 Thttpd与嵌入式数据库结合 408
18.5.1 通过CGI程序访问SQLite 409
18.5.2 编译和测试 411
18.6 小结 411
第19章 JVM及其移植 412
19.1 JVM介绍 412
19.1.1 JVM原理 412
19.1.2 JVM支持的数据类型 413
19.1.3 JVM指令系统 414
19.1.4 JVM寄存器 414
19.1.5 JVM栈结构 414
19.1.6 JVM碎片回收堆 417
19.1.7 JVM异常抛出和异常捕获 417
19.2 类装载 418
19.2.1 装载类的结构体 418
19.2.2 装载类的操作 419
19.3 垃圾回收 421
19.3.1 mark-and-sweep回收算法 422
19.3.2 分代回收算法 423
19.3.3 增量收集 424
19.4 解析器 424
19.4.1 函数Interpret() 424
19.4.2 函数FastInterpret() 425
19.4.3 函数SlowInterpret() 427
19.5 Java编程浅析 428
19.5.1 Java程序命令 428
19.5.2 Java构造函数 428
19.5.3 Java主函数 428
19.5.4 Java程序编译与运行 429
19.6 KVM执行过程 429
19.6.1 KVM启动过程 429
19.6.2 KVM用到的计数器清零 432
19.6.3 KVM初始化内存管理 433
19.6.4 KVM中的哈希表初始化 434
19.6.5 KVM中的事件初始化 435
19.6.6 KVM中的资源释放 435
19.7 PC机安装JVM 435
19.7.1 JVM在Windows上的安装 436
19.7.2 JVM在Linux上的安装 437
19.8 KVM移植和测试 438
19.8.1 SDK安装和环境变量设置 438
19.8.2 修改Makefile和代码 438
19.8.3 KVM编译 439
19.8.4 测试 439
19.8.5 移植 441
19.9 小结 443
第20章 VoIP技术与Linphone编译 444
20.1 VoIP介绍 444
20.1.1 VoIP基本原理 444
20.1.2 VoIP的基本传输过程 445
20.1.3 VoIP的优势 445
20.1.4 VoIP的实现方式 445
20.1.5 VoIP的关键技术 446
20.2 oSIP协议概述 446
20.3 oSIP状态机 447
20.3.1 ICT(Invite Client(outgoing)Transaction)状态机 447
20.3.2 NICT(Non-Invite Client(outgoing)Transaction)状态机 457
20.3.3 IST(Invite Server(incoming)Transaction)状态机 457
20.3.4 NIST(Non-Invite Server(incoming)Transaction)状态机 458
20.4 oSIP解析器 459
20.4.1 初始化解析类型函数osip_body_init() 459
20.4.2 释放函数osip_body_free() 459
20.4.3 字符串到body类型转换函数osip_body_parse() 460
20.4.4 body类型到字符串类型转换函数osip_body_to_str() 460
20.4.5 克隆函数osip_body_clone() 462
20.4.6 oSIP解析器分类 464
20.5 oSIP事务层 464
20.6 SIP建立会话的过程 467
20.7 RTP协议 468
20.7.1 RTP基本概念 468
20.7.2 发送RTP 470
20.7.3 接收RTP 472
20.8 Linphone编译与测试 474
20.8.1 编译Linphone需要的软件包 474
20.8.2 X86平台上编译和安装 475
20.8.3 Linphone测试 478
20.8.4 进一步的测试和开发 481
20.9 Linphone交叉编译 482
20.9.1 Linphone的交叉编译 482
20.9.2 Linphone的测试 484
20.10 小结 486