前言
Linux内核是一种复杂、轻便、模块化并被广泛使用的软件。大约80%的服务器和全世界一半以上设备的嵌入式系统上运行着Linux内核。设备驱动程序在整个Linux系统中起着至关重要的作用。由于Linux已成为非常流行的操作系统,因此本人对开发基于Linux的设备驱动程序的兴趣也在逐步提升。
设备驱动程序通过内核在用户空间和设备之间建立连接。
本书前两章介绍驱动程序的基础知识,为Linux内核的学习做准备。之后介绍基于Linux各个子系统的驱动程序开发,如内存管理、PWM、RTC、IIO、GPIO、IRQ管理等。本书还介绍了直接内存访问和网络设备驱动程序的实用方法。
本书中的源代码已经在x86 PC和SECO的UDOO Quad上进行了测试,其中UDOO Quad的主芯片是恩智浦的ARM i.MX6,它具有丰富的功能和外部接口,可以覆盖本书中讨论的所有测试。它还提供了一些驱动程序来测试价格较低的组件,如MCP23016和24LC512,它们分别是I2C GPIO控制器和电可擦可编程只读存储器。
读完本书,读者能深刻理解设备驱动程序开发的概念,并且可以使用内核(本书写作时Linux内核版本为v4.13)从零开始编写任何设备驱动程序。
本书内容
第1章介绍Linux内核开发过程,主要讨论内核下载、配置和编译步骤,适用于x86系统和基于ARM的系统。
第2章介绍如何用内核模块来实现Linux的模块化,以及模块的加/卸载。本章还介绍了驱动程序的架构一些基本概念和内核最佳实践。
第3章介绍常用的内核功能和机制,如工作队列、等待队列、互斥锁、自旋锁,以及其他用于提高驱动程序可靠性的功能。
第4章重点介绍通过字符设备把设备功能输出到用户空间,以及IOCTL接口支持的自定义命令。
第5章解释什么是平台设备,介绍伪平台总线的概念,以及设备和总线的匹配机制。本章描述平台设备驱动的总体体系结构,以及处理平台数据的方法。
第6章讨论向内核提供设备描述的机制,解释设备寻址、资源处理、DT及其内核API支持的各种数据类型。
第7章深入讨论I2C设备驱动体系架构、数据结构和该总线上的设备寻址及访问方法。
第8章介绍基于SPI的设备驱动体系架构及其涉及的数据结构,还讨论了各种设备的访问方法和特性、应该避免的陷阱,以及SPI DT绑定。
第9章概述Regmap API及其对底层SPI和I2C处理的抽象方法,这些方法对通用API和专用API都适用。
第10章介绍内核数据采集和测量框架,以处理数模转换(DAC)和模数转换(ADC),重点涉及IIO API、触发缓冲区和连续数据捕获的处理方法,以及通过sysfs接口的单通道数据采集方法。
第11章先介绍虚拟内存的概念,以描述内核内存的总体布局。然后介绍内核内存管理子系统,讨论内存分配和映射,以及内核缓存机制。
第12章介绍DMA及其新的内核API:DMA引擎API。除了讨论各种DMA映射方法,介绍与缓存寻址相关的问题,还总结了基于恩智浦i.MX6 SoC的整体使用方法。
第13章介绍Linux的核心内容,描述内核中对象的表示方法,Linux的内部设计方法,从kobject到设备,再到各种总线、类和设备驱动程序。此外,还强调用户空间中鲜为人知的一面——sysfs中的内核对象层次结构。
第14章介绍内核引脚控制API和gpiolib,它们是处理GPIO的内核API。本章还讨论原来基于整数的GPIO接口和基于描述符的新接口。最后,介绍在DT内配置它们的方法。
第15章主要介绍GPIO控制器,它是编写这些设备驱动程序必需的元素。其主要数据结构是gpio_chip结构,本章将详细介绍该结构,并在本书配套的源代码中提供了一个完整可用的驱动程序。
第16章深入浅出地解释Linux IRQ核心内容:全面介绍Linux IRQ管理,先从中断在系统中的传播、中断控制器驱动程序开始,进而解释IRQ复用的概念,以及Linux IRQ域API的使用。
第17章全面介绍输入子系统——处理基于IRQ的输入设备和轮询输入设备,并引入二者的API。此外,还解释和展示了用户空间代码对这些设备的处理方式。
第18章介绍RTC子系统及其API,详细解释RTC驱动程序怎样处理闹钟。
第19章全面描述PWM框架,讨论控制器端API和消费端API,最后还讨论了用户空间的PWM管理。
第20章强调电源管理的重要性,先介绍电源管理IC(Power Management IC,PMIC),解释其驱动程序设计和API。接着,重点介绍消费端,讨论电源调节器的请求和使用。
第21章解释帧缓冲概念及其工作方式,介绍帧缓冲驱动程序的设计及其API,讨论加速和非加速方法,说明驱动程序怎样公开帧缓冲内存,从而使用户空间能够写入,而不必顾及底层任务。
第22章介绍NIC驱动程序体系结构及其数据结构,说明怎样处理设备配置、数据传输和套接字缓冲区。
阅读本书所需知识
阅读本书需要读者对Linux操作系统具有一定的了解,具备基本的C语言程序设计能力(至少需要理解指针处理)。如果某些章节需要其他知识辅助理解,书中会提供参考文档链接,便于读者快速学习。
Linux内核编译是一项费时又艰辛的工作,其最低硬件或虚拟机要求如下。
·CPU:4核。
·内存:4 GB。
·磁盘可用空间:5 GB。
本书还需要以下软件。
·Linux操作系统:最好是基于Debian的版本,本书示例使用的是Ubuntu 16.04。
·gcc和gcc-arm-linux至少应是第5版(本书使用该版本)。
·本书用到的其他软件包将在具体章节中介绍。内核源代码的下载需要网络连接。
读者对象
阅读本书需要读者具备基本的C语言程序设计能力,熟悉Linux基本命令。本书介绍的Linux驱动程序开发广泛用于嵌入式设备,使用的内核版本是v4.1,本书写作时的Linux内核最新版本是v4.13。本书主要是为嵌入式工程师、Linux系统管理员、开发人员和内核黑客设计的。无论是软件开发人员,还是系统架构师或制造商,只要愿意深入研究Linux驱动程序开发,本书就适合您阅读。