设备树在 ARM 设备上运行时使用,以识别并加载正确的驱动程序及其配置。但是,例如,当我查看/proc/device-tree
手机上加载的DT时,有许多与实际平台无关的配置。例如,该特定设备从未使用过也永远不会使用的大约 15 种不同的显示配置。到目前为止,我认为只有相关的 DT 被包含到内核中并加载,但似乎相关/arch
源文件夹中的所有 DTS 都已加载。内核如何为平台选择正确的呢?这不是有点多余吗?
答案1
确定要加载哪个设备树 blob (DTB) 文件(从设备树源 (DTS) 编译而来)通常由引导加载程序处理。
许多设备制造商将自定义引导加载程序以添加制造商特定的代码,以自动执行确定为该硬件加载哪个 DTB 文件的任务。
一个例子U盘启动,一个常用的引导加载程序,加载一个zImage内核 image
fdt_file
以及来自 SATA 设备上 FAT 分区的DTB 。它们分别加载到由loadaddr
和指定的内存地址fdt_addr
,然后交给 U-Boot 的bootz
命令。
fatload sata 0:1 ${loadaddr} ${image};
fatload sata 0:1 ${fdt_addr} ${fdt_file};
bootz ${loadaddr} - ${fdt_addr};
U-Boot的bootz
用法:
bootz [addr [initrd[:size]] [fdt]]
- boot Linux zImage stored in memory
The argument 'initrd' is optional and specifies the address
of the initrd in memory. The optional argument ':size' allows
specifying the size of RAW initrd.
When booting a Linux kernel which requires a flat device-tree
a third argument is required which is the address of the
device-tree blob. To boot that kernel without an initrd image,
use a '-' for the second argument. If you do not pass a third
a bd_info struct will be passed instead
有关U-Boot如何处理的具体信息fdt_file
,您可以参考源代码bootm_find_images, 也boot_get_fdt。
您还可以尝试从 U-Boot 手册中收集一些信息:https://www.denx.de/wiki/view/DULG/UBootCmdFDT
答案2
我认为这不是因为内核加载了所有 DTS。实际上,ARM 固件映像内部可以包含多个 dts,但它仅在启动时加载 dts。您会看到冗余设备 int,/proc/device-tree
因为您的设备树定义了它们。即使您的手机没有这些设备,您仍然可以定义该设备,因为这些设备无法工作并且可能会破坏您的内核。
答案3
在同一个dts目录下
DTS/{manufacturer-name}/some-dts-evb.dts
有一个Makefile,打开它,你可以看到将使用哪个.dts 文件。
dtb-$(CONFIG_ARCH_XXXXXX) += some-dts-evb.dtb