嵌入式Linux: ARM64: platform device的名字是怎么生成的?

platform device的名字是怎么生成的?

Qemu ARM64启动后,可以看到,platform device的名字有两种,如两个红框所示:

根据调用堆栈,在创建platform device的过程中,会调用of_device_make_bus_id来创建唯一的名字:

static void of_device_make_bus_id(struct device *dev)

{

    //从 dev->of_node 获取设备树节点 node

    struct device_node *node = dev->of_node;

    const __be32 *reg;

    u64 addr;

    /* 构造名称,必要时使用父节点以确保唯一性;使用 while 循环遍历 node 的父节点,直到到达根节点 */

    while (node->parent) {

        /*

         * 在每个节点上,检查是否存在 reg 属性

         */

        reg = of_get_property(node, "reg", NULL);

        if (reg && (addr = of_translate_address(node, reg)) != OF_BAD_ADDR) {

            dev_set_name(dev, dev_name(dev) ? "%llx.%pOFn:%s" : "%llx.%pOFn",

                         (unsigned long long)addr, node,

                         dev_name(dev));

            return;

        }

        /* format arguments only used if dev_name() resolves to NULL */

        dev_set_name(dev, dev_name(dev) ? "%s:%s" : "%s",

                     kbasename(node->full_name), dev_name(dev));

        node = node->parent;

    }

}

使用 while 循环遍历 node 的父节点,直到到达根节点。在每个节点上,检查是否存在 reg 属性。

第一种情况:
如果存在 reg 属性,调用of_translate_address尝试将地址翻译为物理地址。如果翻译成功且地址有效(不等于 OF_BAD_ADDR),调用dev_set_name则生成唯一名称并返回。如果 dev_name(dev) 已经有值,将其附加到新生成的名称后面。

dts的片段:

生成的名字:

第二种情况:

如果到达了根节点,仍然不存在reg 属性,或者调用of_translate_address失败,使用节点的 full_name 生成名称。

dts片段:

知其所以然,不再迷惑了!

感谢点赞关注收藏!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值