news 2026/4/22 21:34:44

嵌入式Linux设备树(DTS)文件结构深度解析:手把手教你读懂一个真实的.dts文件

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
嵌入式Linux设备树(DTS)文件结构深度解析:手把手教你读懂一个真实的.dts文件

嵌入式Linux设备树(DTS)文件结构深度解析:手把手教你读懂一个真实的.dts文件

当你在调试一块嵌入式开发板时,突然发现串口无法正常工作。你打开内核日志,看到一行令人困惑的错误信息:"serial8250: unable to register port at 0x3f8 (irq = 4), skipping"。这时候,你会去哪里查找问题的根源?答案很可能就藏在那个神秘的.dts文件中。

设备树(Device Tree)已经成为现代嵌入式Linux系统的标配,它就像一本硬件配置的字典,告诉内核这块板子上有什么、怎么用。但对于许多工程师来说,面对一个真实的.dts文件时,那些嵌套的节点、奇怪的属性值就像天书一样难以理解。本文将以树莓派4的bcm2711-rpi-4-b.dts为例,带你逐行拆解设备树的奥秘。

1. 设备树基础:从概念到文件结构

设备树本质上是一种描述硬件配置的数据结构,采用树状形式组织。与过去将硬件信息硬编码在内核中的做法不同,设备树将硬件描述与内核代码分离,大大提高了系统的可移植性。

一个典型的设备树项目包含以下文件类型:

  • .dts:设备树源文件,人类可读的文本格式
  • .dtsi:设备树包含文件,类似于C语言的头文件
  • .dtb:编译后的二进制设备树文件,由bootloader传递给内核

让我们看一个最简单的设备树示例:

/dts-v1/; / { model = "My Board"; compatible = "myvendor,myboard"; };

这个例子展示了设备树的几个基本特征:

  1. /dts-v1/声明了设备树版本
  2. /是根节点,所有其他节点都是它的子节点
  3. modelcompatible是标准属性

2. 解剖一个真实.dts文件:树莓派4案例

我们以树莓派4的bcm2711-rpi-4-b.dts为例,逐步分析其结构。这个文件位于Linux内核源码的arch/arm/boot/dts目录下。

2.1 文件头与包含关系

文件开头通常是这样:

/dts-v1/; #include "bcm2711.dtsi" #include "bcm2835-rpi.dtsi"

这里有三点需要注意:

  1. #include指令用于包含其他.dtsi文件
  2. 包含顺序很重要,后面的文件可能覆盖前面的定义
  3. .dtsi文件通常包含SOC级别的通用定义

2.2 根节点与标准属性

根节点下的标准属性提供了板级基本信息:

/ { model = "Raspberry Pi 4 Model B"; compatible = "raspberrypi,4-model-b", "brcm,bcm2711"; memory@0 { device_type = "memory"; reg = <0 0x40000000>; }; };

关键属性解析:

属性名含义示例值
model开发板型号"Raspberry Pi 4 Model B"
compatible兼容性列表"raspberrypi,4-model-b"
memory物理内存布局reg = <0 0x40000000>

2.3 节点引用与别名

设备树中经常需要引用其他节点,这时可以使用标签和别名:

aliases { serial0 = &uart0; }; &uart0 { status = "okay"; };
  • uart0:是定义在某个.dtsi文件中的标签
  • &uart0通过标签引用该节点
  • serial0是为uart0创建的别名

3. 关键节点深度解析

3.1 chosen节点:传递运行时参数

chosen { bootargs = "console=ttyAMA0,115200 earlyprintk"; stdout-path = "serial0:115200n8"; };

chosen节点不描述硬件,而是传递内核参数:

  • bootargs:内核命令行参数
  • stdout-path:标准输出设备

3.2 内存映射与寄存器

设备树中最关键的是描述硬件寄存器映射:

uart0: serial@7e201000 { compatible = "arm,pl011", "arm,primecell"; reg = <0x7e201000 0x200>; interrupts = <2 25>; clocks = <&clk_uart>; };

寄存器描述要点:

  1. reg属性格式:
    reg = <地址1 长度1 [地址2 长度2]...>;
  2. 地址和长度的cell数由父节点的#address-cells#size-cells决定

3.3 中断与时钟

现代SOC设备通常涉及中断和时钟配置:

i2c1: i2c@7e804000 { compatible = "brcm,bcm2835-i2c"; interrupts = <2 21>; clocks = <&clk_i2c>; };
  • 中断号格式:<中断控制器 中断号 触发方式>
  • 时钟通过phandle引用

4. 调试技巧与实际问题解决

4.1 如何验证设备树是否正确加载

查看内核启动日志:

dmesg | grep -i device-tree

或者检查/proc/device-tree:

ls -l /proc/device-tree/

4.2 常见问题排查

问题1:设备驱动probe失败,提示"cannot find device"

可能原因:

  • 设备树中该设备的status不是"okay"
  • compatible字符串不匹配
  • 必要的资源(寄存器、中断等)未正确定义

问题2:寄存器访问出错

检查步骤:

  1. 确认reg属性是否正确
  2. 检查父节点的#address-cells#size-cells
  3. 验证物理地址是否与芯片手册一致

4.3 实用调试命令

# 反编译dtb为dts dtc -I dtb -O dts -o output.dts /boot/device-tree.dtb # 查看设备树属性 cat /proc/device-tree/node/property

5. 从设备树到内核设备

理解设备树如何映射到内核设备是调试的关键。以UART设备为例:

  1. 设备树节点:

    uart0: serial@7e201000 { compatible = "arm,pl011"; reg = <0x7e201000 0x1000>; interrupts = <0 1>; };
  2. 内核中的对应关系:

    • compatible字符串匹配驱动
    • reg属性转换为resource
    • interrupts属性转换为IRQ资源
  3. 最终生成:

    static struct platform_device serial_device = { .name = "arm,pl011", .resource = [...], .num_resources = ..., };

掌握这种映射关系,就能快速定位设备树配置是否正确。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/22 21:34:44

UI前端美化技能提升日志day1:矢量图片规范与自适应控制栏实战

UI前端美化技能提升日志day1&#xff1a;矢量图片规范与自适应控制栏实战 作为一名前端开发者&#xff0c;我始终认为“美化”不是单纯的视觉堆砌&#xff0c;而是规范与美感的结合——既要符合国际前端开发标准&#xff0c;又要呈现出简洁、专业、适配多场景的视觉效果。从今…

作者头像 李华
网站建设 2026/4/22 21:33:16

钙调磷酸酶调控蛋白CSP1

钙压素RCAN1又称为CSP1&#xff0c;唐氏综合征关键区蛋白1&#xff08;DSC1&#xff09;&#xff0c;肌细胞富集钙调磷酸酶相互作用蛋白1&#xff08;MCIP1&#xff09;&#xff0c;Adapt78。钙调神经磷酸酶的调节因子&#xff08;RCAN&#xff09;家族有3个成员&#xff0c;RC…

作者头像 李华
网站建设 2026/4/22 21:31:49

多屏办公真香现场:我是如何用一台旧显示器+HDMI转DP方案,把笔记本变成高效开发站的

多屏办公效率革命&#xff1a;旧显示器改造全攻略 坐在咖啡厅角落&#xff0c;我的目光在笔记本屏幕和手机之间来回切换——查资料、写代码、核对设计稿&#xff0c;这种碎片化的工作方式让我效率低下。直到某天整理储物间时&#xff0c;那台2018年购入的27英寸显示器重新进入视…

作者头像 李华
网站建设 2026/4/22 21:24:18

Python自动化测试selenium指定截图文件名方法

&#x1f345; 点击文末小卡片 &#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快这篇文章主要介绍了Python自动化测试selenium指定截图文件名方法&#xff0c;Selenium 支持 Web 浏览器的自动化&#xff0c;它提供一套测试函数&#xff0c;用于支…

作者头像 李华