Como posso saber qual blob da árvore de dispositivos (arquivo dtb) estou usando?

9

Estou trabalhando com o TS-4900, um 'Computador no Módulo' incorporado, conectado a um rodapé, executando o Yocto Linux. Ele usa o U-Boot para iniciar e, supostamente, com base no modelo do rodapé, escolhe o arquivo dtb correto para iniciar e, possivelmente, se não conseguir localizar o correto, volta a ser um 'genérico' para o meu módulo.

Mas como / onde ele determina o caminho certo? Como posso saber qual arquivo .dtb foi usado ou definir qual deles deve ser usado?

Abaixo estão as mensagens de inicialização do 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.
fonte

Respostas:

7

Estou muito atrasado nisso, mas implementei esse script e o abordarei para qualquer pessoa que encontrar isso usando um mecanismo de pesquisa na Internet.

Este computador no módulo pode ser instalado em praticamente qualquer TS de prateleira ou rodapé personalizado, e queríamos que ele funcionasse automaticamente sem que os usuários tivessem que ajustar a árvore de dispositivos usada. Temos um registro de turno de 8 entradas em qualquer placa transportadora com um ID exclusivo para o rodapé. No TS-8550, este é 0x13. http://wiki.embeddedarm.com/wiki/TS-4900#Baseboard_ID

Portanto, no U-Boot, o bbdetectcomando que adicionamos lê o GPIO conectado a esse registrador de deslocamento e define uma variável de ambiente $ baseboardid. O U-Boot tentará primeiro carregar uma árvore de dispositivo específica do rodapé em /boot/imx6${cpu}-ts4900-${baseboardid}.dtb. Se não encontrar um, usará a árvore de dispositivos de fallback em /boot/imx6${cpu}-ts4900.dtb. Este último arquivo possui padrões saudáveis ​​que funcionarão em qualquer placa de operadora. O TS-8550 não precisa de uma placa de suporte específica para o rodapé; portanto, ele volta para a árvore de dispositivos padrão e continua a inicialização.

Para responder sua pergunta original,

cat /proc/device-tree/model

Todas as nossas árvores de dispositivos terão um modelo ligeiramente diferente na árvore de dispositivos.
Por exemplo, o fallback seguro é:

  • "Sistemas tecnológicos i.MX6 Quad TS-4900 (árvore de dispositivos padrão)"

Ou a placa transportadora TS-TPC-8390 com uma árvore de dispositivos específica:

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

Quando o U-Boot executa o comando de inicialização, ele fornece um endereço de memória para o kernel e um endereço de memória para o blob da árvore do dispositivo. Portanto, antes deste comando, ele deve carregar esses arquivos na memória. Com base nas mensagens fornecidas, vemos que dois arquivos não foram carregados no cartão eMMC / SD:

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

É possível que esses arquivos simplesmente não estejam presentes, o caminho esteja incorreto ou o dispositivo incorreto: a partição foi atribuída ao comando U-Boot load. De qualquer forma, o comando falha. Nesse ponto, parece que o carregador de inicialização tenta carregar uma árvore de dispositivos "padrão" - possivelmente armazenada na mesma mídia que o próprio carregador de inicialização.

Para descobrir exatamente o que está acontecendo, interrompa o processo de inicialização no carregador de inicialização e acesse o prompt de comando do U-Boot. A partir daqui, você pode inserir:

printenv

Isso imprimirá as variáveis ​​de ambiente U-boot. Muitas dessas variáveis ​​fazem referência a outras variáveis. Algumas dessas variáveis ​​são frequentemente executadas como scripts, portanto, você pode ver scripts de inicialização, scripts de carregamento do kernel e do fdt, etc. Para descobrir a sequência de inicialização, procure uma variável chamada bootcmd (ou algo semelhante). Geralmente, isso é o que é executado no momento da inicialização. Você precisará rastrear a sequência de inicialização a partir deste ponto através de várias variáveis, mas deverá ver onde os comandos de carregamento são usados ​​para carregar o FDT na memória. Se você deseja publicar a saída de printenv , podemos identificar a lógica exata usada aqui.

shibley
fonte
1
Obrigado. sendo o bootcmd a única variável env que contém o script de inicialização inicial, era o que eu precisava.
SF.