
这半年时间我们组一直在折腾一块新的嵌入式设备平台核心就是换掉用了好几年的Wi-Fi 4模块全面切到新一代Wi-Fi硬件上。项目最初的名字就叫New Wi-Fi Hardware and Device Platform听着挺宽泛实际上牵扯的东西比预期多得多FPGA侧的Vivado导出硬件流程、Linux驱动移植、连接管理还有数不清的调试翻车现场。这篇文章把这次硬切换代从头到脚拆一遍适合正在评估Wi-Fi 6模块、准备在FPGA/SoC平台上做无线设备方案的朋友。这个项目表面上是换个无线模块实际做下来才知道设备平台的升级从来不是换一颗料那么简单。从硬件选型到设备树绑定从XSA文件导出到Windows热点排错每一步都藏着大量细节。我这里把方案思考、核心流程、踩坑实录全部整理出来不加滤镜直接说干货。1. 项目整体设计与方案选型1.1 为什么在这个时间点替换Wi-Fi硬件旧平台用的是Wi-Fi 4802.11n模块只在2.4GHz频段工作这年头已经越来越撑不住场面了。最直观的问题是工厂和办公环境里2.4GHz信道太挤蓝牙、鼠标接收器、无线投屏全堆在这几个信道里设备一多重传率直接拉满。我们用无线抓包工具统计过旧模块在高峰时段的空口重传率能到15%以上这个数字对音视频传输和OTA固件升级来说都是灾难。换Wi-Fi 6/6E硬件的核心收益不只是速度快这么简单。OFDMA技术支持多个终端在同一信道内并行传输MU-MIMO让路由器可以同时跟多台设备通信TWT目标唤醒时间机制则允许设备按约定时间休眠这三点对高密度设备和低功耗嵌入式平台来说每一项都是实打实的体验提升。Wi-Fi 6还强制要求WPA3安全标准也比老协议提高了一大截。在具体芯片选型上我们对比了NXP IW611、Cypress/Infineon CYW55572、Realtek RTL8852BE几款最终选了NXP IW611。理由很朴素它支持Wi-Fi 6 Bluetooth 5.2SDIO接口80MHz带宽附带完整的Linux驱动和firmware支持。当时Wi-Fi 7已经在市场上预热但我们评估后认为嵌入式场景暂时没必要追这个风头——成本高、功耗大而且配套的网络基础设施还不普及没必要给客户增加负担。1.2 设备平台架构独立Wi-Fi模块还是SoC集成设计平台时我们面临一个路线选择用带Wi-Fi的无线SoC还是在主控SoC外挂独立Wi-Fi模块。带Wi-Fi的SoC比如赛普拉斯那类无线MCU集成度高适合极简产品但射频性能和天线布局都受限于芯片封装一旦射频走线出问题改板成本非常高。我们最终选择FPGA/MPSoC主控 独立Wi-Fi模块的架构。主控用Xilinx Zynq UltraScale MPSoC跑Linux系统处理业务逻辑Wi-Fi模块通过SDIO接口挂载。这么做的优势很明显无线升级不用动主控板天线位置可以单独优化射频走线能有更充裕的布局空间而且未来想换Wi-Fi 7模块时只需要改一小块载板。设备平台的软件分层也很有讲究。底层是Linux 5.15 LTS内核中间是SDIO总线驱动加Wi-Fi驱动mwifiex再往上是wpa_supplicant做无线连接管理最上层是我们自己写的连接管理daemon负责配网、状态上报、网络切换。每一层都尽量解耦这样驱动出问题的时候上层业务不会跟着一起崩。2. Vivado导出硬件流程与平台构建2.1 在Vivado中搭建硬件工程FPGA平台开发的第一步是搭建硬件工程。我们在Vivado里新建block design添加Zynq UltraScale MPSoC的processing system IP然后按需求配置DDR、UART、SDIO、I2C、GPIO等外设。这里有个容易被忽略的点Wi-Fi模块需要一路控制GPIO来控制reset和power sequence而不是只管SDIO数据线。我们实际使用的连接关系是SDIO负责数据GPIO_1接模块resetGPIO_2接模块power enable另外还有一路I2C用来控制板上的Wi-Fi指示灯和读取模块部分配置信息。这三者配合起来才能实现完整的上电-复位-枚举-工作流程。如果只接SDIO数据线模块在系统启动时会因为时序问题无法完成枚举这是新手最容易踩的坑。在block design里我们给每个外设都起了清晰的名字比如wifi_sdio、wifi_reset、wifi_pwr方便后续生成设备树时按名称匹配节点。Vivado工程里的命名习惯直接影响后面设备树的可读性这一点建议在做项目的第一天就统一规范。2.2 Export Hardware的关键步骤与常见坑硬件工程完成后就要导出硬件给软件团队用。这个流程在Vivado里叫Export Hardware但很多人并不清楚它导出的到底是什么。简单说它生成的是一个XSA文件.xsa里面打包了完整硬件描述硬件平台信息、比特流bitstream、裸机驱动BSP、设备树源文件等。XSA是Vivado和Vitis之间沟通的桥梁Vitis在创建platform project时必须基于XSA。具体操作分几步先在block design中Validate Design确认没有连接错误然后Generate Output Products生成输出文件创建HDL wrapper并选择让Vivado自动管理接着Generate Bitstream生成比特流这个过程可能需要十几分钟到几十分钟取决于设计复杂度最后File Export Hardware务必勾选Include bitstream选项导出的才是完整的XSA。这里常见的问题是XSA文件版本不匹配。有一次我们直接用Vivado 2023.1导出的XSA去打开Vitis 2022.2结果直接报不支持因为Vitis和Vivado的版本必须严格对应。开发团队如果多人协作建议在文档里写明工具链版本号避免每个人电脑上的版本不一致导致返工。另外要提醒一句如果有多个block design导出前要确认当前激活的是正确的那一个否则导出的硬件平台和板卡实际配置对不上后面启动Linux时就会出现各种诡异的外设异常。3. Linux驱动移植与Wi-Fi连接管理3.1 Wi-Fi驱动移植三步走模组厂商提供的Linux驱动包通常包含三部分内核驱动代码、firmware文件、配置文件比如nvram/clm_blob。对于NXP IW611这样的模组驱动就是mwifiex已经mainline进了Linux内核不需要自己从零移植但要确认内核配置里打开了对应的选项。我们用的是Kernel 5.15 LTS配置时需要打开CONFIG_MWIFIEX和CONFIG_MWIFIEX_SDIO同时还要打开CFG80211和WIRELESS相关选项。编译完内核后把firmware文件和regulatory配置文件放到/lib/firmware/mrvl/目录下。这里特别容易出问题的点是固件文件名和驱动期望的文件名不匹配驱动在加载时会报failed to get firmware的错误对着dmesg一看就能发现但要让新手找可能需要折腾半天。设备树绑定也很有讲究。在Zynq UltraScale的设备树中需要给对应的SDIO节点添加Wi-Fi子节点并声明reset GPIO、power GPIO、中断引脚。比如reset GPIO的极性、deassert时机都要在设备树里通过gpio properties描述清楚。我们第一次调试时就是因为reset GPIO在设备树里没配置导致模块一直处于复位状态SDIO总线上根本扫不到设备。驱动加载成功后的判断标准很简单/sys/bus/sdio/devices/目录下能看到新设备节点dmesg里出现mwifiex相关logifconfig -a或ip link能看到wlan0网卡。如果SDIO设备枚举成功但网卡没出来多半是firmware加载失败或者电源供电不够先用万用表确认模块供电电压是否稳定。3.2 wpa_supplicant与平台连接方案Wi-Fi网卡正常识别后下一步就是让设备能真正连上网络。我们使用wpa_supplicant作为无线连接管理工具用配置文件的方式管理多个网络。基本配置格式包括ssid、psk、key_mgmt再加上一些Wi-Fi 6相关的扩展字段比如ieee80211w开启PMF保护。我们平台对外提供两种工作模式Station模式和SoftAP模式。Station模式用于设备连上用户的AP路由器SoftAP模式用于设备首次配网时的临时热点用户可以通过手机连接热点完成配网。两者同时并存的需求后面也做了用P2P并发或者切换的方式实现同一网卡同时联外网和开热点。在实际调试Wi-Fi 6特性时可以用iw dev wlan0 info查看协商到的能力如果网卡和AP都支持Wi-Fi 6会显示HE capabilities连接时也能看到协商速率明显高于Wi-Fi 5。TWT的验证稍微复杂一些需要通过iw dev wlan0 set bitrates等命令配合测试我们先用ping延迟来观察休眠唤醒对延迟的影响再通过功耗测试确认TWT确实生效。连接管理daemon我们是用C语言写的通过wpa_supplicant的控制接口收发命令监听事件上报。比如设备接入断开、IP分配完成、信号强度变化这些事件daemon都可以实时感知并执行相应的业务逻辑。这一步是整个平台能否稳定运行的关键也是市面上很多方案做不好的地方。4. 调试实录两个印象深刻的翻车现场4.1 CANoe报no hardware license问题出在哪项目中期我们需要做车载以太网的互通性测试所以引入了Vector公司的CANoe工具。结果在测试环境里同事的电脑打开CANoe时直接弹出一个错误no hardware license。第一次遇到这个报错的小年轻当场就懵了以为是软件安装有问题重装了两遍还是老样子。其实CANoe的license机制是这样的软件授权有三种形式——本地USB加密狗dongle、单机激活授权、网络浮动授权Floating License。如果开发机上插着USB dongle优先从dongle读取授权如果配置了浮动授权则需要在启动时连接license服务器获取一个可用节点。报no hardware license通常意味着授权链路没走通。我们当时排查的顺序是先打开Vector License Client看授权状态。软件里能看到本地dongle是否被识别浮动授权列表还剩多少可用节点。接着检查电脑管理器里的FlexNet授权服务是否在运行这个服务主要负责浮动授权的分发和回收。我们还遇到过一种情况之前的测试会话没有正常释放授权节点被占满新的CANoe实例就拿不到license了。重启FlexNet服务或者重启电脑后问题通常能得到解决。还有一个经常被忽略的坑是系统时间和license服务器时间不同步。CANoe的授权体系对时间戳比较敏感时间差超过允许范围就会拒绝授权。设备平台开发时测试机最好开启NTP自动同步否则这种抽风式报错会反复出现。4.2 Windows提示无法设置移动热点竟然和Wi-Fi驱动有关另一个让我印象深刻的翻车现场发生在我们的Windows开发机上。某天下午测试人员需要在现场通过笔记本的移动热点给设备供网结果Windows弹出一条提示我们无法设置移动热点因为你的电脑未建立以太网、wi-fi或手机网络数据连接。关键是这台笔记本明明连着公司的Wi-Fi网速还飞快。第一次遇到这个报错的人估计都会懵电脑明明联网了Windows却告诉我没有连接。实际上这个提示的意思并不是电脑没网而是Windows移动热点的底层依赖没有就绪。移动热点依赖的是微软Wi-Fi Direct虚拟适配器和网络共享服务ICSInternet Connection Sharing。如果电脑的物理Wi-Fi网卡驱动更新后不再支持承载网络或者虚拟适配器被禁用、卸载就会导致这个报错。排查命令也不复杂在管理员权限的命令行里执行netsh wlan show drivers看支持的承载网络一项是不是是。如果不支持说明当前驱动禁用或移除了hosted network功能。我去设备管理器里查了一下发现Microsoft Wi-Fi Direct Virtual Adapter这个设备被标记为禁用。原因是我们前两天给这块笔记本的Intel无线网卡更新了驱动新驱动默认关闭了虚拟热点相关的功能。解决办法有两种要么在网卡驱动的属性设置里打开相应开关具体名称在不同厂商驱动里不一样常见的有Virtual WiFi、Wi-Fi Direct、Extend range等选项要么回滚到之前能正常开热点的驱动版本。我们在项目上最终是回退了驱动因为新版驱动对我们设备测试没有实际收益没必要为了升级而升级。这个事给我的教训是开发机上的驱动和工具链版本都应该纳入项目组统一管理别谁手痒就点一下驱动更新。5. 配套经验与避坑清单5.1 无线调试的基本装备做Wi-Fi硬件平台开发不能只靠ping通不通来判断好赖。我们项目里常备的调试手段包括用频谱仪加衰减器看射频信号质量用wpa_supplicant的debug模式抓连接流程日志用Wireshark配合无线抓包工具看空口报文。这些手段分别对应不同层的问题频谱仪看硬件射频通路wpa_supplicant日志看协议交互Wireshark看实际数据帧交互是否符合预期。特别是做Wi-Fi 6新功能验证时空口抓包几乎是必须的。比如验证TWT节能机制需要在抓包工具里看是否出现TWT setup和teardown帧只看驱动日志是看不到这些协议细节的。手里有一套能抓空口包的工具排查问题效率能提高一倍。5.2 问题排查速查表问题现象可能原因解决思路dmesg报firmware load failed固件文件缺失或文件名不匹配检查/lib/firmware/mrvl/下文件与驱动期望是否一致SDIO总线扫描不到Wi-Fi设备reset GPIO未正确配置或上电时序异常核对设备树GPIO配置用示波器查reset/power时序wlan0出现但连接即断开供电不足或天线匹配问题用电源单独供电测试用频谱仪检查射频功率连接成功后速率低信道带宽协商失败AP端信道拥塞检查AP配置确认80MHz带宽是否开启换信道对比移动热点无法开启Wi-Fi Direct虚拟适配器被禁用或驱动不支持netsh wlan show drivers检查承载网络支持状态CANoe提示no hardware licensedongle未识别、license服务异常或节点占用在Vector License Client中查看授权状态重启FlexNet服务Linux下AP模式无法启用wpa_supplicant配置错误或驱动不支持AP模式查wpa_supplicant日志用iw list查看驱动能力列表这个表格是我们在项目交付时整理给运维团队的基本覆盖了常见的现场问题。实际使用中90%的Wi-Fi问题都能在上表找到对应的排查入口。5.3 设备平台开发到现在的几点体会等到项目做完回头看整个流程有几点心得值得单独说一说。第一硬件平台开发一定要先保证有线侧信道可用再调无线侧。我们的Zynq板卡上预留了以太网口这是最后的逃生通道无线怎么折腾都不至于让设备完全失联。第二工具链版本的统一比想象的更重要。Vivado、Vitis、Linux内核、驱动firmware每一个组件的版本都建议锁定做成一个环境清单否则排查问题时根本说不清楚谁和谁不兼容。第三license和授权这类软环境问题也要当作硬件问题来对待。这次CANoe的license故障让我们意识到测试工具的授权管理同样是项目风险的一部分需要提前规划、纳入变更管理不应该在测试前一天才想起去借授权。最后Wi-Fi硬件的升级不只是换个模块这么简单从射频性能验证到协议特性测试再到上层业务对接是一条完整的链路。设备平台能否真正稳定运行取决于每个环节是否都有人盯紧、有文档沉淀。这次项目的经验沉淀下来后续再上新的无线硬件时我们已经有了一套从选型到调试的标准动作。个人最大的体会是做硬件平台开发心态要稳问题总比办法多但方法对了总能一步步解开。