如何为可编程逻辑IP自定义添加或修改设备树

描述

本文作者: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 中:/recipes-bsp/device-tree/files/*.dtsi

独立设备树仓库:从以下位置克隆: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 更改存储器节点。

存储器配置设备树:

方法 :在 /project-spec/meta-user/recipes-bsp/devcie-tree/files/system-user.dtsi 中添加以下内容:

处理器

 

处理器

 

处理器

 

处理器

从 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

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分