[Linux 驱动] -- platform_device 与 paltform_driver 的匹配(i2c_client 与 i2c_driver)
自己总结
platform_device与platform_driver的匹配分为如下三种情况:
- 基于设备树风格的匹配:
platform_driver.device_driver.of_device_id->compatible 和 设备树中的compatible属性进行比较; - 匹配 id 表(id_table),即 platform_device 设备名是否出现在 platform_driver 的 id_table 中;
- 匹配 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 的匹配。
比较的有限顺序:
- 比较 platform_dev.driver_override 和 paltform_driver.drv->name;
- 比较 platform_dev.dev.of_node 的 compatible 属性 和 platform_driver.drv->of_match_table;
- 比较 platform_dev.name 和 platform_driver.id_table;
- 比较 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/。
