内容介绍
本书全面介绍了嵌入式Linux系统开发过程中,从底层系统支持到上层GUI应用的方方面面,内容涵盖Linux操作系统的安装及相关工具的使用、配置,嵌入式编程所需要的基础知识(交叉编译工具的选项设置、Makefile语法、ARM汇编指令等),硬件部件的使用及编程(囊括了常见硬件,?热?UART、I*IC、LCD等),U-Boot、Linux内核的分析、配置和移植,根文件系统的构造(包括移植busybox、glibc、制作映象文件等),内核调试技术(比如添加kgdb补丁、栈回溯等),驱动程序编写及移植(LED、按键、扩展串口、网卡、硬盘、SD卡、LCD和USB等),GUI系统的移植(包含两个GUI系统:基于Qtopia和基于X),应用程序调试技术。
本书从**简单的点亮一个LED开始,由浅入深地讲解,使读者**终可以配置、移植、裁剪内核,编写驱动程序,移植GUI系统,掌握整个嵌入式Linux系统的开发方法。
本书由浅入深,循序渐进,适合刚接触嵌入式Linux的初学者学习,也可作为大、中专院校嵌入式相关专业本科生、研究生的教材。
目录
- 第 1篇 嵌入式Linux开发环境构建篇
- 第 1章 嵌入式Linux开发概述 2
- 1.1 嵌入式系统介绍 2
- 1.1.1 嵌入式系统的定义和特点 2
- 1.1.2 嵌入式技术的发展历史 3
- 1.2 基于ARM处理器的嵌入式Linux系统 5
- 1.2.1 ARM处理器介绍 5
- 1.2.2 在嵌入式系统中选择嵌入式Linux的理由 8
- 第 2章 嵌入式Linux开发环境构建 10
- 2.1 硬件环境构建 10
- 2.1.1 主机与目标板结合的交叉开发模式 10
- 2.1.2 硬件要求 11
- 2.2 软件环境构建 12
- 2.2.1 主机Linux操作系统的安装 12
- 2.2.2 主机Linux操作系统上网络服务的配置与启动 18
- 2.2.3 在主机Linux操作系统中安装基本的开发环境 23
- 2.2.4 光盘的内容结构及安装 23
- 2.2.5 安装交叉编译工具链 25
- 2.2.6 书中写作风格的约定 28
- 第3章 嵌入式编程基础知识 29
- 3.1 交叉编译工具选项说明 29
- 3.1.1 arm-linux-gcc选项 29
- 3.1.2 arm-linux-ld选项 38
- 3.1.3 arm-linux-objcopy选项 41
- 3.1.4 arm-linux-objdump选项 43
- 3.1.5 汇编代码、机器码和存储器的关系以及数据的表示 44
- 3.2 Makefile介绍 45
- 3.2.1 Makefile规则 45
- 3.2.2 Makefile文件里的赋值方法 46
- 3.2.3 Makefile常用函数 46
- 3.3 常用ARM汇编指令及ATPCS规则 52
- 3.3.1 本书使用的所有汇编指令 52
- 3.3.2 ARM-THUMB子程序调用规则ATPCS 55
- 第4章 Windows、Linux环境下相关工具、命令的使用 58
- 4.1 Windows环境下的工具介绍 58
- 4.1.1 代码阅读、编辑工具Source Insight 58
- 4.1.2 文件传输工具Cuteftp 63
- 4.1.3 远程登录工具SecureCRT 63
- 4.1.4 TFTP服务器软件Tftpd32 64
- 4.2 Linux环境下的工具、命令介绍 65
- 4.2.1 代码阅读、编辑工具KScope 65
- 4.2.2 远程登录工具C-kermit 69
- 4.2.3 编辑命令vi 69
- 4.2.4 查找命令grep、find命令 71
- 4.2.5 在线手册查看命令man 72
- 4.2.6 其他命令:tar、diff、patch 73
- 第 2篇 ARM9嵌入式系统基础实例篇
- 第5章 GPIO接口 76
- 5.1 GPIO硬件介绍 76
- 5.1.1 通过寄存器来操作GPIO引脚 76
- 5.1.2 怎样使用软件来访问硬件 77
- 5.2 GPIO操作实例:LED和按键 80
- 5.2.1 硬件设计 80
- 5.2.2 程序设计及代码详解 80
- 5.2.3 实例测试 86
- 第6章 存储器控制 87
- 6.1 使用存储控制器访问外设的原理 87
- 6.1.1 S3C2410 S3C2440的地址空间 87
- 6.1.2 存储控制器与外设的关系 89
- 6.1.3 存储控制器的寄存器使用方法 91
- 6.2 存储控制器操作实例:使用SDRAM 94
- 6.2.1 代码详解及程序的复制、跳转过程 94
- 6.2.2 实例测试 97
- 第7章 内存管理单元MMU 98
- 7.1 内存管理单元MMU介绍 98
- 7.1.1 S3C2410 S3C2440 MMU特性 98
- 7.1.2 S3C2410 S3C2440 MMU地址变换过程 99
- 7.1.3 内存的访问权限检查 107
- 7.1.4 TLB的作用 109
- 7.1.5 Cache的作用 110
- 7.1.6 S3C2410 S3C2440 MMU、TLB、Cache的控制指令 113
- 7.2 MMU使用实例:地址映射 113
- 7.2.1 程序设计 113
- 7.2.2 代码详解 114
- 7.2.3 实例测试 124
- 第8章 NAND Flash控制器 125
- 8.1 NAND Flash介绍和NAND Flash控制器使用 125
- 8.1.1 Flash介绍 125
- 8.1.2 NAND Flash的物理结构 127
- 8.1.3 NAND Flash访问方法 128
- 8.1.4 S3C2410 S3C2440 NAND Flash控制器介绍 134
- 8.2 NAND Flash控制器操作实例:读Flash 135
- 8.2.1 读NAND Flash的步骤 135
- 8.2.2 代码详解 137
- 第9章 中断体系结构 143
- 9.1 S3C2410 S3C2440中断体系结构 143
- 9.1.1 ARM体系CPU的7种工作模式 143
- 9.1.2 S3C2410 S3C2440中断控制器 146
- 9.1.3 中断控制器寄存器 149
- 9.2 中断控制器操作实例:外部中断 151
- 9.2.1 按键中断代码详解 151
- 9.2.2 实例测试 158
- 第 10章 系统时钟和定时器 159
- 10.1 时钟体系及各类时钟部件 159
- 10.1.1 S3C2410 S3C2440时钟体系 159
- 10.1.2 PWM定时器 161
- 10.1.3 WATCHDOG定时器 164
- 10.2 MPLL和定时器操作实例 166
- 10.2.1 程序设计 166
- 10.2.2 代码详解 166
- 10.2.3 实例测试 170
- 第 11章 通用异步收发器UART 171
- 11.1 UART原理及UART部件使用方法 171
- 11.1.1 UART原理说明 171
- 11.1.2 S3C2410 S3C2440 UART的特性 172
- 11.1.3 S3C2410 S3C2440 UART的使用 173
- 11.2 UART操作实例 177
- 11.2.1 代码详解 177
- 11.2.2 实例测试 180
- 第 12章 I*IC接口 181
- 12.1 I*IC总线协议及硬件介绍 181
- 12.1.1 I*IC总线协议 181
- 12.1.2 S3C2410 S3C2440 I*IC总线控制器 184
- 12.2 I*IC总线操作实例 187
- 12.2.1 I*IC接口RTC芯片M41t11的操作方法 187
- 12.2.2 程序设计 188
- 12.2.3 设置 读取M41t11的源码详解 188
- 12.2.4 I*IC实例的连接脚本 195
- 12.2.5 实例测试 196
- 第 13章 LCD控制器 197
- 13.1 LCD和LCD控制器 197
- 13.1.1 LCD显示器 197
- 13.1.2 S3C2410 S3C2440 LCD控制器介绍 199
- 13.2 TFT LCD显示实例 210
- 13.2.1 程序设计 210
- 13.2.2 代码详解 210
- 13.2.3 实例测试 221
- 第 14章 ADC和触摸屏接口 222
- 14.1 ADC和触摸屏硬件介绍及使用 222
- 14.1.1 S3C2410 S3C2440 ADC和触摸屏接口概述 222
- 14.1.2 S3C3410 S3C2440 ADC接口的使用方法 224
- 14.1.3 触摸屏原理及接口 226
- 14.2 ADC和触摸屏操作实例 230
- 14.2.1 硬件设计 230
- 14.2.2 程序设计 230
- 14.2.3 测试ADC的代码详解 230
- 14.2.4 测试触摸屏的代码详解 232
- 14.2.5 实例测试 237
- 第3篇 嵌入式Linux系统移植篇
- 第 15章 移植U-Boot 240
- 15.1 Bootloader简介 240
- 15.1.1 Bootloader的概念 240
- 15.1.2 Bootloader的结构和启动过程 241
- 15.1.3 常用Bootloader介绍 246
- 15.2 U-Boot分析与移植 246
- 15.2.1 U-Boot工程简介 246
- 15.2.2 U-Boot源码结构 247
- 15.2.3 U-Boot的配置、编译、连接过程 249
- 15.2.4 U-Boot的启动过程源码分析 257
- 15.2.5 U-Boot的移植 264
- 15.2.6 U-Boot的常用命令 288
- 15.2.7 使用U-Boot来执行程序 292
- 第 16章 移植Linux内核 293
- 16.1 Linux版本及特点 293
- 16.2 Linux移植准备 294
- 16.2.1 获取内核源码 294
- 16.2.2 内核源码结构及Makefile分析 295
- 16.2.3 内核的Kconfig分析 304
- 16.2.4 Linux内核配置选项 309
- 16.3 Linux内核移植 313
- 16.3.1 Linux内核启动过程概述 313
- 16.3.2 修改内核以支持S3C2410 S3C2440开发板 314
- 16.3.3 修改MTD分区 327
- 16.3.4 移植YAFFS文件系统 330
- 16.3.5 编译、烧写、启动内核 333
- 第 17章 构建Linux根文件系统 335
- 17.1 Linux文件系统概述 335
- 17.1.1 Linux文件系统的特点 335
- 17.1.2 Linux根文件系统目录结构 336
- 17.1.3 Linux文件属性介绍 340
- 17.2 移植Busybox 341
- 17.2.1 Busybox概述 341
- 17.2.2 init进程介绍及用户程序启动过程 342
- 17.2.3 编译 安装Busybox 346
- 17.3 使用glibc库 350
- 17.3.1 glibc库的组成 350
- 17.3.2 安装glibc库 351
- 17.4 构建根文件系统 352
- 17.4.1 构建etc目录 352
- 17.4.2 构建dev目录 354
- 17.4.3 构建其他目录 356
- 17.4.4 制作 使用yaffs文件系统映象文件 356
- 17.4.5 制作 使用jffs2文件系统映象文件 360
- 第 18章 Linux内核调试技术 362
- 18.1 内核打印函数printk 362
- 18.1.1 printk的使用 362
- 18.1.2 串口控制台 364
- 18.2 内核源码级别的调试方法 366
- 18.2.1 内核调试工具KGDB的作用与原理 366
- 18.2.2 给内核添加KGDB功能支持S3C2410 S3C2440 367
- 18.2.3 结合可视化图形前端DDD和gdb来调试内核 372
- 18.3 Oops信息及栈回溯 375
- 18.3.1 Oops信息来源及格式 375
- 18.3.2 配置内核使Oops信息的栈回溯信息更直观 376
- 18.3.3 使用Oops信息调试内核的实例 376
- 18.3.4 使用Oops的栈信息手工进行栈回溯 380
- 第4篇 嵌入式Linux设备驱动开发篇
- 第 19章 字符设备驱动程序 384
- 19.1 Linux驱动程序开发概述 384
- 19.1.1 应用程序、库、内核、驱动程序的关系 384
- 19.1.2 Linux驱动程序的分类和开发步骤 385
- 19.1.3 驱动程序的加载和卸载 387
- 19.2 字符设备驱动程序开发 387
- 19.2.1 字符设备驱动程序中重要的数据结构和函数 387
- 19.2.2 LED驱动程序源码分析 389
- 第 20章 Linux异常处理体系结构 396
- 20.1 Linux异常处理体系结构概述 396
- 20.1.1 Linux异常处理的层次结构 396
- 20.1.2 常见的异常 400
- 20.2 Linux中断处理体系结构 401
- 20.2.1 中断处理体系结构的初始化 401
- 20.2.2 用户注册中断处理函数的过程 404
- 20.2.3 中断的处理过程 406
- 20.2.4 卸载中断处理函数 409
- 20.3 使用中断的驱动程序示例 410
- 20.3.1 按键驱动程序源码分析 410
- 20.3.2 测试程序情景分析 415
- 第 21章 扩展串口驱动程序移植 419
- 21.1 串口驱动程序框架概述 419
- 21.1.1 串口驱动程序术语介绍 419
- 21.1.2 串口驱动程序的4层结构 420
- 21.2 扩展串口驱动程序移植 423
- 21.2.1 串口驱动程序低层代码分析 423
- 21.2.2 修改代码以支持扩展串口 425
- 21.2.3 测试扩展串口 429
- 第 22章 网卡驱动程序移植 431
- 22.1 CS8900A网卡驱动程序移植 431
- 22.1.1 CS8900A网卡特性 431
- 22.1.2 CS8900A网卡驱动程序修改 432
- 22.2 DM9000网卡驱动程序移植 441
- 22.2.1 DM9000网卡特性 441
- 22.2.2 DM9000网卡驱动程序修改 442
- 第 23章 IDE接口和SD卡驱动程序移植 450
- 23.1 IDE接口驱动程序移植 450
- 23.1.1 IDE接口相关概念介绍 450
- 23.1.2 IDE接口驱动程序移植 452
- 23.1.3 IDE接口驱动程序测试 461
- 23.2 SD卡驱动程序移植 464
- 23.2.1 SD卡相关概念介绍 464
- 23.2.2 SD卡驱动程序移植 465
- 23.2.3 SD卡驱动程序测试 472
- 23.2.4 磁盘分区表 473
- 第 24章 LCD和USB驱动程序移植 475
- 24.1 LCD驱动程序移植 475
- 24.1.1 LCD和USB键盘驱动程序框架 475
- 24.1.2 S3C2410 S3C2440 LCD控制器驱动程序移植 479
- 24.2 USB驱动程序移植 489
- 24.2.1 USB驱动程序概述 489
- 24.2.2 配置内核支持USB键盘、USB鼠标和USB硬盘 491
- 24.2.3 USB设备的使用 492
- 第5篇 嵌入式Linux系统应用开发篇
- 第 25章 嵌入式GUI开发 496
- 25.1 嵌入式GUI介绍 496
- 25.1.1 Linux桌面GUI系统的发展 496
- 25.1.2 嵌入式Linux中的几种GUI 499
- 25.2 Qtopia移植 501
- 25.2.1 主机开发环境的搭建 501
- 25.2.2 交叉编译、安装Qtopia 2.2.0 502
- 25.2.3 开发自己的Qt GUI程序 514
- 25.2.4 在主机上使用模拟软件开发、调试嵌入式Qt GUI程序 518
- 第 26章 基于X的GUI开发 524
- 26.1 X Window概述 524
- 26.1.1 X协议介绍 524
- 26.1.2 窗口管理器(Window manager) 526
- 26.1.3 桌面环境(Desktop environment) 526
- 26.2 交叉编译工具包Scratchbox 526
- 26.2.1 Scratchbox介绍 527
- 26.2.2 安装Scratchbox及编译工具 528
- 26.2.3 在Scratchbox里安装交叉编译工具链 529
- 26.2.4 安装其他开发工具 535
- 26.3 移植X 536
- 26.3.1 编译软件的基本知识 536
- 26.3.2 编译X的依赖软件 539
- 26.3.3 编译Xorg 542
- 26.4 移植Matchbox 547
- 26.4.1 下载源代码 548
- 26.4.2 编译Matchbox 548
- 26.4.3 运行、试验Matchbox 550
- 26.5 移植GTK 553
- 26.5.1 GTK 介绍 553
- 26.5.2 GTK 移植 553
- 26.6 移植基于GTK X的GUI程序 555
- 26.6.1 xterm移植 556
- 26.6.2 gtkboard移植 557
- 26.6.3 裁剪文件系统 560
- 第 27章 Linux应用程序调试技术 564
- 27.1 使用strace工具跟踪系统调用和信号 564
- 27.1.1 strace介绍及移植 564
- 27.1.2 使用strace来调试程序 565
- 27.2 内存调试工具 568
- 27.2.1 使用memwatch进行内存调试 568
- 27.2.2 其他内存工具介绍:mtrace、dmalloc、yamd 571
- 27.3 段错误的调试方法 573
- 27.3.1 使用库函数backtrace和backtrace_symbols定位段错误 573
- 27.3.2 段错误调试实例 574
- 参考文献 578