¿Cómo puedo saber qué blob de árbol de dispositivos (archivo dtb) estoy usando?

9

Estoy trabajando con TS-4900, una 'Computadora en un módulo' incorporada conectada a una placa base, que ejecuta Yocto Linux. Utiliza U-Boot para iniciar, y supuestamente basándose en el modelo de la placa base, elige el archivo dtb correcto para iniciar, y posiblemente si no puede encontrar el correcto, recurre a uno 'genérico' para mi módulo.

Pero, ¿cómo / dónde determina la correcta? ¿Cómo puedo saber qué .dtb se usó o establecer cuál debería usarse?

A continuación se muestran los mensajes de arranque 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.
fuente

Respuestas:

7

Llegué tarde a esto, pero implementé este script y abordaré esto para cualquiera que lo encuentre usando un motor de búsqueda en Internet.

Esta computadora en módulo se puede colocar en casi cualquier TS estándar o placa base personalizada, y queríamos que funcionara automáticamente sin que los usuarios tuvieran que ajustar el árbol de dispositivos utilizado. Tenemos un registro de desplazamiento de 8 entradas en cualquier placa de soporte dada con una identificación única para la placa base. En el TS-8550, esto es 0x13. http://wiki.embeddedarm.com/wiki/TS-4900#Baseboard_ID

Entonces, en U-Boot, el bbdetectcomando que agregamos lee el GPIO conectado a este registro de desplazamiento y establece una variable de entorno $ baseboardid. U-Boot primero intentará cargar un árbol de dispositivo específico de la placa base en /boot/imx6${cpu}-ts4900-${baseboardid}.dtb. Si no puede encontrar uno, usará el árbol de dispositivos alternativos en /boot/imx6${cpu}-ts4900.dtb. Este último archivo tiene valores predeterminados sanos que funcionarán en cualquier placa de soporte. El TS-8550 no necesita una placa de soporte específica de la placa base, por lo que vuelve al árbol de dispositivos estándar y continúa arrancando.

Para responder a tu pregunta original,

cat /proc/device-tree/model

Todos nuestros árboles de dispositivos tendrán un modelo ligeramente diferente en el árbol de dispositivos.
Por ejemplo, el respaldo seguro es:

  • "Sistemas tecnológicos i.MX6 Quad TS-4900 (Árbol de dispositivos predeterminado)"

O la placa de soporte TS-TPC-8390 con un árbol de dispositivos específico:

  • "Sistemas tecnológicos i.MX6 Quad TS-4900 (TS-TPC-8390)"
Mark Featherston
fuente
8

Cuando U-Boot ejecuta el comando de arranque, proporciona una dirección de memoria para el kernel y una dirección de memoria para el blob del árbol de dispositivos. Por lo tanto, antes de este comando, debe cargar estos archivos en la memoria. Según los mensajes que proporcionó, vemos que dos archivos no se pudieron cargar desde la tarjeta eMMC / SD:

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

Es posible que estos archivos simplemente no estuvieran presentes, que su ruta sea incorrecta o que el dispositivo sea incorrecto: la partición se dio al comando de carga U-Boot. En cualquier caso, el comando falla. En este punto, parece que el gestor de arranque intenta cargar un árbol de dispositivos "predeterminado", posiblemente almacenado en el mismo medio que el propio gestor de arranque.

Para saber exactamente lo que está sucediendo, querrá detener el proceso de arranque en el gestor de arranque y acceder al símbolo del sistema U-Boot. Desde aquí, puede ingresar:

printenv

Esto imprimirá las variables de entorno U-boot. Muchas de estas variables hacen referencia a otras variables. Algunas de estas variables a menudo se ejecutan como scripts, por lo que puede ver scripts de arranque, scripts de carga de kernel y fdt, etc. Para averiguar la secuencia de arranque, busque una variable llamada bootcmd (o algo similar). Esto suele ser lo que finalmente se ejecuta en el momento del arranque. Deberá rastrear la secuencia de arranque desde este punto a través de múltiples variables, pero debería ver dónde se usan los comandos de carga para cargar el FDT en la memoria. Si desea publicar la salida de printenv , podemos identificar la lógica exacta utilizada aquí.

shibley
fuente
1
Gracias. bootcmd es la única variable de entorno que contiene el script de inicio inicial que era lo que necesitaba.
SF.