FDT(Flattened Device Tree)工具详解:fdtdump, fdtget, fdtput, fdtoverlay

🔥作者简介: 一个平凡而乐于分享的小比特,中南民族大学通信工程专业研究生,研究方向无线联邦学习

🎬擅长领域:驱动开发,嵌入式软件开发,BSP开发

❄️作者主页:一个平凡而乐于分享的小比特的个人主页

✨收录专栏:Linux,本专栏目的在于,记录学习Linux操作系统的总结

欢迎大家点赞 👍 收藏 ⭐ 加关注哦!💖💖

FDT(Flattened Device Tree)工具详解:fdtdump, fdtget, fdtput, fdtoverlay

概述

FDT(Flattened Device Tree) 是描述硬件配置的数据结构,广泛应用于嵌入式Linux系统。这些工具用于操作和调试设备树文件(.dtb/.dts)。

工具对比总览

工具名称 主要功能 输入格式 输出格式 使用场景
fdtdump 设备树反汇编和查看 .dtb(二进制) 可读文本/DTS格式 调试、分析设备树内容
fdtget 读取设备树属性值 .dtb(二进制) 属性值文本 脚本中提取硬件配置信息
fdtput 修改/添加设备树属性 .dtb(二进制) 修改后的.dtb 临时修改硬件配置
fdtoverlay 应用设备树叠加层 .dtb + .dtbo 合并后的.dtb 动态扩展硬件配置

一、fdtdump - 设备树反汇编工具

功能描述

将二进制设备树(.dtb)转换为可读的文本格式,类似"反编译"过程。

使用示例

bash 复制代码
# 基本用法
fdtdump my-device.dtb

# 输出到文件
fdtdump -o output.dts my-device.dtb

# 显示详细信息
fdtdump -s my-device.dtb  # 显示所有字符串

使用场景

硬件调试场景

当你收到一个预编译的设备树文件,需要了解其具体配置时:

  1. 检查GPIO引脚分配
  2. 查看内存映射
  3. 分析外设配置

二进制DTB文件
fdtdump工具
输出选项
标准输出

可读文本
文件输出

DTS格式
人工分析硬件配置
进一步编辑修改

二、fdtget - 读取设备树属性

功能描述

从设备树中提取特定节点的属性值。

基本语法

bash 复制代码
fdtget <dtb文件> <节点路径> <属性名>

使用示例

bash 复制代码
# 读取CPU频率
fdtget my-board.dtb /cpus/cpu@0 clock-frequency

# 读取多个属性
fdtget my-board.dtb /soc/i2c@12340000 status reg

# 以不同格式读取
fdtget -t s my-board.dtb /gpio-keys/button-0 label  # 字符串格式
fdtget -t i my-board.dtb /memory reg  # 十六进制格式

使用场景

自动化脚本场景

bash 复制代码
#!/bin/bash
# 在启动脚本中动态获取配置
MEM_SIZE=$(fdtget /boot/board.dtb /memory reg | awk '{print $2}')
GPIO_PIN=$(fdtget /boot/board.dtb /leds/led-0 gpios | awk '{print $2}')

echo "Memory size: $MEM_SIZE"
echo "LED GPIO pin: $GPIO_PIN"

三、fdtput - 修改设备树属性

功能描述

修改或添加设备树节点的属性值。

基本语法

bash 复制代码
fdtput <dtb文件> <节点路径> <属性名> <值>

使用示例

bash 复制代码
# 修改状态属性(禁用设备)
fdtput my-board.dtb /soc/usb@12350000 status "disabled"

# 添加新属性
fdtput -t s my-board.dtb /chosen bootargs "console=ttyS0,115200"

# 设置数组类型的属性
fdtput -t i my-board.dtb /gpio-keys/button-0 gpios 0 10 0

使用场景

快速原型开发
原始DTB
需要临时修改
修改GPIO配置
禁用故障外设
调整启动参数
fdtput修改
新DTB文件
重启测试

四、fdtoverlay - 设备树叠加工具

功能描述

将设备树叠加层(.dtbo)应用到基础设备树上,实现硬件配置的动态扩展。

基本语法

bash 复制代码
# 应用叠加层
fdtoverlay -i base.dtb -o merged.dtb overlay1.dtbo overlay2.dtbo

# 列出叠加层信息
fdtoverlay -l merged.dtb

使用示例

bash 复制代码
# 应用单个叠加层
fdtoverlay -i base.dtb -o final.dtb spi-overlay.dtbo

# 应用多个叠加层
fdtoverlay -i base.dtb -o final.dtb \
    i2c-sensor.dtbo \
    lcd-display.dtbo \
    gpio-expander.dtbo

# 从合并的DTB中提取信息
fdtoverlay -l final.dtb

使用场景

模块化硬件配置
可选硬件模块
摄像头模块.dtbo
触摸屏.dtbo
传感器.dtbo
通信模块.dtbo
基础硬件配置
CPU核心配置
内存映射
基本外设
基础DTB
根据需求选择
应用摄像头+传感器
应用触摸屏+通信
fdtoverlay合并
最终DTB
启动对应硬件配置

综合对比示例

场景:调试I2C设备问题

bash 复制代码
# 1. 首先查看完整设备树结构
fdtdump -o current.dts /boot/current.dtb

# 2. 读取当前I2C配置
fdtget /boot/current.dtb /soc/i2c@12340000 clock-frequency
# 输出: 100000

# 3. 发现时钟频率太低,需要提高
fdtput /boot/test.dtb /soc/i2c@12340000 clock-frequency 400000

# 4. 需要添加新的I2C设备(通过叠加层)
cat > new-sensor.dts <<EOF
/dts-v1/;
/plugin/;

&i2c1 {
    new_sensor: sensor@48 {
        compatible = "acme,xyz-sensor";
        reg = <0x48>;
        status = "okay";
    };
};
EOF

# 编译叠加层
dtc -O dtb -o new-sensor.dtbo new-sensor.dts

# 5. 应用到设备树
fdtoverlay -i test.dtb -o final.dtb new-sensor.dtbo

工具工作流程总图

应用场景
输出结果
调试分析流程
设备树开发流程
dtc编译
DTS源文件
二进制DTB
选择合适工具
fdtdump

全面查看
fdtget

读取属性
fdtput

修改属性
fdtoverlay

应用叠加
文本/DTS格式
属性值
修改后DTB
合并后DTB
硬件分析报告
配置提取脚本
临时修改测试
模块化配置

实用技巧和注意事项

1. 工具依赖关系

bash 复制代码
# 在Ubuntu/Debian上安装
sudo apt-get install device-tree-compiler

# 在Buildroot中启用
# 需要选择 BR2_PACKAGE_DTC=y

2. 常用选项总结

选项 fdtdump fdtget fdtput fdtoverlay
输入文件 -i 必需参数 必需参数 -i
输出文件 -o stdout 原文件修改 -o
类型指定 -t -t -t -
调试信息 -d - - -v

3. 实际应用示例:Raspberry Pi配置

bash 复制代码
# 查看树莓派当前配置
fdtdump /boot/bcm2710-rpi-3-b-plus.dtb | grep -A5 "uart1"

# 读取GPIO配置
fdtget /boot/bcm2710-rpi-3-b-plus.dtb /soc/gpio@7e200000 \
    brcm,pins

# 启用SPI接口(通过叠加层)
sudo cp /boot/overlays/spi1-1cs.dtbo /boot/overlays/spi1-2cs.dtbo
echo "dtparam=spi=on" >> /boot/config.txt
echo "dtoverlay=spi1-2cs" >> /boot/config.txt

总结

这些FDT工具形成了一个完整的设备树操作生态系统:

  • fdtdump:用于"查看"和"分析"
  • fdtget/fdtput:用于"读取"和"修改"
  • fdtoverlay:用于"扩展"和"组合"

掌握这些工具可以让你:

  1. 深入理解嵌入式系统的硬件配置
  2. 快速调试硬件相关问题
  3. 灵活调整系统配置而无需重新编译内核
  4. 实现硬件配置的模块化管理

记住这些工具的操作对象主要是二进制DTB文件,而DTS文件是文本源文件,需要通过dtc工具在两者之间转换。

相关推荐
京雨1 年前
Qemu 加载你指定的 initrd、dtb 到哪里?
qemu·riscv64·fdt·initrd