恒美微站
首页
关于我们
建站服务
主题模板
案例展示
资讯中心
联系我们
从PlutoSDR到openwifi:ZYNQ+AD936X固件刷写实战指南
首页
资讯中心
/
从PlutoSDR到openwifi:ZYNQ+AD936X固件刷写实战指南
从PlutoSDR到openwifi:ZYNQ+AD936X固件刷写实战指南
发布时间:2026/9/29 17:14:45
手里这块ZYNQAD936X的小板子当初很可能是为了玩PlutoSDR入手的也可能就是某块写着AD9361方案的软件无线电开发板。我的折腾路径其实挺典型先是跟着原厂固件老老实实用IIO Oscilloscope看波形把AD936X的收发链路调通后来发现这套硬件还有一个更过瘾的玩法——刷开源的openwifi固件让板子直接变成一台能收发真实802.11信号的软件无线电设备。这篇文章就围绕“从PlutoSDR到openwifi”这条线把我在这类ZYNQAD936X平台上刷固件的经验、踩过的坑、以及背后的启动链路逻辑一次讲清楚。不管你是刚接触SDR的爱好者还是想用开源WiFi做原型验证的工程师这篇文章都适用。我不会只甩给你一堆命令而是先说明ZYNQAD936X这套组合为什么能承载这么多好玩固件再手把手演示固件到底怎么刷、怎么验证、出问题了怎么排查。至少读完之后你拿到一块ZYNQAD936X板子敢下手折腾也知道每一步背后到底在干什么。1. 这套开源硬件为什么能刷出这么多花样1.1 ZYNQ的“双核人设”决定了刷机的底层逻辑很多第一次玩ZYNQ的人会被“FPGAARM”这种说法绕晕。其实拿生活类比就很好懂ZYNQ芯片里住着两个性格完全不同的角色ARM那部分叫PSProcessing System它就是一颗标准的双核Cortex-A9处理器能跑Linux、Ubuntu这种正经操作系统负责控制、计算、网络协议栈这些“动脑子”的活儿另一部分叫PLProgrammable Logic就是FPGA逻辑负责高吞吐、低延迟的数据搬运和信号处理比如和AD936X之间几个GSPS速率的数字接口靠ARM去一比特一比特操作根本不现实必须让PL用硬件逻辑去对接。正是因为“PS跑软件、PL跑逻辑”这个架构刷固件这件事被彻底分层了。你可以只更新Linux内核和应用不碰FPGA也可以只烧PL bitstream不动Linux还可以把两者打包成一个BOOT.BIN一次性写进Flash。相比纯DSP或者纯MCU方案ZYNQ的可玩性和灵活性高出不止一个量级。你在网上看到的“刷入openwifi”“刷入PlutoSDR固件”“刷入其他SDR固件”本质上都是在往这个分层架构里填不同的软件和逻辑组合。1.2 AD936X系列射频芯片为什么是SDR的“万金油”AD9361是一颗集成度非常高的射频收发器频率覆盖几十MHz到6GHz瞬时带宽可以配置到几十MHz量级单芯片里集成了接收链路、发射链路、本振、滤波、ADC/DAC乃至校准逻辑。AD9364则可以理解为单收发通道版本PlutoSDR上用的就是AD936X系列。这颗芯片之所以被大量用于SDR、WiFi原型验证、跳频通信系统核心优势是灵活性。它不绑定任何特定通信制式你想让它工作在2.4GHz做WiFi实验或者工作在400MHz做物联网信号分析都只要相应配置频率、带宽、增益就行。你甚至可以在运行中用软件动态改频这对于需要频率跳变的场景非常关键。但也正因为AD936X本身像一张白纸它必须和一个足够强大的数字处理平台搭配这个平台就是ZYNQ。AD936X那边把射频信号变成高速数字流ZYNQ这边的PL负责实时处理、控制时序PS负责跑Linux、跑协议栈、跑上层应用。两者组合起来几乎就是一个可以编程定义的完整无线通信设备。这也是为什么openwifi这种项目会选择ZYNQAD936X作为目标平台。1.3 市面上的几种常见板卡形态刷机之前先认清自己手里是哪种板子非常重要。我简单分一下类板卡形态FPGA型号AD936X型号典型用途刷机特点PlutoSDRZynq Z-7010AD9363/AD9364入门级SDR学习原厂固件完善刷机风险可控适合练手AD-FMCOMMS3-EBZZynq-7000系列AD9361双通道工业级评估板openwifi官方目标板之一功能全适合跑openwifi完整验证第三方AD936X开发板Zynq-7010/7020等AD9361/AD9363/AD9364项目预研、原型验证需要自己适配设备树和启动配置我自己建议如果你是第一次刷机最好先用PlutoSDR熟悉启动方式和U-Boot操作。就算刷成半砖ADI官方恢复镜像也能救回来心里负担小。等刷机流程熟练之后再上FMCOMMS3这类板子跑openwifi会顺很多。2. 刷固件前先把启动链路吃透2.1 从BootROM到Linux上电后到底发生了什么很多人刷机失败就是因为不理解ZYNQ的上电启动过程只知道“把文件丢进去”或者“执行一条命令”。其实ZYNQ的启动是一场接力赛BootROM芯片上电后先执行片内BootROM它干的事非常简单——根据硬件引脚的电平状态判断启动介质是SD、QSPI Flash还是JTAG然后从对应介质加载FSBL到片上RAM。FSBLFirst Stage Boot Loader这是第一级引导程序它的职责是初始化DDR内存、初始化必要的时钟并且可以配置PL加载bitstream。U-Boot这是第二级引导程序功能就丰富多了。你可以中断它进入命令行设置环境变量、加载Linux内核、设置内核启动参数。Linux内核最后U-Boot把内核镜像和设备树加载到DDR跳转执行系统才算真正跑起来。对刷机的人而言FSBL和U-Boot是关键操作对象。FSBL通常被封装进BOOT.BINU-Boot可能也在这个BIN里也可能单独存放。实际刷openwifi这类固件时你烧到Flash或者SD卡里的东西往往不是单一文件而是多个分区、多个文件组成的一套完整启动环境。2.2 BOOT.BIN里到底装了什么BOOT.BIN这个词刷机时绕不开。它本质上是一个打包容器常见内容包含FSBL可执行文件PL bitstreamFPGA逻辑固件可选U-Boot可执行文件如果PL bitstream被打包进BOOT.BINFSBL在启动阶段就会自动配置FPGA逻辑。对于SDR应用来说PL逻辑必须在Linux起来之前就准备好因为在Linux启动过程中AD936X的驱动就要访问PL实现的数字接口。当然你也可以选择不在BOOT.BIN里打包bitstream改由Linux侧通过FPGA管理器加载但这类SDR固件一般还是把bitstream放到BOOT.BIN里更省事、时序也更可靠。除了BOOT.BIN你还会看到device tree.dtb、kernel image通常是uImage或者image.ub、rootfs。这四个东西配合起来才算一套完整固件。刷机时如果你更新了自己的PL逻辑但是没重新生成BOOT.BIN而是只换内核那PL还是旧逻辑如果你只改了BOOT.BIN但内核和设备树不匹配Linux也起不来。我早期经常犯这种“只改一半”的错。2.3 三种刷机路线怎么选ZYNQ平台常见的启动介质和刷机路线有这三种它们的适用场景差别非常大JTAG启动/调试开发调试最灵活的方式。用Xilinx Cable连接JTAG接口直接加载FSBL和bitstream到内存甚至可以直接调试ARM核和FPGA逻辑。但JTAG不适用于日常部署因为掉电就没了。SD卡启动我自己最推荐的刷机方式。把BOOT.BIN、image.ub、rootfs放到SD卡FAT分区设置板卡拨码为SD启动就行了。好处是完全不碰板载Flash原厂固件留在QSPI Flash里随时能切回去。openwifi官方也是以SD卡镜像为主要分发形式。QSPI Flash固化适合最终部署。把BOOT.BIN烧写到板载QSPI Flash里设置拨码为QSPI启动板子就能脱离电脑和SD卡独立运行。代价是Flash写坏或者写错参数恢复起来比SD卡麻烦。我的经验是调试阶段优先SD卡启动最终确认版本没问题再考虑QSPI固化。别上来就直接烧Flash尤其是还没吃透U-Boot环境变量的时候。2.4 固件安全与启动认证顺便提一个很多人忽略的点ZYNQ的BootROM支持RSA签名验证、eFuse熔丝等安全启动机制。有些商业板卡为了防止固件被随意替换会启用Secure Boot。这种情况下你会发现刷第三方固件无法启动或者烧写动作直接被拒绝。openwifi这类开源固件肯定是运行在没启用安全启动的板卡上或者需要你自己生成配套签名。如果你手里的板卡明确启用了Secure Boot那就意味着刷机流程要走厂商指定的安全通道不能按普通开发板的方式硬来。提示拿到二手板卡时第一步先确认Boot Mode拨码和厂商文档再检查是否启用了安全启动。很多“刷不进去”的问题不是你的镜像错了而是板卡本身做了启动限制。3. 实操把openwifi刷进ZYNQAD936X开发板3.1 openwifi是一个什么样的项目openwifi是开源社区里一个非常有代表性的项目它用ZYNQ的FPGA逻辑实现了完整的WiFi物理层和MAC层基带处理配合AD9361这样的射频前端可以发射和接收真实的802.11a/g/n信号。和普通WiFi网卡最大的区别是openwifi的整个基带流程在FPGA里是完全开放、可修改的你可以看到OFDM调制、信道编码、MAC帧处理具体是怎么用硬件逻辑实现的也可以改动它去验证自己的算法。它能做的事情非常多可以和Linux的mac80211无缝对接让板卡作为一张标准无线网卡加入现有的WiFi网络也可以让开发者配置成接入点做协议测试还能输出精确到纳秒量级的时间戳这个特性被广泛用于无线测距、定位、信道探测等科研方向。opwnwifi官网和GitHub仓库里都有详细的文档和镜像下载我的建议是先把官方支持的板卡列表看清楚再决定用哪个镜像。注意openwifi是无线通信科研与教学工具请只在合法授权、自有设备及实验环境下使用。不要用它在未授权场景做越权操作更不要干扰别人正常通信。3.2 准备工作与硬件连接在开始刷机之前我把自己的检查清单整理如下开发板一块确认型号和ZYNQ芯片封装手里这块是Z-7010还是Z-7020直接影响镜像里的FSBL和硬件描述。12V或5V电源根据板卡要求来别拿劣质USB线应付电流不够的话启动时候各种诡异问题都会冒出来。USB-UART串口模块一般用CP2102或者FT232连接的时候注意TXD/RXD交叉板卡TXD接模块RXD板卡RXD接模块TXD。TF卡和读卡器至少8GBClass 10以上。网线用于连接开发板网口和电脑。如果板卡没有预装openwifi镜像需要先从openwifi官方release页面下载镜像通常是一个.img文件。写卡工具Windows下用balenaEtcher或者Win32DiskImagerLinux下用dd命令。连接顺序也有讲究。先把串口、网线、TF卡都接好最后再接电源。养成这种习惯可以避免热插拔导致接口损坏也能让串口完整记录从BootROM开始的全部启动日志。3.3 烧写TF卡镜像的完整步骤假设你已经从openwifi官方下载了类似 openwifi_xxx.img 的镜像文件那么最简单的刷机流程是这样的解压镜像。如果下载的是zip或xz压缩包先解压得到.img文件。用balenaEtcher或者Win32DiskImager把img写入TF卡。Linux下用dd也可以写完镜像后Windows可能会提示“是否格式化该磁盘”千万不要点直接拔卡。把TF卡插入开发板把Boot Mode拨码设置为SD启动。连接串口和电源上电打开串口终端波特率设置为115200、8N1。观察启动日志通常几秒钟内会看到U-Boot输出随后进入Linux。sudo dd ifopenwifi_xxx.img of/dev/sdX bs4M convfsync statusprogress这里特别提醒两个坑第一dd命令里的of/dev/sdX写错盘符会把电脑系统盘直接清掉操作前用lsblk确认TF卡对应的设备名第二写卡过程如果弹窗提示格式化一定忽略因为镜像已经包含了分区表格式化反而会把它破坏掉。启动进入Linux后的第一件事就是确认系统版本和板卡是否真的匹配。用串口进入root用户执行uname -a和cat /proc/device-tree/model看看内核构建时间和设备树是不是openwifi对应的版本。如果设备树匹配错误后续大概率会出现网络接口无法识别、AD936X驱动加载失败这类问题。3.4 默认IP与网口联调openwifi镜像启动后通常会把有线网口配置成一个固定IP方便你通过网络登录开发板。不同的board镜像可能略有差异最稳妥的方法是查看官方文档里给出的默认地址然后把自己的电脑网卡设置成同一网段。我的习惯做法是开发板网口直连电脑网口电脑网卡手动设置IP为与开发板同网段比如开发板是192.168.10.1电脑就设192.168.10.2用ping确认链路通再通过SSH连接开发板如果ping不通先检查串口登录进去用ifconfig看网口有没有起来IP设置对不对。串口和网口双通道都通了之后整个板子的可操作性就上来了。后面改文件、跑测试、升级内核镜像都可以通过SSH完成不用每次都插串口线。3.5 验证wlan0接口与无线收发能力openwifi镜像自带Linux无线驱动正常情况下系统里会出现一个 wlan0 接口。我用串口进去执行iw dev能看到类似下面的信息$ iw dev Interface wlan0 ifindex 3 wdev 0x1 addr 00:xx:xx:xx:xx:xx type managed看到wlan0只是第一步真正需要验证的是射频链路能不能正常工作。最稳妥的验证方法是临时把板卡配置成一个独立无线AP然后用手机或者另一台电脑去扫描这个SSID。这需要在开发板上安装配置hostapd相关工具openwifi文档里有现成步骤。如果没有时间配AP也可以用openwifi针对AD936X做的回环测试或者信号发射测试工具在低功率、加衰减器的情况下验证发射链路是否产生正确的载波。我自己实测时会在射频输出端串一个30dB衰减器再接频谱仪这种做法既保护频谱仪又能直观看到频谱形态。不要省略衰减器直接接天线乱发信号既不合规也不安全。3.6 如何救回被刷坏的固件很多人问我“万一刷成砖了怎么办”根据我的经验ZYNQAD936X平台要彻底“变砖”其实很难因为U-Boot和BootROM天然给了你恢复通道。常见的恢复思路有下面几种如果TF卡里有一份好的镜像而板载QSPI Flash的原厂固件还在可以通过U-Boot环境变量临时指定从SD卡启动或者直接进入U-Boot命令行手动加载内核。这样等于绕过损坏的Flash先让系统活过来。如果你把QSPI Flash也刷坏了还能用JTAG方式通过Vivado的xsdb工具直接加载FSBL和U-Boot到内存然后从内存启动系统再重写Flash。这个流程需要一条JTAG下载线但对开发板来说几乎是万能恢复手段。针对PlutoSDR这类官方板卡ADI官方提供了完整的恢复固件包和刷写流程按照文档执行即可。我自己处理过一次最离谱的情况U-Boot环境变量被改坏导致每次上电都进入死循环。最后用JTAG连接在U-Boot里执行env default -a恢复默认环境变量才解决。所以我强烈建议在U-Boot里做环境变量修改之前先执行printenv把当前配置全部存档防止改坏之后连回溯依据都没有。4. 刷机路上的坑我替你踩过了4.1 串口无输出这是最常见的新手问题。你先别怀疑板子坏了按以下顺序排查检查串口工具选择的COM口是否识别正确Windows设备管理器里看有没有多出串口。检查波特率是不是115200数据位8、停止位1、无校验。检查TXD和RXD是否接反了这是最容易犯的错误很多USB-UART模块上的丝印标的是模块自身视角实际和板卡对接需要交叉。检查串口模块供电是不是3.3V有些模块默认5V电平和ZYNQ的3.3V GPIO不匹配会导致通信乱码或者完全无输出。如果以上都正常再看Boot Mode拨码确认不是处于一个完全不该启动的模式。我用一个简单方法判断板子是否真的在跑上电后摸一下主控芯片温度。如果芯片微微发热说明大概率在运行问题还是出在串口链路上如果完全冰凉电源或BOOT配置问题可能性更大。4.2 U-Boot启动到一半卡死U-Boot卡死的情况需要区分位置。如果卡在DDR初始化之前多半是板卡电源不稳定、DDR颗粒型号与FSBL配置不匹配或者JTAG占用了调试资源。如果卡在加载bitstream阶段通常就是BOOT.BIN里的PL逻辑与当前板卡不匹配或者FSBL里DDR时序参数不对。遇到这种问题我的排查顺序是先用JTAG连接Vivado的Hardware Manager看能不能识别到ZYNQ器件。如果能识别到说明PS部分基本正常接下来在FSBL阶段看是否停在某个具体模块。如果FSBL跑通过去再检查U-Boot日志最后一行输出在哪结合日志去查对应的FPGA加载或者DDR读写问题。提示不要一上来就怀疑镜像坏了。很多时候是板卡的DDR型号和镜像FSBL里配置的不一样尤其是第三方定制板卡。这种场景下最靠谱的办法就是重新用板卡厂商提供的Vivado工程生成一个匹配的BOOT.BIN而不是直接拿通用镜像硬刷。4.3 Linux起来了但没有wlan0进入Linux后如果iw dev看不到wlan0大概率不是固件刷错了而是设备树或者内核模块有问题。先执行dmesg | grep -i ad936x看AD936X驱动有没有加载。如果看到类似“probe fail”的错误重点检查设备树里AD936X对应的SPI片选是不是正确设备树里是否启用了正确的CMOS/LVDS接口配置PL逻辑是否已经加载因为AD936X驱动要和PL里的数字接口交互。如果驱动已经正常加载再看mac80211相关模块有没有自动加载。我遇到过一次很隐蔽的问题Linux内核模块已经加载wlan0也创建了但是ip link set wlan0 up报错提示RF kill或者操作不支持。后来发现是设备树里clock设置错了导致AD936X主时钟频率偏了射频前端没有锁定无线接口无法真正使能。所以遇到无线接口异常不要只盯着驱动要沿时钟链路查一遍。4.4 网口不通openwifi镜像默认网口IP不一定和你电脑在同一个网段。先确定镜像文档里的默认地址再把电脑网卡调整为相同网段。如果还是ping不通用串口进去ifconfig看有线网口是否正常有些板卡要求网线直连而不是通过交换机也有的板卡PHY芯片需要设备树里指定正确的PHY地址。排查网口问题时我喜欢用ethtool ethx看协商速率和Link状态再用dmesg | grep eth看PHY有没有探测成功。如果PHY都无响应那大概率是PHY的复位脚、时钟或者MDIO地址配置问题这种硬件层面的问题更常见于第三方板卡。4.5 SD卡镜像写好后分区不可识别有时候镜像写完后电脑上显示SD卡只剩一个很小或者未分配的分区。这其实是正常的因为镜像分区布局可能和Windows预期的布局不一样。不要慌直接用读写器插入板卡试试。如果板卡也启动不了再用lsblk查看分区格式或者在Linux下用fdisk -l查看完整分区表。我之前踩过一个坑是写卡工具没完全写入就拔卡导致分区表损坏。后来养成了两个习惯一是写卡过程务必等进度条完成并弹出提示二是写完以后用sync命令确认数据落盘Windows下则通过安全弹出存储设备来确保完成。4.6 射频实验合规性提醒这部分内容不值钱但很重要。ZYNQAD936X板卡一旦跑起来就是在真实发射射频信号。做发射实验时请务必注意以下几点在频率范围受限的频段做实验先查清楚当地允许的免执照频段和使用规范发射功率控制在极低水平最好在射频输出端加衰减器再接天线或频谱仪不要在机场、关键通信设施附近随意做发射实验不要在未授权情况下对他人网络设备进行扫描或干扰。把实验室里的行为限制在自有设备和授权范围内既是对自己负责也是维护整个开源无线电社区声誉的必要前提。5. 刷完固件之后你实际上收获了什么东西5.1 一个开源WiFi基带能教会你的不止是“刷机”跑通openwifi只是开始真正有价值的是它打开了一扇窗。你会开始理解一个WiFi帧从MAC层到PHY层到底经过了什么加扰、编码、交织、映射、IFFT、加循环前缀这一整套信号处理链路全部在FPGA逻辑里以可看可改的方式呈现。如果你之前只玩过基于现成芯片的WiFi网卡openwifi会颠覆你对“无线通信”的理解。顺着这个方向你可以继续走三条路修改PL逻辑把openwifi基带某个模块替换成自己的算法比如在接收链路里加入自定义的幅度校正然后对比误码率变化。做信道研究利用openwifi的精确时间戳和CSI反馈能力做室内定位、人体感知、信道建模实验。做协议原型验证如果你在开发私有MAC协议openwifi可以直接作为硬件测试平台不用从零设计一块新的无线板卡。这三条路每一条都够啃很长一段时间但也都足够有趣。5.2 回到ZYNQ平台本身刷机只是入门第一课等你在openwifi上折腾一圈再回头看会发现“刷固件”其实只是ZYNQ平台最浅层的操作。真正难懂的是FSBL、设备树、驱动模块、FPGA逻辑之间的协作关系。但正因为先把固件刷通了你才有一台能正常跑Linux和无线驱动的实验平台才能在这个平台上去验证自己的RTL设计、驱动代码和系统集成能力。我自己的体会是别把刷机看成一次性的“装机任务”而是每次都记录启动日志、记录镜像版本、记录设备树来源。这样当固件出问题的时候你有据可查当你回头升级的时候也知道自己基于什么版本做的修改。5.3 从PlutoSDR到openwifi一条值得走的折腾路线如果让我给刚入手的玩家推荐一条路线我会说先用PlutoSDR原厂固件熟悉IIO工具链学会采集和回放信号然后刷一个openwifi的SD卡镜像把板卡变成本地可访问的无线实验平台紧接着在平台基础上做一次最简单的信号回环测试确认收发链路最后再开始动手改设备树、改驱动、改RTL。每一步都踩实了再往前走你会发现自己不只是会“刷机”而是真的开始理解一块软件无线电板卡的每一层结构。在这条路上备份习惯是最值得投资的习惯。我每拿到一块板卡第一件事就是把原厂固件整卡备份下来把U-Boot环境变量和启动日志完整存档。这套做法在多次“手滑”之后救了我无数回。最后再分享一个实操细节在U-Boot里修改环境变量之前一定先执行printenv将所有变量保存到本地文件。很多刷机事故都源于改动了错误的启动参数而有一份原始配置在手恢复起来往往就是一条env default -a或手动设置回正确值的事情。记住这一点你的刷机成功率会有质的提升。