插件窝 干货文章 Linux 设备树 devicetree(DTS)入门

Linux 设备树 devicetree(DTS)入门

设备 DTS 内核 节点 951    来源:    2025-05-13

Linux 设备树(DTS)入门指南

什么是设备树(Device Tree)

设备树(Device Tree)是一种描述硬件配置的数据结构,用于将硬件信息传递给操作系统内核,特别是在ARM架构中广泛使用。它解决了嵌入式系统中硬件描述硬编码在内核中的问题。

设备树的基本组成

1. 设备树源文件(.dts)

  • 人类可读的文本文件,描述硬件配置
  • 使用类似C语言的语法

2. 设备树编译器(dtc)

  • 将.dts文件编译为二进制格式(.dtb)
  • 通常由内核构建系统自动调用

3. 设备树二进制文件(.dtb)

  • 二进制格式的设备树
  • 由bootloader加载并传递给内核

设备树语法基础

基本结构

/dts-v1/;                      // 设备树版本
/ {                            // 根节点
    node1 {                    // 子节点1
        property1 = "value";  // 属性1
        property2 = <0x1234>;  // 属性2(数值)
        child-node {          // 子节点的子节点
            property3;
        };
    };
    node2 {
        // ...
    };
};

常用数据类型

  1. 字符串: property = "string value";
  2. 数值(32位): property = <0x12345678>;
  3. 二进制数据: property = [01 23 45 67];
  4. 字符串列表: property = "string1", "string2";
  5. 数值列表: property = <1 2 3 4>;

常用属性

  • compatible: 用于设备驱动匹配
  • reg: 寄存器地址和大小
  • interrupts: 中断信息
  • status: 设备状态("okay", "disabled"等)
  • #address-cells#size-cells: 定义寻址方式

设备树示例

简单示例

/dts-v1/;

/ {
    compatible = "mycompany,myboard";
    #address-cells = <1>;
    #size-cells = <1>;

    memory@80000000 {
        device_type = "memory";
        reg = <0x80000000 0x10000000>; // 256MB内存
    };

    uart0: serial@101f1000 {
        compatible = "arm,pl011";
        reg = <0x101f1000 0x1000>;
        interrupts = <0 12 4>;
    };
};

使用标签和引用

/dts-v1/;

/ {
    // 定义标签
    uart1: serial@101f2000 {
        compatible = "arm,pl011";
        reg = <0x101f2000 0x1000>;
    };

    // 使用标签引用
    chosen {
        stdout-path = &uart1;
    };
};

设备树覆盖(Overlay)

设备树覆盖允许在运行时修改设备树,常用于动态配置硬件:

/dts-v1/;
/plugin/;

&uart1 {  // 引用主设备树中的节点
    status = "okay";
    pinctrl-names = "default";
    pinctrl-0 = <&uart1_pins>;
};

设备树编译与使用

编译命令

# 编译dts为dtb
dtc -I dts -O dtb -o myboard.dtb myboard.dts

# 反编译dtb为dts
dtc -I dtb -O dts -o myboard.dts myboard.dtb

在内核中使用

  1. 将.dts文件放在arch/arm/boot/dts/目录
  2. 修改Makefile添加目标
  3. 编译内核时会自动编译设备树

调试技巧

  1. 查看系统设备树:

    ls /proc/device-tree/
    
  2. 查看特定节点属性:

    hexdump /proc/device-tree/node/property
    
  3. 内核启动时查看设备树解析: 在启动参数中添加of=prdebug

  4. 使用dtc工具验证语法:

    dtc -I dts -O dtb -o /dev/null myboard.dts
    

最佳实践

  1. 尽量复用已有的设备树定义
  2. 使用有意义的节点和属性名称
  3. 为设备添加正确的compatible字符串
  4. 使用标签提高可读性和可维护性
  5. 添加必要的注释说明硬件配置

学习资源

  1. 官方文档: Documentation/devicetree/(内核源码中)
  2. Device Tree Specification: https://www.devicetree.org/
  3. Linux内核源码中的示例

通过掌握设备树,您可以更灵活地配置Linux系统硬件,特别是在嵌入式开发中。