ZU47DR RFdc Linux实战:Linux下的RFdc驱动编译和使用

ZU47DR RFdc Linux实战:Linux下的RFdc驱动编译和使用

前言

ZynqUltraScale+ RFSoC ZU47DR,在一款芯片内集成射频直接采样数据转换器、FPGA逻辑、完整的ARM处理器子系统和高速收发器等。本例程使用petalinux2022.1编译系统镜像,进行本次实验前请先了解petalinux的编译流程。RFdc驱动接口在Linux和裸跑下一致,调用的API可参考裸跑下的实现。本次实验的核心目的在于验证xczu47d芯片的RF Data Converter子系统在嵌入式Linux环境下的工作状态、功能完整性和基本性能表现,确认Linux内核能够正确识别并加载Xilinx提供的RFdc硬件驱动模块,验证用户空间与RFdc硬件交互所需的软件库(如XRFdc库)及依赖(libmetal等)安装配置正确,API调用接口可用等其他功能。

测试平台与环境

系统:windows 10

开发工具:vivado 2022.1 + vitis 2022.1 + petalinux2022.1(Ubuntu22.04)

板卡:自制板卡

FPGA工程搭建

fpga与裸跑下工程搭建一致。

构建Linux镜像

在上节中我们已经完成了硬件工程并导出了硬件描述文件(XSA),本节我们将编译Linux镜像和带有RFdc驱动的文件系统。首先我们创建一个petalinux工程,并导入硬件描述文件。

petalinux-create -t project --template zynqMP -n rfdc_image cd rfdc_image petalinux-config --get-hw-description=<path to XSA>

然后复制meta-petalinux/recipes-bsp中的内容到工程目录的 project-spec/meta-user/recipes-bsp中,如下图所示:

然后在meta-user/conf/user-rootfsconfig文件中添加如下内容。

然后使用petalinux-config -c rootfs,在根文件系统的配置中添加rfdc的支持。

petalinux-config -c rootfs

user packages ->

        [*] rfdc

        [*] rfdc-read-write

        [*] rfdc-selftest

编辑当前petalinux工程目录下的project-spec/meta-user/recipes-bsp/device-tree/files/system-user.dtsi文件。

然后构建镜像并生成可启动的BOOT.BIN文件

petalinux-build petalinux-package --boot --fpga --u-boot

编译完成后将BOOT.BIN、boot.scr和image.ub文件复制到SD卡中,将板卡设置为SD卡启动,打开串口调试终端,串口配置为:波特率115200,8数据位,1开始,1停止,即可进入Linux系统。系统默认用户为petalinux。

创建Linux应用程序

上节我们已经生成了Linux的启动镜像,本节我们将在在vitis中编译rfdc的例程。我们先要在petalinux的工程中生成目标的系统根目录用以vitis中的代码编译。

petalinux-build --sdk petalinux-package --sysroot

编译完成后在images/linux目录下可见sdk目录

将sdk目录复制到vitis的目录中,新建linux的plarform工程,将sysroot Directory设置为sdk\sysroots\cortexa72-cortexa53-xilinx-linux目录。

然后在vitis中新建应用程序,File → New → Application Project,Sysroot path选择sdk\sysroots\cortexa72-cortexa53-xilinx-linux。

然后添加RFdc的例程代码,在工程配置中添加库。

最后编译即可生成可执行文件。

板卡运行验证

将上节生成的可执行文件传输到板卡上,添加可执行权限,然后./即可运行。

rfdcimage:~/test$ sudo ./rf_linux.elf Password: RFdc linux Example Test metal: info: metal_linux_dev_open: checking driver vfio-platform,80000000.usp_rf_data_converter,(null) metal: info: metal_uio_dev_open: No IRQ for device 80000000.usp_rf_data_converter. metal: info: metal_linux_dev_open: checking driver vfio-platform,80000000.usp_rf_data_converter,(null) metal: info: metal_uio_dev_open: No IRQ for device 80000000.usp_rf_data_converter. metal: info: metal_linux_dev_open: checking driver vfio-platform,80000000.usp_rf_data_converter,(null) metal: info: metal_uio_dev_open: No IRQ for device 80000000.usp_rf_data_converter. metal: info: metal_linux_dev_open: checking driver vfio-platform,80000000.usp_rf_data_converter,(null) metal: info: metal_uio_dev_open: No IRQ for device 80000000.usp_rf_data_converter. tile=0,block=0,XRFdc_SetDACVOP,Status=0 tile=0,block=0,Attenuation=0.000000,Status=0 tile=0,block=1,XRFdc_SetDACVOP,Status=0 tile=0,block=1,Attenuation=0.000000,Status=0 tile=1,block=0,XRFdc_SetDACVOP,Status=0 tile=1,block=0,Attenuation=0.000000,Status=0 tile=1,block=1,XRFdc_SetDACVOP,Status=0 tile=1,block=1,Attenuation=0.000000,Status=0 tile=2,block=0,XRFdc_SetDACVOP,Status=0 tile=2,block=0,Attenuation=0.000000,Status=0 tile=2,block=1,XRFdc_SetDACVOP,Status=0 tile=2,block=1,Attenuation=0.000000,Status=0 tile=3,block=0,XRFdc_SetDACVOP,Status=0 tile=3,block=0,Attenuation=0.000000,Status=0 tile=3,block=1,XRFdc_SetDACVOP,Status=0 tile=3,block=1,Attenuation=0.000000,Status=0 DAC converter samplerate=5000000000Hz ADC converter samplerate=2500000000Hz DAC NCO frequency of Tile#0 Block0 is set to -4500.000000 DAC NCO frequency of Tile#0 Block1 is set to -4500.000000 DAC NCO frequency of Tile#1 Block0 is set to -4500.000000 DAC NCO frequency of Tile#1 Block1 is set to -4500.000000 DAC NCO frequency of Tile#2 Block0 is set to -4500.000000 DAC NCO frequency of Tile#2 Block1 is set to -4500.000000 DAC NCO frequency of Tile#3 Block0 is set to -4500.000000 DAC NCO frequency of Tile#3 Block1 is set to -4500.000000 ADC NCO frequency of Tile#0 Block0 is set to -1200.000000 ADC NCO frequency of Tile#0 Block1 is set to -1200.000000 ADC NCO frequency of Tile#1 Block0 is set to -1200.000000 ADC NCO frequency of Tile#1 Block1 is set to -1200.000000 ADC NCO frequency of Tile#2 Block0 is set to -1200.000000 ADC NCO frequency of Tile#2 Block1 is set to -1200.000000 ADC NCO frequency of Tile#3 Block0 is set to -1200.000000 ADC NCO frequency of Tile#3 Block1 is set to -1200.000000 tile=0,block=0,EnableGain=0 tile=0,block=0,GainCorrectionFactor=0.000000 tile=0,block=1,EnableGain=0 tile=0,block=1,GainCorrectionFactor=0.000000 tile=1,block=0,EnableGain=0 tile=1,block=0,GainCorrectionFactor=0.000000 tile=1,block=1,EnableGain=0 tile=1,block=1,GainCorrectionFactor=0.000000 tile=2,block=0,EnableGain=0 tile=2,block=0,GainCorrectionFactor=0.000000 tile=2,block=1,EnableGain=0 tile=2,block=1,GainCorrectionFactor=0.000000 tile=3,block=0,EnableGain=0 tile=3,block=0,GainCorrectionFactor=0.000000 tile=3,block=1,EnableGain=0 tile=3,block=1,GainCorrectionFactor=0.000000 tile=0,block=0,EnableGain=1,Status=0 tile=0,block=0,GainCorrectionFactor=1.000000 tile=0,block=1,EnableGain=1,Status=0 tile=0,block=1,GainCorrectionFactor=1.000000 tile=1,block=0,EnableGain=1,Status=0 tile=1,block=0,GainCorrectionFactor=1.000000 tile=1,block=1,EnableGain=1,Status=0 tile=1,block=1,GainCorrectionFactor=1.000000 tile=2,block=0,EnableGain=1,Status=0 tile=2,block=0,GainCorrectionFactor=1.000000 tile=2,block=1,EnableGain=1,Status=0 tile=2,block=1,GainCorrectionFactor=1.000000 tile=3,block=0,EnableGain=1,Status=0 tile=3,block=0,GainCorrectionFactor=1.000000 tile=3,block=1,EnableGain=1,Status=0 tile=3,block=1,GainCorrectionFactor=1.000000 tile=0,block=0,EnableGain=0 tile=0,block=0,GainCorrectionFactor=0.000000 tile=0,block=1,EnableGain=0 tile=0,block=1,GainCorrectionFactor=0.000000 tile=1,block=0,EnableGain=0 tile=1,block=0,GainCorrectionFactor=0.000000 tile=1,block=1,EnableGain=0 tile=1,block=1,GainCorrectionFactor=0.000000 tile=2,block=0,EnableGain=0 tile=2,block=0,GainCorrectionFactor=0.000000 tile=2,block=1,EnableGain=0 tile=2,block=1,GainCorrectionFactor=0.000000 tile=3,block=0,EnableGain=0 tile=3,block=0,GainCorrectionFactor=0.000000 tile=3,block=1,EnableGain=0 tile=3,block=1,GainCorrectionFactor=0.000000 tile=0,block=0,EnableGain=1,Status=0 tile=0,block=0,GainCorrectionFactor=1.000000 tile=0,block=1,EnableGain=1,Status=0 tile=0,block=1,GainCorrectionFactor=1.000000 tile=1,block=0,EnableGain=1,Status=0 tile=1,block=0,GainCorrectionFactor=1.000000 tile=1,block=1,EnableGain=1,Status=0 tile=1,block=1,GainCorrectionFactor=1.000000 tile=2,block=0,EnableGain=1,Status=0 tile=2,block=0,GainCorrectionFactor=1.000000 tile=2,block=1,EnableGain=1,Status=0 tile=2,block=1,GainCorrectionFactor=1.000000 tile=3,block=0,EnableGain=1,Status=0 tile=3,block=0,GainCorrectionFactor=1.000000 tile=3,block=1,EnableGain=1,Status=0 tile=3,block=1,GainCorrectionFactor=1.000000 === RFdc Initialized - Running Multi-tile Sync div=-1775560512=== === Run DAC Sync === metal: info: DTC Scan PLL metal: info: DAC2: 000000011122200000000000011122200000000000000111222000000*000000#132200000000000000113220000000000000001122200000000000001112220 metal: info: DTC Scan T1 metal: info: DAC2: 0000000000000000001132220000000000000000000000000000000011322200#000000000000*00000000000000001122220000000000000000000000000000 metal: info: DAC0: 0000000000000000001122220000000000000000000000000000000113222000000000000000*#00000000000000111322200000000000000000000000000000 metal: info: DAC1: 00000000000000000000113222000000000000000000000000000000001132200000000000000#*0000000000000000111222000000000000000000000000000 metal: info: DAC3: 00000000000000000011322200000000000000000000000000000000111222000000000000000*00000000000000011132220000000000000000000000000000 metal: info: DAC0: Marker: - 35, 0 metal: info: DAC1: Marker: - 35, 0 metal: info: DAC2: Marker: - 35, 0 metal: info: DAC3: Marker: - 35, 0 metal: info: SysRef period in terms of DAC T1s = 1600 metal: info: DAC target latency = 700 INFO : DAC Multi-Tile-Sync completed successfully === Run ADC Sync === metal: info: DTC Scan PLL metal: info: ADC2: 00000000011222000000000000001122220000000000000113222000000*0000#011122200000000000001132220000000000000011322200000000000001132 metal: info: DTC Scan T1 metal: info: ADC2: 0000000000000000000001122220000000000000000000000000000000000*00#000000000000000000000000000000001122220000000000000000000000000 metal: info: ADC0: 000000000000000001112220000000000000000000000000000000000*000#000000000000000000000000000000011322200000000000000000000000000000 metal: info: ADC1: 000000000000000000001132200000000000000000000000000000000000*#000000000000000000000000000000000011322000000000000000000000000000 metal: info: ADC3: 000000000000000000001112220000000000000000000000000000000000*#000000000000000000000000000000000011122200000000000000000000000000 metal: info: ADC0: Marker: - 11, 3 metal: info: ADC1: Marker: - 11, 3 metal: info: ADC2: Marker: - 11, 3 metal: info: ADC3: Marker: - 11, 3 metal: info: SysRef period in terms of ADC T1s = 800 metal: info: ADC target latency = 116 INFO : ADC Multi-Tile-Sync completed successfully metal: warning: Inverse Sinc mode and Nyquist Zone are incompatible for DAC 0 block 0 in XRFdc_SetInvSincFIR DAC NCO frequency of Tile#0 Block0 is set to -4500.000000,2 metal: warning: Inverse Sinc mode and Nyquist Zone are incompatible for DAC 0 block 2 in XRFdc_SetInvSincFIR DAC NCO frequency of Tile#0 Block1 is set to -4500.000000,2 metal: warning: Inverse Sinc mode and Nyquist Zone are incompatible for DAC 1 block 0 in XRFdc_SetInvSincFIR DAC NCO frequency of Tile#1 Block0 is set to -4500.000000,2 metal: warning: Inverse Sinc mode and Nyquist Zone are incompatible for DAC 1 block 2 in XRFdc_SetInvSincFIR DAC NCO frequency of Tile#1 Block1 is set to -4500.000000,2 metal: warning: Inverse Sinc mode and Nyquist Zone are incompatible for DAC 2 block 0 in XRFdc_SetInvSincFIR DAC NCO frequency of Tile#2 Block0 is set to -4500.000000,2 metal: warning: Inverse Sinc mode and Nyquist Zone are incompatible for DAC 2 block 2 in XRFdc_SetInvSincFIR DAC NCO frequency of Tile#2 Block1 is set to -4500.000000,2 metal: warning: Inverse Sinc mode and Nyquist Zone are incompatible for DAC 3 block 0 in XRFdc_SetInvSincFIR DAC NCO frequency of Tile#3 Block0 is set to -4500.000000,2 metal: warning: Inverse Sinc mode and Nyquist Zone are incompatible for DAC 3 block 2 in XRFdc_SetInvSincFIR DAC NCO frequency of Tile#3 Block1 is set to -4500.000000,2 === Multi-Tile Sync Report === DAC0: Latency(T1) =700, Adjusted DelayOffset(T5) = 0 DAC1: Latency(T1) =700, Adjusted DelayOffset(T5) = 0 DAC2: Latency(T1) =700, Adjusted DelayOffset(T5) = 0 DAC3: Latency(T1) =700, Adjusted DelayOffset(T5) = 0 ADC0: Latency(T1) =116, Adjusted DelayOffset(T2) = 0 ADC1: Latency(T1) =116, Adjusted DelayOffset(T2) = 0 ADC2: Latency(T1) =116, Adjusted DelayOffset(T2) = 0 ADC3: Latency(T1) =116, Adjusted DelayOffset(T2) = 0 The sw lasted build at 20:42:02 Aug 18 2025 Rfdc config succcess!!! Successfully ran linux Example Test 

参考资料:
Debugging RFDC Linux Application in SDK - Xilinx Wiki - Confluence

在 SDK 2018.3 中创建面向 RFDC 驱动程序的 Linux 应用程序 - Xilinx Wiki - Confluence

Introduction • Zynq UltraScale+ RFSoC RF Data Converter v2.6 Gen 1/2/3/DFE LogiCORE IP Product Guide (PG269) • 阅读器 • AMD 技术信息门户网站

Read more

AI 也能写爬虫?基于 Bright Data + Warp CLI 的网页抓取实战

AI 也能写爬虫?基于 Bright Data + Warp CLI 的网页抓取实战

🤵‍♂️ 个人主页:@艾派森的个人主页 ✍🏻作者简介:Python学习者 🐋 希望大家多多支持,我们一起进步!😄 如果文章对你有帮助的话, 欢迎评论 💬点赞👍🏻 收藏 📂加关注+ 目录 一、引言 1.1 写过爬虫的人,大概率都踩过这些坑 1.2 AI 已经很会写代码了,但它真的能“写爬虫”吗? 1.3 让 AI 不只是“写代码”,而是“驱动抓取” 二、技术与工具介绍 2.1 为什么“普通 AI + 爬虫代码”很难跑通真实网页? 2.2 Bright Data:爬虫工程真正的“底层基础设施” 2.3

By Ne0inhk
AI时代,一文彻底搞懂天天被提到的Agent是什么?

AI时代,一文彻底搞懂天天被提到的Agent是什么?

一、什么是AI Agent? 1.1 基本定义 AI Agent(人工智能代理)是一种能够感知环境、自主决策并执行动作的智能实体。与传统AI系统不同,Agent不仅能回答问题,还能主动完成一系列复杂任务。 简单来说,如果把大语言模型(LLM)比作一个"超级大脑",那么AI Agent就是给这个大脑装上了"手脚"和"工具",让它能够像人类一样主动行动,而不仅仅是被动回答问题。 1.2 关键特性 * ✅ 自主性:能在没有人类直接干预的情况下运作 * ✅ 反应性:对周围环境和接收到的信息作出及时响应 * ✅ 目标导向:拥有明确的目标或任务,并为之努力 * ✅ 学习能力:通过经验不断改进自身的性能和策略 1.3 与传统AI的区别 传统AI:像个听话的工具,你说&

By Ne0inhk
2026年建筑师必备AI工具TOP10(含平面图转3D解决方案)

2026年建筑师必备AI工具TOP10(含平面图转3D解决方案)

随着AI技术在设计行业的快速发展,越来越多的建筑师和室内设计师开始使用人工智能工具来提升效果图产出效率、优化建模流程、甚至进行营销推广。 本文将盘点2026年建筑师最常用的10款AI工具,并对其适用场景进行分析,帮助你选择最适合的解决方案。 一、建筑师常用AI工具分类 目前建筑行业的AI工具大致可以分为五类: 1. AI效果图生成 2. 平面图转3D模型 3. AI建筑动画视频 4. AI室内设计辅助 5. 建筑概念方案生成 二、2026年建筑师AI工具TOP10 工具名称 主要功能 是否支持平面图转3D 是否支持视频生成 适合人群 EVAI建筑大师 效果图生成/图片编辑/视频生成/3D转换 ✅ ✅ 建筑师/室内设计师 Midjourney 艺术风格图像生成 ❌ ❌ 概念设计 D5 Render 实时渲染 ❌ ❌ 建筑可视化 Stable Diffusion 开源图像生成 ❌ ❌ 技术型用户 Kaedim 2D转3D 部分 ❌ 游戏设计 Planner

By Ne0inhk
OpenClaw接入企业微信全攻略:从0到1打通企业AI协作通道

OpenClaw接入企业微信全攻略:从0到1打通企业AI协作通道

摘要:本文详细介绍了将OpenClaw AI框架接入企业微信的完整方案。通过两种主流接入方式(API模式机器人和自建应用),企业可以快速实现智能问答、流程自动化等AI能力落地。文章重点讲解了从前期准备、核心接入流程到生产环境部署的全套实操步骤,包括权限配置、网络设置、参数对接等关键环节。同时提供了进阶优化建议,如后台守护、HTTPS加固、权限管控等企业级功能配置,以及常见问题排查方法。该方案能有效解决企业信息孤岛问题,将AI能力无缝嵌入员工日常办公场景,在保障数据安全的同时显著提升工作效率。 目录 一、前言:为什么要将OpenClaw接入企业微信? 二、接入前置准备 OpenClaw介绍 接入准备工作 三、核心接入流程(两种方案任选) 方案一:API模式机器人接入(新手首选,快速上手) 步骤1:企业微信后台创建API模式机器人 步骤2:OpenClaw安装企微插件并配置参数 步骤3:完成机器人创建并测试联调 方案二:企业微信自建应用接入(企业级进阶方案) 步骤1:企业微信创建自建应用并获取核心凭证 步骤2:OpenClaw配置自建应用核心参数 步骤3:启用应

By Ne0inhk