内核对设备树的处理

内核对设备树的处理

从源代码文件 dts 文件开始,设备树的处理过程如下:
在这里插入图片描述

拆解

  1. dts 在 PC 机上被编译为 dtb 文件;
  2. u-bootdtb 文件传给内核;
  3. 内核解析 dtb 文件,把每一个节点都转换为 device_node 结构体;
  4. 对于某些 device_node 结构体,会被转换为 platform_device 结构体;

dtb 中每一个节点都被转换为 device_node 结构体

在这里插入图片描述
根节点被保存在全局变量 of_root 中,从 of_root 开始可以访问到任意节点。

哪些设备树节点会被转换为 platform_device

  1. 根节点下含有 compatile 属性的子节点
  2. 含有特定 compatile 属性节点的子节点
    如果一个节点的 compatile 属性,它的值是这4者之一:“simple-bus”, “simplemfd”,,“isa”,“arm,amba-bus”,
    那么它的子节点(需含 compatile 属性)也可以转换为 platform_device
  3. 总线 I2CSPI 节点下的子节点:不转换为 platform_device
    某个总线下到子节点,应该交给对应的总线驱动程序来处理,他们不应该转换为platform_device

怎么转换为 platform_device

内核处理设备树的函数调用过程,这里就不去分析了;只总结结论:

  1. platform_device 中含有 resource 数组,它来自 device_nodereg, iinterrupts 属性;
  2. platform_device.dev.of_node 指向 device_node,可以通过它获取其他属性。

platform_device 与 platform_driver 是如何匹配的?

从设备树转换得到 platform_device 会被注册进内核里,以后当我们每注册一个platform_driver 时,它就会两两确定能否匹配,如果能配对成功就调用 platform_driverprobe 函数。

复习一下以前的 匹配规则
在这里插入图片描述

  1. 最先比较:是否强制选择某个 driver
    比较 platform_device.driver_overrideplatform_driver.name,可以设置platform_devicedriver_override,强制选择某个 platform_driver

  2. 然后比较:设备树信息
    比较:platform_device.dev.of_nodeplatform_driver.of_match_table

    由设备树节点转换得来的 platform_device 中,含有一个结构体 of_node
    它的类型如下:
    在这里插入图片描述
    如果一个platform_driver 支持设备树,它的 platform_driver.driver.of_match_table是一个数组,类型如下:
    在这里插入图片描述
    使用设备树信息来判断 dev 和 drv 是否配对时,
    首先,如果 of_match_table 中含有 compatible 值,就跟 dev 的 compatile 属性比较,若一致则成功,否则返回失败;
    其次,如果 of_match_table 中含有 type 值,就跟 dev 的 device_type 属性比较,若一致则成功,否则返回失败;
    最后,如果 of_match_table 中含有 name 值,就跟 dev 的 name 属性比较,若一致则成功,否则返回失败。

而设备树中建议不再使用 devcie_type 和 name 属性,所以基本上只使用设备节点的compatible 属性来寻找匹配的 platform_driver。

  1. 接下来比较 platform_device_id
    比较 platform_device.nameplatform_driver.id_table[i].name , id_table中可能有多项。
    platform_driver.id_tableplatform_device_id 指针,表示该 drv 支持若干个 device ,它里面列出各个 device{.name, .driver_data} ,其中的 name 表示该 drv 支持的设备的名字,driver_data 是提供给改 device 的私有数据。

  2. 最后比较 platform_device.nameplatform_driver.driver.name
    platform_driver.id_table 可能为空,这时可以根据 platform_driver.driver.name 来寻找同名的 platform_device

总结成一张图:
在这里插入图片描述

  • 9
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值