[Linux 驱动] -- platform_device 与 paltform_driver 的匹配(i2c_client 与 i2c_driver)

📅 2026/7/28 18:10:41 👁️ 阅读次数 📝 编程学习
[Linux 驱动] -- platform_device 与 paltform_driver 的匹配(i2c_client 与 i2c_driver)

自己总结

platform_device与platform_driver的匹配分为如下三种情况:

  1. 基于设备树风格的匹配:
    platform_driver.device_driver.of_device_id->compatible 和 设备树中的compatible属性进行比较;
  2. 匹配 id 表(id_table),即 platform_device 设备名是否出现在 platform_driver 的 id_table 中;
  3. 匹配 platform_device 设备名 与驱动的名字,即 platform_device->name 与 platform_driver->name;

i2c_client 与 i2c_driver 的匹配:

先匹配设备树,后匹配id表,即先匹配dts中的compatible属性与驱动i2c_driver中的 .of_match_table 指向的 of_device_id 中的compatible属性;

后匹配 i2c_client 的name(来源于dts的compatible)与i2c_driver中的id_table指向的i2c_device_id中的name属性。

一、platform_device 跟 platform_driver 的匹配

当我们把设备树文件转换为 dev 时,就能进行 drv 的匹配。

比较的有限顺序:

  1. 比较 platform_dev.driver_override 和 paltform_driver.drv->name;
  2. 比较 platform_dev.dev.of_node 的 compatible 属性 和 platform_driver.drv->of_match_table;
  3. 比较 platform_dev.name 和 platform_driver.id_table;
  4. 比较 platform_dev.name 和 platform_driver.drv->name;

扩展:

Linux内核还约定设备树节点名应写成形如<name>[@<unit_address>]的形式,其中name就是设备名(platform_device->name),最长可以是31个字符长度。unit_address一般是设备地址,用来唯一标识一个节点。

二、在跟文件系统查看设备树(有助于调试)

a、/sys/firmware/fdt :原始 dtb 文件

对这个文件使用命令:

hexdump -C /sys/firmware/fdt

可以查看原始的 dtb 文件:

b、/sys/firmware/devicetree

以目录结构呈现的 dtb 文件,根节点对应 base 目录,每一个节点对应一个目录,每一个属性对应一个文件。

同样用命令hexdump -C ./led进行查看:

c、/sys/devices/platform

系统中所有的 platform_device,有来自设备树的,也有 .c 文件中注册的,对于来自设备树的 platform_device,可以进入 /sys/devices/platform/<设备名>/of_node 查看它的设备树属性。

d、/proc/device-tree

/proc/device-tree 是链接文件指向 /sys/firmware/。