插件窝 干货文章 Linux DTS是什么?如何使用?

Linux DTS是什么?如何使用?

DTS 设备 内核 节点 307    来源:    2025-04-09

Linux DTS (Device Tree Source) 详解

什么是DTS?

DTS (Device Tree Source) 是Linux系统中用于描述硬件配置的一种数据结构,主要用于嵌入式系统和ARM架构的设备。它是设备树(Device Tree)的源代码形式,通过编译后会生成DTB (Device Tree Blob)文件,供Linux内核在启动时使用。

DTS的主要作用

  1. 硬件抽象:将硬件配置与内核代码分离
  2. 平台无关性:同一内核可以支持不同硬件平台
  3. 减少内核移植工作:修改DTS文件而非内核代码

DTS的基本结构

一个典型的DTS文件包含以下部分:

/dts-v1/;                      // 设备树版本声明
/ {                            // 根节点
    model = "My Board";        // 板卡型号
    compatible = "vendor,board"; // 兼容性标识

    cpus {                     // CPU节点
        // CPU描述...
    };

    memory@80000000 {          // 内存节点
        reg = <0x80000000 0x20000000>;
    };

    serial@101f0000 {          // 串口设备节点
        compatible = "arm,pl011";
        reg = <0x101f0000 0x1000>;
        interrupts = <0 12 4>;
    };
};

如何使用DTS

1. 编写DTS文件

创建一个.dts文件描述你的硬件配置,例如myboard.dts

2. 编译DTS为DTB

使用设备树编译器(DTC)将DTS编译为DTB:

dtc -I dts -O dtb -o myboard.dtb myboard.dts

3. 使用DTB文件

将生成的.dtb文件与内核一起使用:

  • 对于U-Boot:bootz 0x82000000 - 0x83000000
  • 直接加载:bootm <kernel_addr> - <dtb_addr>

4. 查看设备树

在运行的Linux系统中查看设备树:

# 查看/sys/firmware/devicetree目录
ls /sys/firmware/devicetree/base

# 使用dtc反编译DTB
dtc -I fs /sys/firmware/devicetree/base

DTS语法要点

  1. 节点(Node):用花括号{}定义
  2. 属性(Property)name = value;形式
  3. phandle:节点引用标识符
  4. 标签(label):方便引用节点
  5. include:可以包含其他dtsi文件

常用工具

  1. dtc:设备树编译器
  2. fdtdump:查看DTB文件内容
  3. ofdump:另一种查看设备树的工具

调试技巧

  1. 检查内核启动日志中的设备树相关信息
  2. 使用of_*系列API在内核中访问设备树
  3. 通过/proc/device-tree查看当前设备树

实际应用示例

// myboard.dts
/dts-v1/;
#include "soc-base.dtsi"

/ {
    model = "My Custom Board";
    compatible = "myvendor,myboard";

    memory {
        device_type = "memory";
        reg = <0x80000000 0x20000000>; // 512MB内存
    };

    leds {
        compatible = "gpio-leds";
        led0 {
            label = "heartbeat";
            gpios = <&gpio0 15 0>;
            linux,default-trigger = "heartbeat";
        };
    };
};

掌握DTS对于嵌入式Linux开发至关重要,它使得硬件描述更加灵活和可维护。