Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Android dtbo(3) 编译和验证

Android dtbo(3) 编译和验证

作者头像
233333
发布于 2023-05-07 12:06:27
发布于 2023-05-07 12:06:27
1.4K00
代码可运行
举报
运行总次数:0
代码可运行

您可以使用设备树编译器 (DTC) 编译设备树源文件。不过,在将叠加层 DT 应用于目标主 DT 之前,您还应该通过模拟 DTO 的行为来验证结果。

1. 通过DTC进行编译

构建主 DT .dts 的示例命令:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
dtc -@ -O dtb -o my_main_dt.dtb my_main_dt.dts

构建叠加 DT .dts 的示例命令:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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 的副本。在副本中,移除第一行头文件。示例:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/dts-v1/;
/plugin/;

将文件另存为 my_overlay_dt_wo_header.dts(或您希望的任何文件名)。

2.创建主 .dts 的副本。在副本中的最后一行后,为您在第 1 步中创建的文件附加 include 语法。例如:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/include/ "my_overlay_dt_wo_header.dts"

将文件另存为 my_main_dt_with_include.dts(或您希望的任何文件名)。

  1. 使用 dtc 编译 my_main_dt_with_include.dts 以获得合并的 DT,这应该与使用 DTO 进行编译所得到的结果相同。例如:
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[main.dts]

/dts-v1/;

/ {
  a: a {};
  b: b {};
  c: c {};
};

overlay_1.dts:

[overlay_1.dts]

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/dts-v1/;
/plugin/;

&b { ref1 =  <&a>;
    e: e {
        prop = <0x0a>;
        phandle = <0x04>;
    };
};

overlay_2.dts:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[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:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[final.dts]

/dts-v1/;

/ {
  a: a {};
  b: b {};
  c: c {};
};

overlay_1.dts:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[overlay_1.dts]

/dts-v1/;
/plugin/;

&b { ref1 =  <&a>;
     e {
          prop = <0x0c>;
      };
};

overlay_2.dts:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[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:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[overlay_1.dts]

/dts-v1/;
/plugin/;

&c { prop = <0xfe>; };

索引 5 处的叠加层 DT:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[overlay_2.dts]

/dts-v1/;
/plugin/;

&c { prop = <0xff>; };

最终 DT:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/dts-v1/;
/ {
a {
    phandle = <0x1>;
};

b {
    phandle = <0x2>;
};

c {
    phandle = <0x3>;
    prop = <0xfe>;
};

__symbols__ {
    a = "/a";
    b = "/b";
    c = "/c";
};
};
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2023-05-05,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
基于全志D1-H掌握 Device Tree Oerlay 的魔法
Device Tree 是目前嵌入式 Linux 系统最常用的设备解耦工具, 所以要玩转嵌入式 Linux , 这个东西必须掌握.
阿志小管家
2024/02/02
2480
Linux之设备树解耦架构解读-V1.0
Dts:DTS即Device Tree Source,是一个文本形式的文件,用于描述硬件信息。一般都是固定信息,无法变更,无法overlay。
233333
2021/08/18
1.4K0
Linux之设备树解耦架构解读-V1.0
Linux设备树(DTS)介绍
Dts:DTS即Device Tree Source,是一个文本形式的文件,用于描述硬件信息。一般都是固定信息,无法变更,无法overlay。
芯动大师
2023/11/16
1K0
Linux设备树(DTS)介绍
Android dtbo(1) dto简介
设备树 (DT, Device Tree) 是用于描述 non-discoverable(google这样写的,意思应该就是硬件信息看不到) 硬件的命名节点和属性构成的一种数据结构。操作系统(例如在 Android 中使用的 Linux 内核)会使用 DT 来支持 Android 设备使用的各种硬件配置。硬件供应商会提供自己的 DT 源文件,接下来 Linux 会将这些文件编译成引导加载程序使用的DTB(Device Tree BLOB)文件。
233333
2023/05/07
2.8K0
Android dtbo(1) dto简介
Rockchip RK3588 - uboot引导方式介绍
开发板 :RK3588 EVB开发板 eMMC :256GB LPDDR4 :16GB 显示屏 :10.1英寸HDMI接口显示屏 u-boot :2017.09 linux :6.1
用户11537198
2025/03/07
3720
Linux内核设备树覆盖(Device Tree Overlay)原理和使用场景
本文基于Linux kernel 5.15版本进行说明,旨在解析Linux设备树覆盖(Device Tree Overlay, DTO)的工作原理及其应用场景。
bingwang
2024/03/18
2K0
Linux内核设备树覆盖(Device Tree Overlay)原理和使用场景
万字长文教你设备树语法 | 设备树实例解析
在之前使用 S3C2440 开发板移植 Linux 3.4.2 内核时,修改了很多关于 c 文件去适配开发板,和开发板相关的文件放在arch/arm/mxch-xxx目录下,因此 linux 内核 arm 架构下添加了很多开发板的适配文件:
Mculover666
2022/05/23
7.7K1
万字长文教你设备树语法 | 设备树实例解析
Android dtbo(2) dto语法
设备树源 (DTS,device tree source) 格式是设备树的文本表示形式。设备树编译器 (DTC) 可将这种格式处理为二进制设备树,这是 Linux 内核要求的形式。
233333
2023/05/07
8210
一文搞定 Linux 设备树
在Linux 2.6中, ARM架构的板极硬件细节过多地被硬编码在arch/arm/plat-xxx和arch/arm/mach-xxx中,采用设备树后,许多硬件的细节可以直接通过它传递给Linux,而不再需要在内核中进行大量的冗余编码。
刘盼
2021/10/12
5.9K0
一文带你搞懂设备树
设备树(Device Tree),将这个词分开就是“设备”和“树”,描述设备树的文件叫做 DTS(DeviceTree Source),这个 DTS 文件采用树形结构描述板级设备,也就是开发板上的设备信息,比如CPU 数量、 内存基地址、IIC 接口上接了哪些设备、SPI 接口上接了哪些设备等等。
Jasonangel
2021/11/17
4.3K0
IMX6ULL驱动开发实战连载-02设备树的编译和加载
上面介绍的编译模块是和内核一起编译的,这种编译方式比较耗时。在Linux3.x 以后的版本才引入了设备树,有了设备树之后,只需要一次编译内核,编译内核的时候会生成的dtc 工具,利用dtc工具就可以完成驱动的编译。我们这里只是简单介绍如何编译设备树、加载设备树,关于设备树,后面会有更加详细的解释。
嵌入式与Linux那些事
2021/05/20
2.5K0
IMX6ULL驱动开发实战连载-02设备树的编译和加载
Linux 设备树(DTS)的深入理解
上一节说过设备树的出现是为了解决内核中大量的板级文件代码,通过 DTS 可以像应用程序里的 XML 语言一样很方便的对硬件信息进行配置。关于设备树的出现其实在 2005 年时候就已经在 PowerPC Linux 里出现了,由于 DTS 的方便性,慢慢地被广泛应用到 ARM、MIPS、X86 等架构上。为了理解设备树的出现的好处,先来看下在使用设备树之前是采用什么方式的。
刘盼
2018/12/29
22.6K0
Android 系统架构及HAL层概述
apex_payload.img是由dm-verity支持的ext4文件系统映像。各种原生常规文件包含在apex_payload.img文件中
wizzie
2022/09/28
11.7K0
Android 系统架构及HAL层概述
Linux设备树(Device Tree)机制
在内核源码中,存在大量对板级细节信息描述的代码。这些代码充斥在/arch/arm/plat-xxx和/arch/arm/mach-xxx目录,对内核而言这些platform设备、resource、i2c_board_info、spi_board_info以及各种硬件的platform_data绝大多数纯属垃圾冗余代码。为了解决这一问题,ARM内核版本3.x之后引入了原先在Power PC等其他体系架构已经使用的Flattened Device Tree。
全栈程序员站长
2022/09/10
5.9K0
Linux设备树(Device Tree)机制
整理了一份Linux设备树基础知识!
在platform_device部分有简单说明描述设备有两种方法:一种是使用platform_device结构体来指定;另一种是使用设备树来描述。
CRMEB商城源码
2022/07/09
8490
整理了一份Linux设备树基础知识!
网友说Linux驱动讲不彻底,原来这才是Linux驱动
总线、设备和驱动模型,如果把它们之间的关系比喻成生活中的例子是比较容易理解的。举个例子,充电墙壁插座安静的嵌入在墙面上,无论设备是电脑还是手机,插座都能依然不动的完成它的使命——充电,没有说为了满足各种设备充电而去更换插座的。其实这就是软件工程强调的高内聚、低耦合概念。
嵌入式Linux内核
2022/10/22
1.7K0
网友说Linux驱动讲不彻底,原来这才是Linux驱动
Linux:设备树学习篇(1)
设备树是一种数据结构,它通过特有的语法格式描述片上片外的设备信息。由BootLoader传递给kernel,kernel进行解析后形成和驱动程序关联的dev结构供驱动代码使用。
四儿家的小祖宗
2022/11/15
3.3K0
Linux:设备树学习篇(1)
韦东山老师Linux设备树学习笔记(一)
我们需要编写设备树文件 (dts: device tree source) ,它需要编译为 dtb(device tree blob) 文件,内核使用的是 dtb 文件。
杨源鑫
2021/08/25
2.4K0
Linux U-Boot 开发指南
介绍 U-Boot 的编译打包、基本配置、常用命令的使用、基本调试方法等, 为 U-BOOT 的移植及应用开发提供了基础。
韦东山
2023/02/25
4.7K0
Linux U-Boot 开发指南
Linux设备树详解(一) 基础知识
关于设备树,之前就经过详细的系统培训,但是本着会用就行的原则,对各个知识点都没有进行系统的总结。都是用到哪里学哪里,时间长了,基本也忘记了。所以对于后期知识各个知识点进行总结,本章主要讨论一下内容,能看懂和修改对应模块的dts文件。
全栈程序员站长
2022/07/04
2.6K0
Linux设备树详解(一) 基础知识
相关推荐
基于全志D1-H掌握 Device Tree Oerlay 的魔法
更多 >
LV.0
这个人很懒,什么都没有留下~
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验