?1、DTBO简介 ? ? ?
? ? ? ?设备树 (DT) 是用于描述“不可发现”硬件的命名节点和属性构成的一种数据结构。操作系统(例如在 Android 中使用的 Linux 内核)会使用 DT 来支持 Android 设备使用的各种硬件配置。硬件供应商会提供自己的 DT 源文件,接下来 Linux 会将这些文件编译到引导加载程序使用的设备树 Blob (DTB) 文件中。
设备树叠加层?(DTO) 可让主要的设备树 Blob (DTB) 叠加在设备树上。使用 DTO 的引导加载程序可以维护系统芯片 (SoC) DT,并动态叠加针对特定设备的 DT,从而向树中添加节点并对现有树中的属性进行更?改。
设备树叠加层 (DTO)?扩展了现有的扁平化设备树 (FDT)?实现,让用户空间可以通过加载用于修改原始数据的额外叠加层 FDT,在运行时修改内核中的初始设备树数据。Android 不要求在运行时从用户空间更新 DT blob,而是建议供应商借助?libfdt ?或?libufdt ?在引导加载程序中添加设备树补丁程序
? ? ? ?DTBO(DTB Overlay,设备树块覆盖)用于在 DTB(Device Tree Blob,设备树块)的基础上添加或修改节点信息。它可以配置 ODM(Original Design Manufacturer,原始设计商)和OEM(Original Equipment Manufacturer,原始设备生产商)特有的设备节点,使这些配置与 SoC 隔离,从而让配置与更新更加方便灵活。
? ? ? ?多 DTBO 结构,编译时同一个 BSP_BUILD_FAMILY 下的多个 DTBO 都会打包到 dtbo.img 中。以 SC9863A 为例,图 图 1-1 为其多 DTBO 结构,其中 sp9863a-3h10-overlay.dtbo-base、sp9863a-1c10-overlay.dtbo-base 和 sp9863a-1h10-overlay.dtbo-base 指定的 sp9863a.dtb 都会编译并打包到 dtb.img 中。
?图1-1 多DTBO 结构示意图
? ? ?U-Boot 在启动时,它会匹配 DTBO 并将其内容合入或者覆盖到匹配的 DTB 中,随后加载到 DDR,再将地址传给 Kernel. ? ? ?dtb.img 在 boot header V2 时会打包到 boot.img,而在 boot header V3/V4 时会打包到 vendorboot.img。 ? ? ?系统引入 DTBO 后,设备树分割为两部分: ? Native DT:Vendor 供应商提供的 SoC 公用部分和 Vendor 默认配置。 ? Overlay DT:ODM/OEM 提供的专属配置或客制化差异配置。?
2、DTB 和 和 DTBO 节点编写?
2.1 基本语法规范 ? ? ? DTBO 基本语法规范如下: ? ? ? 1. DTB 和 DTBO 的源文件在文件起始位置必须包含“/dts-v1/;”字符串标签。 ? ? ? 2. DTBO 的源文件起始位置必须包含“/plugin/;”字符串标签。这是为了避免编译过程中 DTBO 对当前文件不存在的节点引用时产生报错。 ? ? ? ?3. DTBO 支持 fragment 语法,fragment、target-path 和__overlay__三部分构成完整的 fragment 语法结构。其中每个部分含义如下: ? fragment 代表需要引用 DTB 中节点的片段标签 ? target-path 代表需要引用的 DTB 中的节点名称 ? __overlay__里的内容代表实际叠加到 DTB 中的内容 具体编写代码示例如图 图 2-1 所示。
图2-1 DTBO 编写示例
扩展阅读:设备树叠加层
|