char
[TOC] drivers/char 字符设备(Character Devices) 面向字节流的设备驱动模型历史与背景这项技术是为了解决什么特定问题而诞生的?drivers/char 目录及其实现的字符设备(Character Device)模型是Linux乃至整个UNIX家族中最古老、最基础的驱动模型之一。它的诞生源于UNIX的设计哲学——“一切皆文件”(Everything is a file)。 这项技术的核心目标是为那些不以固定大小的数据块(block)进行I/O,而是以连续的字节流(byte stream)方式进行通信的硬件设备提供一个统一、标准的抽象接口。在早期,这主要包括: 终端和串口(TTYs and Serial Ports):用户通过键盘输入字符,屏幕显示字符,这些都是典型的字节流操作。 打印机:向打印机发送要打印的数据流。 磁带机:顺序地读取或写入数据。 通过将这些硬件抽象成文件系统中的一个节点(如 /dev/ttyS0),用户空间的应用程序就可以使用标准的文件I/O系统调用(open, read, write, c...
fdt
[TOC] fdtdec 扁平设备树解析 devicetree devicetree-specification devicetree-specification.pdf 设备树BLLOB结构 123456789101112131415161718struct fdt_header { fdt32_t magic; /* magic word FDT_MAGIC */ fdt32_t totalsize; /* total size of DT block */ fdt32_t off_dt_struct; /* offset to structure */ fdt32_t off_dt_strings; /* offset to strings */ fdt32_t off_mem_rsvmap; /* offset to memory reserve map */ fdt32_t version; /* format version */ fdt32_t last_comp_version; /* last compatible ver...
iio
[toc] drivers/iio 工业I/O子系统(Industrial I/O) 统一的传感器数据采集框架历史与背景这项技术是为了解决什么特定问题而诞生的?IIO(Industrial I/O)子系统的诞生是为了解决Linux内核中一个长期存在的混乱问题:缺乏一个标准的、统一的框架来处理各种传感器和数据转换器(ADC/DAC)。 在此框架出现之前,这类设备的驱动程序散落在内核的各个角落,缺乏一致性: 滥用其他子系统:一些加速度计驱动程序为了方便,将自己伪装成一个input设备(如摇杆),但这在语义上是不正确的。input子系统是为用户输入事件(如按键、鼠标移动)设计的,而不是为了测量物理世界的数据。 使用私有的字符设备:许多驱动创建自己独特的字符设备接口,使用自定义的ioctl命令。这导致用户空间的应用程序必须为每一种不同的传感器编写特定的支持代码,无法通用。 滥用sysfs:一些驱动直接通过sysfs文件来暴露连续的数据流。Sysfs的设计初衷是用于传递少量、低频的配置信息或状态值(“一文件一值”),用它来读取高速的...
clocksource
[TOC] clocksource 内核时钟源(Kernel Clocksource) 为内核提供统一的时间基准历史与背景这项技术是为了解决什么特定问题而诞生的?clocksource框架的诞生是为了解决Linux内核中一个根本性的问题:如何以一种统一、可移植的方式来处理多样化的硬件计时器。 硬件的多样性:不同的CPU架构和平台提供了五花八门的硬件计时器,例如x86上的TSC(时间戳计数器)、HPET(高精度事件定时器)、ACPI PM Timer,以及ARM平台上的Architected Timer等。这些计时器的精度、速度、稳定性和编程接口各不相同。 缺乏统一抽象:在clocksource框架出现之前,内核中的时间管理代码与特定的硬件架构和计时器紧密耦合。这使得将内核移植到新平台变得困难,也难以在运行时动态选择最优的计时器硬件。 对高精度的需求:随着系统应用(如实时系统、高频交易、性能剖析)对时间精度要求的提高,内核需要一个能够充分利用现代高精度计时器硬件的框架。 clocksource框架通过创建一个通用的抽象层,将这些底层硬件计时器的差异性隐藏起来,为内核的上...
mfd
[TOC] drivers/mfd 多功能设备驱动核心(Multi-Function Devices Core) 管理集成多种功能的复合芯片历史与背景这项技术是为了解决什么特定问题而诞生的?这项技术是为了解决现代集成电路(IC)日益增长的功能集成度所带来的驱动程序开发和管理难题。许多现代芯片,特别是电源管理集成电路(PMIC)、音频编解码器(Audio Codec)、系统控制器等,不再是单一功能的设备。它们在一个物理芯片上集成了多个可以独立工作的硬件模块。例如,一个PMIC可能同时包含: 多个直流-直流(DC-DC)转换器和低压差线性稳压器(LDO) 一个实时时钟(RTC) 一个GPIO控制器 一个中断控制器 一个看门狗定时器(Watchdog) 一个ADC(模数转换器) 如果没有MFD框架,开发者可能会编写一个巨大的、单一的“巨石型”(Monolithic)驱动程序来管理所有这些功能。这种做法会导致以下问题: 代码臃肿且难以维护:一个驱动文件包含所有功能的逻辑,违反了单一职责原则,代码耦合度高。 缺乏模块化和重用性:RTC功能部分的代码无法被内核标准的RT...
nvmem
[toc] drivers/nvmem/core.c NVMEM核心(NVMEM Core) 非易失性内存的统一访问框架历史与背景这项技术是为了解决什么特定问题而诞生的?NVMEM(Non-Volatile Memory)子系统的诞生是为了解决一个在嵌入式系统中普遍存在的问题:如何以一种标准的、统一的方式来访问各种小型、非易失性存储设备中的原始数据。 在此框架出现之前,内核中没有一个专门的子系统来处理这类需求,导致了实现上的混乱: 缺乏统一接口:一个以太网驱动需要从板载的I2C EEPROM中读取MAC地址,而一个无线网卡驱动可能需要从SoC内部的EFUSE(电子熔丝)中读取校准数据。这些驱动不得不自己去实现与特定存储芯片(EEPROM, EFUSE, OTP等)的交互逻辑,或者依赖于特定平台的私有接口。 驱动间强耦合:设备驱动(消费者)被迫要知道提供数据的存储芯片(生产者)的具体细节。如果硬件设计发生变化,例如将MAC地址从EEPROM移到了SPI Flash的一个分区中,那么设备驱动的代码就需要进行重大修改。 代码重复与不可移植:每个需要读取配置数...
leds
[TOC] drivers/leds LED子系统(LED Subsystem) 内核统一的LED设备控制框架历史与背景这项技术是为了解决什么特定问题而诞生的?LED子系统的诞生是为了解决在Linux内核中缺乏一个统一、抽象的LED管理方式的问题。在此框架出现之前,对LED的控制是零散且混乱的: 驱动代码重复:每个需要控制LED的驱动程序(例如,网卡驱动、SD卡驱动)都必须自己去实现操作GPIO或特定硬件寄存器的代码,导致大量功能相似的代码被重复编写。 缺乏统一的用户接口:用户无法以一种标准的方式来查看系统中有哪些LED,也无法在运行时改变它们的行为。控制LED的逻辑被硬编码在各自的驱动中。 逻辑与硬件强耦合:LED的“物理”控制(如何点亮它)和“逻辑”行为(为什么点亮它,例如因为网络活动)被混杂在一起。这使得更换LED硬件或改变其用途变得非常困难。 LED子系统的核心目标就是创建一个清晰的框架,将LED的物理控制与触发其亮灭的系统事件彻底解耦,并为用户空间提供一个标准的控制接口。 它的发展经历了哪些重要的里程碑或版本迭代?LED子系统的发展核心是触发器(Tr...
regmap
[TOC] regmapRegmap 简介Regmap 是 Linux 内核中的一个子系统,用于抽象和管理设备寄存器的访问。它为驱动程序提供了统一的接口,支持多种总线(如 I2C、SPI、MMIO 等)上的寄存器操作,同时提供了缓存、锁机制和调试功能。Regmap 的设计目标是简化驱动开发,减少重复代码,并提高寄存器访问的效率和安全性。 工作原理1. 核心概念 寄存器映射 (Register Map):Regmap 将设备的寄存器抽象为一个统一的映射,屏蔽了底层总线的差异。 寄存器缓存:Regmap 提供了可选的寄存器缓存机制,用于减少总线访问次数,提高性能。 寄存器访问控制:通过配置文件(struct regmap_config),可以定义哪些寄存器是可读、可写或易失的。 总线适配器:Regmap 支持多种总线(如 I2C、SPI、MMIO 等),通过总线适配器实现具体的读写操作。 2. 数据结构 struct regmap:表示寄存器映射的核心数据结构,包含寄存器的地址、值、缓存等信息。 struct regmap_config:配置寄存器映射的结构体,用...
OF
[TOC] OF在 Linux 内核中,of 通常是 Open Firmware 的缩写。Open Firmware 是一种硬件设备描述标准,用于描述设备树(Device Tree)。设备树是一种数据结构,用于以树状层次结构描述硬件的布局和配置,特别是在嵌入式系统和 ARM 架构中广泛使用。 of 表示与设备树(Device Tree)相关的驱动代码。 fdt.c 表示与 Flat Device Tree(FDT,扁平设备树)相关的实现。 设备树的作用设备树的主要作用是将硬件信息从内核代码中分离出来,使得内核可以通过解析设备树来获取硬件配置,而无需硬编码。这种方式提高了内核的可移植性和灵活性。 在 Linux 内核中,fwnode 和 node 是两种不同的结构体,分别用于描述硬件设备的固件信息和设备树节点信息。它们的主要区别在于用途和适用场景。 fwnode和node的区别1. fwnode_handlefwnode_handle 是一个通用的固件节点(firmware node)抽象,用于描述硬件设备的固件信息。它可以适配多种固件接口,例如设备树(Device T...
regulator
[TOC] drivers/regulator Regulator框架(Regulator Framework) 内核统一的电源供应管理框架历史与背景这项技术是为了解决什么特定问题而诞生的?Regulator(电源稳压器)框架的诞生是为了解决在现代嵌入式系统(尤其是SoC)中一个核心且日益复杂的问题:电源管理。 在此框架出现之前,对电源的控制是混乱、不可移植且与硬件高度耦合的: 代码的混乱与不可移植:设备驱动程序(例如一个Wi-Fi芯片驱动)需要电源才能工作。在没有统一框架的情况下,这个驱动必须包含特定于某个主板的代码来打开它的电源,例如通过I2C与PMIC(电源管理集成电路)通信,或者直接翻转一个GPIO引脚。这意味着同一个Wi-Fi驱动,如果要用在另一块使用不同PMIC的主板上,就需要被修改和重新编译。 缺乏电源拓扑视图:内核无法了解系统中复杂的电源供应关系(即“电源树”),例如哪个LDO(低压差稳压器)是由哪个Buck(降压)转换器供电的。这使得实现复杂的、系统级的电源优化变得几乎不可能。 无法实现动态电压与频率调整(DVFS):DVFS是现代CPU节能的...







