在做Android8时,发现在dts中引入了dto。设备树叠加层(DTO)可让主要的设备树(DTB)叠加到设备树上。使用DTO的引导程序可以维护系统芯片(SOC)DT,并动态叠加针对特定设备的DT,从而向树中添加节点并对先用树中的属性进行更改。也就是SOC的设备节点作为DTB,其他设备作为DTO,DTO可以对DTB中的节点进行引用和修改。实现DTO包括分割设备树,编译,分区和运行。

分割DT

首先将设备树分割成两部分:

主DT。由SOC供应商提供的SOC公用部分和默认配置。

叠加DT。由原始设计制造商(ODM)/原始设备制造商(OEM)提供的设备专属配置。

编译主DT和叠加DT

要编译主DT,请执行以下操作:

将朱.dts编译为.dtb文件。

将.dtb文件刷写到引导加载程序在运行时可访问的分区。

要编译叠加DT,请执行以下操作:

将叠加DT .dts编译为.dtbo文件。虽然文件格式与已格式化为扁平化设备树的.dtb文件相同,但是用不同的文件扩展名可以将其与主DT分开来。

将.dtbo文件刷写到引导加载程序在运行时可访问的分区。

对DT进行分区

在闪存中确定加载程序在运行时可访问和可信的位置以放入.dtb和.dtbo。

朱DT的实例位置:

引导分区的一部分,已附加到内核(image.gz)

单独的DT blob(.dtb),位于专用的(dtb)中。

在引导加载程序中运行

将 .dtb 从存储加载到内存中

将 .dtbo 从存储加载到内存中

用 .dtbo 叠加 .dtb 以形成合并的 DT

启动内核(已给定合并 DT 的内存地址)

对于包含关系,我们可以从dts目录下的Makefile看到:

dtbo-$(CONFIG_ARCH_SDM429) += sdm429-mtp-overlay.dtbo \

sdm429-cdp-overlay.dtbo \

sdm429-qrd-overlay.dtbo \

sdm429-spyro-qrd-evt-overlay.dtbo \

sdm429-spyro-qrd-dvt-overlay.dtbo

sdm429-spyro-qrd-evt-overlay.dtbo-base := sdm429-spyro.dtb

sdm429-spyro-qrd-dvt-overlay.dtbo-base := sdm429-spyro-dvt.dtb

对于SDM429来说,将有5个dtbo,sdm429-spyro-qrd-evt-overlay.dtbo-base这个dtbo依赖于sdm429-spyro.dtb,sdm429-spyro-qrd-dvt-overlay.dtbo-base这个dtbo依赖于sdm429-spyro-dvt.dtb。更具这些dtbo和dtb我们能够追溯到引用的各个dtsi文件。

更多推荐