Wie kann ich feststellen, welchen Gerätebaum-Blob (dtb-Datei) ich verwende?

9

Ich arbeite mit TS-4900, einem eingebetteten 'Computer on Module', der an ein Baseboard angeschlossen ist und Yocto Linux ausführt. Es verwendet U-Boot zum Starten und wählt angeblich basierend auf dem Modell des Baseboards die richtige dtb-Datei zum Starten aus. Wenn es möglicherweise nicht die richtige findet, greift es möglicherweise auf eine 'generische' für mein Modul zurück.

Aber wie / wo bestimmt es das richtige? Wie kann ich feststellen, welche .dtb verwendet wurde oder welche verwendet werden soll?

Unten finden Sie die Startmeldungen von 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...)
SF.
quelle

Antworten:

7

Ich bin viel zu spät dran, aber ich habe dieses Skript implementiert und werde es für jeden ansprechen, der es über eine Internet-Suchmaschine findet.

Dieses Computer-On-Modul kann auf fast jedem Standard-TS oder benutzerdefinierten Baseboard installiert werden. Wir wollten, dass es automatisch funktioniert, ohne dass Benutzer den verwendeten Gerätebaum anpassen müssen. Wir haben ein Schieberegister mit 8 Eingängen auf jeder Trägerplatine mit einer eindeutigen ID für die Basisplatine. Auf dem TS-8550 ist dies 0x13. http://wiki.embeddedarm.com/wiki/TS-4900#Baseboard_ID

In U-Boot bbdetectliest der von uns hinzugefügte Befehl das mit diesem Schieberegister verbundene GPIO und legt eine Umgebungsvariable $ baseboardid fest. U-Boot versucht zunächst, einen Baseboard-spezifischen Gerätebaum unter zu laden /boot/imx6${cpu}-ts4900-${baseboardid}.dtb. Wenn es keinen findet, wird der Fallback-Gerätebaum unter verwendet /boot/imx6${cpu}-ts4900.dtb. Diese letztere Datei hat vernünftige Standardeinstellungen, die auf jeder Trägerplatine funktionieren. Der TS-8550 benötigt keine Baseboard-spezifische Trägerplatine, greift also auf den Standardgerätebaum zurück und bootet weiter.

Um Ihre ursprüngliche Frage zu beantworten,

cat /proc/device-tree/model

Alle unsere Gerätebäume haben ein etwas anderes Modell im Gerätebaum.
Zum Beispiel ist der sichere Fallback:

  • Technologische Systeme i.MX6 Quad TS-4900 (Standardgerätebaum)

Oder die TS-TPC-8390-Trägerplatine mit einem bestimmten Gerätebaum:

  • Technologische Systeme i.MX6 Quad TS-4900 (TS-TPC-8390)
Mark Featherston
quelle
8

Wenn U-Boot den Startbefehl ausführt, stellt es eine Speicheradresse für den Kernel und eine Speicheradresse für den Gerätebaum-Blob bereit. Daher müssen diese Dateien vor diesem Befehl in den Speicher geladen werden. Basierend auf den von Ihnen bereitgestellten Nachrichten sehen wir, dass zwei Dateien nicht von der eMMC / SD-Karte geladen werden konnten:

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

Es ist möglich, dass entweder diese Dateien einfach nicht vorhanden waren, ihr Pfad falsch ist oder das falsche Gerät: Partition wurde an den U-Boot-Ladebefehl übergeben. In jedem Fall schlägt der Befehl fehl. An diesem Punkt scheint der Bootloader zu versuchen, einen "Standard" -Gerätbaum zu laden, der möglicherweise auf demselben Medium wie der Bootloader selbst gespeichert ist.

Um genau herauszufinden, was gerade passiert, müssen Sie den Startvorgang beim Bootloader anhalten und auf die U-Boot-Eingabeaufforderung zugreifen. Von hier aus können Sie eingeben:

printenv

Dadurch werden die U-Boot-Umgebungsvariablen ausgedruckt. Viele dieser Variablen verweisen auf andere Variablen. Einige dieser Variablen werden häufig wie Skripte ausgeführt, sodass möglicherweise Startskripte, Kernel- und FDT-Ladeskripte usw. angezeigt werden. Um die Startsequenz zu ermitteln, suchen Sie nach einer Variablen namens bootcmd (oder ähnlichem). Dies ist normalerweise das, was letztendlich beim Booten ausgeführt wird. Sie müssen die Startsequenz von diesem Punkt aus über mehrere Variablen verfolgen, aber Sie sollten sehen, wo Ladebefehle zum Laden des FDT in den Speicher verwendet werden. Wenn Sie die Ausgabe von printenv veröffentlichen möchten , können wir die genaue Logik identifizieren, die hier verwendet wird.

shibley
quelle
1
Vielen Dank. bootcmd war die einzige env-Variable, die das anfängliche Startskript enthält, was ich brauchte.
SF.