当前位置:首页 > 工业控制 > 电路设计项目集锦
[导读]这一切都开始于一个“简单”的HDL调整-你知道,只是添加一个小的自定义IP和一个额外的DMA。Vivado很高兴,比特流产生了,ZCU102的灯像迪斯科舞厅一样闪烁。接下来是真正的boss大战:让Linux启动。

这一切都开始于一个“简单”的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

本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

LED驱动电源的输入包括高压工频交流(即市电)、低压直流、高压直流、低压高频交流(如电子变压器的输出)等。

关键字: 驱动电源

在工业自动化蓬勃发展的当下,工业电机作为核心动力设备,其驱动电源的性能直接关系到整个系统的稳定性和可靠性。其中,反电动势抑制与过流保护是驱动电源设计中至关重要的两个环节,集成化方案的设计成为提升电机驱动性能的关键。

关键字: 工业电机 驱动电源

LED 驱动电源作为 LED 照明系统的 “心脏”,其稳定性直接决定了整个照明设备的使用寿命。然而,在实际应用中,LED 驱动电源易损坏的问题却十分常见,不仅增加了维护成本,还影响了用户体验。要解决这一问题,需从设计、生...

关键字: 驱动电源 照明系统 散热

根据LED驱动电源的公式,电感内电流波动大小和电感值成反比,输出纹波和输出电容值成反比。所以加大电感值和输出电容值可以减小纹波。

关键字: LED 设计 驱动电源

电动汽车(EV)作为新能源汽车的重要代表,正逐渐成为全球汽车产业的重要发展方向。电动汽车的核心技术之一是电机驱动控制系统,而绝缘栅双极型晶体管(IGBT)作为电机驱动系统中的关键元件,其性能直接影响到电动汽车的动力性能和...

关键字: 电动汽车 新能源 驱动电源

在现代城市建设中,街道及停车场照明作为基础设施的重要组成部分,其质量和效率直接关系到城市的公共安全、居民生活质量和能源利用效率。随着科技的进步,高亮度白光发光二极管(LED)因其独特的优势逐渐取代传统光源,成为大功率区域...

关键字: 发光二极管 驱动电源 LED

LED通用照明设计工程师会遇到许多挑战,如功率密度、功率因数校正(PFC)、空间受限和可靠性等。

关键字: LED 驱动电源 功率因数校正

在LED照明技术日益普及的今天,LED驱动电源的电磁干扰(EMI)问题成为了一个不可忽视的挑战。电磁干扰不仅会影响LED灯具的正常工作,还可能对周围电子设备造成不利影响,甚至引发系统故障。因此,采取有效的硬件措施来解决L...

关键字: LED照明技术 电磁干扰 驱动电源

开关电源具有效率高的特性,而且开关电源的变压器体积比串联稳压型电源的要小得多,电源电路比较整洁,整机重量也有所下降,所以,现在的LED驱动电源

关键字: LED 驱动电源 开关电源

LED驱动电源是把电源供应转换为特定的电压电流以驱动LED发光的电压转换器,通常情况下:LED驱动电源的输入包括高压工频交流(即市电)、低压直流、高压直流、低压高频交流(如电子变压器的输出)等。

关键字: LED 隧道灯 驱动电源
关闭