En informática, un árbol de dispositivos (también escrito device tree) es una estructura de datos que describe los componentes de hardware de una computadora particular para que el núcleo (kernel)del sistema operativo pueda usar y administrar esos componentes, incluyendo la CPU o GPU, la memoria, los buses y los periféricos.
La razón principal para la existencia de Device Tree en Linux es proporcionar una forma de describir el hardware no detectable. Esta información fue previamente codificada en código fuente. El árbol de dispositivos se obtuvo a partir de estaciones de trabajo y servidores basados en SPARC a través del proyecto Open Firmware.
La especificación actual de Devicetree está dirigida a sistemas más pequeños, pero todavía se usa con algunos sistemas de clase servidor (por ejemplo, los descritos por Power Architecture Platform Reference, incluidos algunos Apple Macintosh).
Las computadoras personales con la arquitectura x86 generalmente no usan árboles de dispositivos, confiando en cambio en varios protocolos de configuración automática para descubrir el hardware. Los sistemas que usan árboles de dispositivos generalmente pasan un árbol de dispositivos estáticos (quizás almacenados en ROM) al sistema operativo, pero también pueden generar un árbol de dispositivos en las primeras etapas de arranque. Como ejemplo, Das U-Boot y kexec pueden pasar un árbol de dispositivos cuando se inicia un nuevo sistema operativo. En sistemas con un gestor de arranque que no admite árboles de dispositivos, se puede instalar un árbol de dispositivos estáticos junto con el sistema operativo; el kernel de Linux es compatible con este enfoque.
La especificación Devicetree está actualmente gestionada por una comunidad llamada devicetree.org, que está asociada, entre otros, a Linaro y Arm.
Formatos de árbol de dispositivos
Un árbol de dispositivos puede contener cualquier tipo de datos, ya que internamente es un árbol de nodos y propiedades con nombre. Los nodos contienen propiedades y nodos secundarios, mientras que las propiedades son pares nombre-valor.
Los datos de Device Tree se pueden representar en varios formatos diferentes. Se deriva del formato de árbol de dispositivo utilizado por Open Firmware para encapsular la información de la plataforma. Los datos del árbol del dispositivo normalmente se crean y mantienen en un formato legible para humanos en archivos fuente .dts y archivos de inclusión de fuentes .dtsi. El sistema de compilación de Linux preprocesa la fuente con cpp.
La fuente del árbol del dispositivo se compila en un formato binario contenido en un archivo blob .dtb. El formato de los datos en el archivo blob .dtb se conoce comúnmente como Árbol de dispositivos aplanado (FDT). El sistema operativo Linux usa los datos del árbol del dispositivo para buscar y registrar los dispositivos en el sistema. Se accede al FDT sin procesar durante las primeras fases de arranque, pero se expande a una estructura de datos interna del kernel conocida como Árbol de dispositivos expandidos (EDT) para un acceso más eficiente para fases posteriores del arranque y una vez que el sistema se ha completado arrancando
Actualmente, el kernel de Linux puede leer la información del árbol del dispositivo en las arquitecturas ARM, x86, Microblaze, PowerPC y Sparc. Existe interés en extender el soporte para los árboles de dispositivos a otras plataformas, para unificar el manejo de la descripción de la plataforma en las arquitecturas del kernel.
El árbol de dispositivos son un conjunto de archivos .dts y .dtsi que se encuentran arch/arm/boot/dts en la carpeta del código fuente del kernel de linux. se editan con un editor de textos simple como gedit leafpad o geany,
Estos archivos se han de modificar para configurar un archivo concreto para tu objetivo, ya sea una tablet, un teléfono móvil, un gps o cualquier dispositivo arm que queramos hacer funcionar con Linux
Cuando tenemos configurado el archivo o los archivos para tu objetivo hay que compilarlo,
Yo conozco 2 opciones, compilar el árbol entero o solo un archivo.
a la hora de compilar el kernel se compilar también todo el árbol con la orden dtbs
make -j$(nproc) ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- zImage modules dtbs
Si se realiza cualquier cambio en el árbol después de compilar el kernel solo se tiene que invocar:
make -j$(nproc) ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- dtbs
Para poder leer la documentación oficial del árbol de dispositivos que se aplica en el kernel de linux puede hacerlo online
https://www.kernel.org/doc/Documentation/devicetree/
También puede descargar el código fuente de linux y poder leer los archivos de documentación en la carpeta “Documentaction/devicetree/bindings y así poder empezar a sentirse hacker!!
Podríamos identificar 3 tipos de archivos del árbol, (estas denominaciones me las estoy inventando por que no tienen conceptos asociativos validos en ingles)
dts de definición de modelo
dts de definición de gama
dtsi de definición de subarquitectura
Esta separación ha sido casual o practica, no esta documentada esta practica en los manuales oficiales del árbol de dispositivos,
dts de definición de modelo:
Estos archivos hacer referencia a un modelo determinado, es decir si samsung tuviese el interés de pasar sus tablets a linux (que utopia) tendría que hacer todo un árbol de dispositivos propio, los del ultimo nivel serían estos ficheros que harían referencia a un modelo exacto, con un RAM,CPU,NAND,Wi-Fi concreto.
dts de definición de gama
Estos archivos pueden ser dts o dtsi, y si continuamos con el mismo ejemplo de samsung estos ficheros harían referencia a una gama entera de la que se diferenciasen componentes como Wi-Fi ,usb y controlador de energía, pero que mantienen siempre el mismo tipo de procesador,
dtsi de definición de subarquitectura
Estos ficheros compondrían los componentes de subarquitectura, por ejemplo todas las tablets samsung de 32 bits, definen los conceptos básicos del procesador, las dependencias de estos ficheros suelen ser archivos .c