3. Android DTS 目录结构:kernel/arch/arm64/boot/dts/ 下的组织方式

Android 设备树源文件(DTS)的物理存放路径遵循 Linux 内核主线规范,同时融入了厂商(Vendor)与平台(Platform)的层次划分。理解这一目录结构,是进行多板型 DTS 覆盖与配置分离的基础。

3.1 顶层目录布局

所有 ARM64 架构的设备树文件均位于内核源码树的固定路径下:

kernel/arch/arm64/boot/dts/
├── allwinner/
├── amlogic/
├── broadcom/
├── exynos/
├── freescale/
├── hisilicon/
├── mediatek/
├── qcom/
├── rockchip/
├── samsung/
├── ti/
└── ...

每个顶级子目录对应一个 SoC 厂商或平台家族。在 Android BSP 工程中,最常打交道的目录包括 qcom/(高通)、mediatek/(联发科)、exynos/(三星)、rockchip/(瑞芯微)等。

实践要点:Android 编译系统通过 BOARD_KERNEL_DTS 或 TARGET_DEVICE 变量定位具体 DTS 文件路径,而非扫描整个目录树。因此,目录结构的规范性直接影响编译效率。

3.2 Vendor 与 Platform 二级目录划分

在主流厂商目录内部,普遍采用 Vendor(厂商/品牌) 与 Platform(平台/芯片组) 两级子目录进行组织。以高通(qcom)为例:

kernel/arch/arm64/boot/dts/qcom/
├── sm8250.dtsi              # 平台级 .dtsi(Snapdragon 865)
├── sm8250-pinctrl.dtsi      # 引脚复用专用 .dtsi
├── sm8250-camera.dtsi       # 摄像头专用 .dtsi
├── sm8250-display.dtsi      # 显示专用 .dtsi
├── sm8250-vidc.dtsi         # 视频编解码专用 .dtsi
├── sm8250-audio.dtsi        # 音频专用 .dtsi
├── sm8250-thermal.dtsi      # 温控专用 .dtsi
│
├── vendor/
│   ├── xiaomi/
│   │   ├── sm8250-xiaomi-alioth.dts   # 小米 K40 Pro
│   │   ├── sm8250-xiaomi-alioth-overlay.dts
│   │   └── sm8250-xiaomi-cas.dts      # 小米 10 Ultra
│   ├── oneplus/
│   │   ├── sm8250-oneplus-lemonade.dts # OnePlus 9
│   │   └── sm8250-oneplus-lemonadev.dts
│   └── google/
│       ├── sm8250-google-redbull.dts
│       └── sm8250-google-redbull-overlay.dts
│
└── platform/
    ├── sm8250-mtp.dts        # 高通参考设计板(MTP)
    ├── sm8250-cdp.dts        # 高通参考设计板(CDP)
    ├── sm8250-rumi.dts       # 仿真/模拟平台
    └── sm8250-qrd.dts        # 高通参考设计(QRD)
关键概念:
  • Platform 目录:存放 SoC 厂商提供的参考设计板级文件,用于芯片验证和早期驱动开发。
  • Vendor 目录:存放终端设备厂商(OEM/ODM)的定制板级文件,包含产品特有的外设配置、GPIO 定义、电源管理等。

3.3 目录划分对比表

维度 Platform 目录 Vendor 目录
维护者 SoC 厂商(如高通、联发科) 终端设备厂商(如小米、OPPO)
文件类型 参考设计 DTS、芯片级 .dtsi 产品级 DTS、Overlay DTS
变更频率 低(随内核版本或芯片版本更新) 高(每个项目、每个 SKU 都可能变更)
配置范围 SoC 内部模块、总线、时钟、电源域 外设型号、GPIO 复用、LCD/TP 参数、传感器
复用性 跨多个 Vendor 项目复用 通常仅限同一产品系列
编译入口 由 Platform 的 Makefile 统一包含 由 BoardConfig.mk 或 dtbo.img 构建脚本指定

3.4 目录结构的内联 SVG 架构图

下图展示了从 SoC 厂商到终端产品的 DTS 文件组织层级与依赖关系:

Android DTS 目录结构:Vendor 与 Platform 划分 Android DTS 目录结构 — Vendor 与 Platform 划分 kernel/arch/arm64/boot/dts/qcom/ platform/(SoC 厂商参考设计) sm8250-mtp.dts sm8250-cdp.dts sm8250-qrd.dts vendor/(OEM/ODM 定制) xiaomi/ oneplus/ google/ sm8250-xiaomi-alioth.dts sm8250-oneplus-lemonade.dts sm8250-google-redbull.dts sm8250.dtsi(芯片级) 图例说明 Platform 目录:SoC 厂商参考设计板级文件 Vendor 目录:OEM/ODM 产品定制板级文件 芯片级 .dtsi:被所有板级文件 #include 引用 产品 DTS:最终编译生成 dtb/dtbo 的源文件 Vendor 子目录:按品牌/项目分组

3.5 文件命名规范与编译映射

Android DTS 文件的命名遵循 <soc_platform>-<vendor>-<board>.dts 的约定,这种命名方式直接映射到编译系统的目标输出:

  • dtb 文件:sm8250-xiaomi-alioth.dtb — 由同名 DTS 编译生成,用于 boot 分区。
  • dtbo 文件:sm8250-xiaomi-alioth-overlay.dtbo — 由 overlay DTS 编译生成,用于 dtbo 分区。
  • dtb.img:多个 dtb 打包而成,包含同一平台下所有兼容板型的设备树。
常见陷阱:部分厂商在 Vendor 目录下直接放置 .dtsi 文件而非 .dts 文件,这会导致编译系统无法识别为独立板型入口。正确的做法是:Vendor 目录下只放 .dts(或 -overlay.dts),所有共享配置通过 #include 引用 Platform 目录或芯片级 .dtsi。

3.6 多板型场景下的目录组织策略

当一个 Vendor 在同一平台下维护多个板型时,推荐采用以下目录组织方式:

kernel/arch/arm64/boot/dts/qcom/vendor/xiaomi/
├── sm8250-xiaomi-alioth.dts          # 主 DTS
├── sm8250-xiaomi-alioth-overlay.dts  # DTBO 覆盖
├── sm8250-xiaomi-cas.dts             # 另一款设备
├── sm8250-xiaomi-cas-overlay.dts
├── sm8250-xiaomi-renoir.dts
├── sm8250-xiaomi-renoir-overlay.dts
│
├── dtsi/                             # 可选:项目级共享 .dtsi
│   ├── sm8250-xiaomi-common.dtsi     # 小米通用配置
│   ├── sm8250-xiaomi-camera.dtsi     # 相机模组配置
│   └── sm8250-xiaomi-display.dtsi    # 显示面板配置
│
└── overlays/                         # 可选:多个 overlay 片段
    ├── sm8250-xiaomi-alioth-overlay.dts
    └── sm8250-xiaomi-cas-overlay.dts
最佳实践:
  1. 按项目分组:每个产品系列使用独立的子目录或前缀,避免文件混乱。
  2. 共享 .dtsi 下沉:将同品牌下多个板型共用的配置提取到 dtsi/ 子目录,减少重复。
  3. Overlay 与主 DTS 同目录:保持 overlay 文件与主 DTS 在同一层级,便于编译脚本统一处理。
  4. 避免深层嵌套:Vendor 目录下最多两级子目录(品牌/项目),过深会导致编译路径过长或引用混乱。

3.7 目录结构对编译系统的影响

Android 编译系统通过 device/ 目录下的 BoardConfig.mk 或 AndroidBoard.mk 指定 DTS 路径:

# device/xiaomi/alioth/BoardConfig.mk
BOARD_KERNEL_DTS := qcom/vendor/xiaomi/sm8250-xiaomi-alioth.dts
BOARD_DTBO_IMAGE := qcom/vendor/xiaomi/sm8250-xiaomi-alioth-overlay.dtbo

编译系统根据这些变量,在 kernel/arch/arm64/boot/dts/ 下查找对应文件。因此,目录结构的任何变动(如重命名目录、移动文件)都必须同步更新 BoardConfig.mk,否则会导致编译失败。

编译产物 源文件路径(示例) 输出路径
dtb qcom/vendor/xiaomi/sm8250-xiaomi-alioth.dts arch/arm64/boot/dts/qcom/vendor/xiaomi/sm8250-xiaomi-alioth.dtb
dtbo qcom/vendor/xiaomi/sm8250-xiaomi-alioth-overlay.dts arch/arm64/boot/dts/qcom/vendor/xiaomi/sm8250-xiaomi-alioth-overlay.dtbo
dtb.img 多个 dtb 打包 out/target/product/alioth/dtb.img