🔥作者简介: 一个平凡而乐于分享的小比特,中南民族大学通信工程专业研究生,研究方向无线联邦学习
🎬擅长领域:驱动开发,嵌入式软件开发,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 # 显示所有字符串
使用场景
硬件调试场景 :
当你收到一个预编译的设备树文件,需要了解其具体配置时:
- 检查GPIO引脚分配
- 查看内存映射
- 分析外设配置
二进制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:用于"扩展"和"组合"
掌握这些工具可以让你:
- 深入理解嵌入式系统的硬件配置
- 快速调试硬件相关问题
- 灵活调整系统配置而无需重新编译内核
- 实现硬件配置的模块化管理
记住这些工具的操作对象主要是二进制DTB文件,而DTS文件是文本源文件,需要通过dtc工具在两者之间转换。