当前位置: 首页 > news >正文

嵌入式Linux设备树(DTS)文件深度解析:手把手教你读懂内存、串口与chosen节点

嵌入式Linux设备树(DTS)文件深度解析:手把手教你读懂内存、串口与chosen节点

当你第一次打开开发板的.dts文件时,面对密密麻麻的节点定义和十六进制地址,是否感到无从下手?作为嵌入式工程师,我们经常需要在没有完整文档的情况下,仅凭设备树源码理解硬件配置。本文将以实际开发板arm64-demo.dts文件为例,带你逐行解析关键节点,掌握设备树的核心阅读技巧。

1. 设备树基础:从硬件描述到内核识别

设备树本质上是一种硬件描述语言,它用树状结构定义系统中的所有设备及其相互关系。与传统的硬编码方式相比,设备树将硬件描述与内核代码分离,使得同一内核可以支持不同硬件平台。

典型设备树文件结构

/dts-v1/; #include "soc-base.dtsi" / { model = "Board Name"; compatible = "vendor,soc-model"; memory@80000000 { reg = <0x80000000 0x20000000>; }; serial@11002000 { status = "okay"; }; };

设备树编译流程:

  1. .dts(文本源码) → DTC编译 →.dtb(二进制)
  2. Bootloader加载dtb到内存并传递给内核
  3. 内核解析dtb生成设备列表

提示:使用fdtdump工具可以查看dtb文件内容,这对调试非常有用

2. 内存节点解析:物理内存布局的定义

内存节点(memory)是每个设备树必须包含的基础节点,它定义了系统的物理内存映射。以arm64-demo为例:

memory@40000000 { device_type = "memory"; reg = <0 0x40000000 0 0x1e800000>; };

关键要素解析:

属性说明示例值含义
device_type必须为"memory"标识内存设备
reg地址范围描述<0 0x40000000 0 0x1e800000>表示从0x40000000开始的480MB内存

地址格式由父节点的#address-cells#size-cells决定:

  • #address-cells = <2>:地址用两个32位数表示
  • #size-cells = <2>:大小用两个32位数表示

常见问题排查

  • 内存大小错误会导致系统无法启动
  • 多块内存需要定义多个memory节点
  • 使用memreserve可以保留特定内存区域

3. 串口配置:从节点定义到驱动匹配

串口是嵌入式系统最常用的调试接口,其设备树配置直接影响内核初始化过程。示例中的UART节点:

uart0: serial@11002000 { compatible = "mediatek,mt6795-uart"; reg = <0 0x11002000 0 0x400>; interrupts = <GIC_SPI 91 IRQ_TYPE_LEVEL_LOW>; clocks = <&uart_clk>; status = "disabled"; }; &uart0 { status = "okay"; };

关键属性解析:

  1. compatible:驱动匹配的关键字

    • 格式:"厂商,型号"
    • 内核会查找匹配的驱动
  2. reg:寄存器地址范围

    • <0 0x11002000 0 0x400>表示从0x11002000开始的1KB空间
  3. status:设备状态控制

    • "okay":启用设备
    • "disabled":禁用设备

实际操作案例:启用UART1

&uart1 { status = "okay"; current-speed = <115200>; };

4. chosen节点:系统运行时参数的传递

chosen节点不描述硬件,而是传递内核启动参数和运行时配置:

chosen { stdout-path = "serial0:921600n8"; bootargs = "console=ttyS0,921600 earlycon=uart8250,mmio32,0x11002000"; };

常用配置项:

  • stdout-path:指定默认控制台输出

    • 格式:"别名:波特率数据格式"
  • bootargs:内核命令行参数

    • 可以覆盖内核默认参数
    • 支持动态修改

调试技巧:

# 查看内核解析后的设备树 cat /proc/device-tree/chosen/bootargs # 修改启动参数(需在bootloader中设置) setenv bootargs "console=ttyS0,115200 root=/dev/mmcblk0p2"

5. aliases与节点引用:简化设备访问

aliases节点为常用设备定义简短名称,避免使用冗长的完整路径:

aliases { serial0 = &uart0; ethernet0 = &eth0; mmc0 = &sdhci0; };

引用节点的三种方式:

  1. 完整路径/soc/serial@11002000
  2. 标签引用&uart0(需先定义uart0: serial@11002000
  3. 别名引用serial0

实际操作示例:

// 通过标签修改节点属性 &uart0 { status = "okay"; }; // 通过别名引用节点 serial0: serial@11002000 { current-speed = <115200>; };

6. 设备树调试实战技巧

当设备树配置出现问题时,可以使用以下工具链进行调试:

调试工具集

工具用途示例
dtc编译/反编译设备树dtc -I dtb -O dts -o dump.dts image.dtb
fdtdump查看dtb内容fdtdump image.dtb
ofdump内核运行时查看cat /proc/device-tree/node/path

常见问题解决方案:

  1. 设备未初始化

    • 检查status是否为"okay"
    • 确认compatible与驱动匹配
  2. 地址冲突

    • 使用reg属性验证地址范围
    • 检查ranges属性是否正确
  3. 中断无法触发

    • 确认中断号与类型
    • 检查中断控制器配置

在最近的一个项目中,我发现UART无法工作,最终通过对比寄存器地址和硬件手册,发现是reg属性中的地址偏移量少了一个零。这种错误设备树编译器不会报错,但会导致驱动初始化失败。

http://www.jsqmd.com/news/660913/

相关文章:

  • 5个核心功能解析:如何用ComfyUI-Crystools提升AI绘画工作流效率
  • STM32以太网DMA描述符实战:从初始化到数据发送的完整流程解析
  • 打开vscode总是提示未找到python的解决办法(打开终端却能找到)
  • 别再混淆了!用open62541实战讲解OPC UA数据类型与变量类型的区别(附完整代码)
  • SITS2026真实产线复盘:如何用AI云原生生成92%可上线代码,却在CI/CD卡点超47小时?
  • 深聊优质的电力运维团队,电力运维按需定制服务靠谱吗 - mypinpai
  • 【应用场景】OpenClaw玩转迅雷下载
  • G-Helper:重新定义华硕笔记本性能管理的开源轻量级解决方案
  • ESP32 SPI实战避坑:从零配置W25Q128 Flash存储,解决DMA内存对齐那些坑
  • 用Python和akshare搞定三大交易所期权数据:从深交所、上交所到中金所的完整爬虫实战
  • 从NSL-KDD到CIC-IDS2017:五大主流入侵检测数据集实战评测与避坑指南
  • ABAQUS参数反演实战:如何用Matlab遗传算法调用Python脚本优化材料参数?
  • 解惑单位食堂承包公司怎么选,这些有实力的企业供你参考 - 工业设备
  • 告别编译噩梦:OpenHarmony rk3568项目内核构建的三种“保底”调试大法
  • 从零到一:基于PyTorch的WDCNN轴承故障诊断实战复现
  • 深聊高校食堂承包公司,选哪家更靠谱 - myqiye
  • 号易平台佣金怎么算? 秒返与次月返模式详解及收益模拟 - 号易官方邀请码666666
  • 如何保持持续学习的能力?
  • 松下焊接机器人保护气WGFACS节气阀
  • 告别卡顿!用Python-can库智能精简汽车BLF日志文件(附GUI界面源码)
  • 开源免费:Speech Seaco Paraformer语音识别模型完整使用手册
  • 【Dify实战】Provider接入开发全流程解析:从零到生产部署
  • 别再傻傻分不清了!一文搞懂激光雷达里的‘零差’和‘外差’探测(附FMCW/PSK对比)
  • [技术架构解析] UNETR:当Transformer编码器遇见3D医学图像分割
  • 【车辆控制】基于DMPC算法实现异构车辆队列实施分布式模型预测控制附Matlab代码
  • 给你的Python脚本加个‘蓝奏云助手’:封装成可复用的类库教程
  • 从Redis到Netty:手把手拆解主从Reactor多线程模型,看高性能框架如何选型
  • PL2303老芯片驱动完整指南:快速解决Windows 10/11兼容性问题
  • Windows USB驱动安装难题:libwdi如何让你告别“黄色感叹号“
  • Unlock Music:3分钟解锁加密音乐,让付费歌曲真正属于你