Comment savoir quel blob d'arborescence de périphériques (fichier dtb) j'utilise?

9

Je travaille avec TS-4900, un «ordinateur sur module» intégré branché sur une carte de base, exécutant Yocto Linux. Il utilise U-Boot pour démarrer, et en se basant soi-disant sur le modèle de la carte mère, il choisit le bon fichier dtb pour démarrer, et éventuellement s'il ne parvient pas à trouver le bon, il retombe dans un fichier `` générique '' pour mon module.

Mais comment / où détermine-t-il la bonne? Comment puis-je savoir quel .dtb a été utilisé ou définir lequel doit être utilisé?

Voici les messages de démarrage de 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.
la source

Réponses:

7

Je suis bien en retard, mais j'ai implémenté ce script et je m'adresserai à tous ceux qui le trouveront à l'aide d'un moteur de recherche Internet.

Cet ordinateur sur le module peut être installé sur presque n'importe quel TS standard ou sur une plinthe personnalisée, et nous voulions qu'il fonctionne automatiquement sans que les utilisateurs n'aient à ajuster l'arborescence des périphériques utilisée. Nous avons un registre à décalage à 8 entrées sur n'importe quelle carte de support donnée avec un identifiant unique pour la carte de base. Sur le TS-8550, il s'agit de 0x13. http://wiki.embeddedarm.com/wiki/TS-4900#Baseboard_ID

Ainsi, dans U-Boot, la bbdetectcommande que nous avons ajoutée lit le GPIO connecté à ce registre à décalage et définit une variable d'environnement $ baseboardid. U-Boot tentera d'abord de charger une arborescence de périphériques spécifique à la carte mère sur /boot/imx6${cpu}-ts4900-${baseboardid}.dtb. S'il ne parvient pas à en trouver un, il utilisera l'arborescence des périphériques de secours à l'adresse /boot/imx6${cpu}-ts4900.dtb. Ce dernier fichier a des défauts par défaut qui fonctionneront sur n'importe quelle carte de support. Le TS-8550 n'a pas besoin d'une carte de support spécifique à la plinthe, il revient donc à l'arborescence des périphériques standard et continue de démarrer.

Pour répondre à votre question d'origine,

cat /proc/device-tree/model

Toutes nos arborescences d'appareils auront un modèle légèrement différent dans l'arborescence des appareils.
Par exemple, la solution de secours sûre est:

  • "Technologic Systems i.MX6 Quad TS-4900 (arborescence de périphériques par défaut)"

Ou la carte porteuse TS-TPC-8390 avec une arborescence de périphériques spécifique:

  • "Systèmes technologiques i.MX6 Quad TS-4900 (TS-TPC-8390)"
Mark Featherston
la source
8

Lorsque U-Boot exécute la commande de démarrage, il fournit une adresse mémoire pour le noyau et une adresse mémoire pour le blob de l'arborescence des périphériques. Par conséquent, avant cette commande, il doit charger ces fichiers en mémoire. Sur la base des messages que vous avez fournis, nous constatons que deux fichiers n'ont pas pu être chargés à partir de la carte eMMC / SD:

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

Il est possible que ces fichiers ne soient tout simplement pas présents, que leur chemin soit incorrect ou que le périphérique soit incorrect: la partition a été attribuée à la commande de chargement U-Boot. Dans tous les cas, la commande échoue. À ce stade, il semble que le chargeur de démarrage tente de charger une arborescence de périphériques "par défaut" - éventuellement stockée sur le même support que le chargeur de démarrage lui-même.

Pour savoir exactement ce qui se passe, vous devez arrêter le processus de démarrage au niveau du chargeur de démarrage et accéder à l'invite de commande U-Boot. De là, vous pouvez entrer:

printenv

Cela imprimera les variables d'environnement U-boot. Beaucoup de ces variables font référence à d'autres variables. Certaines de ces variables sont souvent exécutées comme des scripts, vous pouvez donc voir des scripts de démarrage, des scripts de chargement du noyau et du fdt, etc. Pour comprendre la séquence de démarrage, recherchez une variable appelée bootcmd (ou quelque chose de similaire). C'est généralement ce qui est finalement exécuté au démarrage. Vous devrez tracer la séquence de démarrage à partir de ce point à travers plusieurs variables, mais vous devriez voir où les commandes de chargement sont utilisées pour charger le FDT en mémoire. Si vous souhaitez publier la sortie de printenv , nous pouvons identifier la logique exacte utilisée ici.

shibley
la source
1
Merci. bootcmd étant la seule variable env qui contient le script de démarrage initial était ce dont j'avais besoin.
SF.