Maison  >  Article  >  Opération et maintenance  >  Qu’est-ce que Linux DTS ? comment utiliser?

Qu’est-ce que Linux DTS ? comment utiliser?

WBOY
WBOYoriginal
2024-03-01 17:15:04723parcourir

Linux DTS是什么?如何使用?

Linux DTS (Device Tree Source) est une structure de données qui décrit les informations sur le matériel. Elle est principalement utilisée pour décrire les informations de divers périphériques matériels dans les systèmes embarqués, y compris les adresses de périphérique, les interruptions, les configurations de registre et les pilotes de périphérique. Dans le noyau Linux, les fichiers DTS sont généralement utilisés pour décrire les informations matérielles des périphériques intégrés afin que le système d'exploitation puisse identifier et utiliser correctement les périphériques matériels.

Structure du fichier DTS

Un fichier DTS typique est le suivant :

/dts-v1/;

#include <imx6qdl-pico.dtsi>
#include <imx6qdl-pico-m4.dtsi>

/ {
    compatible = "fsl,imx6q-pico", "fsl,imx6q";
    
    model = "Boundary Devices i.MX6 Quad SABRE Lite";
    
    memory {
        device_type = "memory";
        reg = <0x10000000 0x40000000>;
    };
    
    chosen {
        compatible = "brcm,bcm2835";
        uart_boot = <&uart1>;
    };

    aliases {
        serial0 = &uart1;
    };

    soc {
        compatible = "simple-bus";
        #address-cells = <1>;
        #size-cells = <1>;
        ranges;
        
        gpio: gpio@0209c000 {
            compatible = "fsl,imx6ul-gpio";
            reg = <0x0209c000 0x1000>;
            interrupts = <GPIOn IRQn>;
            gpio-controller;
            #gpio-cells = <2>;
        };
    
    };
    
    uart1: serial@02020000 {
        compatible = "fsl,imx6q-uart", "fsl,imx21-uart";
        reg = <0x02020000 0x40000>;
        interrupts = <78>;
        clocks = <&clks 82>;
        clock-names = "ipg", "per";
        status = "okay";
    };
    
    sound {
        compatible = "fsl,imx6-sai";
        model = "imx6-sai";
        status = "okay";
        /* SSI1 */
        ssi@021d8000 {
            compatible = "fsl,imx6-sai";
            reg = <0x021d8000 0x4000>;
            interrupts = <0 125 0>;
            clocks = <&clks 2>;
            dmas = <&sdma 9 11 0>, <&sdma 10 11 0>, <&sdma 11 11 0>;
            dma-names = "tx", "rx", "mclk";
            status = "okay";
        };
    };
};

Description du contenu du fichier DTS

  • /dts-v1/ : La version spécifiée est la version DTS 1, décrivant le fichier DTS Information sur la version.
  • /dts-v1/: 指定版本为DTS版本1,描述DTS文件的版本信息。
  • #include 184cbaa65f0dd2e5fe6d736ea556f9c7: 包含其他DTS文件,可复用其定义。
  • /: 根节点,描述整个设备树结构。
  • compatible: 指定设备兼容性信息。
  • model: 设备型号信息。
  • memory: 描述内存信息。
  • chosen: 描述一些选项信息。
  • aliases: 定义设备别名。
  • soc: 描述SoC相关信息。
  • gpio: 描述GPIO控制器。
  • uart1: 描述UART1硬件信息。
  • sound: 描述声音设备信息。

如何使用Linux DTS

  1. 编辑DTS文件:在Linux内核源码中的arch/arm/boot/dts/目录下找到对应平台的DTS文件(如imx6qdl-pico.dtsi),根据实际硬件信息编辑DTS文件。
  2. 编译DTS文件:在Linux内核源码根目录下执行以下命令编译DTS文件:

    make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- dtbs
  3. 替换设备树二进制文件:将生成的.dtb文件(设备树二进制文件)替换到目标设备的引导分区。
  4. 使用设备树:在Linux内核启动时,会加载设备树文件来描述硬件信息,从而正确识别和配置硬件设备。

代码示例

#include <linux/module.h>
#include <linux/of_device.h>
#include <linux/platform_device.h>

static int my_driver_probe(struct platform_device *pdev)
{
    struct device_node *np = pdev->dev.of_node;
    
    if (!np) {
        dev_err(&pdev->dev, "No device tree node found
");
        return -ENODEV;
    }
    
    // 解析设备树节点信息
    u32 reg;
    if (of_property_read_u32(np, "reg", &reg)) {
        dev_err(&pdev->dev, "Failed to read 'reg' property
");
        return -EINVAL;
    }
    
    dev_info(&pdev->dev, "Got 'reg' property: %u
", reg);
    
    return 0;
}

static const struct of_device_id my_driver_of_match[] = {
    { .compatible = "my_driver", },
    { },
};
MODULE_DEVICE_TABLE(of, my_driver_of_match);

static struct platform_driver my_driver = {
    .probe = my_driver_probe,
    .driver = {
        .name = "my_driver",
        .of_match_table = my_driver_of_match,
        .owner = THIS_MODULE,
    }
};

module_platform_driver(my_driver);

MODULE_LICENSE("GPL");
MODULE_AUTHOR("Author Name");
MODULE_DESCRIPTION("Sample driver using Device Tree");

以上是一个简单的Linux设备驱动程序示例,通过解析设备树节点中的属性来配置硬件设备。在probe函数中,首先获取设备树节点,然后读取其中的reg属性并输出。在of_device_id#include 184cbaa65f0dd2e5fe6d736ea556f9c7 : contient d'autres fichiers DTS et peut réutiliser leurs définitions.

/ : nœud racine, décrivant l'ensemble de l'arborescence des appareils. 🎜compatible : spécifiez les informations de compatibilité de l'appareil. 🎜model : informations sur le modèle de l'appareil. 🎜memory : décrit les informations sur la mémoire. 🎜choisi : Décrivez quelques informations sur les options. 🎜alias : définissez les alias des appareils. 🎜soc : décrit les informations relatives au SoC. 🎜gpio : Décrit le contrôleur GPIO. 🎜uart1 : décrit les informations sur le matériel UART1. 🎜sound : décrit les informations sur le périphérique audio. 🎜Comment utiliser Linux DTS🎜
    🎜Modifier les fichiers DTS : recherchez le DTS pour la plateforme correspondante dans le répertoire arch/arm/boot/dts/ du Fichier de code source du noyau Linux (tel que imx6qdl-pico.dtsi), modifiez le fichier DTS en fonction des informations réelles sur le matériel. 🎜🎜Compilez le fichier DTS : exécutez la commande suivante dans le répertoire racine du code source du noyau Linux pour compiler le fichier DTS : 🎜rrreee🎜Remplacez le fichier binaire de l'arborescence des périphériques : remplacez le généré. dtb (binaire de l'arborescence des périphériques) sur la partition de démarrage du périphérique cible. 🎜Utiliser l'arborescence des périphériques : lorsque le noyau Linux démarre, le fichier de l'arborescence des périphériques sera chargé pour décrire les informations sur le matériel, afin d'identifier et de configurer correctement le périphérique matériel.
🎜Exemple de code🎜rrreee🎜Ce qui précède est un exemple simple de pilote de périphérique Linux qui configure les périphériques matériels en analysant les propriétés dans les nœuds de l'arborescence des périphériques. Dans la fonction probe, obtenez d'abord le nœud de l'arborescence des périphériques, puis lisez l'attribut reg et affichez-le. Les informations de compatibilité du nœud de l'arborescence des périphériques qui doivent correspondre sont déclarées dans of_device_id afin que le pilote puisse correspondre correctement au périphérique. 🎜

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn