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总线模型架构 Platform总线 (platform_bus_type) 匹配引擎 Platform设备 struct platform_device • name / id • resource[] / dev.of_node Platform驱动 struct platform_driver • probe() / remove() • of_match_table / id_table 匹配成功 → 调用 probe() 匹配成功后,驱动获得设备资源控制权,完成硬件初始化
关键理解: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主流方式
Platform驱动与设备树协作流程 设备树 (.dts/.dtsi) my_device: my-device@1c00000 compatible = "vendor,my-device" reg = <0x1c00000 0x1000> 内核编译 .dtb → 传递给内核 Platform驱动 of_match_table = { .compatible = "vendor,my-device" } 匹配成功 → 驱动 probe() 被调用 probe() 内部典型操作 ① platform_get_resource() → 获取IO内存/中断资源 ② devm_ioremap_resource() → 映射寄存器地址 ③ device_create() / misc_register() → 创建设备节点
常见误区:设备树不是驱动代码,而是硬件描述数据。驱动通过设备树获取"硬件长什么样",而不是"驱动怎么工作"。修改设备树不需要重新编译内核,只需更新.dtb文件即可。

1.4 为什么选择Platform驱动模型

在嵌入式Linux开发中,Platform驱动模型已成为事实标准,主要原因包括:

  1. 统一框架:所有内存映射设备使用相同的驱动接口,降低学习成本。
  2. 设备树解耦:硬件描述与驱动代码分离,支持多板卡复用。
  3. 电源管理集成:Platform驱动天然支持系统休眠/唤醒回调。
  4. 热插拔模拟:虽然设备是固定的,但驱动可以动态加载/卸载。
  5. 内核社区标准:所有主流SoC厂商(NXP、TI、Rockchip、Allwinner等)均采用此模型。