U-Boot

如何判斷我正在使用哪個設備樹 blob(dtb 文件)?

  • January 17, 2017

我正在使用 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...)

我在這方面已經很晚了,但我實現了這個腳本,我會為任何使用網際網路搜尋引擎找到這個的人解決這個問題。

這台電腦模組幾乎可以放在任何現成的 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 Quad TS-4900 (TS-TPC-8390)”

當 U-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的輸出,我們可以確定此處使用的確切邏輯。

引用自:https://unix.stackexchange.com/questions/192640