设备树源 (DTS) 格式是设备树 (DT) 的文本表示形式。设备树编译器 (DTC) 将此格式处理为二进制 DT,这是 Linux 内核期望的格式。
使用引用
DTC(设备树编译器 + 叠加补丁)项目在 dtc-format.txt 和 manual.txt 中描述了 DTS 格式。DTO 格式和规则在 dt-object-internal.txt 中进行了描述。这些文档描述了如何在叠加 DT 中使用节点 fragment@x
和语法 __overlay__
来更新主 DT。例如
/ { fragment@0 { target = <&some_node>; __overlay__ { some_prop = "okay"; ... }; }; };
但是,Google 强烈建议您不要使用 fragment@x
和语法 __overlay__
,而是使用引用语法。例如
&some_node { some_prop = "okay"; ... };
引用语法由 dtc
编译成与上面使用语法 __overlay__
相同的对象。此语法不强制您对 fragment 进行编号,使您可以轻松地读取和写入叠加 DTS。如果您的 dtc
不支持此语法糖,请使用 AOSP 中的 dtc。
使用标签
为了允许对编译时不存在的节点进行未定义的引用,叠加 DT .dts
文件必须在其标头中包含标签 /plugin/
。例如
/dts-v1/; /plugin/;
从这里,您可以使用引用来定位要叠加的节点,引用是以 & 为前缀的绝对节点路径。例如,对于主 DT 中的 node@0
在主 DT 中定义标签... | ...然后使用标签。 |
---|---|
[my_main_dt.dts] /dts-v1/; / { my_node: node@0 { status = "disabled"; my_child: child@0 { value = <0xffffffff>; }; }; }; |
[my_overlay_dt.dts] /dts-v1/; /plugin/; &my_node { status = "okay"; }; &my_child { value = <0x1>; }; |
覆盖
如果引用目标属性存在于主 DT 中,则在 DTO 之后会被覆盖;否则,它将被附加。例如
main.dts | overlay.dts | 合并结果 |
---|---|---|
[my_main_dt.dts] /dts-v1/; / { compatible = "corp,foo"; my_node: node@0 { status = "disabled"; }; }; |
[my_overlay_dt.dts] /dts-v1/; /plugin/; &my_node { status = "okay"; }; |
/dts-v1/; / { compatible = "corp,foo"; ... node@0 { linux,phandle = <0x1>; phandle = <0x1>; status = "okay"; }; }; |
附加
如果引用目标属性在主 DT 中不存在,则在 DTO 之后会被附加。例如
main.dts | overlay.dts | 合并结果 |
---|---|---|
[my_main_dt.dts] /dts-v1/; / { compatible = "corp,foo"; my_node: node@0 { status = "okay"; }; }; |
[my_overlay_dt.dts] /dts-v1/; /plugin/; &my_node { new_prop = "bar"; }; |
/dts-v1/; / { compatible = "corp,foo"; ... node@0 { linux,phandle = <0x1>; phandle = <0x1>; status = "okay"; new_prop = "bar"; }; }; |
子节点
子节点语法示例
main.dts | overlay.dts | 合并结果 |
---|---|---|
[my_main_dt.dts] /dts-v1/; / { compatible = "corp,foo"; my_nodes: nodes { compatible = "corp,bar"; node@0 { status = "disabled"; }; }; }; |
[my_overlay_dt.dts] /dts-v1/; /plugin/; &my_nodes { new_prop1 = "abc"; node@0 { status = "okay"; new_prop2 = "xyz"; }; }; |
/dts-v1/; / { compatible = "corp,foo"; ... nodes { linux,phandle = <0x1>; phandle = <0x1>; compatible = "corp,bar"; new_prop1 = "abc"; node@0 { linux,phandle = <0x2>; phandle = <0x2>; status = "okay"; new_prop2 = "xyz"; }; }; }; |