ESC
开源 2 分钟阅读

w1700k-sdr:将 Wi-Fi 7 路由器改造成 320 Msps 宽带软件定义接收器

开源项目 w1700k-sdr 将 Gemtek W1700K Wi-Fi 7 路由器改造成宽带软件定义接收器:MediaTek MT7996 射频以最高 320 Msps 采集 14 位原始 IQ 数据,Airoha AN7581 SoC 经 10 GbE 零拷贝传输,Linux 主机在浏览器中实时呈现 2.4/5/6 GHz 全频段频谱与瀑布图。项目固件完全自研,逐寄存器逆向了 MediaTe

来源:GitHub

W1700K SDR

将 Gemtek W1700K Wi-Fi 7 路由器改造成宽带软件定义接收器。路由器的 MediaTek MT7996 射频以最高 320 Msps 采集原始 14 位 IQ 数据,其 Airoha AN7581 SoC 通过 10 GbE 将数据流式传输,Linux 主机则在浏览器中将其呈现为实时频谱和瀑布图,接收器控制界面就在旁边。

2.4 GHz 频段实况:频谱与瀑布图

整个 2.4 GHz 频段以 320 Msps 实时呈现,抽取滤波器的滚降已在数据流中校正(“flatten”):对每个采样点做 262,144 点 FFT,每秒 100 个频谱(此录制以每秒 50 帧运行)。

MT7996 只运行我们自己的固件:一个 ROM 补丁,以及由本仓库构建的 WM 和 WA,不含任何 MediaTek 代码。它从冷上电开始自行启动射频——对照 MediaTek 自己固件的运行轨迹,逐寄存器解码其初始化和校准过程——并从主机接收命令(本振频率、采样率、捕获、数据流、增益、滤波器)。参见 docs/architecture.md 和 docs/roadmap.md。

它能做什么

采样率每个频段 40、80、160 或 320 Msps 的 14 位复数 IQ,与本振和滤波器无关;频段 2 上还支持 640/2(640 Msps 的隔点采样:±155 MHz 内平坦,但 160–320 MHz 外的信号会混叠进来)
频段2.4 GHz(MT7976)、5 GHz 和 6 GHz(两颗 MT7977);切换频段只需对运行中的数据流做一次寄存器写入
调谐无信道概念:本振可以是频段合成器能锁定的任意 Hz(单元 A:2.081–2.748、4.647–7.509 和 4.707–7.576 GHz),步进为 2.98 Hz(2.4 GHz)或 11.9–14.3 Hz;数据流中重调约 1 ms
前端AGC 或手动 LNA/基带增益;模拟滤波器 20–320 MHz
传输射频通过 DMA 写入 SoC DRAM 中 1 GiB 的环形缓冲区;内核将每 8 KiB 分片作为一个 UDP 数据报,零拷贝地从 10 GbE 端口发出;320 Msps 时,一半分片在射频自己的核心上打包为每采样对 28 位,以适配链路(无损、自动)
主机w1700k-stream 接收导出数据,并将 IQ 流提供给主机上的每个消费者(共享内存、复数 int16、带间隙标记),可选地对采样本身应用抽取滚降校正(“flatten”);w1700k-spectrum:对每个采样做 262,144 点 FFT,每秒 100 帧,浏览器 UI,实时控制;sdr-recv 录制数据流

截图

2.4 GHz 下的 Web UI

320 Msps、flatten 后的 2.4 GHz:Wi-Fi 帧和较短的跳频突发,底噪在频段边缘保持平稳。Stream 面板显示链路承载 9.75 Gbit/s,一半分片被打包,每个采样都经过变换。

5 GHz 下的 Web UI

5170–5330 MHz 的两个繁忙的 80 MHz Wi-Fi 信道,以 flatten 后的 320 MHz 视图呈现。

两个信道边缘放大到 24 MHz

放大到 5250 MHz 附近的 24 MHz:两个信道的边缘及之间的保护间隔,分辨率 1.22 kHz。

仓库

路径
platform/SoC 上运行的内容:我们的 U-Boot、带板级补丁的 Linux 6.18、只读 BusyBox 根文件系统
kernel/w1700k_sdr/MT7996 驱动(固件下载、DMA 环、10 GbE 导出、固件命令邮箱)及其单元侧客户端
firmware/我们的 MT7996 固件:ROM 补丁、WM(射频启动和频段设置、数据流、射频控制)和 WA(打包器)
host/w1700k/主机控制:固件加载、数据流、以固件命令形式进行的射频控制;w1700k serve 提供 Web UI
host/stream/w1700k-stream,主机上导出数据的唯一接收者:共享内存中的 IQ 流供每个消费者使用,以及滚降校正
host/spectrum/频谱/瀑布图 Web 服务器
host/recv/sdr-recv,数据流录制器
init/从原厂系统安装、更新、恢复、回到原厂系统
include/hw/寄存器参考:所有已知的 MT7996、A-die 和 AN7581 寄存器,以 C 头文件形式
docs/架构、路线图

入门

你需要一台 W1700K(HW 1.x)或 W1700K2(HW 2.1)、一个接在其控制台排针上的 3.3 V USB 串口适配器、一根接到 lan3 端口的以太网线用于安装,以及主机上一块接到 wan 端口(10GBASE-T;X710 配铜缆 SFP+ 模块可行)的 10 GbE 网卡用于 IQ 数据流。两个版本运行相同的镜像。大多数设备搭载 W25N04KV NAND;部分 W1700K2 搭载 W25N04LV(ID ef 8b 23),已支持但从未在实机上运行过:init/install 遇到它会停下,直到你传入 --i-dont-care-about-nand-corruption,并要求你提供它的原始转储(init/rawdump)给维护者。

make                                   # 全部构建,来自公开源码(约 10 分钟加上下载时间)
make check                             # 测试套件

sudo init/host/link up IFACE           # 接到 lan3 的网卡上配置 192.168.1.10/24
sudo init/host/tftp-forward enable IFACE
init/install                           # 备份 NAND、安装、保存射频校准数据

sudo init/host/link up IFACE10G 10.77.0.10/24 9216    # 10 GbE 数据流链路
host/stream/build/w1700k-stream &                      # 数据流服务,供本主机的所有消费者使用
host/spectrum/build/w1700k-spectrum --controller "host/bin/w1700k serve" --listen 0.0.0.0:8073

然后打开 http://HOST:8073/ 并按 ▶。首次启动会加载射频固件并启动射频(约 2 秒)。不使用浏览器时,同样的操作对应 host/bin/w1700k load|start|band|tune|gain|filter|stop|status。

构建要求:C/C++ 编译器、make、git、Python 3.10+、常规 Buildroot 前置依赖、clang、ld.lld、llvm-objcopy 和 llvm-readobj(RISC-V 固件)、openssl(固件容器加密),以及数据流服务和频谱服务器所需的 libfftw3-dev 和 zlib。不需要下载任何厂商固件。

使用前须知

  • 我们的固件仅支持接收。 它不运行任何 MediaTek 的发射校准,并保持 MAC 的发射路径禁用;在 5250 MHz 进行的无缝观察在整个负载期间未见任何发射,而 MediaTek 的固件会发射满功率突发。尽管如此,不要在没有衰减器的情况下将天线端口直接接入灵敏仪器。
  • 我们的 ROM 补丁不写 eFuse。 MediaTek 自 2025 年起的 ROM 补丁在首次运行时会永久烧录一个 eFuse 门位(使用 MediaTek 自己的驱动也是如此);运行过一次的设备就会带有该位。
  • 安装会替换原厂操作系统。 init/install 首先将 NAND 数据复制到主机;请保留该副本。init/restore 将其写回并使设备回到原厂固件。
  • 访问未公开的 MT7996 或 AN7581 地址可能导致 SoC 挂起或射频卡死,直到断电重启。include/hw/ 标记了所有已知的危险。

许可证

MIT,但 Linux 驱动和内核补丁(GPL-2.0-only)、U-Boot 补丁(GPL-2.0+)、驱动的用户空间头文件(GPL-2.0 WITH Linux-syscall-note)以及源自 MediaTek mt76 驱动的文件(BSD-3-Clause-Clear)除外。参见 LICENSE。