1. Platform驱动概述
1.1 什么是Platform驱动
Platform驱动是Linux内核中用于管理非即插即用设备的一种驱动模型。在嵌入式系统中,大量设备(如I2C控制器、SPI控制器、GPIO控制器、UART等)无法通过PCI、USB等总线自动枚举,而是固定在SoC的地址空间上。Platform驱动为这类设备提供了统一的注册、匹配和操作框架。
核心定义:Platform驱动是挂载在虚拟Platform总线上的驱动程序,通过名称或设备树进行匹配,驱动对应的Platform设备。
| 特性 | 说明 |
|---|---|
| 驱动对象 | SoC内部外设、内存映射设备、无总线枚举能力的设备 |
| 匹配方式 | 名称匹配(传统方式)或设备树compatible匹配(主流方式) |
| 资源获取 | 通过platform_get_resource()从设备树或平台数据获取IO内存、中断等 |
| 生命周期 | probe()探测 → 设备操作 → remove()移除 |
1.2 Platform总线模型
Linux内核的Platform总线模型是Linux设备驱动模型(LDDM)在嵌入式领域的核心实现。它由三个基本组件构成:
- Platform总线(虚拟总线):内核中注册为
platform_bus_type,负责维护设备和驱动的匹配逻辑。 - Platform设备:通过
struct platform_device描述,包含设备名称、资源列表、设备树节点等信息。 - Platform驱动:通过
struct platform_driver描述,包含probe/remove回调、id_table或of_match_table。
关键理解:Platform总线是虚拟的,它不像物理总线那样传输数据,而是作为"媒人"将设备和驱动配对。配对成功后,驱动接管设备,完成硬件初始化。
1.3 Platform驱动与设备树的关系
设备树(Device Tree)是描述硬件拓扑结构的数据文件,Platform驱动通过设备树获取设备信息。两者的关系可以概括为:
- 设备树提供硬件描述:寄存器地址、中断号、时钟、DMA通道等资源信息。
- Platform驱动解析设备树:通过
of_match_table匹配节点,使用of_系列API读取属性。 - 解耦硬件与软件:同一份驱动代码,通过不同设备树文件适配不同硬件板卡。
| 对比维度 | 传统Platform驱动(无设备树) | 设备树Platform驱动 |
|---|---|---|
| 匹配方式 | .id_table 名称匹配 |
.of_match_table compatible匹配 |
| 资源来源 | platform_data 结构体 | 设备树节点属性解析 |
| 硬件适配 | 修改驱动代码 | 修改设备树.dts文件 |
| 可移植性 | 低,每款硬件需独立驱动 | 高,同一驱动适配多款硬件 |
| 内核维护 | ARM32早期方式,逐步淘汰 | ARM64/ARM32主流方式 |
常见误区:设备树不是驱动代码,而是硬件描述数据。驱动通过设备树获取"硬件长什么样",而不是"驱动怎么工作"。修改设备树不需要重新编译内核,只需更新.dtb文件即可。
1.4 为什么选择Platform驱动模型
在嵌入式Linux开发中,Platform驱动模型已成为事实标准,主要原因包括:
- 统一框架:所有内存映射设备使用相同的驱动接口,降低学习成本。
- 设备树解耦:硬件描述与驱动代码分离,支持多板卡复用。
- 电源管理集成:Platform驱动天然支持系统休眠/唤醒回调。
- 热插拔模拟:虽然设备是固定的,但驱动可以动态加载/卸载。
- 内核社区标准:所有主流SoC厂商(NXP、TI、Rockchip、Allwinner等)均采用此模型。