¿Qué es un archivo dtb u-Boot y cómo lo uso (BeagleBoard xM)?

13

Estoy tratando de construir un Linux personalizado para un BeagleBoard xM (Rev. C). Hago mucho C / C ++ pero soy un principiante en la construcción e instalación de Linux desde cero.

Utilicé el dispositivo de compilación Yocto Project ( https://www.yoctoproject.org/ ) que parecía prometedor: creó archivos para el cargador de arranque u-Boot, el kernel de Linux y el sistema de archivos raíz.

Esta página proporciona instrucciones para configurar la tarjeta micro SD con los archivos generados por Yocto. Sin embargo, los archivos de imagen incluyen un archivo ".dtb" que no se menciona en las instrucciones de configuración.

¿Tiene este archivo algo que ver con el hardware de la placa? Varios sitios mencionan la carga de archivos dtd (¿tal vez en uEnv.txt?) Pero no he encontrado ninguna información detallada.

Usé las instrucciones anteriores para configurar la partición de arranque con MLO y u-boot.img, y me metí un poco con el uEnv.txt. También configuré una segunda partición con el sistema de archivos raíz.

Pude arrancar e iniciar sesión (a través de la consola del puerto serie), pero parecía que la mayoría del hardware de la placa, por ejemplo, video y todos los dispositivos USB, incluido Ethernet, no funcionaban. ¿Podría ser esto porque no estaba usando el archivo .dtb?

¿Alguien puede explicar el dtb y cómo usarlo en una placa beagle? ¡Gracias!

Jeremy
fuente
Resulta que leí mal el nombre del archivo, originalmente pensé que era un archivo ".dtd" pero es REALMENTE ".dtb", por lo que no pude encontrar información al respecto. La pregunta ahora ha sido actualizada.
Jeremy
Ejemplo mínimo con dispositivo virtual QEMU para comprender mejor el concepto: stackoverflow.com/questions/17488320/…
Ciro Santilli 新疆 改造 中心 法轮功 六四 事件

Respuestas:

13

Respondiendo a mi propia pregunta, después de que descubrí qué buscar. Un archivo "dtb" contiene un Blob de árbol de dispositivos (o Binario) (buena descripción aquí ). Es la nueva (er) forma de pasar información de hardware sobre la placa al kernel de Linux.

Se puede cargar en la memoria y pasar al núcleo mediante u-Boot.

Aquí están los comandos de u-Boot que utilicé:

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 es el núcleo, y beagle-xm.dtb es el blob del árbol de dispositivos. Automaticé el proceso de arranque configurando una variable "uenvcmd = ..." en uEnv.txt (con lo anterior en él), pero es un poco feo y probablemente hay mejores formas.

Tenga en cuenta que esto se inicia y dice que cargó bien el árbol de dispositivos. Sin embargo, todavía no tengo dispositivos USB o video (por lo que puedo decir). Sin embargo, sospecho que puede ser un problema diferente.

Jeremy
fuente
3
Es la nueva (er) forma de pasar información de hardware sobre la placa al kernel de Linux. No había forma previa de pasar información de hardware al kernel. En cambio, el núcleo tendría que incluir estáticamente toda la información y, por lo tanto, tendría un archivo C específico de la placa para enumerar todas esas asignaciones. Esta fue una pesadilla de mantenimiento desde el punto de vista del núcleo.
BatchyX
¡Gracias! Descubrí cómo cargar el archivo dtb, y Linux ahora se inicia y emite varios mensajes sobre la carga de controladores, pero no puedo ver ningún dispositivo USB (incluido el módulo ethernet). Ver nueva pregunta: enlace . ¿Quizás hay algo que necesito configurar manualmente en Linux?
Jeremy
¿Pero qué dirección usar para el archivo dtb? Por ejemplo, si mi zImage va a la dirección 0x43000000 (en lugar del ejemplo anterior 0x80300000), ¿dónde debe ir el dtb?
André van Schoubroeck el
2

Estoy usando Ubuntu 14.04 en el beaglebone black, por lo que mi configuración puede ser un poco diferente, pero así es como cargué un dtb personalizado:

En uEnv.txt, agregue una línea con: dtb=name-of-desired.dtb

Las ubicaciones buscadas deben ser como se especifica aquí . Para mí, aquí fue /boot/dtbs/linux-kernel/donde linux-kernel es el nombre de la versión cargada.

Damian Manda
fuente
0

Tenga en cuenta que hay 2 dtb. El u-boot dtb y el kernel dtb. Son 2 cosas diferentes. U-boot board dts / dtb no siempre se usa, no es obligatorio, por cierto, en u-boot puedes usar el "u-boot" dtb incrustarlo en u-boot o concatenarlo en u-boot.

Angelo Dureghello
fuente