Android dtbo(3) 编译和验证
您可以使用设备树编译器 (DTC) 编译设备树源文件。不过,在将叠加层 DT 应用于目标主 DT 之前,您还应该通过模拟 DTO 的行为来验证结果。
1. 通过DTC进行编译
构建主 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(或您希望的任何文件名)。
- 使用 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";
};
};
Android dtbo(3) 编译和验证的更多相关文章
- Android studio 加速编译方法
JRebel for Android 是一个Android Studio的插件,可以大大加速Android Studio的编译速度,对于小项目来说或许不明显:但是当项目达到一定的规模时,它对于Andr ...
- 【转】Android 源码编译make的错误处理--不错
原文网址:http://blog.csdn.net/ithomer/article/details/6977386 Android源码下载:官方下载 或参考android源码下载方式 Android编 ...
- 【转】高通平台android 环境配置编译及开发经验总结
原文网址:http://blog.csdn.net/dongwuming/article/details/12784535 1.高通平台android开发总结 1.1 搭建高通平台环境开发环境 在高通 ...
- 有关android源码编译的几个问题
项目用到编译环境,与源码有些差异不能照搬,关键是连源码都没编译过,下面基本上是行网上照的各种自学成才的分享,病急乱投医了,都记在下面作为参照吧. 1.验证是否编译正确,在终端执行 emulator & ...
- Android工程的编译过程
现在很多人想对Android工程的编译和打包进行自动化,比如建立每日构建系统.自动生成发布文件等等.这些都需要我们对Android工程的编译和打包有一个深入的理解,至少要知道它的每一步都做了什么,需要 ...
- Android 秒级编译 Freeline
http://mp.weixin.qq.com/s?__biz=MzA4NTQwNDcyMA==&mid=2650662410&idx=1&sn=c654fa7b0cc8c91 ...
- android.intent.action.MAIN 与 android.intent.category.LAUNCHER 的验证理解 (转)
原文地址:android.intent.action.MAIN 与 android.intent.category.LAUNCHER 的验证理解 作者: 第一种情况:有MAIN,无LAUNCHER,程 ...
- android loginDemo +WebService用户登录验证
android loginDemo +WebService用户登录验证 本文是基于android4.0下的loginActivity Demo和android下的Webservice实现的.l ...
- Android 源代码自动编译packages/apps
/*************************************************************************** * Android 源代码自动编译packag ...
- Android源码编译的全过程记录
写本篇文章主要参考了官方文档和网上的一些资料,但是对于Android最新的代码来说,网上资料有些已经过时.本文中步骤已经作者实验,大家可以亲自执行试试.由于没有使用Eclipse的习惯,所以没有做Ec ...
随机推荐
- FindBugs质量管理
1. FindBugs是什么 FindBugs 是一个静态分析工具,它检查类或者 JAR 文件,将字节码与一组缺陷模式进行对比以发现可能的问题.有了静态分析工具,就可以在不实际运行程序的情况对软件进行 ...
- 【Git】介绍与概述
版本控制工具应该具备的功能? 协同修改 多人并行不悖的修改服务器端的同一个文件. 数据备份 不仅保存目录和文件的当前状态,还能够保存每一个提交过的历史状态. 版本管理 在保存每一个版本的文件信息的时候 ...
- 【GPU】如何两周内零经验手搓一个GPU | 美国工程师极限挑战 | 重写三次 | CUDA | SIMD | ISA指令集 | Verilog | OpenLane
地址: https://www.youtube.com/watch?v=FTh-c2ek6PU
- 什么是智慧城市(Smart City)?
Smart City是一个常见的概念,但是这个东西,这个名词到底指代的是什么却一直搞不太清,于是就查了查资料,有了这篇blog. 参考: https://baijiahao.baidu.com/s?i ...
- OneFlow框架0.9.1dev版本,成功安装并运行
安装cuda和cudnn: (此步骤可以忽略,pip安装框架时会自动安装依赖的cuda和cudnn环境) conda install cudatoolkit==11.8.0 python3 -m pi ...
- 很好用的python游戏环境(续2):强化学习算法走迷宫游戏环境(导航问题 navigation):分享一个python语言的迷宫游戏环境
相关前文: 很好用的python游戏环境(续):强化学习算法走迷宫游戏环境(导航问题 navigation):分享一个python语言的迷宫游戏环境 项目的GitHub地址: https://gith ...
- 使用CPU运行大语言模型(LLM),以清华开源大模型ChatGLM3为例:无需显卡!用CPU搞定大模型运行部署!【详细手把手演示】
教程视频地址: 无需显卡!用CPU搞定大模型运行部署![详细手把手演示] 按照上面视频进行安装配置之前需要注意,python编程环境需要大于等于python3.10,否则会运行报错.下载好GitHub ...
- obs 直播软件 虚拟摄像头插件 —— obs-virtualcam
如题: 外网下载地址: https://github.com/Fenrirthviti/obs-virtual-cam/releases 这个东西是做啥用的这里就不讲了,这个东西的资源不好找,找了好半 ...
- Ubuntu系统anaconda报错version `GLIBCXX_3.4.30' not found
参考文章: https://blog.csdn.net/zhu_charles/article/details/75914060 =================================== ...
- k8s资源预留
Kubernetes 的节点可以按照 Capacity 调度.默认情况下 pod 能够使用节点全部可用容量. 这是个问题,因为节点自己通常运行了不少驱动 OS 和 Kubernetes 的系统守护进程 ...