



Linux内核是一个复杂、可移植、模块化的软件,广泛运行在全球约80%的服务器上和过半数设备的嵌入式系统中。设备驱动程序对Linux系统的运行效果具有决定性影响。随着Linux成为最流行的操作系统之一,人们对开发个人设备驱动程序的兴趣也在稳步增长。
设备驱动程序是连接用户空间和硬件设备的桥梁,是通过Linux内核实现的。
本书的前两章会帮助你理解驱动程序的基础知识,为学习Linux内核的漫长旅途做准备。之后本书将会涉及Linux子系统基础上的驱动开发,比如内存管理、工业输入/输出(Industrial Input/Output,IIO)、通用输入/输出(General-Purpose Input/Output,GPIO)、中断请求(Interrupt Request,IRQ)管理以及集成电路总线(Inter-Integrated Circuit,I2C)和串行外设接口(Serial Peripheral Interface,SPI)。
本书还将介绍直接存储器访问(Direct Memory Access,DMA)和寄存器映射抽象的实用方法。
本书中的源代码已经在x86 PC和SECO公司的UDOO QUAD开发板上进行了测试。本书还提供了一些驱动程序来测试廉价组件,如MCP23016和24LC512,它们分别是I2C的GPIO控制器和电擦除可编程只读存储器(Electrically-Erasable Programmable Read-Only Memory,EEPROM)。
读完本书以后,你将熟悉设备驱动程序开发的概念,并能够使用Linux最新的稳定内核分支(写作本书时为v5.10.y)自主开发各类设备驱动程序。
为了理解本书的内容,读者需要具备基本的C语言编程能力和Linux命令相关知识。本书涵盖了被广泛使用的嵌入式设备的Linux驱动程序开发知识,使用的内核版本是v5.10。本书主要面向嵌入式工程师、Linux系统管理员和开发人员。
无论你是系统开发人员、系统架构师或制造商,还是愿意深入研究Linux设备驱动程序开发的其他人员,本书都值得你阅读。
第1章“内核开发简介”介绍Linux内核的开发过程,讨论针对x86和基于ARM的内核的下载、配置和编译步骤。
第2章“Linux内核模块的基本概念”讨论Linux内核模块的参数处理以及模块的加载/卸载。
第3章“处理内核的核心辅助函数”介绍常用的内核函数和机制,如工作队列、等待队列、互斥锁、自旋锁,以及其他一切有助于提高驱动程序可靠性的机制。
第4章“编写字符设备驱动程序”重点介绍如何通过字符设备将数据导出到用户空间,以及利用ioctl方法向设备发送特殊命令。
第5章“理解和利用设备树”讨论向内核描述设备的机制,解释设备寻址、资源处理,以及设备树(Device Tree,DT)支持的多种数据类型及其内核应用程序接口(Application Program Interface,API)。
第6章“设备、驱动程序和平台抽象简介”解释Linux内核平台抽象、伪平台总线的概念,以及设备与驱动程序匹配机制。
第7章“平台设备和驱动程序的概念”描述平台驱动程序的一般架构,以及如何处理平台数据。
第8章“编写I2C设备驱动程序”深入探讨I2C设备驱动程序的架构、数据结构,以及总线上驱动程序的初始化和注册方法。
第9章“编写SPI设备驱动程序”描述基于SPI的设备驱动程序架构以及相关数据结构,讨论部分设备的访问方法和特性,以及SPI与设备树相关的内容。
第10章“深入理解Linux内核内存分配”首先介绍虚拟内存的概念,描述整个内核内存的布局;然后介绍内核内存管理子系统,讨论内存分配和映射、相关API以及涉及的设备。
第11章“实现DMA支持”介绍DMA及其新的内核API——DMA引擎API,讨论不同的DMA映射,并描述如何解决缓存一致性问题。本章还用一个通用的例子总结相关的概念。
第12章“内存访问抽象化——Regmap API简介:寄存器映射抽象化”对寄存器映射API进行概述,讲解它们如何抽象底层的SPI事务,并介绍相关API。
第13章“揭秘内核IRQ框架”全面介绍Linux IRQ管理,从中断在整个系统中的传播开始,到中断控制器驱动程序,从而使用Linux IRQ域API解释中断多路复用的概念。
第14章“LDM简介”概述Linux的核心设计,描述对象如何在内核中表示,以及Linux底层通用设计原理——从kobject到设备,再到总线、类和设备驱动程序。
第15章“深入了解IIO框架”介绍内核数据采集和测量框架,以便处理数模转换器(Digital-to-Analog Converter,DAC)和模数转换器(Analog-to-Digital Converter,ADC)。本章从内核空间和用户空间介绍IIO API(得益于libiio),这些API用于处理触发的缓冲区和连续的数据捕获。
第16章“充分利用引脚控制器和GPIO子系统”描述内核引脚控制基础设施和API,以及GPIO芯片驱动程序和gpiolib(处理GPIO的内核API)。本章将介绍旧的和已弃用的基于整数的GPIO接口,以及新引入的基于描述符的GPIO接口,讨论在设备树中配置它们的方式。本章还会介绍libgpiod,这是用于在用户空间中处理GPIO的官方库。
第17章“利用Linux内核输入子系统”提供Linux内核输入子系统的全局视图,涉及基于IRQ的及轮询的输入设备,并介绍这两种API。本章将解释并展示用户空间如何处理此类设备。
本书假设读者对Linux操作系统有中等程度的了解,并具备基本的C语言编程知识(至少了解数据结构、指针处理和内存分配)。所有代码示例都已在Linux内核v5.10中测试通过。
其他必要的软件包在本书的专门章节中都有描述。下载内核源代码需要网络连接。
如果使用的是本书的电子版,建议读者自行编写代码,或者从本书的随书资源中获取代码。这样做能帮助你避免因复制和粘贴代码带来的潜在错误。