如何判断我使用的是哪个设备树 blob(dtb 文件)?

SF.*_*SF. 11 u-boot yocto device-tree

我正在使用 TS-4900,这是一个插入基板的嵌入式“计算机模块”,运行 Yocto Linux。它使用 U-Boot 启动,据说它会根据底板的型号选择正确的 dtb 文件来启动,如果它无法找到正确的文件,它可能会回退到我的模块的“通用”文件。

但是它如何/在哪里确定正确的?我如何知道使用了哪个 .dtb,或者设置应该使用哪个?

下面是 U-Boot 的启动信息。

U-Boot 2014.10-g3ac6ec3 (Jan 29 2015 - 17:20:15)

CPU:   Freescale i.MX6SOLO rev1.1 at 792 MHz
Reset cause: POR
Board: TS-4900
Revision: C
       Watchdog enabled
I2C:   ready
DRAM:  1 GiB
MMC:   FSL_SDHC: 0, FSL_SDHC: 1
SF: Detected N25Q64 with page size 256 Bytes, erase size 4 KiB, total 8 MiB
*** Warning - bad CRC, using default environment

In:    serial
Out:   serial
Err:   serial
Net:   using phy at 7
FEC [PRIME]
Press Ctrl+C to abort autoboot in 1 second(s)
(Re)start USB...
USB0:   Port not available.
USB1:   USB EHCI 1.00
scanning bus 1 for devices... 2 USB Device(s) found
       scanning usb for storage devices... 0 Storage Device(s) found
No storage devices, perhaps not 'usb start'ed..?
Booting from the eMMC ...
** File not found /boot/boot.ub **
** File not found /boot/imx6dl-ts4900-13.dtb **
Booting default device tree
42507 bytes read in 196 ms (210.9 KiB/s)
118642 bytes read in 172 ms (672.9 KiB/s)
ICE40 FPGA reloaded successfully
4609784 bytes read in 337 ms (13 MiB/s)
## Booting kernel from Legacy Image at 12000000 ...
   Image Name:   Linux-3.10.17-1.0.0-technologic+
   Image Type:   ARM Linux Kernel Image (uncompressed)
   Data Size:    4609720 Bytes = 4.4 MiB
   Load Address: 10008000
   Entry Point:  10008000
   Verifying Checksum ... OK
## Flattened Device Tree blob at 18000000
   Booting using the fdt blob at 0x18000000
EHCI failed to shut down host controller.
   Loading Kernel Image ... OK
   Using Device Tree in place at 18000000, end 1800d60a

Starting kernel ...

[    0.000000] Booting Linux on physical CPU 0x0

(Kernel startup commences...)
Run Code Online (Sandbox Code Playgroud)

shi*_*ley 9

当 U-Boot 执行引导命令时,它会为内核提供一个内存地址,并为设备树 blob 提供一个内存地址。因此,在此命令之前,它必须将这些文件加载​​到内存中。根据您提供的消息,我们看到两个文件无法从 eMMC/SD 卡加载:

/boot/boot.ub
/boot/imx6dl-ts4900-13.dtb
Run Code Online (Sandbox Code Playgroud)

可能是这些文件根本不存在,它们的路径错误,或者给 U-Boot 加载命令提供了不正确的 device:partition。在任何情况下,命令都会失败。此时,引导加载程序似乎试图加载“默认”设备树 - 可能与引导加载程序本身存储在同一介质上。

要确切了解发生了什么,您需要在引导加载程序中停止引导过程并访问 U-Boot 命令提示符。从这里,您可以输入:

printenv
Run Code Online (Sandbox Code Playgroud)

这将打印出 U-boot 环境变量。许多这些变量引用了其他变量。其中一些变量通常像脚本一样执行,因此您可能会看到启动脚本、内核和 fdt 加载脚本等。要确定启动顺序,请查找名为bootcmd(或类似名称)的变量。这通常是最终在引导时运行的内容。您需要通过多个变量从这一点开始跟踪启动顺序,但您应该看到加载命令用于将 FDT 加载到内存中的位置。如果您想发布printenv的输出,我们可以确定此处使用的确切逻辑。

  • 谢谢。**bootcmd** 是包含初始启动脚本的一个环境变量,这正是我所需要的。 (2认同)

小智 7

我迟到了,但我实现了这个脚本,我会为任何使用互联网搜索引擎找到它的人解决这个问题。

这款计算机模块几乎可以安装在任何现成的 TS 或定制基板上,我们希望它能够自动工作,而无需用户调整所使用的设备树。我们在任何给定的载板上都有一个 8 输入移位寄存器,基板具有唯一的 ID。在 TS-8550 上,这是 0x13。 http://wiki.embeddedarm.com/wiki/TS-4900#Baseboard_ID

所以在 U-Boot 中,bbdetect我们添加的命令读取连接到这个移位寄存器的 GPIO 并设置一个 $baseboardid 环境变量。U-Boot 将首先尝试在/boot/imx6${cpu}-ts4900-${baseboardid}.dtb. 如果未能找到,它将使用 的后备设备树/boot/imx6${cpu}-ts4900.dtb。后一个文件具有适用于任何载板的合理默认值。TS-8550 不需要基板特定的载板,因此它回退到标准设备树并继续启动。

要回答您的原始问题,

cat /proc/device-tree/model
Run Code Online (Sandbox Code Playgroud)

我们所有的设备树在设备树中都有一个稍微不同的模型。
例如,安全回退是:

  • “Technologic Systems i.MX6 Quad TS-4900(默认设备树)”

或者带有特定设备树的 TS-TPC-8390 载板:

  • “技术系统 i.MX6 Quad TS-4900 (TS-TPC-8390)”