news 2026/4/27 18:18:55

别再死记硬背了!用5个真实DTS片段,带你吃透Linux设备树语法

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
别再死记硬背了!用5个真实DTS片段,带你吃透Linux设备树语法

实战派Linux设备树:5个DTS片段解锁硬件配置核心技能

第一次打开开发板的DTS文件时,那些密密麻麻的节点和属性就像天书一样。我清楚地记得自己盯着树莓派的bcm2711-rpi-4-b.dts发呆了半小时,完全不知道从哪里入手修改GPIO配置。这正是大多数嵌入式开发者面对设备树时的真实写照——文档读了不少,语法规则也背过,但真要动手改点什么,手指悬在键盘上就是敲不下去。

1. 从零解剖一个真实DTS文件

打开树莓派4B的DTS文件,首先映入眼帘的是这个结构:

/dts-v1/; / { model = "Raspberry Pi 4 Model B"; compatible = "raspberrypi,4-model-b", "brcm,bcm2711"; #address-cells = <2>; #size-cells = <1>; memory@0 { device_type = "memory"; reg = <0 0 0 0x40000000>; }; };

这个片段揭示了几个关键实战要点:

  • 版本声明/dts-v1/必须出现在文件开头,就像C语言的#include一样
  • 根节点:所有设备树都以/开始构建硬件拓扑
  • 硬件标识modelcompatible是内核匹配机器的关键
  • 地址编码#address-cells#size-cells决定了后续reg属性的解析方式

提示:在修改现有DTS时,务必保留原文件的compatible值,这是内核识别硬件的关键指纹。

2. 硬件寄存器映射实战

为开发板添加一个新的I2C设备时,最常遇到的问题就是寄存器地址配置。看看这个真实的I2C控制器定义:

i2c@7e205000 { compatible = "brcm,bcm2835-i2c"; reg = <0x7e205000 0x1000>; interrupts = <2 21>; clocks = <&clocks BCM2835_CLOCK_VPU>; #address-cells = <1>; #size-cells = <0>; status = "okay"; touchscreen@38 { compatible = "edt,edt-ft5406"; reg = <0x38>; interrupt-parent = <&gpio>; interrupts = <22 IRQ_TYPE_EDGE_FALLING>; }; };

这段代码展示了三个层次的硬件描述:

  1. 控制器配置

    • reg属性中的0x7e205000是物理地址
    • interrupts<2 21>表示使用中断控制器2的第21号中断
  2. 时钟依赖

    • clocks引用系统时钟树中的VPU时钟
  3. 设备挂载

    • 触摸屏设备地址0x38
    • GPIO22作为中断引脚,下降沿触发

3. 中断配置的三种武器

设备树中最让人头疼的中断配置,其实有明确的模式可循:

3.1 简单中断(单一控制器)

gpio-keys { compatible = "gpio-keys"; #address-cells = <1>; #size-cells = <0>; button@17 { label = "Power"; linux,code = <116>; // KEY_POWER gpios = <&gpio 17 GPIO_ACTIVE_LOW>; interrupt-parent = <&gpio>; interrupts = <17 IRQ_TYPE_EDGE_FALLING>; }; };

3.2 复杂中断(多控制器)

pcie@7d500000 { compatible = "brcm,bcm2711-pcie"; interrupts = <0 96>, <0 97>, <0 98>; interrupt-names = "pcie", "msi", "dma"; interrupt-parent = <&gic>; };

3.3 级联中断(GPIO扩展)

expander: gpio-expander@20 { compatible = "ti,tca9554"; reg = <0x20>; interrupt-parent = <&gpio>; interrupts = <23 IRQ_TYPE_LEVEL_LOW>; #gpio-cells = <2>; gpio-controller; };

三种配置方式的对比:

类型适用场景关键属性示例设备
简单中断单一GPIO中断interrupts + interrupt-parent按键、传感器
复杂中断多中断源设备interrupts + interrupt-namesPCIe、USB控制器
级联中断通过GPIO扩展的中断gpio-controller + interruptsI2C GPIO扩展器

4. 设备树覆盖(DTBO)实战技巧

当需要动态修改设备配置时,设备树覆盖是最佳选择。这是一个实际用于禁用蓝牙的覆盖片段:

/dts-v1/; /plugin/; / { fragment@0 { target = <&uart1>; __overlay__ { status = "disabled"; }; }; fragment@1 { target-path = "/aliases"; __overlay__ { serial0 = "/uart0"; }; }; };

这个覆盖文件做了两件事:

  1. 禁用uart1(蓝牙使用的串口)
  2. 将系统默认串口别名指向uart0

编译和应用的命令序列:

# 编译dtbo dtc -@ -I dts -O dtb -o disable-bt.dtbo disable-bt.dts # 应用覆盖 sudo cp disable-bt.dtbo /boot/overlays/ # 在config.txt中添加 dtoverlay=disable-bt

常见覆盖操作速查表:

操作类型语法示例典型应用场景
禁用设备status = "disabled";关闭冲突外设
修改参数clock-frequency = <1000000>;调整I2C速率
添加节点__overlay__ { new-node { ... } };添加定制硬件
重命名引用serial0 = "/uart0";切换默认控制台

5. 调试设备树的必备工具链

当设备树配置不生效时,这套调试组合拳能快速定位问题:

第一步:检查DTB反编译

dtc -I dtb -O dts -o /tmp/decompiled.dts /boot/bcm2711-rpi-4-b.dtb

第二步:验证内核解析结果

# 查看所有设备节点 ls /proc/device-tree/ # 读取特定属性 hexdump -C /proc/device-tree/soc/i2c@7e205000/reg

第三部:动态调试

chosen { bootargs = "... earlycon=pl011,0xfe201000 loglevel=8"; linux,stdout-path = &uart1; };

关键调试符号说明:

OF: ** device tree ** OF: fdt: -1024368128 bytes leftover OF: device tree: 1 (level) 2 (siblings) 3 (phandle) 4 (deadbeef)

设备树开发中最常遇到的三个坑:

  1. 地址单元不匹配:父节点的#address-cells和子节点reg定义不一致
  2. 中断号冲突:不同设备错误共享相同中断线
  3. 时钟依赖缺失:未正确声明时钟关系导致设备初始化失败

记得第一次调试I2C设备时,我花了整整两天才发现问题出在忘记声明clock-names属性。现在我的检查清单总是包含这些项目:

  • [ ] 所有reg属性与父节点的#address-cells匹配
  • [ ] 中断号在对应控制器范围内
  • [ ] 必要的时钟引用已正确定义
  • [ ]status属性设置为"okay"
  • [ ]compatible字符串与驱动完全一致
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/27 18:13:30

FPGA开发者必看:四款热门开发板HDMI接口电路设计对比与选型指南

FPGA开发板HDMI接口设计深度对比&#xff1a;从电路细节到选型策略 当你在项目需求文档中写下"支持HDMI输出"这行字时&#xff0c;真正的挑战才刚刚开始。四款主流FPGA开发板——正点原子达芬奇、小梅哥AX720、米联客ZYNQ7030和ZYNQ7020&#xff0c;它们的HDMI接口电…

作者头像 李华
网站建设 2026/4/27 18:13:30

Python农业物联网融合不是“拼接”,而是“重构”:用本体建模+动态权重分配实现作物胁迫预警准确率跃升至94.3%(IEEE IoT Journal 2024最新实践)

更多请点击&#xff1a; https://intelliparadigm.com 第一章&#xff1a;Python农业物联网多源数据融合 多源异构数据接入挑战 现代农业物联网系统常集成土壤温湿度传感器、气象站、无人机遥感影像、边缘摄像头及历史农事日志等多类数据源&#xff0c;其协议&#xff08;MQT…

作者头像 李华
网站建设 2026/4/27 18:10:02

PvZ Toolkit:重新定义植物大战僵尸游戏体验的开源修改器

PvZ Toolkit&#xff1a;重新定义植物大战僵尸游戏体验的开源修改器 【免费下载链接】pvztoolkit 植物大战僵尸 PC 版综合修改器 项目地址: https://gitcode.com/gh_mirrors/pv/pvztoolkit 你是否曾为植物大战僵尸中的资源短缺而烦恼&#xff1f;是否希望突破游戏原有的…

作者头像 李华
网站建设 2026/4/27 18:09:25

全国有出口资质企业信息库1949-2022年

01、数据介绍企业需要经营范围有进出口且办理进出口权资质&#xff0c;需要到商务局、海关、外管局等有关部门申请批准后&#xff0c;获得进出口企业经营权&#xff0c;出口产品符合国家要求&#xff0c;符合出口产品的海关监管条件&#xff0c;对于《出口许可证管理货物目录》…

作者头像 李华