首页 > 其他分享 >Android dtbo(3) 编译和验证

Android dtbo(3) 编译和验证

时间:2023-05-05 10:44:46浏览次数:33  
标签:叠加 overlay 编译 dt dtbo dts Android my DT

您可以使用设备树编译器 (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(或您希望的任何文件名)。

  1. 使用 dtc 编译 my_main_dt_with_include.dts 以获得合并的 DT,这应该与使用 DTO 进行编译所得到的结果相同。例如:
dtc -@ -O dtb -o my_merged_dt.dtb my_main_dt_with_include.dts
  1. 使用 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可以执行以下操作:

  1. 识别它正在哪个开发板上运行,并选择要应用的相应叠加层。
  2. 将 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";
};
};

标签:叠加,overlay,编译,dt,dtbo,dts,Android,my,DT
From: https://www.cnblogs.com/linhaostudy/p/17373455.html

相关文章

  • UbOpenCV 编译和安装
      1.环境OS:Ubuntu18.04/Debian10OpenCVversion:3.4.15Board:RK3399 2.编译和安装 搭建python3.7虚拟环境#依次安装gcc和cmake等编译环境#安装python3.7-tk和python3.7-dev#安装virtualenv虚拟环境sudoaptinstallgcccmakegitbu......
  • 一个完整的编译Ptlib.Opal 的教程
    想到以前你第一次到我家的情景.有点伤感.还是把它埋在内心深处吧好好的生活.努力把音视频的知识打扎实。接下来的时间就好好研究ptlib和Opal的知识。并把学习的过程记录下来1.从开源中国下载Ptlib最新的版本.ptlib-2.8.0-src.zip2.先单独编译Configure分别用Debug和Release的......
  • 编译器优化选项和debug,release模式的区别(转)
    原文:https://blog.csdn.net/qq_41854911/article/details/129657879有时候,程序在Debug模式下运行的好好的,一Release就crash了。有时候,程序在Debug模式下崩溃了,Release模式下居然能正常运行。以上这种情况,可能很多人都遇到过。用C/C++的朋友都知道编译器编译有各种优化级别,编译......
  • 嵌入式linux移植——ptlib、H323plus、oh323tut 交叉编译
    前言:上一篇博客主要讲了比较多原理的东西,也是我解决问题时掌握到的一些东西和重要依据,这篇博客接着上一篇博客嵌入式linux移植——ptlib、H323plus交叉编译I继续往下讲~【补充】开发环境:Ubuntu16.04、Hi3531a;编译工具链:arm-hisiv300-linux; 【一个刷存在感而且想要骗赞......
  • 三步 让你的 vscode 自动编译ts文件
    1:环境安装tsc 作用:负责将ts 代码 转为 浏览器和nodejs识别的 js代码。/全局安装npminstall-gtypescript//检查是否安装成功tsc-v 2:自动编译运行tsc--init,创建tsconfig.json文件;修改tsconfig.json文件,设置编译后的js文件夹。快速查找outDir,输出......
  • 命令行编译和执行java代码
    虽然现在IDE很强大又很智能,但是平常随意写点练手的代码的时候,直接在命令行中使用vim和java命令更为方便快捷,可以做到无鼠标纯键盘的操作。首先保证将java相关指令添加到了环境变量中;1.编译class文件:javac-d./Test.java编译好的class文件会放置到环境当前目录(./)中。-d......
  • Qt6.5编译记录
        Qt6.5的长期支持版释放了,就开始了再次的折腾。首先安装编译环境,官方文档的编译环境链接为:QtforWindows-BuildingfromSource|Qt6.5 可以看到,很清爽,只需要Cmake,Ninja和Python3,不再需要其他的了,而且都提供了链接(但是实际编译时,如果需要编译QtPDF,还是需要Node......
  • 关于Android studio的虚拟机Webview出现网页无法加载,显示net::ERR_NAMENOT_RESOLVED的
    一开始出现了这个错误net::ERR_CLEARTEXT_NOT_PERMITTED参考这三个文献,https://www.cnblogs.com/suhq/p/14414882.htmlhttps://blog.csdn.net/qq_59125846/article/details/121953461https://blog.csdn.net/weixin_43169336/article/details/128379580都试了一遍后,问题消失,......
  • Android dtbo(2) dto语法
    设备树源(DTS,devicetreesource)格式是设备树的文本表示形式。设备树编译器(DTC)可将这种格式处理为二进制设备树,这是Linux内核要求的形式。1.使用引用DTC(DeviceTreecompiler+overlaypatches)项目在dtc-format.txt和manual.txt中说明了DTS格式。在dt-object-......
  • Android dtbo(1) dto简介
    设备树(DT,DeviceTree)是用于描述non-discoverable(google这样写的,意思应该就是硬件信息看不到)硬件的命名节点和属性构成的一种数据结构。操作系统(例如在Android中使用的Linux内核)会使用DT来支持Android设备使用的各种硬件配置。硬件供应商会提供自己的DT源文件,......