找回密码
立即注册
搜索
热搜: Java Python Linux Go
发回帖 发新帖

3207

积分

0

好友

414

主题
发表于 2026-2-11 11:26:00 | 查看: 37| 回复: 0

系统设备树技术概念示意图

在基于 AMD Zynq 或 Versal 等平台进行嵌入式开发时,为目标处理器生成正确的设备树二进制对象 (DTB) 是启动 Linux 等操作系统的关键一步。本文将带你了解如何利用 Lopper 这一实用工具,从系统级的设备树描述中,精确裁剪出适用于特定处理器的 DTB 文件。

Lopper 是什么?

Lopper 是一个基于 Python 的框架,它的核心功能是从系统设备树 (System Device Tree, SDT) 中抽取系统元数据,比如处理器和 IP 在地址映射中的信息。

目前,Lopper 框架的 API 并未通过 AMD Vitis™ 统一软件平台直接向用户开放。相反,Vitis 的 Python API(例如平台、域、系统工程和应用组件的创建)在底层调用了 Lopper 框架的 API。此外,Lopper 框架还负责生成 xparameters.h、连接器脚本以及驱动和库的初始化文件。

除了上述用途,Lopper 的一个重要功能正是我们本文关注的:从系统设备树中,为目标处理器“裁剪”出专用的设备树二进制对象 (DTB)。这就像是为一套完整的硬件“图纸”(SDT)中,专门复印出某个处理器核心所需要的那一部分“安装说明书”(DTB)。

理解系统设备树 (SDT)

系统设备树是 AMD Vitis Unified 开发流程中引入的一个新概念。在传统的 Vitis 流程中,硬件元数据是根据工具需求,通过“特殊处理”的方式,使用 HSI API 直接从 XSA 文件中抽取的。

而在 Vitis Unified 流程中,我们在生成平台时会创建 SDT,并通过 Lopper 工具将硬件元数据提供给 Vitis。这类似于 Linux 中使用的设备树概念,但顾名思义,SDT 是一个系统级的设备树,它包含了所有 CPU 集群(及其各自的地址映射)和系统级存储器。而一个典型的 Linux 设备树,则专用于某个特定目标处理器(例如 Cortex A53 #0)的地址映射。

在开发流程中,所有组件(如平台、应用、域等)都派生自 SDT。SDT 也用于创建面向处理器的设备树,并派生系统级元数据,如地址映射中的 IP 和处理器信息。

如何生成系统设备树 (SDT)?

SDT 由名为 SDTgen 的工具生成,这是一个基于 Tcl 的实用工具,可通过 XSCT 调用:

sdtgen set_dt_param -dir sdt_out -xsa design_1_wrapper.xsa -board_dts versal-vck190-rev1.1
sdtgen generate_sdt

注意,我们通过 -board_dts 选项传递了 VCK190 评估板的 .dtsi 文件。这是因为 XSA 文件仅包含 Vivado™ IP Integrator 块设计中的 IP 硬件元数据。如果你想生成能在 Linux 或 U-Boot 中正常工作的 DTB,就需要额外传递开发板级别的 DT 节点信息,例如 PHY 和 I2C 设备。你可以在 SDTgen 的 GitHub 仓库中查看支持的开发板列表:https://github.com/Xilinx/system-device-tree-xlnx/tree/master/device_tree/data/kernel_dtsi/2024.1/BOARD

执行上述命令后,SDT 文件(一组 .dts.dtsi 文件)将被生成到 sdt_out 目录中。接下来,我们就可以在这个 SDT 上使用 Lopper 来抽取和“裁剪” DTB 了。

使用 Lopper 获取处理器列表

在裁剪 DTB 之前,你可能需要先了解 SDT 中包含哪些处理器。运行以下命令可以获取处理器列表:

source lopper_settings.sh
export LOPPER_DTC_FLAGS="-b 0 -@"
lopper -f -i ./lopper/lopper/lops/lop-cpulist.dts ./sdt_out/system-top.dts

为特定处理器生成 DTB

假设我们要为 SDT 中的 Cortex A72 #0 处理器生成 DTB,可以使用以下命令:

lopper -f --enhanced -i ./lopper/lopper/lops/lop-a72-imux.dts ./sdt_out/system-top.dts system.dtb -- gen_domain_dts psv_cortexa72_0 linux_dt

这条命令指示 Lopper 使用特定的操作(lop-a72-imux.dts),从系统级设备树(system-top.dts)中,为 ID 为 psv_cortexa72_0 的处理器域,生成适用于 Linux 的设备树,并输出为 system.dtb 文件。

为分段流程生成 DTB 和 PL DTBO

在某些更复杂的场景,例如需要动态加载 FPGA 比特流时,可能会采用分段流程。这时,生成 DTB 和 PL(可编程逻辑)设备树覆盖对象 (DTBO) 的命令如下:

lopper -f --enhanced ./sdt_out/system-top.dts ./sdt_out/system.dts -- xlnx_overlay_dt cortexa72-versal full; \
lopper -f --enhanced -O . -i ./lopper/lopper/lops/lop-a72-imux.dts ./sdt_out/system.dts ./sdt_out/system.dtb -- gen_domain_dts psv_cortexa72_0 linux_dt; \
dtc -I dts -O dtb -o ./sdt_out/pl.dtbo pl.dtsi

这个流程首先在 SDT 上执行覆盖操作,生成一个中间文件(system.dts)。然后,基于这个中间文件,再次使用 Lopper 为目标处理器生成最终的 DTB。最后,使用设备树编译器 (DTC) 将描述 PL 部分的 .dtsi 文件编译成 .dtbo 覆盖文件。

总结与思考

通过以上步骤,我们可以看到 Lopper 在 AMD Vitis Unified 流程中扮演着承上启下的关键角色。它将硬件描述(SDT)转换为软件可用的配置信息(DTB),是连接硬件设计与嵌入式软件开发的重要桥梁。理解 Lopper 的工作原理和使用方法,能帮助开发者更精准地控制启动环境,尤其是在多处理器、异构计算的复杂 FPGA 平台上。

设备树的生成与裁剪是嵌入式开发中的一项基础且重要的工作。如果你对 系统设备树 的底层原理、Lopper 的更高级用法,或者在其他嵌入式场景下的应用有更多兴趣,欢迎在 云栈社区 与我们继续交流探讨。




上一篇:Anthropic 2026趋势解读:智能体编程如何重构软件工程与团队协作
下一篇:如何通过OpenFeign RequestInterceptor实现请求增强与日志记录?
您需要登录后才可以回帖 登录 | 立即注册

手机版|小黑屋|网站地图|云栈社区 ( 苏ICP备2022046150号-2 )

GMT+8, 2026-2-23 11:42 , Processed in 0.669422 second(s), 38 queries , Gzip On.

Powered by Discuz! X3.5

© 2025-2026 云栈社区.

快速回复 返回顶部 返回列表