高通平台设备树加载
一、问题提出
最近遇到在做基于高通yocto的项目,在小系统还没起来的时候,添加设备树节点的时候看到一堆设备树,不知道哪个设备是板子所使用的。直到小系统的同事告诉了修改,以及使用的设备树。但仍不知为何?遂有此篇。
二、一般嵌入式设备的设备树加载过程
在主线 Linux 里,通常指标准启动链路是:dts/dtsi -> dtb -> bootloader 选板级 dtb 并放进内存 -> 内核接收 FDT 指针 -> 早期扫描 -> 展开成 live device tree -> 创建设备 -> 驱动按 compatible 绑定。
一般的嵌入式 Linux 设备里,设备树的“加载”基本就是 boot loader/firmware 的工作,通常就是bootloader把 dtb 交给内核的。
大致流程是:
1 | BootROM |
更具体一点:
SoC 上电后先跑片内 BootROM,它只负责从 eMMC/SD/NAND/SPI Flash/网络等介质把第一阶段启动程序拉起来。
第一阶段启动程序通常先初始化 DDR,因为后面的 kernel 和 dtb 都得放进 RAM。
之后进入真正的 boot loader,很多板子是 U-Boot。这一步会找到要启动的 Image/zImage、*.dtb、initramfs。
boot loader 往往还会修改 dtb,比如写入 /chosen/bootargs、stdout-path、initrd-start/end、内存大小、MAC 地址、序列号、reserved-memory 等。
最后 boot loader 跳进内核,并把 dtb 的物理地址告诉内核。
- ARM32: r2
- ARM64: x0
内核早期启动先检查 dtb 头(magic0 xd00dfeed),然后解析:
- 根节点 compatible:识别板子/SoC
- /memory:可用内存
- /chosen:bootargs、initrd、stdout-path 等
再把扁平 dtb 展开成内核里的设备树结构,按节点创建设备,让驱动去 probe。
三、高通平台设备树加载
在高通平台,使用的bootloader是高通自己的xbl,