嵌入式Linux高级驱动教程

出版日期:2014-9
ISBN:9787121230267
作者:深圳信盈达电子有限公司,陈志发,周中孝
页数:604页

作者简介

本书涉及嵌入式Linux系统设备驱动开发的各个环节。全书共21章,内容包括:Linux系统基本操作,嵌入式Linux开发环境的搭建,Linux设备驱动的概念,Linux内核模块编程,字符设备驱动(含LED驱动)的开发及完善,内核同步机制,中断驱动,内核工作队列,内核定时器,平台设备、LCD设备、Linux触摸屏和温度传感器的驱动,以及Linux内核各子系统(clock子系统、输入子系统、IIC子系统、SPI子系统和MTD子系统)的介绍。本书由深圳信盈达嵌入式学院的嵌入式开发工程师编写,并配备了相关的实验和完整的驱动程序代码及测试应用程序代码。

书籍目录

第1章  Linux基础知识
1
1.1 Linux历史介绍
1
1.2 Linux 常用命令
1
1.2.1 文件管理命令
1
1.2.2 磁盘相关命令(fdisk)
9
1.2.3 文档编辑命令
10
1.2.4 文件传输命令
11
1.2.5 磁盘维护命令
12
1.2.6 系统设置命令
12
1.2.7 备份压缩命令
13
1.3 Linux环境编程入门
14
1.3.1 GCC介绍
14
1.3.2 GNU Make 基本语法
15
1.3.3 Makefile 通用模块
20
1.4 Linux内核版本
21
1.5 Linux内核开发者社区
22
1.6 shell 编程入门
22
1.6.1 shell里的流程控制
26
1.6.2 Here Documents
31
1.6.3 shell里的函数
32
1.6.4 命令行参数
33
1.6.5 shell脚本示例
33
1.6.6 脚本调试
34
1.7 vim编辑器
35
1.7.1 模式
35
1.7.2 常用命令
36
1.7.3 配置文件
38
第2章 嵌入式Linux驱动开发环境搭建
40
2.1 引言
40
2.2 交叉编译器
42
2.2.1 交叉编译器概念
42
2.2.2 交叉编译器获取
42
2.2.3 交叉编译器安装
42
2.2.4 交叉编译器使用
43
2.3 嵌入式开发串口终端
44
2.3.1 串口终端用途介绍
44
2.3.2 Windows下超级终端介绍
45
2.3.3 Linux下Minicom 串口终端介绍
46
2.4 嵌入式开发相关下载工具
50
2.4.1 Windows下TFTP下载软件
50
2.4.2 Linux下TFTP服务
50
2.4.3 Linux 下NFS服务器
51
2.5 启动加载程序的使用和移植
52
2.5.1 u-boot常用命令
52
2.5.2 u-boot常用环境变量介绍
53
2.5.3 u-boot移植到mini2440方法
53
2.6 为mini2440编译内核
56
2.7 根文件系统制作
56
2.7.1 根文件系统的作用
56
2.7.2 根文件系统的制作步骤
57
2.8 J-Link仿真器使用
59
2.8.1 J-Link功能简介
59
2.8.2 J-Link功能配置及使用范例
60
第3章 Linux设备驱动简介
63
3.1 Linux设备驱动概述
63
3.2 Linux内核结构
63
3.2.1 Linux内核空间划分
63
3.2.2 Linux用户空间
64
3.2.3 Linux内核空间
64
3.2.4 用户态和内核态
64
3.2.5 进程上下文和中断上下文
64
3.3 Linux设备驱动特点
65
3.3.1 设备分类
65
3.3.2 设备号
65
3.3.3 模块和设备驱动关系
66
3.4 内核模块的主要相关命令
66
3.5 内核驱动信息打印—printk
67
第4章 Linux内核模块编程
71
4.1 认识Linux模块
71
4.1.1 一个最简单的Linux内核模块
71
4.1.2 Linux内核模块程序结构
74
4.1.3 helloworld.c模块Makefile 文件编写
76
4.1.4 helloworld模块编译
76
4.2 模块编程形式2:多模块——模块间有依赖关系
76
4.2.1 模块符号导出
76
4.2.2 多模块C代码编程示例
77
4.2.3 多模块Makefile编译编程示例
78
4.2.4 编译和测试模块
78
4.2.5 多模块编程总结
79
4.3 模块编程形式3:模块传递参数
79
4.3.1 模块传递参数关键宏定义
79
4.3.2 module_param () 介绍
79
4.3.3 模块传递参数示例C代码
81
4.3.4 模块传递参数示例Makefile
82
4.3.5 编译和测试模块传递参数功能
82
4.3.6 模块传递参数功能总结
83
4.4 模块编程形式4:多个C文件编译为一个模块
84
4.4.1 多个C文件模块示例C代码
84
4.4.2 多个C文件模块示例Makefile代码
85
4.4.3 编译和测试模块
85
4.4.4 多个C文件模块编程总结
86
第5章 字符设备驱动开发
87
5.1 Linux设备驱动特点
87
5.1.1 Linux系统3大类设备特点
87
5.1.2 Linux内核框架
88
5.1.3 字符设备的几种编程模型
89
5.2 字符设备相关重要结构
89
5.2.1 struct file_operaions结构
89
5.2.2 struct inode结构
92
5.2.3 struct file结构
96
5.3 杂项设备驱动模板
97
5.3.1 杂项设备注册和注销
98
5.3.2 杂项设备驱动测试
99
5.3.3 杂项设备驱动模型示例
101
5.4 早期标准字符设备驱动模板
105
5.4.1 早期标准字符设备驱动注册和注销
105
5.4.2 早期标准字符设备驱动模型示例
106
5.4.3 早期标准字符设备驱动模型测试
109
5.5 Linux 2.6标准字符设备驱动模型
112
5.5.1 Linux 2.6标准字符设备驱动核心结构:struct cdev
112
5.5.2 Linux 2.6标准字符设备驱动设备号
112
5.5.3 Linux 2.6标准字符设备驱动相关API函数
113
5.5.4 Linux 2.6标准字符设备驱动编写流程
115
5.5.5 Linux 2.6标准字符设备驱动模型示例
115
5.5.6 Linux 2.6标准字符设备驱动程序测试
120
5.6 字符设备驱动模型小结
122
5.7 早期字符设备驱动自动生成设备节点文件
123
5.7.1 mdev的介绍及使用方法
123
5.7.2 相关数据结构、函数介绍
124
5.7.3 自动创建设备文件范例
126
5.7.4 自动创建设备文件小结
133
第6章 字符设备LED驱动
135
6.1 LED硬件原理图
135
6.2 LED点灯原理分析
135
6.3 字符设备驱动open接口
136
6.3.1 open接口参数
136
6.3.2 open 接口函数框架
136
6.4 release接口函数
137
6.4.1 release 接口函数的作用
137
6.4.2 release接口函数框架
137
6.5 字符设备驱动write接口
137
6.5.1 write接口参数说明
137
6.5.2 与write接口代码相关的常用API
138
6.5.3 write 接口函数框架
138
6.6 字符设备驱动read接口
139
6.6.1 read接口参数
139
6.6.2 与read接口代码相关的常用API
139
6.6.3 read 接口函数框架
139
6.7 llseek接口实现
140
6.7.1 llseek接口参数
140
6.7.2 llsek接口函数框架
140
6.7.3 重写能与llseek配套的write函数框架
141
6.7.4 重写能与llseek配套的read函数框架
142
6.8 LED驱动程序示例
143
6.8.1 LED驱动程序要使用到的核心函数
143
6.8.2 LED驱动程序示例
143
6.9 ioctl控制接口
154
6.9.1 用户空间ioctl系统调用
154
6.9.2 内核空间驱动ioctl的方法
154
6.9.3 ioctl接口函数框架示例
156
6.9.4 LED驱动添加标准ioctl接口控制LED的范例
158
第7章 内核同步机制
172
7.1 引言
172
7.2 原子操作
172
7.2.1 原子操作概念
172
7.2.2 原子操作相关API
173
7.2.3 简单原子操作使用例子
176
7.3 信号量
181
7.3.1 信号量概念
181
7.3.2 信号量相关API
181
7.3.3 简单信号量使用例子
183
7.4 读写信号量(rw_semaphore)
188
7.4.1 读写信号量概念
188
7.4.2 读写信号量相关API
189
7.5 自旋锁
191
7.5.1 自旋锁概念
192
7.5.2 自旋锁相关API
192
7.5.3 自旋锁使用方法小结
197
第8章 LED驱动完善—添加同步机制代码
199
8.1 信号量实现LED设备独占
199
8.1.1 添加互斥量代码实现独占功能示例
199
8.1.2 应用程序测试信号量独占功能
205
8.2 原子操作实现LED设备独占
206
8.2.1 原子操作代码实现独占功能示例
206
8.2.2 测试应用程序:原子操作独占功能
213
8.3 自旋锁实现LED设备并发控制
214
8.3.1 SMP并发分析
214
8.3.2 自旋锁代码实现设备并发控制功能示例
215
8.3.3 应用程序测试自旋锁并发控制功能
221
8.4 等待队列
222
8.4.1 为什么要使用等待队列
222
8.4.2 等待队列头数据结构
222
8.4.3 等待队列的睡眠过程
222
8.4.4 等待队列的唤醒过程
225
8.4.5 等待队列API
227
8.5 各种同步机制的比较
231
第9章 Linux中断驱动程序
232
9.1 什么是中断
232
9.2 Linux 2.6 中断处理原理
232
9.3 Linux中断处理程序架构
235
9.3.1 底半部实现方法之一:tasklet
235
9.3.2 底半部实现方法之二:工作队列
239
9.4 Linux 2.6 中断API
244
9.4.1 注册中断
244
9.4.2 注销中断
245
9.4.3 禁止中断
246
9.4.4 使能中断
246
9.4.5 共享中断
247
9.5 按键设备驱动程序
247
9.5.1 开发板按键硬件原理图
247
9.5.2 软件设计程序分析
247
9.5.3 按键驱动程序代码示例
248
9.5.4 按键驱动应用程序测试结果
258
9.6 非阻塞I/O和阻塞I/O
261
9.6.1 概念
261
9.6.2 如何在设备驱动实现阻塞功能
261
9.6.3 驱动阻塞和非阻塞模板
262
9.7 按键驱动程序完善:新增加poll接口
263
9.7.1 键驱动程序poll接口示例代码清单
263
9.7.2 poll接口应用程序编写
273
9.7.3 测试结果及分析
276
第10章 内核工作队列
281
10.1 内核工作队列概述
281
10.2 Linux workqueue工作原理
281
10.2.1 数据结构work_struct
282
10.2.2 数据结构workqueue_struct
282
10.2.3 数据结构cpu_workqueue_struct
283
10.2.4 workqueue原理分析
283
10.3 Linux内核共享工作队列
284
10.3.1 共享工作队列介绍
284
10.3.2 内核共享工作队列API
284
10.3.3 内核共享工作队列使用步骤
285
10.3.4 内核共享工作队列示例
286
10.3.5 内核共享工作队列测试及结果分析
287
10.4 自定义内核工作队列
288
10.4.1 创建工作队列
288
10.4.2 调度工作队列
288
10.4.3 销毁工作队列
289
10.4.4 自定义工作队列示例
289
10.4.5 自定义工作队列测试及结果分析
292
10.5 延时工作队列
292
10.5.1 延时工作队列介绍
292
10.5.2 延时工作队列数据结构和核心API
293
10.5.3 延时工作队列示例
294
10.5.4 延时工作队列测试及结果分析
296
10.6 内核微线程tasklet
296
10.6.1 内核微线程简介
296
10.6.2 tasklet的创建及enable/disable函数
297
10.6.3 tasklet调度函数
298
10.6.4 微线程kill函数
299
10.6.5 tasklet微线程的编程步骤
300
10.6.6 tasklet的简单示例
301
10.6.7 微线程的简单示例测试及结果分析
302
10.7 按键设备驱动程序改进——使用延时工作队列实现消抖
303
10.7.1 按键抖动机械特性分析
303
10.7.2 软件设备框架分析
304
10.7.3 增加延时工作队列机制的按键驱动代码示例
304
10.7.4 添加延时工作队列机制的按键驱动程序测试及结果分析
315
第11章 内核定时器
317
11.1 内核定时器概述
317
11.2 相关数据结构
317
11.3 内核定时器函数
318
11.3.1 静态定义并初始化定时器API
318
11.3.2 定时器初始化
318
11.3.3 向内核添加定时器
319
11.3.4 定时器时间修改
319
11.3.5 定时器取消
320
11.3.6 定时情况查询
320
11.4 定时器编程步骤
320
11.5 内核定时器编程简单示例
321
11.5.1 内核定时器示例代码
321
11.5.2 内核定时示例代码测试结果分析
322
11.6 按键设备驱动程序改进—使用内核定时器实现消抖
323
11.6.1 修改按键驱动代码
323
11.6.2 改进版本的按键驱动程序测试及结果分析
335
第12章 平台设备驱动模型
337
12.1 平台设备和驱动初识
337
12.1.1 总线驱动模型简介
337
12.1.2 平台总线驱动模型特点
337
12.2 平台设备驱动模型分层
337
12.2.1 platform 设备层编程
337
12.2.2 设备层核心数据结构
338
12.2.3 platform 设备层API
339
12.2.4 platform驱动层编程
340
12.2.5 平台驱动层核心数据结构
341
12.2.6 platform 驱动层核心API
342
12.3 基于平台模型的LED设备驱动
343
12.3.1 平台模型LED驱动软件框架分析
343
12.3.2 平台模型LED驱动层编程
344
12.3.3 平台模型设备层编程
346
12.3.4 平台模型LED驱动测试结果分析
353
第13章 LCD设备驱动
355
13.1 FrameBuffer 的原理
355
13.2 FrameBuffer在Linux中的实现和机制
355
13.3 内核自带s3c2440 LCD驱动移植
356
13.3.1 LCD硬件资源分析
356
13.3.2 LCD工作时序参数分析
357
13.3.3 驱动探测函数简要分析
360
13.3.4 LCD驱动平台数据结构
360
13.3.5 LCD驱动平台资源分析
363
13.3.6 LCD设备驱动设备层编程
364
13.4 LCD设备驱动分析
365
13.4.1 LCD设备驱动核心结构struct fb_info
366
13.4.2 LCD设备驱动可变参数结构struct fb_var_screeninfo
367
13.4.3 LCD设备驱动固定参数结构struct fb_fix_screeninfo
368
13.4.4 LCD设备驱动硬件操作方法结构struct fb_ops
369
13.4.5 LCD设备驱动probe函数分析
371
13.4.6 LCD设备驱动remove函数分析
384
13.4.7 LCD设备驱动suspend函数分析
385
13.4.8 LCD设备驱动resume函数分析
385
13.4.9 LCD硬件操作函数结构struct fb_ops *fbop分析
386
13.5 LCD应用程序编程示例
391
13.5.1 LCD显示汉字示例代码
391
13.5.2 LCD显示BMP图片示例代码
399
第14章 Linux下clock子系统
407
14.1 clk时钟管理概念
407
14.2 核心数据结构struct clk
407
14.3 clocks链表
408
14.4 clk平台通用操作
408
14.5 clk与pm(电源管理)
409
14.6 clk时钟系统实现原理
409
14.7 clk时钟系统的应用
409
第15章 Linux输入子系统
413
15.1 输入子系统概述
413
15.2 输入子系统的结构
413
15.3 Linux中输入设备驱动的分层
414
15.4 关键结构体
414
15.5 软件设计流程
418
15.6 常用相关API
418
15.7 使用输入子系统的例子
420
15.8 小结
424
第16章 Linux触摸屏驱动
425
16.1 电阻式触摸屏工作原理
425
16.2 s3c2440中的触摸屏接口
425
16.3 mini2440的触摸屏驱动
426
16.3.1 初始化
431
16.3.2 中断处理
433
16.3.3 测试与校准
434
16.4 触摸屏驱动总结
436
第17章 网络设备驱动
437
17.1 网络设备概述
437
17.2 DM9000芯片工作原理介绍
438
17.2.1 DM9000功能介绍
438
17.2.2 DM9000结构框图
438
17.3 DM9000的引脚
438
17.4 DM9000的寄存器
442
17.5 DM9000内部寄存器访问方式
452
17.6 DM9000 编程操作步骤
453
17.7 mini2440 开发板DM9000硬件连接图分析
454
17.8 DM9000 Linux驱动移植
456
17.8.1 DM9000设备模型分析
456
17.8.2 DM9000探测函数简要分析
456
17.8.3 DM9000 平台的资源分析
457
17.8.4 DM9000平台的数据分析
458
17.8.5 移植DM9000平台设备层代码的编写
460
17.9 DM9000 Linux驱动源码分析
461
17.9.1 数据结构 struct net_device
461
17.9.2 数据结构struct net_device_ops
462
17.9.3 数据结构 struct sk_buff
463
17.9.4 私有数据结构 struct board_info
465
17.9.5 DM9000使用到的核心API
466
17.10 DM9000驱动模块入口函数分析
476
17.11 DM9000探测函数代码分析
477
17.12 DM9000网卡硬件操作函数struct net_device_ops重要成员分析
486
17.12.1 网络设备打开函数ndo_open接口
486
17.12.2 网络设备关闭函数ndo_stop接口
490
17.12.3 网络设备发送函数ndo_start_xmit接口
491
17.12.4 网络设备超时处理函数ndo_tx_timeout接口
498
17.13 接收过程详细分析
499
17.13.1 DM9000接收中断代码分析
499
17.13.2 DM9000读数据包及提交数据包到上层函数分析
500
第18章 Linux I2C子系统
507
18.1 IIC总线知识
507
18.2 IIC子系统体系结构
510
18.3 IIC相关的重要数据结构
510
18.4 IIC核心层
513
18.5 i2c_add_driver分析
515
18.6 IIC设备驱动示例
518
18.6.1 设备驱动程序
518
18.6.2 应用程序编程
522
18.7 IIC总线驱动分析
524
18.7.1 适配器驱动
524
18.7.2 适配器平台资源
531
18.8 IIC子系统总结
531
第19章 Linux SPI子系统
532
19.1 SPI子系统概述
532
19.2 SPI子系统框图详解
532
19.3 SPI相关的数据结构
533
19.4 SPI核心代码的初始化分析
535
19.5 SPI设备文件自动产生代码的分析
536
19.6 SPI子系统核心API
537
19.7 SPI设备驱动范例
539
19.7.1 SPI设备驱动程序编程
539
19.7.2 SPI应用程序编程
544
19.8 SPI总线驱动分析
546
19.9 SPI子系统总结
549
第20章 单总线协议—DS18B20温度传感器驱动
550
20.1 DS18B20介绍
550
20.2 DS18B20的特点
550
20.3 DS18B20的内部结构
550
20.4 DS18B20指令码
553
20.5 DS18B20时序
554
20.5.1 复位时序
554
20.5.2 写时序
555
20.5.3 读时序
555
20.6 DS18B20操作流程
556
20.7 DS18B20与单片机的典型接口设计
556
20.8 DS18B20的精确延时问题
557
20.9 基于MS51单片机的裸机DS18B20 驱动程序
557
20.10 Linux 系统下的DS18B20温度传感器驱动
561
20.10.1 内核自带DS18B20温度传感器驱动简要说明
562
20.10.2 通过内核配置菜单配置DS18B20驱动
562
20.10.3 注册DS18B20驱动的设备层
563
第21章 Linux MTD子系统
567
21.1 Linux MTD子系统介绍
567
21.2 MTD子系统相关核心结构
569
21.3 Nand Flash硬件操作介绍
572
21.3.1 Nand Flash工作原理
572
21.3.2 Nand Flash 数据存储单元的整体架构
573
21.3.3 Nand Flash 引脚(Pin)说明
573
21.3.4 Nand Flash寻址方式
573
21.3.5 Nand Flash读操作流程
574
21.3.6 Nand Flash 写操作流程
574
21.3.7 Nand Flash主要内设命令详细介绍
575
21.3.8 Nand Flash 控制器中特殊功能寄存器介绍
576
21.4 Nand Flash驱动实例
577
21.4.1 Nand Flash驱动框架编写
577
21.4.2 Nand Flash底层操作程序
584
21.4.3 Nand Flash分区的配置
585
21.4.4 Nand Flash驱动挂接测试
585
21.5 基于MTD 子系统的设备驱动编程总结
586
参考文献
587


 嵌入式Linux高级驱动教程下载



发布书评

 
 


 

农业基础科学,时尚,美术/书法,绘画,软件工程/开发项目管理,研究生/本专科,爱情/情感,动漫学堂PDF下载,。 PDF下载网 

PDF下载网 @ 2024