如何为ADRV9009 + ZCU102构建自定义PetaLinux映像
扫描二维码
随时随地手机看文章
这一切都开始于一个“简单”的HDL调整-你知道,只是添加一个小的自定义IP和一个额外的DMA。Vivado很高兴,比特流产生了,ZCU102的灯像迪斯科舞厅一样闪烁。接下来是真正的boss大战:让Linux启动。
Petalinux非常引人注目,它抛出了警告、依赖性发脾气和“设备树不匹配”,这可能会让任何工程师质疑他们的生活选择。
如果您对这个故事感到熟悉,那么恭喜您,您已经进入了adi公司ADRV9009平台定制工程师精英俱乐部。
本教程是您的健康路线图:我们将使用Vivado和Petalinux 2024.2重新构建ADRV9009 + ZCU102的Linux映像,为您的自定义HDL设计完美调整-没有隐藏脚本,没有黑魔法,只是干净,可重复的步骤。
2. 概述:我们正在构建的内容
那么,任务是什么?我们不是在这里从头开始编写内核或召唤Linux之神-我们只是想要一个稳定的,可引导的Petalinux映像,它可以与基于Analog Devices的ADRV9009 + ZCU102参考设计的自定义HDL设计无缝协作。
Ob jective
重建一个Linux镜像(BOOT.BIN + image. zip)。b)与您修改的HDL项目兼容,其中包括:
ADRV9009收发链
•自定义IP块(AXI流接口)
•一个额外的ADI DMA IP (AXI内存映射接口)
•Zynq UltraScale+ MPSoC (ZCU102)
最后,你会得到:
•在硬件上运行Linux的可引导SD卡
•为RF前端正确加载IIO驱动程序
To ols & Environment
专业提示:始终匹配您的Vivado和Petalinux版本-混合工具链就像跨线程BNC连接器:它可能适合,但您稍后会后悔。
最终目标
在本教程结束时,您将拥有一个经过验证的Linux映像:
•成功启动您的定制HDL设计
•识别ADRV9009, SPI, IIO和DMA设备
•启用调试、流和用户空间测试
3. 先决条件
在继续之前,确保只准备好这两件事:
•已安装Petalinux 2024.2并获取其环境源
•自定义HDL硬件(.xsa)文件(带比特流)从Vivado导出
就是这样,您已经为构建做好了准备。
4. 搭建环境
用你的。xsa准备好了,Petalinux也安装好了,现在是准备构建工作区的时候了。
创建工作目录
首先,让我们创建一个父文件夹,这个文件夹将包含所有的图像构建材料和克隆的元图层文件夹,然后移动到这个文件夹。
Petalinux环境的源代码
现在将petalinux工具链源到petalinux安装目录下的这个文件夹中,特别是settings.sh文件。
克隆所需存储库
现在通过模拟设备将meta-adi yocto层克隆到父文件夹
创建一个新的Petalinux项目
现在在父文件夹中创建一个petalinux项目
5. 使用自定义硬件构建Linux映像
现在让我们开始建造吧,我假设你。从您的vivado成功构建Xsa文件。
提示:确保指向包含。Xsa文件-不是。Xsa文件本身。否则,您将遇到AMD Xilinx更新的Petalinux构建工作流中引入的SDT错误。
在我的例子中命令是这样的:
这将打开Petalinux System Configuration GUI,如图5所示。导航到Yocto设置→用户层→用户层0(新),并输入克隆存储库的路径:
. . / meta-adi / meta-adi-xilinx
然后Save and Exit应用更改。完整的流程如下图所示。
提示一:
大多数设置都是根据XSA中指定的硬件设计细节自动配置的。我发现自己在大多数PetaLinux项目中更新的主要硬件配置设置位于Image Packaging configuration选项卡下。这是配置根文件系统类型和相关引导设置的地方。特别是对于基于zynqmp的设计,我的根文件系统位于SD卡上。我还希望它是持久的(即-它保持电力循环之间的变化)。因此,在根文件系统类型下,将其更改为EXT4 (SD/eMMC/SATA/USB)。
图11显示了保存并退出后应该看到的日志。
(b)到目前为止,我们已经成功添加了meta-adi-xilinx Yocto用户层。现在,我们需要通过将内核指向正确的设备树配置来更新默认设备树配置。dts文件。您可以使用以下命令直接从终端执行此操作:
echo "KERNEL_DTB=\"${dts_to_use}\"" >> project-spec/meta-user/conf/petalinuxbsp.conf .
这确保了Petalinux构建使用ADRV9009 + ZCU102设计的预期设备树blob (DTB)。
在这个例子中,对于adi公司的ADRV9009 + ZCU102参考设计,我使用的设备树文件是:
zynqmp-zcu102-rev10-adrv9009-jesd204-fsm
注意:请确保不包含任何文件扩展名(如。dts或。Dtb)在名称的末尾-只有基本文件名。
下图显示了在我的设置中使用的确切终端命令。
重要提示:运行命令后,打开project-spec/meta-user/conf/petalinuxbsp.conf文件,检查是否正确添加了完整的设备树名称。有时名称的某些部分可能会被截断,这可能导致在构建过程中出现无尽的“未找到文件”错误-因此值得仔细检查!
(c)“有趣”部分-自定义设备树修改
好了,现在是这个过程中最“令人愉快”的部分——编辑设备树。
首先,我们有意地让第一个构建失败(是的,是有意的)。这将生成pl.dtsi文件——Petalinux基于.xsa创建的自动生成的设备树。
现在,这里有一个问题:虽然AMD/Xilinx在处理自己的ip方面做得很好,但其他方面……我们只能说Petalinux对第三方区块的猜测充其量是乐观的。
换句话说,您通常会为您的ADI ip得到一个可爱的垃圾节点集合。
为了解决这个问题,Analog Devices采取了干净的路线——他们删除了petalinux为ADI ip生成的节点,并用正确的参数覆盖他们自己的设备树。
我们将遵循同样的理念:
•检查Petalinux生成了哪些节点。
•使用清理文件删除不正确的。
在system-user中添加正确的ADI设备树节点。Dtsi文件-位于其他所有文件之上的文件。
因为没有什么比删除您的工具刚刚自豪地构建的一半更能说明“定制嵌入式Linux”了。
在项目目录中导航到构建文件夹并键入
从现在开始,喝一大杯(或三杯)咖啡——这部分将是一场马拉松。错误会像打地鼠一样弹出,但不要担心—我们将一个接一个地查找它们,直到Petalinux最终挥动白旗并构建。错误1:License Checksum Mismatch
jsd -status-dev-r0 do_populate_lic: QA问题:jsd -status: LIC_FILES_CHKSUM不匹配file://license .txt;md5 = 38 c01601d5c4b84986a8f48ece946aa1
jed -status:新的md5校验和为982e522e7ec5a0beed8de5114ebfea50
啊,是的——经典的LIC_FILES_CHKSUM不匹配。这通常发生在包中的许可文本被更新,但配方仍然引用旧的校验和时。
修复:只需复制错误日志中显示的新MD5校验和,并替换导致问题的配方文件中的旧校验和。
在我的例子中,错误指向:
meta-adi / meta-adi-xilinx recipes-support / jesd-status / jesd-status_dev.b
于是,我打开了。并将旧的MD5替换为新的MD5:
LIC_FILES_CHKSUM = "file://LICENSE.txt;md5 = 982 e522e7ec5a0beed8de5114ebfea50”
对于显示相同问题的任何其他包重复此操作。这是一个无害的“欢迎来到Yocto”时刻——乏味,但却是入会仪式的一部分。此外,不要取消构建,即使它正在继续执行一些其他任务
错误2:取回错误
错误:linux-xlnx-6.6.40-adi-v2025.1+git-r0 do_fetch: Fetcher失败:
获取命令export PSEUDO_DISABLED=1;出口SSL_CERT_DIR =…
这是典型的“获取失败”——基本上是Petalinux在说“我无法连接互联网,请修复你的Wi-Fi”。
修复:只要确保你有一个稳定的互联网连接,然后重新运行构建:
petalinux-build
十有八九,这个错误会在连接正常的那一刻消失——不需要深入调试。
错误3:内核版本完整性检查失败
错误:linux-xlnx-6.6.40- di-v2025.1+git-r0 do_kernel_version_sanity_check:
包版本(6.6.40-adi-v2025.1+git)与正在构建的内核(6.12)不匹配。
请更新PV变量以匹配内核源或集
你的配方中的KERNEL_VERSION_SANITY_SKIP="1"。
啊,臭名昭著的内核版本不匹配——Petalinux用这种方式提醒我们,它希望所有东西都完美匹配(即使它无关紧要)。
解决办法:这个是无害的。构建环境中的内核版本与配方中指定的内核版本不一致。要使警告静音(并保持完整),只需将这一行添加到Linux配方文件中:
Kernel_version_sanity_skip = “1”
您将在错误日志的最后一行找到正确的配方位置,例如:
meta-xilinx / meta-xilinx-core recipes-kernel / linux / linux-xlnx_6.6.40-v2024.2.bb
编辑完成后,保存文件并重新构建:
petalinux-build
Petalinux将高兴地停止抱怨版本不匹配——因为有时候,无知是福。
(d)修改设备树
最后——构建失败。好消息:这正是我们想要的。为什么?因为此故障生成pl.dtsi文件—从.xsa派生的自动生成的设备树。
在我定制的ADRV9009 + ZCU102参考设计中,我添加了:
基于轴流的DSP IP
ADI axis - dma控制器IP(内存映射)。
当Petalinux创建设备树时,新的DMA绑定到一个名为misc_clk_0的时钟。但是ADI的Yocto层包含一个清除机制,可以删除许多自动生成的节点——包括这个时钟。结果:构建失败。(图12显示了“misc_clk_0 not found”错误。)
目标是什么?
我们将遵循ADI的清理流程,使我们的自定义硬件运行良好:
生成pl.dtsi(通过失败的构建完成)。
识别其中的自定义IP节点。
通过ADI的pl-delete文件显式删除这些节点。
在system-user.dtsi中添加这些节点的正确的手写版本。
步骤1 -识别自定义节点
导航到:
组件/ plnx_workspace /设备树/设备树
打开pl.dtsi并查找属于自定义ip的节点。就我而言:
axi_dmac_0: axi_dmac@80000000 {
clock-names = "m_dest_axi_aclk", "s_axi_aclk", "s_axis_aclk";
clocks = <&zynqmp_clk 72>, <&zynqmp_clk 71>, <&misc_clk_0>;
compatible = "xlnx,axi-dmac-1.0";
reg = <0x0 0x80000000 0x0 0x10000>;
};
这是我们自动生成的节点,我们将很快用一个干净的节点替换它。
步骤2 -添加节点到ADI的删除列表
进入ADI层:
meta-adi / meta-adi-xilinx / recipes-bsp /设备树/文件/打开:
pl-delete-nodes-zynqmp-zcu102-rev10-adrv9009-jesd204-fsm.dtsi
在顶部,你会看到包含如下内容:
/ include /“pl-delete-nodes-zynqmp-zcu102-hdl-adrv9009.dtsi”
第二个文件实际上包含删除命令。pl-delete-nodes-zynqmp-zcu102-hdl-adrv9009开放。Dtsi并添加节点的删除行:
/ delete-node / &axi_dmac_0;
为什么:这告诉Petalinux在构建期间从pl.dtsi中删除自动生成的DMA节点。稍后,我们将在system-user.dtsi中重新添加一个正确定义的版本。
(图13显示了修改后的删除节点文件。)
步骤3—在system-user.dtsi中添加Clean Node
现在编辑:
说明/ meta-user / recipes-bsp /设备树/文件/ system-user.dtsi
将新的DMA节点附加到其余内容下面:
/include/ "system-conf.dtsi"
/ {
};
&fpga_axi {
pdm_dmac: dma-controller@8000000 {
compatible = "adi,axi-dmac-1.00.a";
reg = <0x8000000 0x10000>; // Base address and size
dma-controller;
interrupts-extended = <>;
#dma-cells = <1>;
#clock-cells = <0>;
dma-coherent;
clocks = <&zynqmp_clk 73>;
};
};
提示:此顶级文件覆盖已删除的节点,并在构建时注入干净的定义。这就是ADI层保持模块化的方式——所有自定义的东西都在这里,而不是直接在pl.dtsi中。
最后指出
在pl-delete-nodes中删除…确保ADI的清理不会重新生成错误的自动生成配置。
添加到system-user。dtsi确保Linux完全按照预期看到您的DMA和时钟绑定。
在这之后,cd…从构建文件夹中重新运行构建:
petalinux-build
再抓一个——这次,它会过去的。瞧!构建成功了!
如果一切顺利(并且在此过程中没有意外地删除理智),Petalinux将最终完成构建。
现在,您应该在终端上看到类似于图14的成功消息——这是每个工程师梦寐以求的美好时刻:
“构建成功完成。”
深吸一口气,喝一口遗忘已久的咖啡,向自己点一点头——您刚刚像专业人士一样为ADRV9009 + ZCU102构建了一个自定义Linux映像。
6. 打包引导二进制文件(Boot . bin)
一旦项目成功构建,就该生成引导二进制文件了- boot . bin .该文件结合了ZynqMP设备正确启动所需的基本引导组件。
在我的情况下,我是从SD卡引导ZCU102,所以BOOT.BIN必须至少包括:
•FSBL(第一阶段引导加载程序)
•FPGA位流(.bit)
•U-Boot引导加载程序
所有这些文件都是在Petalinux项目的输出目录中自动生成的:
现在把它们包装在一起,使用:
这个命令在映像目录中创建BOOT.BIN文件,准备放到SD卡上进行引导。
提示:如果您稍后重新构建项目并需要重新生成引导映像,请使用——force标志来覆盖现有文件:
我的屏幕日志如图12所示。
7:包装SD卡镜像
如果从SD卡引导(而不是直接引导到INITRD或INITRAMFS), PetaLinux提供了一个方便的内置实用程序来创建完整的SD卡映像。此工具将所有内容打包到。可以使用诸如balenaEtcher、Rufus或dd等实用程序将图像文件闪入SD卡。
命令概述
PetaLinux使用PetaLinux -package命令和——wic标志来创建这个映像。
在我的设置中(从SD卡启动ZCU102板),在SD卡的启动分区中需要以下文件:
•BOOT.BIN→引导程序二进制文件(FSBL + bitstream + U-Boot)
•image.ub→合并Linux内核和根文件系统映像
•system.dtb→设备树Blob
•boot.scr→U-Boot启动脚本
根文件系统本身(rootfs.tar.gz)放在SD卡的根分区中。
完整命令示例
在PetaLinux项目目录下运行以下命令:
期待什么
•该过程可能需要几分钟才能完成,具体取决于系统的I/O速度。
•生成。镜像通常在6 - 7gb左右,所以确保你至少有一个8gb的SD卡可用。
•一旦完成,。哪个映像将出现在项目的images/linux/目录中。
闪烁SD卡
你现在可以闪光了。在我的案例中,我使用的是balena蚀刻器。
8. 启动板
现在是最有趣的部分了——让您的新构建的Linux系统焕发生机!
•插入SD卡:将SD卡(带有PetaLinux映像)插入主板的SD插槽,如图15所示。
•设置启动方式(ZCU102):对于ZCU102,将启动方式开关(ZCU102为SW6)设置为从SD卡启动:
On | off | off | off
(开关位置见图16)
•为串行控制台连接UART:使用micro-USB电缆将ZCU102上的UART转usb端口连接到主机PC(参见图17)。该连接将允许您查看引导日志并与Linux控制台进行交互。
•安装ADRV9009 FMC卡:将ADRV9009收发板固定在ZCU102上的HPC1 FMC连接器上,如图18所示。
•打开串行终端:启动您最喜欢的串行终端程序- PuTTY, TeraTerm或类似程序。选择合适的端口(在我的例子中是/dev/ttyUSB0)。波特率设置为115200。
一旦所有东西都连接好并通电,您就可以正式启动到您的定制PetaLinux + ADI系统了。坐下来,看着引导日志滚动,享受Linux终于迎接您的甜蜜时刻——祝贺您,您已经从零开始构建了它!
结论
现在,您已经成功地为ADRV9009 + ZCU102平台构建了自定义PetaLinux映像,集成了您自己的基于hdl的硬件设计,并确保了设备树的兼容性。这个过程演示了完整的流程——从准备环境和合并元数据层,到解决构建时问题和在硬件上部署最终映像。
您的设置现在可以在Zynq UltraScale+ SoC上进行更高级别的系统验证、驱动程序集成和应用程序开发。无论您计划扩展功能,执行性能测量,还是集成实时DSP工作负载,这都是进一步开发的坚实基础。
本文编译自hackster.io