Linux_DeviceTree - Kasimashi/Systemes-embarques GitHub Wiki

Le Device Tree avec Linux

Le Device Tree (DT) est une structure de données utilisée par le noyau Linux pour décrire le matériel d'un système, en particulier dans les systèmes embarqués. Il permet au noyau de comprendre et d'interagir avec le matériel sans avoir besoin d'écrire du code spécifique pour chaque plate-forme. Le Device Tree est principalement utilisé dans les architectures ARM, mais il peut aussi être utilisé dans d'autres architectures comme PowerPC, MIPS, etc.

Fonctionnement du Device Tree

Le Device Tree est généralement décrit dans un fichier texte qui est ensuite compilé en un fichier binaire appelé DTB (Device Tree Blob). Ce fichier binaire est chargé par le bootloader (par exemple U-Boot) et est ensuite utilisé par le noyau Linux au moment du démarrage pour découvrir la configuration du matériel.

Le fichier de description du Device Tree est une hiérarchie d'objets (nodes) décrivant les composants matériels. Chaque nœud représente un périphérique ou un sous-système du système, comme le processeur, la mémoire, les périphériques d'entrée/sortie (GPIO, UART, etc.), et les périphériques spécifiques.

Structure du Device Tree

La structure d’un fichier Device Tree ressemble à un arbre avec des nœuds et des propriétés associées à chaque nœud. Voici un exemple simplifié de la structure d'un fichier Device Tree pour un système donné :

/dts-v1/;

/ {
    model = "Example Device";
    compatible = "manufacturer,example-device";
    
    memory {
        reg = <0x80000000 0x10000000>;  /* Adresse et taille de la mémoire */
    };
    
    uart1: serial@4000 {
        compatible = "vendor,uart";
        reg = <0x4000 0x1000>;
        interrupts = <10>;
    };
    
    gpio@5000 {
        compatible = "vendor,gpio";
        reg = <0x5000 0x1000>;
    };
};

Détails de la structure

  • / { ... } : Le nœud racine de l'arbre, où les informations générales sur l'appareil sont définies.
  • model et compatible : Des propriétés qui définissent le modèle du système et le périphérique compatible.
  • memory : Décrit la plage d'adresses de la mémoire du système.
  • uart1 et gpio : Des nœuds décrivant des périphériques comme un port série (UART) et un contrôleur GPIO, avec des propriétés comme reg (adresse et taille) et interrupts.

Compilation du Device Tree

Les fichiers de description du Device Tree (avec l'extension .dts) sont compilés en fichiers binaires .dtb avec l'outil dtc (Device Tree Compiler) :

dtc -I dts -O dtb -o <fichier.dtb> <fichier.dts>

Ce fichier .dtb est ensuite utilisé par le noyau Linux au démarrage.

Exemple de Device Tree pour STM32

Voici un exemple d'un fichier Device Tree pour une carte STM32, supposons une carte STM32F4 avec un UART et un GPIO. Cet exemple montre comment décrire une simple configuration matérielle dans le fichier Device Tree.

/dts-v1/;

/ {
    model = "STM32F4 Board";
    compatible = "st,stm32f4", "st,stm32";
    
    memory {
        reg = <0x20000000 0x40000>;  /* Définir la mémoire à 0x20000000 de taille 256 Ko */
    };

    soc {
        compatible = "st,stm32f4";

        /* Définition de l'UART (port série) */
        uart1: serial@40011000 {
            compatible = "st,stm32-uart";
            reg = <0x40011000 0x400>;
            interrupts = <36>;  /* Numéro d'interruption de l'UART */
            clock-frequency = <16000000>;
            status = "okay";  /* Active l'UART */
        };

        /* Définition du GPIO */
        gpio1: gpio@40020000 {
            compatible = "st,stm32-gpio";
            reg = <0x40020000 0x400>;
            gpio-controller;
            #gpio-cells = <2>;
            interrupt-controller;
            #interrupt-cells = <2>;
        };
    };
};

Explication de l'exemple :

  1. model et compatible : Ces propriétés définissent le modèle de la carte (STM32F4) et les périphériques compatibles.
  2. memory : La mémoire est définie à partir de l'adresse 0x20000000 pour une taille de 256 Ko.
  3. soc (System on Chip) : Ce nœud contient des informations sur les périphériques matériels spécifiques à la puce STM32F4.
    • uart1 : Définition de l'UART à l'adresse 0x40011000 avec une taille de 1024 octets et une interruption associée à l'UART.
    • gpio1 : Définition d'un contrôleur GPIO à l'adresse 0x40020000 pour gérer les broches GPIO.

Compilation pour STM32

Pour STM32, vous utiliseriez également l'outil dtc pour compiler ce fichier en un fichier .dtb que vous placerez sur la carte via un bootloader comme U-Boot. Une fois le fichier .dtb chargé, le noyau Linux peut interagir avec les périphériques définis dans le Device Tree.


Conclusion

Le Device Tree est un moyen puissant pour décrire le matériel d'un système embarqué sans avoir besoin de recompiler le noyau Linux. Cela permet une plus grande flexibilité, surtout pour les architectures comme ARM, où les configurations matérielles peuvent varier considérablement d'une plateforme à l'autre. En utilisant le Device Tree, le noyau Linux peut découvrir et gérer dynamiquement les périphériques, ce qui simplifie grandement le processus de développement et de portage.

⚠️ **GitHub.com Fallback** ⚠️