尝试为 Versal 目标启用 FPGA 管理器时,使用 2023.2 版本工具编译 PetaLinux 映像时,编译设备树时崩溃。
我目前正在将我的设计之一从 ZynqMP 架构(载板 KR260 上的 SOM K26)更新为 Versal 架构(VPK120 评估板)。初始设计的软件堆栈是 Canonical Ubuntu 和 Petalinux,并使用 xmutil 包装器来加载比特流和设备树覆盖。
与 PS 的交互主要通过 dma_proxy 驱动程序在 AXI Lite 和 AXI DMA 中进行。据我从参考指南(UG1144)和Versal分段配置流程中了解到的最好信息,我想将 dfx_dtg_versal_full 配置用于具有 PDI 和加载设备树覆盖的程序。
因此,我使用以下命令添加了应用程序(其中 pl-custom.dtsi 是 dma_proxy 驱动程序节点)以及从 bsp 创建的项目:
petalinux-create -t apps --template dfx_dtg_versal_full -n myplapp --enable --srcuri "../myplapp.xsa ../pl-custom.dtsi"
构建项目时会出现以下注释和警告:
INFO: Creating dfx_dtg_versal_full template apps required FPGA Manager to be enabled in petalinux-config
WARNING: myplapp-1.0-r0 do_configure: Using fpgamanager_base.bbclass requires fpga-overlay MACHINE_FEATURE to be enabled
因此,这两条消息都意味着在
petalinux-config
中启用 FPGA 管理器,但此配置会导致在使用以下日志编译设备树时构建崩溃。
NOTE: Executing Tasks
ERROR: device-tree-xilinx-v2023.2+gitAUTOINC+1a5881d004-r0 do_compile: Error executing a python function in exec_func_python() autogenerated:
The stack trace of python calls that resulted in this exception/failure was:
File: 'exec_func_python() autogenerated', lineno: 2, function: <module>
0001:
*** 0002:devicetree_do_compile(d)
0003:
File: '/home/ubuntu/sandbox/vpk120-plinux/components/yocto/layers/poky/meta/classes-recipe/devicetree.bbclass', lineno: 137, function: devicetree_do_compile
0133: if not(os.path.isfile(dtspath)) or not(dts.endswith(".dts") or devicetree_source_is_overlay(dtspath)):
0134: continue # skip non-.dts files and non-overlay files
0135: except:
0136: continue # skip if can't determine if overlay
*** 0137: devicetree_compile(dtspath, includes, d)
0138:}
0139:
0140:devicetree_do_install() {
0141: for DTB_FILE in `ls *.dtb *.dtbo`; do
File: '/home/ubuntu/sandbox/vpk120-plinux/components/yocto/layers/poky/meta/classes-recipe/devicetree.bbclass', lineno: 125, function: devicetree_compile
0121: dtcargs += ["-i", i]
0122: dtcargs += ["-o", "{0}.{1}".format(dtname, "dtbo" if isoverlay else "dtb")]
0123: dtcargs += ["-I", "dts", "-O", "dtb", "{0}.pp".format(dts)]
0124: bb.note("Running {0}".format(" ".join(dtcargs)))
*** 0125: subprocess.run(dtcargs, check = True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
0126:
0127:python devicetree_do_compile() {
0128: includes = expand_includes("DT_INCLUDE", d)
0129: listpath = d.getVar("DT_FILES_PATH")
File: '/tools/Xilinx/PetaLinux/2023.2/components/yocto/buildtools/sysroots/x86_64-petalinux-linux/usr/lib/python3.10/subprocess.py', lineno: 524, function: run
0520: # We don't call process.wait() as .__exit__ does that for us.
0521: raise
0522: retcode = process.poll()
0523: if check and retcode:
*** 0524: raise CalledProcessError(retcode, process.args,
0525: output=stdout, stderr=stderr)
0526: return CompletedProcess(process.args, retcode, stdout, stderr)
0527:
0528:
Exception: subprocess.CalledProcessError: Command '['dtc', '-@', '-@', '-p', '0', '-@', '-H', 'epapr', '-i', '/home/ubuntu/sandbox/vpk120-plinux/build/tmp/work/xilinx_vpk120-xilinx-linux/device-tree/xilinx-v2023.2+gitAUTOINC+1a5881d004-r0/git/device_tree/data/kernel_dtsi/2023.2/BOARD/', '-i', '/home/ubuntu/sandbox/vpk120-plinux/components/plnx_workspace/device-tree/device-tree', '-i', '/home/ubuntu/sandbox/vpk120-plinux/build/tmp/work/xilinx_vpk120-xilinx-linux/device-tree/xilinx-v2023.2+gitAUTOINC+1a5881d004-r0/git/device_tree/data/kernel_dtsi/2023.2/include/', '-i', '/home/ubuntu/sandbox/vpk120-plinux/build/tmp/work/xilinx_vpk120-xilinx-linux/device-tree/xilinx-v2023.2+gitAUTOINC+1a5881d004-r0', '-o', 'pl.dtbo', '-I', 'dts', '-O', 'dtb', 'pl.dtsi.pp']' returned non-zero exit status 1.
Subprocess output:
Error: /home/ubuntu/sandbox/vpk120-plinux/components/plnx_workspace/device-tree/device-tree/pl.dtsi:9.10-10.1 syntax error
FATAL ERROR: Unable to parse input tree
ERROR: Logfile of failure stored in: /home/ubuntu/sandbox/vpk120-plinux/build/tmp/work/xilinx_vpk120-xilinx-linux/device-tree/xilinx-v2023.2+gitAUTOINC+1a5881d004-r0/temp/log.do_compile.656445
ERROR: Task (/home/ubuntu/sandbox/vpk120-plinux/components/yocto/layers/meta-xilinx/meta-xilinx-core/recipes-bsp/device-tree/device-tree.bb:do_compile) failed with exit code '1'
NOTE: Tasks Summary: Attempted 10501 tasks of which 10463 didn't need to be rerun and 1 failed.
我尝试在 DTG 设置中启用设备树覆盖,并检查内核中是否启用了设备树覆盖支持,但同样的错误不断发生。我很快尝试了2022.2版本的工具,编译设备树时也崩溃了。
无法解析的设备树文件是仅包含的组件中自动生成的pl.dtsi
/dts-v1/;
/plugin/;
如果我尝试手动在 pl.dtsi 中添加 fpga 覆盖的节点,我可以使编译工作,但如果我在 '''project-spec/meta-user/recipes-bsp/device 中添加节点,它就不起作用-tree/files/system-user.dtsi''' 也不是 '''project-spec/decoupling-dtsi/system-user.dtsi'''
fragment@0 {
target = <&fpga>;
__overlay__ {
#address-cells = <2>;
#size-cells = <2>;
firmware-name = "system.pdi";
};
};
我对设备树和最近的通用架构的了解相当初级,所以我认为我遗漏了一些东西,但我无法从错误日志中找出什么。 我将尝试不同的参数来创建应用程序,因为出现错误(警告:myplapp-1.0-r0 do_install:A xsa 不包含 PL IP,因此不需要 /lib/firmware/xilinx/myplapp/myplapp.dtbo)但我怀疑它能否解决问题。
有人知道如何解决这个问题吗?
如果你有一个不经常改变的固定字符串,那么使用 string 是合适的。如果您需要执行许多涉及修改字符串的操作,尤其是在循环或复杂算法中,那么使用 StringBuilder 会更高效。