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

使用docker快速部署Nginx、Redis、MySQL、Tomcat以及制作镜像

使用docker快速部署Nginx、Redis、MySQL、Tomcat以及制作镜像

文章目录 * 应用快速部署 * Nginx * Redis * MySQL * Tomcat * 制作镜像 * 镜像原理 * 基于已有容器创建 * 使用 Dockerfile 创建镜像 * 指令说明 * 构建应用 * 创建 Dockerfile 文件 * 创建镜像 应用快速部署 Nginx docker run -d-p80:80 nginx 使用浏览器访问虚拟机地址 Redis docker pull redis docker run --name redis -d-p6379:6379 redis 可以使用 Redis 客户端工具连接 连接成功可以看到服务器信息 MySQL 企业中用得最多的是 MySQL 5.7 版本 docker pull centos/

By Ne0inhk
轻量级服务器探针 Komari 简单高效监控服务器状态

轻量级服务器探针 Komari 简单高效监控服务器状态

本文最初发布在只抄博客,如需查看最新内容与细节补充,欢迎前往原文链接。 前言 Komari 是一款与哪吒探针比较类似的服务器监控工具,可以实时查看服务器的状态。 与哪吒探针相比,主要有以下几个优点: * 专注监控:Komari 没有像哪吒探针一样包含 DDNS、内网穿透等与监控无关的功能 * 历史记录:Komari 默认支持查看过去 30 天内(可以设置更长时间)的占用情况,而哪吒探针只能查看实时的状态 * 配置简单:Komari 的后台设置简单易懂,无论是通知规则、备注还是延迟监控,都可以直接通过表单操作,而哪吒探针则需要通过 JSON 才能配置 * 支持备份:Komari 后台就可以直接导出 / 导入备份文件,无需像哪吒探针备份整个目录 * GeoIP:Komari 可以直接在面板中选择 IP 库的提供商以及在线更

By Ne0inhk

远程桌面:Ubuntu Desktop操作系统上如何安装Rustdesk远程桌面客户端(离线安装包)

本文将为您提供在 Ubuntu Desktop 操作系统上通过离线安装包安装 RustDesk 远程桌面客户端的详细步骤。以下是完整的安装指南,确保清晰且易于操作。 前提条件 1. 操作系统:Ubuntu Desktop(支持的版本通常包括 20.04、22.04、24.04 等 LTS 或非 LTS 版本)。 2. 离线安装包:确保您已下载 RustDesk 的 .deb 安装包(适用于 Ubuntu/Debian 系统)。您可以从 RustDesk 官方网站(https://rustdesk.com/)或 GitHub 页面(https://github.com/rustdesk/rustdesk/

By Ne0inhk
IoTDB 性能优化双杀:查询分析与负载均衡实战指南

IoTDB 性能优化双杀:查询分析与负载均衡实战指南

IoTDB 性能优化双杀:查询分析与负载均衡实战指南 在分布式时序数据库的日常运维中,查询慢、集群负载不均是最让人头疼的两大问题。前者直接影响业务响应速度,后者则可能导致节点资源浪费或宕机风险。今天就来分享IoTDB的两大核心优化手段——查询性能分析(Explain/Explain Analyze)和Region迁移负载均衡,用实操技巧帮你搞定这两个痛点。 一、查询性能分析:精准定位慢查询瓶颈 不管是日常运维还是开发调试,搞懂查询的执行逻辑和资源消耗,才能针对性优化。IoTDB从V1.3.2版本开始,内置了两套实用的查询分析工具,不用额外部署,上手就能用。 1. 两款核心分析工具:Explain vs Explain Analyze 这两个工具各有侧重,咱们可以根据需求灵活选择: * Explain语句:相当于查询的"执行蓝图",不用实际执行SQL,就能预览执行计划。比如数据怎么检索、过滤条件是否生效、查询计划在哪些节点分配,都能一目了然。 语法特别简单:EXPLAIN <SELECT_

By Ne0inhk