0%

2025-08-05-qcom平台设备树加载

高通平台设备树加载

一、问题提出

​ 最近遇到在做基于高通yocto的项目,在小系统还没起来的时候,添加设备树节点的时候看到一堆设备树,不知道哪个设备是板子所使用的。直到小系统的同事告诉了修改,以及使用的设备树。但仍不知为何?遂有此篇。

二、一般嵌入式设备的设备树加载过程

​ 在主线 Linux 里,通常指标准启动链路是:dts/dtsi -> dtb -> bootloader 选板级 dtb 并放进内存 -> 内核接收 FDT 指针 -> 早期扫描 -> 展开成 live device tree -> 创建设备 -> 驱动按 compatible 绑定

​ 一般的嵌入式 Linux 设备里,设备树的“加载”基本就是 boot loader/firmware 的工作,通常就是bootloader把 dtb 交给内核的。

​ 大致流程是:

1
2
3
4
5
6
7
8
BootROM
-> 一级启动程序(SPL/FSBL/BL2)
-> 二级 boot loader(U-Boot/TF-A/EDK2 等)
-> 加载 kernel Image + dtb + initramfs 到 RAM
-> 按板级信息修补 dtb
-> 把 dtb 地址传给 Linux
-> Linux 早期启动解析 dtb

更具体一点:

  1. SoC 上电后先跑片内 BootROM,它只负责从 eMMC/SD/NAND/SPI Flash/网络等介质把第一阶段启动程序拉起来。

  2. 第一阶段启动程序通常先初始化 DDR,因为后面的 kernel 和 dtb 都得放进 RAM。

  3. 之后进入真正的 boot loader,很多板子是 U-Boot。这一步会找到要启动的 Image/zImage、*.dtb、initramfs。

  4. boot loader 往往还会修改 dtb,比如写入 /chosen/bootargs、stdout-path、initrd-start/end、内存大小、MAC 地址、序列号、reserved-memory 等。

  5. 最后 boot loader 跳进内核,并把 dtb 的物理地址告诉内核。

    • ARM32: r2
    • ARM64: x0
  6. 内核早期启动先检查 dtb 头(magic0 xd00dfeed),然后解析:

    • 根节点 compatible:识别板子/SoC
    • /memory:可用内存
    • /chosen:bootargs、initrd、stdout-path 等
  7. 再把扁平 dtb 展开成内核里的设备树结构,按节点创建设备,让驱动去 probe。

三、高通平台设备树加载

在高通平台,使用的bootloader是高通自己的xbl,

-------------本文结束感谢您的阅读-------------