1. struct of_device_id 基础解析
在Linux设备驱动开发领域,of_device_id结构体扮演着至关重要的角色。这个看似简单的数据结构,实际上是连接设备树(Device Tree)与驱动程序的桥梁。我第一次接触这个结构体是在调试一块定制开发板时,当时花了整整两天才理解清楚它的完整工作机制。
of_device_id本质上是一个匹配表,用于描述驱动程序可以支持的设备。在设备树机制中,每个硬件设备都在.dts文件中以节点形式描述,而驱动则需要通过of_device_id来声明自己能够匹配哪些设备节点。这种机制完美替代了传统的硬编码设备注册方式,使得同一份驱动代码可以灵活适配不同硬件配置。
2. of_device_id 结构定义与成员详解
2.1 基础结构定义
在Linux内核头文件include/linux/mod_devicetable.h中,我们可以找到of_device_id的完整定义:
c复制struct of_device_id {
char name[32];
char type[32];
char compatible[128];
const void *data;
};
这个结构体虽然只有四个成员,但每个都承担着特定职责。我第一次实现驱动时,就曾因为混淆了name和compatible的用途而导致驱动无法正常加载。
2.2 关键成员解析
compatible成员:这是最重要的匹配字段,采用"制造商,型号"的格式。例如:
c复制static const struct of_device_id my_driver_ids[] = {
{ .compatible = "fsl,imx6q-gpio" },
{ /* sentinel */ }
};
当设备树节点的compatible属性与驱动中声明的任何一个of_device_id条目匹配时,内核就会将二者关联起来。我在实践中发现,有些厂商会使用多个兼容字符串,这时驱动也需要相应声明多个匹配项。
data成员:这是个容易被忽视但很有用的字段,它可以指向任意数据。在复杂驱动中,我经常用它来传递设备特定的配置参数:
c复制static const
