2. Linux设备模型基础:总线、设备、驱动三要素及其相互关系

在深入Platform驱动适配之前,必须理解Linux内核设备模型的核心抽象。该模型将硬件资源、软件控制逻辑与通信通道解耦为三个基本要素:总线(Bus)、设备(Device)和驱动(Driver)。这三者构成了内核管理硬件拓扑、电源状态和热插拔事件的基石。

2.1 三要素定义与职责

要素 内核数据结构 核心职责 典型实例
总线 struct bus_type 定义设备与驱动的匹配规则;管理设备/驱动链表;提供热插拔、电源管理回调 platform_bus_type、i2c_bus_type、spi_bus_type
设备 struct device 描述硬件实体:寄存器地址、中断号、时钟、DMA通道;挂载在总线上 platform_device、i2c_client
驱动 struct device_driver 实现硬件操作逻辑:probe()、remove()、suspend()、resume();与设备绑定后生效 platform_driver、i2c_driver
关键认知:总线是“媒人”,设备是“资源描述者”,驱动是“操作执行者”。驱动不直接操作设备,而是通过总线匹配后,由内核调用驱动的probe()函数完成绑定。

2.2 三要素的相互关系

三者之间的协作遵循“注册 → 匹配 → 绑定 → 回调”的固定流程。下图展示了核心关系与数据流向:

总线、设备、驱动三要素关系图 总线 (bus_type) match() / 链表管理 设备 (device) 资源描述 / 硬件属性 驱动 (driver) probe() / remove() 匹配成功 → 绑定 调用驱动 probe() 注册/挂载 注册/挂载 驱动操作硬件

2.3 匹配与绑定流程

当设备和驱动都注册到同一总线后,内核自动执行以下步骤:

  1. 设备注册:调用 device_add() 将设备挂入总线设备链表,触发总线匹配扫描。
  2. 驱动注册:调用 driver_register() 将驱动挂入总线驱动链表,触发总线匹配扫描。
  3. 匹配执行:总线调用 bus_type.match() 函数,比较设备与驱动的标识(如名称、设备树compatible属性、ID表)。
  4. 绑定通知:匹配成功时,内核设置 device->driver 指针,并将设备加入驱动的设备列表。
  5. probe回调:内核调用驱动提供的 probe() 函数,驱动在此函数中获取设备资源、初始化硬件、注册子系统接口。
核心代码路径:以Platform总线为例,匹配函数为 platform_match(),其匹配优先级为:设备树compatible → ACPI ID → 名称/别名 → 平台ID表。

2.4 关键数据结构关系

内核源码中,三要素通过指针相互引用,形成网状结构:

struct bus_type {
    const char *name;
    int (*match)(struct device *dev, struct device_driver *drv);
    struct subsys_private *p;  // 内部管理设备链表和驱动链表
};

struct device {
    struct bus_type *bus;       // 所属总线
    struct device_driver *driver; // 绑定的驱动(匹配后赋值)
    void *platform_data;        // 平台数据(非设备树时使用)
    struct device_node *of_node; // 设备树节点指针
};

struct device_driver {
    const char *name;
    struct bus_type *bus;       // 所属总线
    int (*probe)(struct device *dev);
    int (*remove)(struct device *dev);
};

2.5 三要素在Platform总线中的实例化

Platform总线是虚拟总线,用于描述“非可枚举”设备(如SoC内部外设)。其具体实现如下:

抽象要素 Platform具体类型 注册函数 匹配依据
总线 platform_bus_type 内核启动时自动注册 platform_match()
设备 platform_device platform_device_register() 设备树compatible / 名称
驱动 platform_driver platform_driver_register() of_match_table / id_table
常见误区:初学者常认为驱动直接“找到”设备。实际上,驱动只负责注册自己,匹配工作完全由总线完成。驱动开发者只需确保 of_match_table 或 id_table 与设备树/设备名称一致即可。

2.6 设备模型与设备树的关系

设备树(Device Tree)是设备模型在嵌入式平台上的“资源供给端”。设备树提供设备描述,内核在启动时解析设备树并创建 platform_device 实例,然后挂入Platform总线。下图展示了从设备树到驱动绑定的完整链路:

设备树 → 设备模型 → 驱动绑定链路 设备树 (.dts) compatible / reg / interrupts OF解析 platform_device 资源转换 / 挂入总线 platform_bus_type match() 匹配 platform_driver of_match_table probe() 执行 → 设备就绪

2.7 本章小结

  • 总线是匹配引擎,负责连接设备和驱动;设备描述硬件资源;驱动实现控制逻辑。
  • 三要素通过 bus_type.match() 完成绑定,绑定后调用驱动的 probe() 进行初始化。
  • Platform总线是设备模型在嵌入式领域的核心实现,设备树是其设备描述的主要来源。
  • 理解三要素关系是掌握Platform驱动适配的前提,后续章节将深入设备树匹配细节与probe编程。