我正在使用 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...)
答案1
当 U-Boot 执行引导命令时,它为内核提供内存地址,并为设备树 blob 提供内存地址。因此,在执行此命令之前,必须将这些文件加载到内存中。根据您提供的消息,我们发现有两个文件无法从 eMMC/SD 卡加载:
/boot/boot.ub
/boot/imx6dl-ts4900-13.dtb
可能是这些文件根本不存在、它们的路径错误或者向 U-Boot 加载命令提供了不正确的 device:partition。无论如何,该命令都会失败。此时,引导加载程序似乎尝试加载“默认”设备树 - 可能与引导加载程序本身存储在同一介质上。
要准确了解发生了什么,您需要在引导加载程序处停止引导过程并访问 U-Boot 命令提示符。从这里,您可以输入:
printenv
这将打印出 U-boot 环境变量。其中许多变量引用其他变量。其中一些变量通常像脚本一样执行,因此您可能会看到启动脚本、内核和 fdt 加载脚本等。要弄清楚启动顺序,请查找名为的变量启动命令(或类似的东西)。这通常是最终在启动时运行的内容。您需要通过多个变量从此时开始跟踪启动顺序,但您应该看到加载命令用于将 FDT 加载到内存中的位置。如果您想发布输出打印环境,我们可以确定这里使用的确切逻辑。
答案2
我已经很晚了,但我实现了这个脚本,我将为任何使用互联网搜索引擎找到这个脚本的人解决这个问题。
该计算机模块可以放置在几乎任何现成的 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
我们所有的设备树在设备树中的模型都略有不同。
例如,安全后备是:
- “Technologic Systems i.MX6 Quad TS-4900(默认设备树)”
或者具有特定设备树的 TS-TPC-8390 载板:
- “技术系统 i.MX6 四核 TS-4900 (TS-TPC-8390)”
答案3
不确定这个问题是否得到充分回答。正如已经提到的,使用 printenv 显示默认的 bootcmd。您可以执行此命令的开头部分来从引导设备读取数据,但尚未实际引导。
printenv(例如打印以下内容)
- bootcmd=mmc 信息
- mmc读取90000000 100000 5000
- setenv fdt_high 0xffffffffffffffff;
- bootm 90000000 - $(fdtcontroladdr)
- fdtcontroladdr=bffe08d0
例如,在我的 RISCV 计算机上,图像加载有:
- mmc读取90000000 100000 5000
- setenv fdt_high 0xffffffffffffffff
然后你可以设置 fdt 地址:
- fdt addr(printenv中fdtcontroladdr的值)
然后你可以这样做:
- 快速打印
嘿,扁平的设备树已经过时了。