Muestra las diferencias entre dos versiones de la página.
Ambos lados, revisión anterior Revisión previa Próxima revisión | Revisión previa | ||
dispositivos_ingobernables_device_tree [2018/04/05 16:08] pietre se ha restaurado la vieja versión (2018/03/21 03:15) |
dispositivos_ingobernables_device_tree [2018/11/03 17:57] (actual) pietre |
||
---|---|---|---|
Línea 1: | Línea 1: | ||
- | Árbol de dispositivos | + | 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. |
- | Esta página describe cómo escribir un árbol de dispositivos para una nueva máquina. Se pretende proporcionar una visión general de los conceptos de árbol de dispositivos y cómo se utilizan para describir una máquina. | + | |
- | Para obtener una descripción técnica completa del formato del árbol de dispositivos, consulte la especificación ePAPR v1.1. La especificación de ePAPR cubre con mucho más detalle que los temas básicos cubiertos en esta página, consúltelo su en caso de necesitar mas información que no esté cubierto por esta página. El ePAPR está siendo actualizado con un nuevo nombre de Device tree Specification Documentation. | + | 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. | ||
- | Formato de datos básico | + | 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). |
- | Conceptos básicos | + | |
- | Máquina de ejemplo | + | |
- | Estructura inicial | + | |
- | CPU | + | |
- | Nombres de nodos | + | |
- | Dispositivos | + | |
- | Descripción de la propiedad compatible | + | |
- | Cómo funciona el direccionamiento | + | |
- | Dirección de la CPU | + | |
- | Dispositivos con memoria asignada | + | |
- | Dispositivos sin memoria asignada | + | |
- | Rangos (traducción de direcciones) | + | |
- | Cómo funcionan las interrupciones | + | |
- | Datos específicos del dispositivo | + | |
- | Nodos especiales | + | |
- | aliases Node | + | |
- | Nodo elegido | + | |
- | Temas avanzados | + | |
- | Máquina de muestra avanzada | + | |
- | PCI Host Bridge | + | |
- | Numeración del bus PCI | + | |
- | Traducción de direcciones PCI | + | |
- | Mapeo Avanzado de Interrupciones | + | |
- | Notas | + | |
- | 1 Formato de datos básico | + | |
- | El árbol de dispositivos es una estructura de árbol simple de nodos y propiedades. Las propiedades son pares clave-valor, y el nodo puede contener tanto las propiedades como los nodos secundarios. Por ejemplo, el siguiente es un árbol simple en el formato .dts: | + | |
- | /dts-v1/; | + | 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. |
- | node1 { | + | **Formatos de árbol de dispositivos** |
- | a-string-property = "A string"; | + | |
- | a-string-list-property = "first string", "second string"; | + | |
- | // hex is implied in byte arrays. no '0x' prefix is required | + | |
- | a-byte-data-property = [01 23 34 56]; | + | |
- | child-node1 { | + | |
- | first-child-property; | + | |
- | second-child-property = <1>; | + | |
- | a-string-property = "Hello, world"; | + | |
- | }; | + | |
- | child-node2 { | + | |
- | }; | + | |
- | }; | + | |
- | node2 { | + | |
- | an-empty-property; | + | |
- | a-cell-property = <1 2 3 4>; /* each number (cell) is a uint32 */ | + | |
- | child-node1 { | + | |
- | }; | + | |
- | }; | + | |
- | }; | + | |
- | Este árbol es obviamente bastante inútil porque no describe nada, pero muestra la estructura de nodos y propiedades. Aquí tenemos: | + | 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. |
- | un único nodo raíz: “/” un par de nodos secundarios:“node1” y “node2” a un par de nodos hijos de node1: “child-node1” and “child-node2” un montón de propiedades dispersas a través del árbol. | + | 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. |
- | Las propiedades son pares clave-valor simples donde el valor puede estar vacío o contener un flujo de bytes arbitrario. Aunque los tipos de datos no están codificados en la estructura de datos, existen algunas representaciones de datos fundamentales que pueden expresarse en un archivo de origen de árbol de dispositivos. | + | 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 |
- | Las cadenas de texto(string) (null terminated) se representan con comillas dobles | + | 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. |
- | string-property = “a string”; | ||
- | Cell son enteros sin signo de 32 bits delimitados por corchetes angulares: cell-property = <0xbeef 123 0xabcd1234>; | + | ===Árbol de dispositivos: Resumido=== |
- | Los datos binarios (binary) se delimitan con corchetes: | + | 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, | ||
- | binary-property = [0x01 0x23 0x45 0x67]; | + | 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 |
- | Los datos de diferentes representaciones se pueden concatenar juntos usando una coma: | + | 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'' | ||
+ | |||
+ | |||
+ | ==Árbol de dispositivos: Documentación oficial== | ||
+ | |||
+ | 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 | ||
- | mixed-property = “a string”, [0x01 0x23 0x45 0x67], <0x12345678>; | ||
- | Las comas también se utilizan para crear listas de cadenas string-list = “red fish”, “blue fish”; |