使用 Lopper 从系统设备树生成设备树二进制对象

本文作者:AMD 工程师 Stephenm

本文将讨论如何使用 Lopper 实用工具为目标处理器生成 DTB。

Lopper 概述

Lopper 是一个基于 Python 的框架,用于从系统设备树中抽取系统元数据,例如,处理器地址映射上的处理器和 IP。

目前,Lopper 框架 API 不会通过 AMD Vitis™ 统一软件平台直接向用户公开。相反,Vitis Python API(例如平台、域、系统工程和应用组件创建)使用底层 Lopper 框架 API。Lopper 框架还用于生成 xparameters.h、连接器脚本以及驱动程序和库初始化文件。

Lopper 还可用于从系统设备树 (SDT) 中为目标处理器“剪裁”设备树二进制对象 (DTB)。

系统设备树 (SDT) 概述

系统设备树 (SDT) 是 AMD Vitis Unified 流程中新引入的概念。原先在 Vitis 传统流程中,硬件元数据是根据 Vitis 工具的要求通过“特殊处理”方式使用 HSI API 从 XSA 直接抽取的,例如,抽取处理器用于创建平台或者抽取 IP 用于创建 BSP。

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

所有组件都派生自 SDT,例如平台、应用、域等。SDT 也将用于创建面向处理器的设备树。它还用于派生系统级元数据,例如地址映射中的 IP 和处理器。

SDT 在 Vitis Unified 中用于描述硬件元数据,但它也可用于为目标处理器“剪裁”DTB。

生成 SDT

SDT 是使用 SDTgen 生成的,它是来自 XSCT 的基于 Tcl 的实用工具:

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 只包含 AMD Vivado™ 设计套件 IP integrator 块设计 (BD) 中 IP 的硬件元数据。

但是,如果想生成能够在 Linux 或 U-Boot 中工作的 DTB,则需要传递 PHY 的板级 DT 节点和 I2C 器件。在 SDTgen 中可以查看开发板列表 :

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 获取处理器

要从 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
从 Lopper 为 Cortex A72 # 0 生成 DTB

从 Lopper 为 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

为分段流程生成 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