插件窝 干货文章 理解Linux DTS的作用及用法

理解Linux DTS的作用及用法

内核 DTS 硬件 编译 562    来源:    2025-04-09

Linux DTS(Device Tree Source)详解

DTS概述

DTS(Device Tree Source)是Linux内核中用于描述硬件配置的一种数据结构,它解决了传统内核中硬件信息硬编码的问题,使得同一内核可以支持多种硬件平台。

DTS的作用

  1. 硬件抽象:将硬件描述从内核代码中分离出来
  2. 平台无关性:同一内核可以支持不同硬件配置
  3. 可维护性:硬件变更只需修改DTS文件,无需重新编译内核
  4. 可读性:树形结构直观描述硬件拓扑

DTS文件类型

  • .dts:设备树源文件(Device Tree Source)
  • .dtsi:设备树包含文件(类似头文件)
  • .dtb:编译后的二进制设备树文件(Device Tree Blob)

DTS基本语法

节点结构

/ {
    node1 {
        a-string-property = "A string";
        a-string-list-property = "first string", "second string";
        a-byte-data-property = [0x01 0x23 0x34 0x56];
        child-node1 {
            first-child-property;
            second-child-property = <1>;
        };
        child-node2 {
        };
    };
    node2 {
        an-empty-property;
        a-cell-property = <1 2 3 4>;
    };
};

常用属性

  • compatible:指定设备驱动匹配字符串
  • reg:描述设备寄存器地址范围
  • interrupts:描述设备中断信息
  • #address-cells#size-cells:描述子节点reg属性的格式

DTS编译与使用

编译流程

  1. 使用dtc工具将.dts编译为.dtb:

    dtc -I dts -O dtb -o output.dtb input.dts
    
  2. 在内核源码中编译:

    make dtbs
    

使用方式

  1. U-Boot传递:通过bootm命令加载dtb

    bootm <kernel_addr> - <dtb_addr>
    
  2. 内嵌DTB:将dtb编译进内核镜像

实例分析

简单GPIO设备描述

/ {
    compatible = "acme,coyotes-revenge";

    gpio0: gpio@10000000 {
        compatible = "acme,gpio";
        reg = <0x10000000 0x1000>;
        interrupts = <1>;
        gpio-controller;
        #gpio-cells = <2>;
    };

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

调试技巧

  1. 查看系统设备树

    ls /proc/device-tree/
    
  2. 反编译dtb

    dtc -I dtb -O dts -o output.dts input.dtb
    
  3. 内核配置

    CONFIG_PROC_DEVICETREE=y
    CONFIG_OF=y
    

最佳实践

  1. 尽量使用已有的dtsi文件作为基础
  2. 合理组织节点层次结构
  3. 为每个节点添加有意义的compatible字符串
  4. 使用标签(&label)引用节点
  5. 保持与内核文档中的绑定(bindings)一致

DTS是现代Linux系统支持多种硬件平台的关键技术,掌握DTS的使用可以大大提高嵌入式Linux开发的效率和灵活性。