设备树覆盖:片段编号

ser*_*gej 4 linux-device-driver linux-kernel embedded-linux device-tree

考虑以下设备树覆盖示例。片段编号为 0、1、2。

数字重要吗?它们必须按升序排列吗?或者 0, 2, 1 也可以吗?哪里指定的?

/dts-v1/;
/plugin/;

/ {
    fragment@0 {
        target = <&foo>;
        __overlay__ {
            ...
        };
    };

    fragment@1 {
        target = <&bar>;
        __overlay__ {
            ...
        };
    };

    fragment@2 {
        target = <&baz>;
        __overlay__ {
            ...
        };
    };

};
Run Code Online (Sandbox Code Playgroud)

Sam*_*nko 5

这些数字(和名称)并不重要。看看下面的函数drivers/of/overlay.c

of_overlay_create()-> of_build_overlay_info()-> of_fill_overlay_info()->find_target_node()

如您所见,代码只是迭代tree(using for_each_child_of_node()),然后按"__overlay__"名称获取感兴趣的节点,如下所示:

ovinfo->overlay = of_get_child_by_name(info_node, "__overlay__");
Run Code Online (Sandbox Code Playgroud)

所以这些片段只是一些节点,它们的名称并不重要。唯一真正使用的是这些节点的内容。

我什至可以假设您可以完全省略那些@1,@2后缀。看一下设备树规范(第 2.2.1 节节点名称):

设备树中的每个节点根据以下约定命名:

node-name@unit-address

名称的组成部分unit-address特定于节点所在的总线类型。它由表 2-1 中的一组字符中的一个或多个 ASCII 字符组成。必须与节点属性unit-address中指定的首地址匹配。如果节点没有属性,则 必须省略,并且仅通过节点名称即可将该节点与树中同一级别的其他节点区分开来。特定总线的绑定可以为和 的格式指定附加的、更具体的要求。regreg@unit-addressregunit-address

当然,解析设备树文件的代码中可能存在一些技巧,如下所示:drivers/of/fdt.c, unflatten_dt_node()

if ((*p1) == '@')
Run Code Online (Sandbox Code Playgroud)

但我真的怀疑“@”后面的数字是否有意义(在你的情况下)。