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 三要素的相互关系
三者之间的协作遵循“注册 → 匹配 → 绑定 → 回调”的固定流程。下图展示了核心关系与数据流向:
2.3 匹配与绑定流程
当设备和驱动都注册到同一总线后,内核自动执行以下步骤:
- 设备注册:调用
device_add()将设备挂入总线设备链表,触发总线匹配扫描。 - 驱动注册:调用
driver_register()将驱动挂入总线驱动链表,触发总线匹配扫描。 - 匹配执行:总线调用
bus_type.match()函数,比较设备与驱动的标识(如名称、设备树compatible属性、ID表)。 - 绑定通知:匹配成功时,内核设置
device->driver指针,并将设备加入驱动的设备列表。 - 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总线。下图展示了从设备树到驱动绑定的完整链路:
2.7 本章小结
- 总线是匹配引擎,负责连接设备和驱动;设备描述硬件资源;驱动实现控制逻辑。
- 三要素通过
bus_type.match()完成绑定,绑定后调用驱动的probe()进行初始化。 - Platform总线是设备模型在嵌入式领域的核心实现,设备树是其设备描述的主要来源。
- 理解三要素关系是掌握Platform驱动适配的前提,后续章节将深入设备树匹配细节与probe编程。