设备树覆盖:片段编号

时间:2015-11-20 21:17:17

标签: linux-kernel linux-device-driver 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__ {
            ...
        };
    };

};

1 个答案:

答案 0 :(得分:3)

这些数字(和名字)并不重要。看看drivers/of/overlay.c中的下一个函数:

of_overlay_create() - &gt; of_build_overlay_info() - &gt; of_fill_overlay_info() - &gt; find_target_node()

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

ovinfo->overlay = of_get_child_by_name(info_node, "__overlay__");

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

我甚至可以假设你可以完全省略那些@1@2后缀。请查看Device Tree specification(第2.2.1节节点名称):

  

设备树中的每个节点都按照以下约定命名:

     

node-name@unit-address

     

名称的unit-address组件特定于节点所在的总线类型。它包含   表2-1中字符集中的一个或多个ASCII字符的字符串。 unit-address必须   匹配节点的reg属性中指定的第一个地址。 如果节点没有reg属性,则   必须省略@unit-address,并且仅节点名称将节点与其他节点区分开来   在树中的同一级别。特定总线的绑定可以指定更多,更具体的   regunit-address格式的要求。

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

if ((*p1) == '@')

但我真的怀疑@&#39; @&#39;之后的数字。意味着什么(在你的情况下)。