《Linux设备驱动开发详解》PDF下载

  • 购买积分:19 如何计算积分?
  • 作  者:宋宝华编著
  • 出 版 社:北京:人民邮电出版社
  • 出版年份:2008
  • ISBN:7115172390
  • 页数:686 页
图书介绍:本书是一本介绍Linux设备驱动开发理论、框架与实例的书,本书以2.6版本内核为蓝本,详细介绍自旋锁、信号量、完成量、中断顶/底半部、定时器、内存和I/O映射以及异步通知、阻塞/非阻塞I/O等Linux设备驱动理论,字符设备、块设备、TTY设备、I2C设备、LCD设备、音频设备、USB设备、网络设备、PCI设备等Linux设备驱动的架构,框架中各个复杂数据架构和函数的关系,并讲解了大量Linux驱动开发的大量实例,使读者能够独立开发各类Linux设备驱动。本书内容全面,实例丰富,操作性强,语言通俗易懂,适合广大Linux开发人员、嵌入式工程师参考使用,也适合广大Linux爱好者阅读。

第1篇 Linux设备驱动入门第1章 设备驱动概述 2

1.1 设备驱动的作用 3

1.2 无操作系统时的设备驱动 3

1.3 有操作系统时的设备驱动 5

1.4 Linux设备驱动 6

1.4.1 设备的分类及特点 6

1.4.2 Linux设备驱动与整个软硬件系统的关系 7

1.4.3 编写Linux设备驱动的技术基础 8

1.4.4 Linux设备驱动的学习方法 8

1.5 设备驱动的Hello World:LED驱动 11

1.5.1 无操作系统时的LED驱动 11

1.5.2 Linux系统下的LED驱动 12

第2章 驱动设计的硬件基础 16

2.1 处理器 17

2.1.1 通用处理器 17

2.1.2 数字信号处理器 18

2.2 存储器 20

2.3 接口与总线 24

2.3.1 串口 24

2.3.2 I2C总线 25

2.3.3 USB 26

2.3.4 以太网接口 27

2.3.5 ISA总线 28

2.3.6 PCI和cPCI 29

2.4 CPLD和FPGA 33

2.5 原理图分析 35

2.5.1 原理图分析的内容 35

2.5.2 原理图的分析方法 36

2.6 硬件时序分析 37

2.6.1 时序分析的概念 37

2.6.2 典型硬件时序 38

2.7 仪器仪表使用 39

2.7.1 万用表 39

2.7.2 示波器 39

2.7.3 逻辑分析仪 41

2.8 总结 42

第3章 Linux内核及内核编程 43

3.1 Linux内核的发展与演变 44

3.2 Linux 2.6内核的特点 45

3.3 Linux内核的组成 46

3.3.1 Linux内核源代码目录结构 46

3.3.2 Linux内核的组成部分 47

3.3.3 Linux内核空间与用户空间 49

3.4 Linux内核的编译及加载 50

3.4.1 Linux内核的编译 50

3.4.2 Kconfig和Makefile 57

3.4.3 Linux内核的引导 63

3.5 Linux下的C编程 65

3.5.1 Linux程序命名习惯 65

3.5.2 GNU C与ANSI C 66

3.5.3 do{}while(0) 70

3.5.4 goto 71

3.6 总结 71

第2篇 Linux设备驱动核心理论第4章 Linux内核模块 74

4.1 Linux内核模块简介 75

4.2 Linux内核模块的程序结构 76

4.3 模块加载函数 77

4.4 模块卸载函数 78

4.5 模块参数 78

4.6 导出符号 80

4.7 模块声明与描述 81

4.8 模块的使用计数 81

4.9 模块的编译 82

4.10 模块与GPL 83

4.11 总结 84

第5章 Linux文件系统与设备文件系统 85

5.1 Linux文件操作 86

5.1.1 文件操作的相关系统调用 86

5.1.2 C库函数的文件操作 88

5.2 Linux文件系统 90

5.2.1 Linux文件系统目录结构 90

5.2.2 Linux文件系统与设备驱动 91

5.3 devfs设备文件系统 95

5.4 udev设备文件系统 96

5.4.1 udev与devfs的区别 96

5.4.2 sysfs文件系统与Linux设备模型 96

5.4.3 udev的组成 108

5.4.4 udev规则文件 109

5.4.5 创建和配置udev 111

5.5 总结 113

第6章 字符设备驱动 114

6.1 Linux字符设备驱动结构 115

6.1.1 cdev结构体 115

6.1.2 分配和释放设备号 116

6.1.3 file_operations结构体 116

6.1.4 Linux字符设备驱动的组成 118

6.2 globalmem虚拟设备实例描述 121

6.3 globalmem设备驱动 121

6.3.1 头文件、宏及设备结构体 121

6.3.2 加载与卸载设备驱动 122

6.3.3 读写函数 123

6.3.4 seek()函数 124

6.3.5 ioctl()函数 125

6.3.6 使用文件私有数据 127

6.4 globalmem驱动在用户空间的验证 133

6.5 总结 134

第7章 Linux设备驱动中的并发控制 135

7.1 并发与竞态 136

7.2 中断屏蔽 137

7.3 原子操作 137

7.3.1 整型原子操作 138

7.3.2 位原子操作 138

7.4 自旋锁 139

7.4.1 自旋锁的使用 139

7.4.2 读写自旋锁 141

7.4.3 顺序锁 143

7.4.4 读—拷贝—更新 144

7.5 信号量 148

7.5.1 信号量的使用 148

7.5.2 信号量用于同步 150

7.5.3 完成量用于同步 150

7.5.4 自旋锁vs信号量 151

7.5.5 读写信号量 152

7.6 互斥体 152

7.7 增加并发控制后的globalmem驱动 153

7.8 总结 156

第8章 Linux设备驱动中的阻塞与非阻塞I/O 157

8.1 阻塞与非阻塞I/O 158

8.1.1 等待队列 158

8.1.2 支持阻塞操作的globalfifo设备驱动 162

8.1.3 在用户空间验证globalfifo的读写 167

8.2 轮询操作 167

8.2.1 轮询的概念与作用 167

8.2.2 应用程序中的轮询编程 168

8.2.3 设备驱动中的轮询编程 168

8.3 支持轮询操作的globalfifo驱动 169

8.3.1 在globalfifo驱动中增加轮询操作 169

8.3.2 在用户空间验证globalfifo设备的轮询 170

8.4 总结 171

第9章 Linux设备驱动中的异步通知与异步I/O 172

9.1 异步通知的概念与作用 173

9.2 Linux异步通知编程 173

9.2.1 Linux信号 173

9.2.2 信号的接收 175

9.2.3 信号的释放 176

9.3 支持异步通知的globalfifo驱动 178

9.3.1 在globalfifo驱动中增加异步通知 178

9.3.2 在用户空间验证globalfifo的异步通知 180

9.4 Linux 2.6异步I/O 181

9.4.1 AIO概念与GNU C库函数 181

9.4.2 使用信号作为AIO的通知 184

9.4.3 使用回调函数作为A1O的通知 185

9.4.4 AIO与设备驱动 186

9.5 总结 188

第10章 中断与时钟 189

10.1 中断与定时器 190

10.2 Linux中断处理程序架构 191

10.3 Linux中断编程 192

10.3.1 申请和释放中断 192

10.3.2 使能和屏蔽中断 193

10.3.3 底半部机制 193

10.3.4 实例:S3C2410实时钟中断 196

10.4 中断共享 197

10.5 内核定时器 199

10.5.1 内核定时器编程 199

10.5.2 实例:秒字符设备 201

10.6 内核延时 205

10.6.1 短延迟 205

10.6.2 长延迟 205

10.6.3 睡着延迟 206

10.7 总结 207

第11章 内存与I/O访问 208

11.1 CPU与内存和I/O 209

11.1.1 内存空间与I/O空间 209

11.1.2 内存管理单元MMU 210

11.2 Linux内存管理 213

11.3 内存存取 215

11.3.1 用户空间内存动态申请 215

11.3.2 内核空间内存动态申请 215

11.3.3 虚拟地址与物理地址关系 218

11.4 设备I/O端口和I/O内存的访问 219

11.4.1 Linux I/O端口和I/O内存访问接口 219

11.4.2 申请与释放设备I/O端口和I/O内存 221

11.4.3 设备I/O端口和I/O内存访问流程 221

11.4.4 将设备地址映射到用户空间 222

11.5 I/O内存静态映射 227

11.6 DMA 230

11.6.1 DMA与Cache一致性 230

11.6.2 Linux下的DMA编程 231

11.7 总结 240

第12章 Linux字符设备驱动综合实例 241

12.1 按键的设备驱动 242

12.1.1 按键的硬件原理 242

12.1.2 按键驱动中的数据结构 243

12.1.3 按键驱动的模块加载和卸载函数 244

12.1.4 按键设备驱动中断、定时器处理程序 245

12.1.5 按键设备驱动的打开、释放函数 247

12.1.6 按键设备驱动读函数 247

12.2 触摸屏的设备驱动 248

12.2.1 触摸屏的硬件原理 248

12.2.2 触摸屏设备驱动中数据结构 250

12.2.3 触摸屏驱动中的硬件控制 251

12.2.4 触摸屏驱动模块加载和卸载函数 252

12.2.5 触摸屏驱动中断、定时器处理程序 252

12.2.6 触摸屏设备驱动的打开、释放函数 255

12.2.7 触摸屏设备驱动的读函数 255

12.2.8 触摸屏设备驱动的轮询与异步通知 256

12.2.9 Linux输入子系统 257

12.3 DSP HPI的设备驱动 258

12.3.1 HPI接口的硬件原理 258

12.3.2 HPI接口设备驱动中数据结构 259

12.3.3 HPI接口设备驱动的读写函数 260

12.4 NVRAM设备驱动 261

12.4.1 NVRAM设备驱动的数据结构 261

12.4.2 NVRAM设备驱动的模块加载与卸载函数 262

12.4.3 NVRAM设备驱动读写函数 262

12.4.4 NVRAM设备驱动的seek函数 263

12.5 看门狗设备驱动 264

12.5.1 看门狗硬件原理 264

12.5.2 看门狗驱动中的数据结构 265

12.5.3 看门狗驱动模块的加载和卸载函数 268

12.5.4 看门狗驱动探测和移除函数 269

12.5.5 看门狗驱动的挂起和恢复函数 271

12.5.6 看门狗驱动的打开和释放函数 272

12.5.7 看门狗驱动写函数 274

12.6 总结 274

第3篇 Linux设备驱动实例第13章 Linux块设备驱动 276

13.1 块设备的I/O操作特点 277

13.2 Linux块设备驱动结构 277

13.2.1 block_device_operations结构体 277

13.2.2 gendisk结构体 278

13.2.3 request与bio结构体 280

13.2.4 块设备驱动注册与注销 288

13.3 Linux块设备驱动的模块加载与卸载 288

13.4 块设备的打开与释放 291

13.5 块设备驱动的ioctl函数 291

13.6 块设备驱动的I/O请求处理 292

13.6.1 使用请求队列 292

13.6.2 不使用请求队列 295

13.7 实例1:RamDisk驱动 296

13.7.1 RamDisk的硬件原理 296

13.7.2 RamDisk驱动模块的加载与卸载 296

13.7.3 RamDisk设备驱动block device operations及成员函数 299

13.7.4 RamDisk I/O请求处理 300

13.8 实例2:IDE硬盘设备驱动 300

13.8.1 IDE硬盘设备原理 300

13.8.2 IDE硬盘设备驱动的block_device_operations及成员函数 303

13.8.3 IDE硬盘设备驱动的I/O请求处理 304

13.8.4 在内核中增加对新系统IDE设备的支持 310

13.9 总结 313

第14章 Linux终端设备驱动 314

14.1 终端设备 315

14.2 终端设备驱动结构 316

14.3 终端设备驱动的初始化与释放 321

14.3.1 模块加载与卸载函数 321

14.3.2 打开与关闭函数 322

14.4 数据发送和接收 323

14.5 tty线路设置 326

14.5.1 线路设置用户空间接口 326

14.5.2 tty驱动的set_termios函数 327

14.5.3 tty驱动的tiocmget和tiocmset函数 328

14.5.4 tty驱动的ioctl函数 329

14.6 UART设备驱动 330

14.7 S3C2410 UART的驱动实例 335

14.7.1 S3C2410串口硬件描述 335

14.7.2 S3C2410串口驱动的数据结构 338

14.7.3 S3C2410串口驱动的初始化与释放 341

14.7.4 S3C2410串口数据收发 344

14.7.5 S3C2410串口线路设置 350

14.8 总结 352

第15章 Linux的I2C核心、总线与设备驱动 353

15.1 Linux的I2C体系结构 354

15.2 Linux I2C核心 359

15.3 Linux I2C总线驱动 361

15.3.1 I2C适配器驱动加载与卸载 361

15.3.2 I2C总线通信方法 361

15.4 Linux I2C设备驱动 363

15.4.1 Linux I2C设备驱动的模块加载与卸载 364

15.4.2 Linux I2C设备驱动的i2c driver成员函数 364

15.4.3 Linux I2C设备驱动的文件操作接口 367

15.4.4 Linux的i2c-dev.c文件分析 368

15.5 S3C2410 I2C总线驱动实例 374

15.5.1 S3C2410 I2C控制器硬件描述 374

15.5.2 S3C2410 I2C总线驱动总体分析 374

15.5.3 S3C2410 I2C适配器驱动的模块加载与卸载 375

15.5.4 S3C2410 I2C总线通信方法 378

15.6 SAA7113H视频AD芯片的I2C设备驱动实例 383

15.6.1 SAA7113H视频AD芯片硬件描述 383

15.6.2 SAA7113H视频AD芯片驱动的模块加载与卸载 384

15.6.3 SAA7113H设备驱动的i2c driver成员函数 384

15.7 总结 386

第16章 Linux网络设备驱动 387

16.1 Linux网络设备驱动的结构 388

16.1.1 网络协议接口层 388

16.1.2 网络设备接口层 392

16.1.3 设备驱动功能层 395

16.1.4 网络设备与媒介层 395

16.2 网络设备驱动的注册与注销 395

16.3 网络设备的初始化 397

16.4 网络设备的打开与释放 398

16.5 数据发送流程 399

16.6 数据接收流程 400

16.7 网络连接状态 402

16.8 参数设置和统计数据 404

16.9 CS8900网卡设备驱动实例 407

16.9.1 CS8900网卡硬件描述 407

16.9.2 CS8900网卡驱动设计分析 409

16.9.3 CS8900网卡注册、初始化与注销 410

16.9.4 CS8900网卡发送数据流程 415

16.9.5 CS8900网卡接收数据流程 416

16.10 总结 418

第17章 Linux音频设备驱动 419

17.1 数字音频设备 420

17.2 音频设备硬件接口 421

17.2.1 PCM接口 421

17.2.2 IIS接口 421

17.2.3 AC97接口 421

17.3 Linux OSS音频设备驱动 422

17.3.1 OSS驱动的组成 422

17.3.2 mixer接口 423

17.3.3 dsp接口 424

17.3.4 OSS用户空间编程 425

17.4 Linux ALSA音频设备驱动 431

17.4.1 ALSA的组成 431

17.4.2 card和组件管理 432

17.4.3 PCM设备 434

17.4.4 控制接口 444

17.4.5 AC97 API接口 449

17.4.6 ALSA用户空间编程 451

17.5 S3C2410+UDA1341 OSS驱动实例 456

17.5.1 S3C2410与UDA1341接口硬件描述 456

17.5.2 注册dsp和mixer接口 459

17.5.3 mixer接口的I/O控制函数 460

17.5.4 dsp接口音频数据传输 462

17.6 SA1100+UDA1341 ALSA驱动实例 465

17.6.1 card注册与注销 465

17.6.2 PCM设备的实现 467

17.6.3 控制接口的实现 472

17.7 PXA255+AC97 ALSA驱动实例 474

17.8 总结 476

第18章 LCD设备驱动 477

18.1 LCD硬件原理 478

18.2 帧缓冲 480

18.2.1 帧缓冲的概念 480

18.2.2 显示缓冲区与显示点 480

18.2.3 Linux帧缓冲相关数据结构与函数 481

18.3 Linux帧缓冲设备驱动结构 487

18.4 帧缓冲设备驱动的模块加载与卸载函数 487

18.5 帧缓冲设备显示缓冲区的申请与释放 489

18.6 帧缓冲设备的参数设置 490

18.6.1 定时参数 490

18.6.2 像素时钟 491

18.6.3 颜色位域 491

18.6.4 固定参数 491

18.7 帧缓冲设备驱动的fb_ops成员函数 491

18.8 LCD设备驱动的读写、mmap和ioctl函数 493

18.9 帧缓冲设备的用户空间访问 499

18.10 Linux图形用户界面 504

18.10.1 Qt-X11/QtEmbedded/Qtopia 504

18.10.2 Microwindows/Nano-X 508

18.10.3 MiniGUI 511

18.11 实例:S3C2410 LCD设备驱动 514

18.11.1 S3C2410 LCD控制器硬件描述 514

18.11.2 S3C2410 LCD驱动的模块加载与卸载函数 517

18.11.3 S3C2410 LCD驱动的探测与移除函数 520

18.11.4 S3C2410 LCD驱动挂起与恢复函数 524

18.11.5 S3C2410 LCD驱动的fb_ops成员函数 525

18.12 总结 528

第19章 Flash设备驱动 529

19.1 Linux Flash驱动结构 530

19.1.1 Linux MTD系统层次 530

19.1.2 Linux MTD系统接口 530

19.1.3 MTD用户空间编程 534

19.2 NOR Flash驱动 538

19.3 NAND Flash驱动 541

19.4 NOR Flash驱动实例:S3C2410外围的NOR Flash驱动 546

19.5 NAND Flash驱动实例:S3C2410外围的NAND Flash驱动 549

19.5.1 S3C2410 NAND控制器硬件描述 549

19.5.2 nand_chip初始化和成员函数 549

19.5.3 NAND设备驱动初始化与释放 553

19.6 Flash文件系统的建立 556

19.6.1 Flash转换层 556

19.6.2 CramFS 557

19.6.3 JFFS/JFFS2 558

19.6.4 YAFFS/YAFFS2 559

19.7 总结 561

第20章 USB主机与设备驱动 562

20.1 Linux USB驱动层次 563

20.1.1 主机侧与设备侧USB驱动 563

20.1.2 设备、配置、接口、端点 564

20.2 USB主机驱动 568

20.2.1 USB主机驱动的整体结构 568

20.2.2 实例:S3C2410 USB主机驱动 571

20.3 USB设备驱动 572

20.3.1 USB设备驱动整体结构 572

20.3.2 USB请求块(URB) 577

20.3.3 探测和断开函数 582

20.3.4 USB骨架程序 582

20.4 USB设备驱动实例 589

20.4.1 USB串口驱动 589

20.4.2 USB键盘驱动 594

20.5 总结 598

第21章 PCI设备驱动 599

21.1 PCI总线与配置空间 600

21.1.1 PCI总线的Linux描述 600

21.1.2 PCI设备的Linux描述 602

21.1.3 PCI配置空间访问 603

21.2 PCI设备驱动结构 607

21.2.1 pci_driver结构体 607

21.2.2 PCI设备驱动的组成 612

21.2.3 旧版内核的PCI设备探测 615

21.3 实例:Intel 810主板声卡驱动 617

21.4 总结 623

第4篇 Linux设备驱动测试、移植第22章 Linux设备驱动的调试 626

22.1 Linux开发环境建设 627

22.1.1 实验室建设 627

22.1.2 工具链 628

22.1.3 串口工具 629

22.2 GDB调试器用法 632

22.2.1 GDB基本用法 632

22.2.2 DDD图形界面调试工具 640

22.3 Linux内核调试 642

22.4 内核打印信息——printk() 643

22.5 使用/proc 644

22.6 Oops 649

22.7 监视工具 650

22.8 内核调试器 652

22.8.1 kcore 652

22.8.2 KDB 654

22.8.3 KGDB 656

22.9 使用仿真器调试内核 657

22.10 应用程序调试 658

22.11 总结 659

第23章 Linux设备驱动的移植 660

23.1 编写可移植的设备驱动 661

23.1.1 可移植的数据类型 661

23.1.2 结构体对界 662

23.1.3 Little Endian与BigEndian 663

23.1.4 内存页面大小 664

23.2 巧用同类设备驱动 664

23.2.1 巧用demo板驱动 664

23.2.2 巧用类似芯片的驱动程序 665

23.2.3 借用芯片厂商的范例程序 668

23.3 从Linux 2.4移植设备驱动到Linux 2.6 668

23.4 Linux与其他操作系统之间的驱动移植 676

23.5 总结 684

参考文献 685