当前位置:   article > 正文

linux kernel --- dts的相关操作函数_dts compatible

dts compatible

一、compatible匹配

1、dts 中写法

compatible = “aaa,bbb”

当一个驱动支持多个设备的时候,在每个设备的dts中,都会配置各自的compatible,当与driver中的compatible匹配后,会取各自的data。在 __of_match_node中有match++。

2、example

static const struct of_device_id plat_drv_match[] = {
   
    {
    .compatible = "aaa,bbb", .data = &bbb_hw_data},
    {
    .compatible = "aaa,ccc", .data = &ccc_hw_data},
    {
   }
};

data = of_device_get_match_data(dev);
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

在bbb.dts中,匹配到第1条,data就用第1条
在ccc.dts中,匹配到第2条,data就用第2条

3、源码

以下函数位于 //kernel4.14/drivers/of/device.c

const void *of_device_get_match_data(const struct device *dev)
{
   
        const struct of_device_id *match;

        match = of_match_device(dev->driver->of_match_table, dev);
        if (!match)
                return NULL;

        return match->data;
}
EXPORT_SYMBOL(of_device_get_match_data);
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

判断dts中的compatible属性是否包含driver中指定的compatible,
实际上返回的是dev->driver->of_match_table->data。
data是void *类型,自己如果想取到data里的值,就可以自己定义类型,里面可以放一些自己需要的参数。

二、根据dts中的reg-names得到dts中配置的reg

1、dts 中写法

reg的参数:第一个是地址,第二个是映射长度。
如果是32位,reg = <0x80000000 0x1000>;
如果是64位,reg = <0 0x80000000 0 0x1000>;
reg-names = “bbb”;

2、example

resource = platform_get_resource_byname(pdev, IORESOURCE_MEM, "bbb");
addr = resource->start; //为reg中的起始地址
size = resource_size(resource); //为reg中的内存大小
virt_addr = devm_ioremap_nocache(&pdev->dev, addr, size); //物理地址和虚拟地址的映射
  • 1
  • 2
  • 3
  • 4

3、源码

以下函数位于 //kernel4.14/drivers/base/platform.c

/**
 * platform_get_resource_byname - get a resource for a device by name
 * @dev: platform device
 * @type: resource type
 * @name: resource name
 */
struct resource *platform_get_resource_byname(struct platform_device *dev,
                                              unsigned int type,
                                              const char *name)
{
   
        u32 i
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/知新_RL/article/detail/712608
推荐阅读
相关标签
  

闽ICP备14008679号