您可以使用设备树编译器 (DTC) 编译设备树源文件。不过,在将叠加层 DT 应用于目标主 DT 之前,您还应该通过模拟 DTO 的行为来验证结果。
1. 通过DTC进行编译
使用 dtc 编译 .dts
时,您必须添加选项-@
以在生成的 .dtbo
中添加 __symbols__
节点。__symbols__
节点包含带label的所有节点的列表,DTO 库可使用这个列表作为引用。
构建主 DT .dts 的示例命令:
dtc -@ -O dtb -o my_main_dt.dtb my_main_dt.dts
构建叠加 DT .dts 的示例命令:
dtc -@ -O dtb -o my_overlay_dt.dtbo my_overlay_dt.dts
注意:如果您遇到 DTC 构建错误:invalid option --'@'
,则可能需要更新 DTC 版本。在 AOSP 上游,官方 DTC 对 DTO 的支持从版本 1.4.4 开始,而且大部分补丁程序在 2016 年 12 月后就完成了合并。为了支持 DTO,建议您使用 AOSP 中的 external/dtc,它已与最新的 DTC 同步(已视需要合并 DTO 补丁程序)。
2. 在host机器上验证 DTO 结果
验证流程可以帮助您识别将叠加层 DT 放在主 DT 上时可能发生的错误。更新目标之前,您可以通过在 .dts
中使用 /include/
模拟 DTO 行为,从而在主机上验证叠加层 DT 的结果。
注意:/include/
不支持在叠加层 DT source中使用__overlay__
。
使用语法 /include/
模拟主机上的 DTO:
1.创建叠加层 .dts
的副本。在副本中,移除第一行头文件。示例:
/dts-v1/;
/plugin/;
将文件另存为 my_overlay_dt_wo_header.dts
(或您希望的任何文件名)。
2.创建主 .dts
的副本。在副本中的最后一行后,为您在第 1 步中创建的文件附加 include 语法。例如:
/include/ "my_overlay_dt_wo_header.dts"
将文件另存为 my_main_dt_with_include.dts
(或您希望的任何文件名)。
3.使用 dtc 编译 my_main_dt_with_include.dts
以获得合并的 DT,这应该与使用 DTO 进行编译所得到的结果相同。例如:
dtc -@ -O dtb -o my_merged_dt.dtb my_main_dt_with_include.dts
- 使用 dtc dump my_merged_dt.dto。
dtc -O dts -o my_merged_dt.dts my_merged_dt.dtb
3. 在 Android 9 中验证 DTO
Android 9 需要具有设备树 Blob 叠加层 (DTBO) 分区。要在 SoC DT 中添加节点或更改属性,引导加载程序必须在 SoC DT 之上动态叠加设备专用的 DT。
3.1 指示被应用的叠加层
为了使供应商测试套件 (VTS) 能够评估叠加层应用的准确性,供应商必须添加新的kernel command linevans胡androidboot.dtbo_idx
,用于指示从 DTBO 分区中选择哪些叠加层。 In Android 12 using kernel version 5.10 or greater, this parameter passes through bootconfig. 例如,参数 androidboot. dtbo_idx=x,y,z
其中x、y 和 z 为 DTBO 分区中已由引导加载程序按相同顺序应用于基础设备树 (DT) 的设备树叠加层 (DTO) 的索引,这些索引以零为起点。
叠加层可以应用于主设备树中的节点,也可以添加新节点,但不能引用之前叠加层中添加的节点。这种限制是必要的,因为叠加层应用不会将叠加层符号表与主 DT 符号表合并(不合并的做法既可避免符号名称出现冲突,也可避免叠加层之间的依赖关系复杂化)。
3.1.1 示例:无效叠加层
在此示例中,overlay_2.dts
引用了由 overlay_1.dts
添加的节点 e。在将 overlay_1 应用于主 DT 之后,如果尝试将 overlay_2 应用于生成的 DT,叠加层应用将运行失败,并显示基础 DT 的符号表中不存在符号 e 的错误。
main.dts:
[main.dts]
/dts-v1/;
/ {
a: a {};
b: b {};
c: c {};
};
overlay_1.dts:
[overlay_1.dts]
/dts-v1/;
/plugin/;
&b { ref1 = <&a>;
e: e {
prop = <0x0a>;
phandle = <0x04>;
};
};
overlay_2.dts:
[overlay_2.dts]
/dts-v1/;
/plugin/;
/* invalid! */
&e {
prop = <0x0b>;
};
3.1.2 示例:有效叠加层
在此示例中,overlay_2.dts 仅引用了主 DTS 中的节点 b。将 overlay_1 和 overlay_2 依次应用于基础 DT 之后,节点 e 中属性 prop 的值(由 overlay_1.dts 设置)将被 overlay_2.dts 设置的值覆盖。
main.dts:
[final.dts]
/dts-v1/;
/ {
a: a {};
b: b {};
c: c {};
};
overlay_1.dts:
[overlay_1.dts]
/dts-v1/;
/plugin/;
&b { ref1 = <&a>;
e {
prop = <0x0c>;
};
};
overlay_2.dts:
[overlay_2.dts]
/dts-v1/;
/plugin/;
/* valid */
&b { ref1 = <&c>;
e {
prop = <0x0d>;
};
};
3.2 实现 DTBO 分区
要实现所需的 DTBO 分区,请确保bootloader可以执行以下操作:
- 识别它正在哪个开发板上运行,并选择要应用的相应叠加层。
将
androidboot.dtbo_idx
参数附加到内核命令行。- 该参数必须指示 DTBO 分区映像中由bootloader按相同顺序应用于基础 DT 的 DTO 的索引,这些索引以零为起点。
- 这些索引必须引用叠加层在 DTBO 分区中的位置。
3.3 验证 DTBO 分区
您可以使用 VTS 验证以下内容:
- 内核命令行参数
androidboot.dtbo_idx
是否存在(方法:检查 Init 是否已自动设置相应的ro.boot.dtbo_idx
系统属性)。 ro.boot.dtbo_idx
系统属性的有效性(方法:检查该属性是否至少指定了一个有效的 DTBO 映像索引)。- DTBO 分区的有效性(也验证 DTBO 分区中应用于基础 DT 的叠加层的有效性)。
- 生成的 DT 中的其他节点或属性更改是否已呈现给 Linux 内核。
例如,在以下叠加层和最终 DT 中,将 androidboot.dtbo_idx=5,3 添加到内核命令行可通过验证,而将 androidboot.dtbo_idx=3,5 添加到内核命令行不能通过验证。
索引 3 处的叠加层 DT:
[overlay_1.dts]
/dts-v1/;
/plugin/;
&c { prop = <0xfe>; };
索引 5 处的叠加层 DT:
[overlay_2.dts]
/dts-v1/;
/plugin/;
&c { prop = <0xff>; };
最终 DT:
/dts-v1/;
/ {
a {
phandle = <0x1>;
};
b {
phandle = <0x2>;
};
c {
phandle = <0x3>;
prop = <0xfe>;
};
__symbols__ {
a = "/a";
b = "/b";
c = "/c";
};
};
评论 (0)