前言
在之前的文章中已经对设备树的基本概念作了讲解, 操作系统(例如在 Android 中使用的 Linux 内核)会使用 DT 来支持 Android 设备使用的各种硬件配置。硬件供应商(ODM)会提供自己的 DT 源文件,接下来 Linux 会将这些文件编译到引导加载程序使用的设备树 Blob (DTB) 文件中。
Android在原有的DT基础上增加了设备树叠加层的处理方式。进一步的对于芯片产品的DT和开发者(ODM/OEM/产品开发者)的DT做了解耦。
设备树叠加层 (DTO) 可让主要的(ODM)设备树 Blob (DTB) 叠加在Soc设备树上。使用 DTO 的引导加载程序可以维护系统芯片 (SoC) DT,并动态叠加针对特定设备(ODM)的 DT,从而向树中添加节点并对现有树中的属性进行更改。 本篇文章主要讲述如下内容:
- DT的专有名词
- Bootloader 加载DT的基本流程
- Android 下DTO的实现以及原理
- 实际案例-MT8167 平台DTS的加载完整流程
DT相关的专有名词
DT | Device Tree |
---|
DTB | Device Tree Blob | DTBO | Device Tree Blob for Overlay | DTC | Device Tree Compiler | DTO | Device Tree Overlay | DTS | Device Tree Source | FDT | Flattened Device Tree, a binary format contained in a .dtb blob file |
Bootloader 加载DT的基本流程
如上图所示,系统加载DT主要包含: DTS源文件编译, .dtb分区以及对应镜像文件生成, bootloader运行将.dtb 分区的文件加载到内存中, 将对应的内存地址通过寄存器传递到kernel。
在支持DTO的Android下, DT 是由以下两个部分组成:
- Main DT, 主要是Soc-only的部分以及默认的系统配置,例如cpu配置/内存相关配置等,soc的供应商提供, 本文所用的MT8167 那么这个Main DT就是由MTK提供的.
- Overlay DT, 该Soc所对应的产品需要的特定配置, 主要是由ODM/OEM提供,这里可以理解为开发者自己定义(当然目前在MT8167上MTK也提供了基本的Oerlay DT基本模板)
- 编译阶段
- 通过dtc(device tree compiler)将Main DT dts源文件编译为.dtb文件.
- 通过dtc(device tree compiler)将Overlay DT的dts源文件编译为后缀名为.dtbo的文件.
这里需要注意的是, .dtb和.dtbo 的文件格式是相同的都是FDT. 后缀名不同只是为了区分.
-
dtb分区 在MT8167这一平台上是将dtbo划分为了独立的分区, 具体的分析在实际案例章节会详细说明. -
运行
- 在bootloader中将.dtb文件读取到内存中
- 在bootloader中将.dtbo文件从dtbo分区(emmc指定分区)读取到内存中.
- 将.dtb 和 .dtbo 合并
- 在bootloader跳转启动kernel时,将该内存地址通过寄存器传递给到kernel
关于这个环节的详细流程在实际案例章节会详细说明.
实际案例-MT8167 平台DTS的加载完整流程
2022/05/29前输出
MT8167 平台的Main DT和Overlay DT一览
截图平台的相关DTS源文件 只需要截图部分就可以.
odmdtbo.img(dtbo) 构建以及.dtb的存储
bootloader中如何加载dtb和dtbo
需要具体的代码分析 以及如何传递给kernel
kernel中是如何使用获取到合并后的DT
参考链接
Google官方文档-Device Tree Overlays 【Device Tree】Device Tree 基础概念 【Device Tree】Kernel中的gpio driver在DTS下是如何初始化的
|