Linux_DeviceTree - Kasimashi/Systemes-embarques GitHub Wiki
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.
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.
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>;
};
};
- / { ... } : 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.
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.
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>;
};
};
};
- model et compatible : Ces propriétés définissent le modèle de la carte (STM32F4) et les périphériques compatibles.
-
memory : La mémoire est définie à partir de l'adresse
0x20000000
pour une taille de 256 Ko. -
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.
-
uart1 : Définition de l'UART à l'adresse
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.
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.