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

一、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);

在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);

判断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); //物理地址和虚拟地址的映射

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
  • 3
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值