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片段:
知其所以然,不再迷惑了!
感谢点赞关注收藏!