O que é um arquivo dtb u-Boot e como eu o uso (BeagleBoard xM)?

13

Estou tentando criar um Linux personalizado para um BeagleBoard xM (Rev. C). Eu faço muito C / C ++, mas sou iniciante na construção e instalação do Linux a partir do zero.

Usei o dispositivo de construção do Yocto Project ( https://www.yoctoproject.org/ ) que parecia promissor - ele criou arquivos para o carregador de inicialização u-Boot, o kernel do Linux e o sistema de arquivos raiz.

Esta página fornece instruções para configurar o cartão micro SD com os arquivos gerados pelo Yocto. No entanto, os arquivos de imagem incluem um arquivo ".dtb" que não é mencionado nas instruções de configuração.

Esse arquivo tem algo a ver com o hardware da placa? Vários sites mencionam o carregamento de arquivos dtd (talvez em uEnv.txt?), Mas não encontrei nenhuma informação detalhada.

Usei as instruções acima para configurar a partição de inicialização com o MLO e o u-boot.img e mexi um pouco com o uEnv.txt. Também configurei uma segunda partição com o sistema de arquivos raiz.

Consegui inicializar e efetuar login (via console da porta serial), mas parecia que a maior parte do hardware da placa - por exemplo, vídeo e todos os dispositivos USB, incluindo Ethernet - não estavam funcionando. Poderia ser porque eu não estava usando o arquivo .dtb?

Alguém pode explicar o dtb e como usá-lo em uma placa beagle? Obrigado!

Jeremy
fonte
Acontece que eu interpretei mal o nome do arquivo - eu originalmente pensava que era um arquivo ".dtd", mas na verdade é ".dtb" - e é por isso que não consegui encontrar informações sobre ele. A questão foi atualizada.
Jeremy
Exemplo mínimo com o dispositivo virtual QEMU para entender melhor o conceito: stackoverflow.com/questions/17488320/…
Ciro Santilli escreveu:

Respostas:

13

Respondendo à minha própria pergunta, depois que eu descobri o que procurar. Um arquivo "dtb" contém um Blob da árvore de dispositivos (ou binário) (boa descrição aqui ). É a nova (er) maneira de passar informações de hardware sobre a placa para o kernel do Linux.

Ele pode ser carregado na memória e passado para o kernel pelo u-Boot.

Aqui estão os comandos u-Boot que eu usei:

setenv bootargs 'console=tty0 console=ttyO2,115200n8 root=/dev/mmcblk0p2 rootwait rootfstype=ext4 rw'
fatload mmc 0:1 0x80300000 zImage
fatload mmc 0:1 0x815f0000 beagle-xm.dtb
bootz 0x80300000 - 0x815f0000

zImage é o kernel e beagle-xm.dtb é o blob da árvore de dispositivos. Automatizei o processo de inicialização configurando uma variável "uenvcmd = ..." no uEnv.txt (com as opções acima), mas é um pouco feia e provavelmente há maneiras melhores.

Observe que isso inicializa e diz que carregou a árvore de dispositivos OK. No entanto, ainda não tenho dispositivos USB ou vídeo (pelo que sei). No entanto, suspeito que possa ser um problema diferente.

Jeremy
fonte
3
É a nova (er) maneira de passar informações de hardware sobre a placa para o kernel do Linux. Não havia maneira anterior de passar informações de hardware para o kernel. Em vez disso, o kernel teria que incluir estaticamente todas as informações e, portanto, teria um arquivo C específico da placa para listar todos esses mapeamentos. Este foi um pesadelo de manutenção do ponto de vista do kernel.
BatchyX
Obrigado! Eu descobri como carregar o arquivo dtb, e o Linux agora é inicializado e emite várias mensagens sobre o carregamento de drivers, mas não consigo ver nenhum dispositivo USB (incluindo o módulo ethernet). Veja nova pergunta: link . Talvez haja algo que eu precise configurar manualmente no Linux?
Jeremy
Mas qual endereço usar para o arquivo dtb? Por exemplo, se minha zImage for endereçar 0x43000000 (em vez do exemplo acima 0x80300000), onde o dtb deve ir?
André van Schoubroeck
2

Estou usando o Ubuntu 14.04 no beaglebone black, então minha configuração pode ser um pouco diferente, mas aqui está como carreguei um dtb personalizado:

No uEnv.txt, adicione uma linha com: dtb=name-of-desired.dtb

Os locais pesquisados ​​devem ser os especificados aqui . Para mim, era aqui /boot/dtbs/linux-kernel/que linux-kernel é o nome da versão carregada.

Damian Manda
fonte
0

Observe que existem 2 dtb. O u-boot dtb e o kernel dtb. São duas coisas diferentes. A placa de inicialização em U dts / dtb nem sempre é usada, não é obrigatória. No u-boot, você pode usar o dtb "u-boot" incorporando-o ao u-boot ou concatenando-o ao u-boot.

Angelo Dureghello
fonte