第1章 驱动总论 1
1.1 总论 1
1.1.1 驱动在内核中的比例 1
1.1.2 驱动开发需要具备的能力 1
1.1.3 驱动开发重点关注的内容 2
1.2 驱动理论与思想 3
1.2.1 分类思想 4
1.2.2 分层思想 4
1.2.3 分离思想 10
1.2.4 总线思想 11
本章小结 11
第2章 内核编程及基础知识点 12
2.1 内核线程 12
2.2 内核定时器 16
2.3 链表 18
2.4 内存操作 18
2.5 I/O端口 20
2.6 内核相关宏 21
2.7 内核态文件操作 22
2.8 内核通知链 25
本章小结 30
第3章 模块与常用字符设备方法 31
3.1 Linux驱动 31
3.2 内核驱动模块剖析 32
3.2.1 内核模块 34
3.2.2 模块工具集 34
3.2.3 模块文件结构分析 36
3.2.4 内核管理 37
3.2.5 Modutils工具包及Module-init-tools移植 37
3.2.6 符号 37
3.2.7 驱动模块之间的依赖 38
3.2.8 模块编译流程细节 38
3.2.9 模块编写 39
3.3 宏观分析Linux驱动 39
3.4 设备文件 41
3.5 设备管理系统 46
3.5.1 自动创建和管理设备文件揭秘 46
3.5.2 devfs、mdev和udev 46
3.5.3 udev基本原理与流程 47
3.5.4 热插拔与冷插拔 48
3.5.5 class 48
3.6 字符设备驱动 50
3.6.1 原始方式 51
3.6.2 静态设定设备号方式 51
3.6.3 使用udev工具自动生成设备文件方式 52
3.6.4 简洁型字符设备驱动——misc字符设备驱动方式 53
3.7 设备操作方法file operations 55
3.7.1 ioctl和unlocked ioctl操作 57
3.7.2 read/write设备方法 65
3.7.3 llseek设备方法 70
3.7.4 mmap设备方法 70
3.7.5 利用mmap在应用层实现硬件操作 75
本章小结 76
第4章 同步和互斥 77
4.1 概述 77
4.2 基本概念 77
4.3 互斥和同步机制 79
4.4 互斥 79
4.4.1 屏蔽中断 79
4.4.2 原子操作 80
4.4.3 自旋锁 81
4.4.4 信号量 82
4.4.5 自旋锁与信号量 83
4.4.6 互斥体:专用于互斥 84
4.5 同步 84
本章小结 86
第5章 中断系统 87
5.1 中断概述 87
5.2 基本概念 87
5.3 中断原理及使用注意事项 89
5.4 中断接口函数 89
5.4.1 中断申请和释放 89
5.4.2 中断共享 90
5.4.3 中断例程之一:按键中断 92
5.4.4 中断例程之二:A/D转换驱动 96
5.5 底半部:tasklet、工作队列 104
5.6 时间管理 106
本章小结 107
第6章 设备高级特性 108
6.1 字符设备file_operations的高级特性 108
6.2 Linux设备驱动的I/O模型 109
6.2.1 同步阻塞I/O 109
6.2.2 同步非阻塞I/O 109
6.2.3 异步阻塞I/O 110
6.2.4 异步非阻塞I/O 110
6.2.5 异步通知 110
6.2.6 同步阻塞型I/O的实现:建立在等待队列的基础上 117
6.2.7 异步阻塞型I/O的实现:基于poll系统调用操作接口函数 121
6.3 设备复用 126
本章小结 128
第7章 高级类型驱动 129
7.1 misc类型驱动 129
7.1.1 概述 129
7.1.2 结构与流程分析 129
7.1.3 关于设备节点的创建 130
7.2 input类型驱动 130
7.2.1 input驱动概述 130
7.2.2 三个主要结构体 133
7.2.3 Input驱动步骤 136
7.3 触摸屏驱动 144
7.4 I2C驱动 150
7.4.1 I2C总线接口 150
7.4.2 I2C内核驱动层及相关文件分析 151
7.4.3 重要的数据结构及相关联系 153
7.4.4 流程分析 157
7.4.5 i2c-tools 165
7.5 块设备驱动 169
7.5.1 块设备驱动分析 169
7.5.2 制作一个块设备例子:RamDisk驱动 174
本章小结 177
第8章 虚拟文件系统 178
8.1 内核在线窗口——虚拟文件系统 178
8.2 proc文件系统 179
8.2.1 目录介绍 179
8.2.2 创建目录与文件 184
8.2.3 相关应用 185
8.3 sys文件系统 186
8.3.1 sys文件系统概述 186
8.3.2 sys文件目录 187
8.3.3 sys文件系统接口函数与创建文件夹模板 189
本章小结 192
第9章 设备驱动模型 193
9.1 设备驱动模型概述 193
9.2 sys文件系统与设备驱动模型 194
9.3 认识设备驱动模型 195
9.4 两大基石kobject和kset 197
9.4.1 内核对象kobject 197
9.4.2 另外一个基石kset 199
9.5 subsystem 203
9.6 三角关系核心——总线、设备、驱动 204
9.6.1 总线 204
9.6.2 设备 207
9.6.3 驱动 209
9.7 platform总线 211
9.8 serio总线 220
9.8.1 serio子系统介绍 220
9.8.2 serio子系统框架 220
9.8.3 主要数据结构 223
本章小结 229
第10章 嵌入式Linux文件系统 230
10.1 文件系统介绍 230
10.2 创建最简单的根文件系统 233
10.3 YAFFS文件系统移植 241
10.4 JFFS2文件系统制作 250
10.5 ramdisk文件系统制作 250
10.6 cramfs文件系统制作 252
本章小结 253
第11章 开发与调试技巧 254
11.1 vim使用 254
11.2 工具使用 254
11.3 printk使用技巧 259
11.4 使用proc在线打开打印开关 260
11.5 异常崩溃oops处理 261
11.6 动态修改模块参数 269
11.7 使用devmem2操作物理地址 269
11.8 时间测量 270
11.9 善于使用开源项目 270
本章小结 271
第12章 底层驱动规划与管理探索 272
12.1 底层驱动规划探索 272
12.1.1 设计理念概述 272
12.1.2 底层平台软件设计 273
12.1.3 底层平台软件管理规则 276
12.1.4 独立驱动模块的版本管理 276
12.1.5 提供最基本的系统 278
12.1.6 驱动开发注意事项 278
12.1.7 版本库 279
12.1.8 平台版本构建发布 282
12.2 研发管理 283
12.2.1 嵌入式软件研发管理畅想 284
12.2.2 嵌入式软件V字形开发模式 285
12.3 软件开发文档 286
12.3.1 可行性分析报告 286
12.3.2 嵌入式软件系统设计方案文档 289
12.3.3 嵌入式软件概要设计 290
12.3.4 嵌入式软件详细设计 293
12.3.5 案例分析 294
本章小结 295
第13章 Linux设备驱动编程规范 296
13.1 基本原则 296
13.2 布局 297
13.3 基本格式 299
13.4 对齐 300
13.5 空行空格 301
13.6 注释 301
13.7 命名 302
13.8 函数 302
13.9 可靠性 303
13.1 0其他 303
本章小结 305
参考文献 306