本文作者:AMD 工程师 Aravind Babu
本文讨论如何在构建时和运行时为处理器系统 (PS) 的各组成部分或各可编程逻辑 (PL) IP 添加或修改设备树更改,以及如何调试与设备树相关的问题。
1.为现有 PL 节点和自定义 PL 节点修改设备树
1.1 了解设备树结构
AMD Zynq /ZynqMP/Versal 的设备树是使用 PetaLinux 工具从 .xsa 文件自动生成的。其中包括:
SoC 外设:UART、SPI、I2C 等
存储器节点
PL 节点(如果在 .xsa 中存在)
1.2 设备树文件的位置
在 PetaLinux 中:project-spec/meta-user/recipes-bsp/device-tree/files/system-user.dtsi
在 Yocto 中:
独立设备树仓库:从以下位置克隆:https://github.com/Xilinx/device-tree-xlnx
1.3 编辑现有节点示例
要修改 dwc3 节点,只需在 project-spec/meta-user/recipes-bsp/device-tree/files/system-user.dtsi 文件中添加以下节点。

1.4 添加自定义 PL 节点
如果您的 PL 中有自定义 IP 块(例如 axi_gpio_0),其节点可能已经存在于从 .xsa 生成的 pl.dtsi 文件中。
要修改或添加属性:
请勿直接编辑 pl.dtsi;它是从 .xsa 自动生成的。
在 system-user.dtsi 中覆盖 PL 节点:

注释:检查是否在此路径中自动生成该节点。仅限该节点存在时才从 system-user.dtsi 修改或添加节点,以避免构建错误。
要手动添加新的 PL 节点:

如何添加子节点:

注释:在更新之前,检查子节点的现有节点并将其用作参考。
删除设备树节点属性
示例 1:您需要移除以下节点中的 phys:

解决方案:在 system-user.dtsi 中添加以下内容:

在设备树中移除 iic_main 节点。
#pl.dtsi 内容

#system-top.dts 内容

解决方案:在 system-user.dtsi 中添加以下内容
注释:在删除该节点之前,请确保已删除别名和其他引用。

2.在 U-Boot 和 Linux 中读取/写入设备树属性
U-Boot 使用扁平设备树 (FDT)。您可以使用 fdt 命令对其进行操作。
读取属性
fdt addr ${fdtcontroladdr}
(fdt get value
例如:fdt get value val /axi/ethernet@ff0c0000 mac-address
写入属性
fdt set
例如:fdt set /axi/ethernet@ff0c0000 mac-address [00 0a 35 00 01 02]
列出节点
fdt list /
fdt list /axi
使用 FDT 从 U-boot 更改存储器节点。
存储器配置设备树:
方法 :在




从 Linux 读取设备树:
读取属性
cat /proc/device-tree/
例如:cat /proc/device-tree/axi/ethernet@ff0c0000/mac-address
反编译 dtb 用于调试
dtc -I dtb -O dts -o extracted.dts /proc/device-tree
注释:/proc/device-tree 是当前设备树的实时表示法。
3.设备树问题的调试技巧
常见症状
器件节点不执行探测(未绑定任何驱动程序)。
内核 dmesg 显示“OF: no match for compatible.”
/sys/class/、/dev/ 等中未出现器件2。
调试检查表
1. 检查节点中的 status 是否为“okay”。
2. 确保 compatible 字符串与驱动程序的 of_match_table 匹配。
3. 验证 reg、interrupts 和 clocks 的值。
4. 确保节点未被覆盖;后面的 include 可以覆盖先前的定义。
5. 在内核中启用 CONFIG_OF_ 选项。
6. 重新编译 DTS 并更新 DTB。
反编译并检查 DTB
dtc -I dtb -O dts -o out.dts system.dtb
在 Linux 中检查驱动程序绑定
dmesg | grep -i
ls /sys/bus/platform/devices/
4. 通过 HSI 从 XSA 文件调试设备树
hsi 用于从 .xsa 中提取硬件信息,以进行设备树生成/调试。
使用 hsi 查询 PL 地址映射、时钟、外设:
open_hw_design design.xsa
get_cells -hier
report_property [get_cells axi_gpio_0]
有助于确保设备树中地址和时钟信息的准确性。
4.1 基本 HSI 脚本示例
打开 XSA:
open_hw_design
set cpu [get_cells -hier -filter {IP_TYPE == "psu_cortexa53"}]
列出可用外设(列出 IP):
get_cells -hier
获取 IP 属性
get_property IP_NAME [hsi get_cells]
检查 PL IP 的属性
get_property CONFIG.PCW_FPGA0_PERIPHERAL_FREQMHZ [get_os]
4.2 导出设备树

这样会生成:
system.dts
pl.dtsi
pcw.dtsi
4.3 确认设备树绑定
您可以编写 Tcl 脚本来执行以下操作:
交叉检查寄存器地址
检查时钟分配
列出存储器映射
列出状态为“disabled”的 IP
全部0条评论
快来发表一下你的评论吧 !