Come faccio a sapere quale BLOB dell'albero dei dispositivi (file dtb) sto usando?


9

Sto lavorando con TS-4900, un "Computer on Module" incorporato collegato a una scheda base, che esegue Yocto Linux. Usa U-Boot per iniziare, e presumibilmente basandosi sul modello della baseboard sceglie il file dtb giusto per iniziare, e possibilmente se non riesce a trovare quello giusto, ricade in uno "generico" per il mio modulo.

Ma come / dove determina quello giusto? Come posso sapere quale .dtb è stato usato o impostare quale dovrebbe essere usato?

Di seguito sono riportati i messaggi di avvio di 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...)

Risposte:


7

Sono in ritardo su questo, ma ho implementato questo script e lo indirizzerò a chiunque lo trovi utilizzando un motore di ricerca su Internet.

Questo computer sul modulo può essere installato su quasi tutti i TS standard o sulla baseboard personalizzata e volevamo che funzionasse automaticamente senza che gli utenti dovessero regolare l'albero dei dispositivi utilizzato. Abbiamo un registro a scorrimento a 8 ingressi su ogni scheda di supporto con un ID univoco per la scheda di base. Sul TS-8550, questo è 0x13. http://wiki.embeddedarm.com/wiki/TS-4900#Baseboard_ID

Quindi in U-Boot il bbdetectcomando che abbiamo aggiunto legge il GPIO collegato a questo registro a scorrimento e imposta una variabile d'ambiente $ baseboardid. U-Boot tenterà innanzitutto di caricare un albero dispositivo specifico della scheda madre su /boot/imx6${cpu}-ts4900-${baseboardid}.dtb. Se non riesce a trovarne uno, utilizzerà l'albero dei dispositivi di fallback su /boot/imx6${cpu}-ts4900.dtb. Quest'ultimo file ha impostazioni predefinite che funzioneranno su qualsiasi board carrier. TS-8550 non ha bisogno di una scheda portante specifica per la scheda madre, quindi ricade nella struttura standard dei dispositivi e continua ad avviarsi.

Per rispondere alla tua domanda originale,

cat /proc/device-tree/model

Tutti i nostri alberi dei dispositivi avranno un modello leggermente diverso nell'albero dei dispositivi.
Ad esempio, il fallback sicuro è:

  • "Technologic Systems i.MX6 Quad TS-4900 (albero dei dispositivi predefinito)"

Oppure la scheda portante TS-TPC-8390 con un albero dispositivo specifico:

  • "Technologic Systems i.MX6 Quad TS-4900 (TS-TPC-8390)"

8

Quando U-Boot esegue il comando boot, fornisce un indirizzo di memoria per il kernel e un indirizzo di memoria per il BLOB dell'albero dei dispositivi. Pertanto, prima di questo comando, deve caricare questi file in memoria. In base ai messaggi forniti, vediamo che non è stato possibile caricare due file dalla scheda eMMC / SD:

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

È possibile che questi file semplicemente non fossero presenti, il loro percorso sia sbagliato o il dispositivo errato: la partizione è stata assegnata al comando U-Boot load. In ogni caso, il comando non riesce. A questo punto, sembra che il bootloader tenti di caricare un albero dei dispositivi "predefinito", possibilmente memorizzato sullo stesso supporto del bootloader stesso.

Per scoprire esattamente cosa sta succedendo, ti consigliamo di interrompere il processo di avvio dal bootloader e accedere al prompt dei comandi di U-Boot. Da qui, puoi inserire:

printenv

Questo stamperà le variabili di ambiente U-boot. Molte di queste variabili fanno riferimento ad altre variabili. Alcune di queste variabili sono spesso eseguite come script, quindi potresti vedere script di avvio, script di caricamento kernel & fdt, ecc. Per capire la sequenza di avvio, cerca una variabile chiamata bootcmd (o qualcosa di simile). Questo è di solito ciò che viene eseguito alla fine all'avvio. Dovrai tracciare la sequenza di avvio da questo punto attraverso più variabili, ma dovresti vedere dove vengono utilizzati i comandi di caricamento per caricare l'FDT in memoria. Se desideri pubblicare l'output di printenv , possiamo identificare la logica esatta utilizzata qui.


1
Grazie. bootcmd essendo l'unica variabile env che contiene lo script di avvio iniziale era quello di cui avevo bisogno.
SF.
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.