LinuxCommandLibrary
GitHubF-DroidGoogle Play Store

w1700k

Host control CLI for a W1700K Wi-Fi 7 software-defined receiver

TLDR

Print the receiver state
$ w1700k status
copy
Also read the active band's RF registers
$ w1700k status --rf
copy
Load firmware and bring the radio up from cold (about 2 s)
$ w1700k load
copy
Load and capture band 1 (5 GHz) afterwards
$ w1700k load --band [1]
copy
Start or stop the IQ stream over 10 GbE
$ w1700k start
copy
$ w1700k stop
copy
Switch band, sample rate, or LO
$ w1700k band [1] --rate [320] --lo [5250M]
copy
Tune the active band (any Hz the synthesizer locks)
$ w1700k tune [5250M]
copy
Automatic gain, or forced LNA and baseband
$ w1700k gain --agc
copy
$ w1700k gain --lna [2] --lpf [9]
copy
Set the analog filter (MHz)
$ w1700k filter [80]
copy
JSON control protocol on stdin/stdout (used by w1700k-spectrum)
$ w1700k serve
copy

SYNOPSIS

w1700k [--config path] command [options]

DESCRIPTION

w1700k is the Linux host client for W1700K SDR: firmware and tools that turn a Gemtek W1700K Wi-Fi 7 router (MediaTek MT7996 radio, Airoha AN7581 SoC) into a wideband receive-only software-defined radio. From a checkout it is `host/bin/w1700k`, or `PYTHONPATH=host python3 -m w1700k`. It talks to the unit over ssh and sends firmware commands only; the host never writes radio registers.load downloads the project's ROM patch, WM, and WA, writes the unit's calibration EEPROM into the WM, brings the radio up from cold, and sets each band's analog filter, LO, and sample rate. Capture is then start / stop. RF changes (tune, gain, filter, trim, band) are one firmware command each and can run mid-stream. A new sample rate stops a running stream, reconfigures, and restarts it.Bands are 0 (2.4 GHz, MT7976), 1 (5 GHz, MT7977), and 2 (6 GHz, MT7977). There are no Wi-Fi channels: each band has an independent LO, sample rate (40, 80, 160, or 320 Msps; 640/2 on band 2 only), and analog filter (20–320 MHz). Defaults after every load: band 0 at 2442 MHz, band 1 at 5250 MHz, band 2 at 6105 MHz, all 320 Msps with a 320 MHz filter.The IQ export is UDP over the unit's 10 GbE `wan` port. w1700k-stream is the host's one receiver of that export; w1700k-spectrum and sdr-recv attach to its shared-memory ring. Receiver state lives on the unit (`/tmp/w1700k-state.json`), so CLI calls and a serve session share it.

PARAMETERS

--config path

Configuration file. Default search is `$W1700K_CONFIG`, then `~/.config/w1700k/config.json`.

CONFIGURATION

~/.config/w1700k/config.json

Optional JSON. Keys include `unit.host` (default `192.168.1.1`), `unit.user` (`root`), `unit.sshkey`, `unit.knownhosts`, `unit.bindir` (`/usr/sbin`), `unit.module` (`/lib/modules/w1700ksdr.ko`), `eeprom`, `firmwaredir` (`<repo>/firmware/build`), and `export.interface` / `srcip` / `dstip` / `dstmac` / `port` / `ports` for the 10 GbE path (defaults `eth1`, `10.77.0.1`, `10.77.0.10`, port 7700, 8 source ports).
~/.local/share/w1700k/units/_SERIAL_/eeprom.bin
Per-unit RF calibration EEPROM saved by `init/install`. Without an `eeprom` key the host uses `~/.config/w1700k/eeprom.bin` if present, else that saved copy when exactly one unit has one.
W1700K_CONFIG
Alternate path to the JSON config.

COMMANDS

load [--band 0|1|2]

Load firmware and bring the radio up. Optional --band is the band captured afterwards.
band 0|1|2 [--rate 40|80|160|320|640/2] [--lo FREQ]
Capture another band, and optionally a new sample rate or LO. 640/2 is band 2 only.
start / stop
Start or stop the IQ stream. Packing follows the sample rate (raw through 160 Msps, lossless half-packing at 320).
status [--rf]
Print receiver state. --rf also reads the active band's synthesizer, filter, and gain.
tune FREQ
Set the active band's LO. Accepts forms such as `5250M`, `2.442G`, `2441.000123M`.
gain --agc | --lna 0..4 --lpf 0..9
Automatic gain, or forced LNA and baseband (LPF) steps.
filter 20|40|80|160|320
Analog filter of the active band, at any sample rate.
trim 0..31
Filter RC trim of the active band.
serve
Newline-delimited JSON on stdin/stdout: one request `{"id":N,"op":...}` per line, one reply per request, plus `state` / `progress` / `log` events. Operations include status, load, configure, start, stop, tune, gain, and filter.
push [--from DIR] [--to DIR]
Development: copy a built driver and unit-side clients to the unit (default destination `/tmp/w1700k`).
fw
Development: print WM and WA status blocks.

CAVEATS

Needs a W1700K, a 3.3 V USB serial adapter on its console header, Ethernet to `lan3` for install, and a 10 GbE NIC cabled to `wan` for the IQ stream. `init/install` replaces the stock operating system after copying NAND to the host; restoring stock needs a raw NAND writer, which this repository does not provide.The project's firmware is receive-only: it runs none of MediaTek's transmit calibrations and keeps the MAC transmit path disabled. Do not cable an antenna port straight into a sensitive instrument without an attenuator. Accessing undocumented MT7996 or AN7581 addresses can hang the SoC until a power cycle.Build the firmware first (`make -C firmware`); the host reads `firmware/build/firmware.json`. The export interface needs a jumbo MTU (at least 8236; 9216 is provisioned). A band whose synthesizer stays unlocked after a firmware reload needs a power cycle of the unit. Samples captured during a retune are invalid.The tools are built from the repository; they are not a typical distro package.

HISTORY

W1700K SDR is an MIT-licensed (kernel driver GPL-2.0) public project that reverse-engineers the W1700K's MT7996 radio into a wideband IQ receiver, with host control, a stream service, and a browser spectrum UI. The host CLI is the Python package under `host/w1700k`.

SEE ALSO

RESOURCES

Copied to clipboard
Kai