如何得知我正在使用哪个设备树Blob(DTB文件)?


9

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

但是,它如何/在哪里确定合适的呢?如何得知使用了哪个.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...)

Answers:


7

我对此事还很晚,但是我实现了此脚本,并将为使用Internet搜索引擎找到该脚本的任何人解决。

该模块计算机几乎可以放在任何现成的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

我们所有的设备树在设备树中的模型都会稍有不同。
例如,安全后备是:

  • “技术系统i.MX6 Quad TS-4900(默认设备树)”

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

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

8

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

/boot/boot.ub
/boot/imx6dl-ts4900-13.dtb

这些文件可能根本不存在,路径错误或错误的device:partition分配给了U-Boot加载命令。无论如何,该命令都会失败。此时,引导加载程序似乎尝试加载“默认”设备树-可能与引导加载程序本身存储在同一介质上。

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

printenv

这将打印出U-boot环境变量。这些变量中有许多引用其他变量。其中的一些变量经常执行类似的脚本,所以你可以看到启动脚本,内核和FDT加载脚本等。要弄清楚的引导顺序,神色一变叫做bootcmd(或类似的东西)。这通常是在引导时最终运行的内容。您需要从此处通过多个变量跟踪启动顺序,但是您应该看到在何处使用了加载命令将FDT加载到内存中。如果您想发布printenv的输出,我们可以在此处确定确切的逻辑。


1
谢谢。bootcmd是一个包含初始启动脚本的env变量,这正是我所需要的。
SF。
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.