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.5K00
代码可运行
举报
运行总次数: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 删除。

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

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
微信小程序发送短信验证码完整实例
微信小程序注册完整实例,发送短信验证码,带60秒倒计时功能,无需服务器端。效果图:
用户4432598
2019/01/06
10.3K1
获取用户授权的手机号【微信小程序】
微信开发文档: https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/getPhoneNumber.html
很酷的站长
2023/01/08
4.2K0
获取用户授权的手机号【微信小程序】
小程序中wx.login与获取用户信息调用的时机
笔者最近在开发小程序,笔者直接嵌套的方式结合wx.login和getPhoneNumber,打算这样获取用户手机号:
挥刀北上
2020/11/10
3.1K0
小程序中wx.login与获取用户信息调用的时机
【黄啊码】PHP配合微信小程序实现获取手机号码【直接抄即可】
今天刚好做项目的时候用到这块功能,黄啊码就直接上手了,奈何网上的教程各式各样,就是没有个直接可以抄的,啊码最烦说话说一半,今天就直接弄个给大家抄的。
黄啊码
2022/09/28
1K0
【黄啊码】PHP配合微信小程序实现获取手机号码【直接抄即可】
[小程序]微信小程序获取input并发送网络请求
1. 获取输入框数据 wxml中的input上增加bindinput属性,和方法值 在js部分定义与之对应的方法,只要在输入的时候,数据就会绑定调用到该方法,存入data属性变量中
唯一Chat
2019/09/10
1.1K0
[小程序]微信小程序获取input并发送网络请求
全解小程序猜数字游戏 04《 程序员变现指南之 微信&QQ 小程序 真的零基础开发宝典》
由于小程序开发需要一定的基础,这些基础需要提前掌握,本教程只对小程序开发进行零基础说明。
1_bit
2022/01/06
9050
全解小程序猜数字游戏 04《 程序员变现指南之 微信&QQ 小程序 真的零基础开发宝典》
手把手教你完成微信小程序用户信息绑定(微信报修小程序源码讲解八)
1、打开微信开发工具,找到 app.json 文件,在 app.json 下添加一个页面:pages/binding/index
热心的程序员
2020/04/03
9660
微信小程序 - 通用页面(登录、注册、找回密码)
点击登录时,动态设置data属性值,改变登录按钮文本,背景色,显示loading动画,不可点击
用户5997198
2019/09/02
19.4K1
微信小程序 - 通用页面(登录、注册、找回密码)
零基础学小程序004----小程序post请求,提交数据到服务器,小程序下单,小程序用户注册功能
由于这段时间工作比较忙,小程序入门系列课程一直没有更新,今天好不容易抽个时间来更新系列教程,今天的这个教程对大家很有用,涉及到和后台服务器的数据交互。
编程小石头
2020/10/22
1.6K0
零基础学小程序004----小程序post请求,提交数据到服务器,小程序下单,小程序用户注册功能
用小程序·云开发轻松构建二手书商城小程序丨实战
使用组件开发效率会高很多,避免重复工作,同时可以参考部分组件的写法,还是有很多值得学习的地方的。
腾讯云开发TCB
2019/09/29
1.9K0
用小程序·云开发轻松构建二手书商城小程序(上)丨实战
今天是“世界读书日”,传承知识,手有余香~本文教你用小程序·云开发轻松制作二手书交易商城小程序,让智慧延续,让温暖传递。
腾讯云开发TCB
2020/06/03
2K0
微信小程序自定义登录
每次在输入框输入时,都会去触发该方法,并且带有参数,该参数(event)的 event.detail.value 值正是我们输入的最新内容,同时 event.currentTarget.id 是我们输入框设置的 id,正好可以用来区分 手机号码 和 密码。
乐心湖
2021/01/03
1.6K0
微信小程序自定义登录
微信小程序(逻辑层的全部知识点)保姆级讲解
小程序开发框架的逻辑层使用 JavaScript 引擎为小程序提供开发者 JavaScript 代码的运行环境以及微信小程序的特有功能。
淼学派对
2022/11/20
1.4K0
微信小程序(逻辑层的全部知识点)保姆级讲解
微信小程序提交form表单内容
wxml <form catchsubmit="confirmPublish"> <view class="cu-form-group margin-top"> <view class="title d-flex"> 姓名 </view> <view class="w-100 h-100 borderBottom flex-1 d-flex jc-start ai-center" style="height:100rpx;"> <input maxleng
王小婷
2021/06/29
1.6K0
小程序安全设置-弹出框输入获取值
小程序安全设置 Page({ /** * 页面的初始数据 */ data: { anquan: '', detailanquan: '', hiddenmodalput: true, //可以通过hidden是否掩藏弹出框的属性,来指定那个弹出框 idCard: '', password: '', phone: '', email: '', wxUnionid: '', // 修改密码 psd: "
达达前端
2022/04/29
1.2K0
微信小程序 获取手机号 JS
本文原创首发CSDN,链接 https://blog.csdn.net/qq_41464123/article/details/105214094 ,作者博客https://blog.csdn.net/qq_41464123 ,转载请带上本段内容,尤其是脚本之家、码神岛等平台,谢谢配合。 ----
Designer 小郑
2023/08/01
1.6K0
微信小程序 获取手机号 JS
[猫头虎分享21天微信小程序基础入门教程] 第17天:小程序的用户授权与安全
大家好,我是猫头虎,一名全栈软件工程师。今天我们继续微信小程序的学习,重点了解如何实现用户授权和确保小程序的安全性。这些内容对于保护用户隐私和数据安全至关重要。🚀
猫头虎
2024/05/28
2130
小程序入门,看这一篇就够了!
文章为实战中踩坑经历,以及解决方案。同时是自己的一个项目回顾,在这里分享给大家,希望能帮助到大家。文章内代码需要左右滑动噢~ 登录授权 授权(基本信息,手机号码 )必须使用小程序原生的的button组件,然后指定open-type 后通过回调才能拿到用户信息。代码入下: index.wxml<vi
腾讯NEXT学位
2019/11/18
8430
小程序入门,看这一篇就够了!
小程序页面跳转传参-this和that的区别-登录流程-下拉菜单-实现画布自适应各种手机尺寸
小程序调用wx.login() 获取 登录凭证code ,并回传到开发者服务器 调用接口wx.login() 获取临时登录凭证(code)
达达前端
2019/07/04
7470
微信小程序快速入门开发指南(三)
          url: app.globalData.uploadfileUrl,  //后台接收上传文件的接口
初九之潜龙勿用
2024/06/20
1990
推荐阅读
相关推荐
微信小程序发送短信验证码完整实例
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验