前 言

本书自第1版出版以来,在极短的时间里就进入了畅销版的前十,获得了年度“十大原创经典”、“十大畅销经典”等殊荣。在长达二年半的时间里,本书始终保持在销售排行榜的前列。在此,笔者要向广大读者的支持和厚爱表示最真挚地感谢!但是,本书自从出版后,也暴露了一些问题,主要体现在:

1.没有现成的开发环境,读者需要从头到尾构建,而构建需要花费很长的时间,许多时候会不成功,加之配套光盘中的实例没有Makefile,更加重了操作的难度;

2.没有配套的开发板,大量的基于S3C2410的实例找不到可以直接运行的平台,因此读者无法亲身体验这些驱动;

3.一些内容并不实用或陈旧,也有一些知识点的讲解语言晦涩,读者难以理解,典型如platform驱动等;

4.一些知识点并不完整,如input驱动、USB UDC和gadget驱动、SPI驱动、ASoC驱动等。

有鉴于此,笔者对全书超过40%的篇幅进行了改动。这些改动,一些是对过时内容的删除,一些是对讲解不清知识点的修正,一些是对重点内容的增强,一些则是有用知识点的增加,其目的是要向读者提供一套更加准确和完整的全方位、立体式Linux设备驱动学习平台。第2版相对第1版的主要改动有:

1.直接提供VirtualBox虚拟机,该虚拟机上已包含了书中所需开发环境和源代码,读者不再需要安装环境即可进行试验,书中详细介绍了各个试验的步骤;

2.提供了专门的配套学习板——基于三星S3C6410 SoC的LDD6410(Linux Device Drivers 6410),使得书中的各种真实设备驱动实例都找了试验的依托;

3.全面升级内核至Linux 2.6.28.6,根据Linux内核API的变更情况更新了书中的所有内容,典型如I2C驱动的体系结构、网络NAPI的接口等,并对delayed_work等较新的内核机制进行了介绍;

4.删除了大量过时的内容,如redhat Linux 2.4内核更新到2.6、传统的按键驱动、SAA7113H启动、传统的IDE驱动等,同时新增了大量内容,包括Linux内核的编码风格、Linux内核的移植、Android驱动、USB UDC和gadget驱动、ALSA SoC驱动、input驱动、SPI驱动、基于sysfs的设备驱动、Linux设备驱动的固件加载、Linux性能调优工具、Linux设备驱动的电源管理、Linux驱动的分层设计思想、主机驱动与设备驱动分离设计思想等;

5.在块设备驱动方面,删除了RAMDISK驱动实例,而新增了更加简单易懂的vmem_disk驱动,类似于globalmem和globalfifo;

6.对许多关键知识点的讲解进行了语言上的调整和内容方面的增强,以便读者能更好的理解,譬如以专门章节讲解platform驱动等。

在总体结构方面,全书仍然与第1版一致,共分4篇23章,内容安排如下。

第1篇(第1~3章)主要讲解Linux设备驱动的基础。

第1章主要讲解设备驱动的作用,并从无操作系统的设备驱动引出了Linux操作系统下的设备驱动以及全书所用试验环境的安装方法。

第2章系统地讲解了一个Linux驱动工程师应该掌握的硬件知识,使读者打下Linux设备驱动开发的硬件基础。本章涵盖了各种类型的CPU、存储器和常见的外设,并讲解了硬件时序分析方法和仪器使用方法。

第3章将Linux设备驱动放在Linux 2.6内核背景中进行讲解,说明Linux内核的基本原理和编程方法,为编写Linux设备驱动打下软件基础。

第2篇(第4~12章)主要讲解Linux设备驱动编程的基础理论、字符设备驱动、设备驱动设计中涉及的并发控制、同步等问题以及Linux驱动的工程化。

第4、5章分别讲解Linux内核模块和Linux设备文件系统。

第6~9章以虚拟设备globalmem和globalfifo为主线讲解了字符设备驱动的编写方法,各章还讲解了并发控制、阻塞与非阻塞、异步I/O等高级控制功能。

第10、11章分别讲解Linux驱动编程中所涉及的中断和定时器,内核和I/O操作处理方法。

globalmem和globalfifo驱动与真实项目中看到的驱动有一些不同,第12章详细讲解Linux设备驱动的工程化问题,让读者看到真实的驱动要考虑的诸多问题。

第3篇(第13~21章)深刻剖析复杂设备驱动的体系架构,每一章都给出了具体的实例,涉及的设备包括块设备、终端设备、I2C适配器与I2C设备、网络设备、PCI设备、USB主机控制器、USB设备、UDC、gadget、LCD设备、Flash设备等。本篇的讲解中抽象与具体相结合,先以模板的形式给出各种设备驱动的设计框架,然后用具体实例设备的驱动填充对应的模板。

第4篇(第22~23章)详细讲解了Linux设备驱动和内核的调试和移植方法。

第22章讲解了Linux设备驱动的开发环境构建以及借助printk、oops、/proc、strace、仿真器进行驱动调试的方法,最后也介绍了Linux的性能调优工具。

第23章讲解了开发可移植驱动程序以及借助芯片范例程序、demo板驱动和其他操作系统驱动等现成代码进行Linux驱动快速移植的方法,最后也介绍了如何在一块新的SoC和电路板上构建Linux。

最后,再次对广大读者以及所有为本书提出过宝贵意见、为本书的诞生奉献过力量的人们,表示最诚挚的谢意!欢迎读者朋友继续通过本书专用网址http://www.linuxdriver.cn/与作者和编辑团队进行交流。

2010年6月