Роутер OpenWrt One переделали в SDR-приёмник с полосой 40 МГц На GitHub вышел проект openwrt-one-sdr. Из роутера OpenWrt One на MediaTek MT7981B с радиотрактом MT7976 сделали широкополосный SDR-приёмник: сырые I/Q по 14 бит, 40 млн отсчётов в секунду из диапазонов 2,4 и 5 ГГц. Двухъядерный Cortex-A53 гонит поток по 2,5 GbE на компьютер в формате VITA 49, там спектр и водопад в браузере. По данным репозитория: ⚙️ приём 2,4 и 5 ГГц, полоса канала 40 МГц, частота дискретизации 40 млн отсчётов/с, 14 бит на пару I/Q ⚙️ перестройка идёт по центрам блоков HE40, а не по основному каналу: 2422-2462 МГц с шагом 5 МГц на 2,4 ГГц и 5190 или 5230 МГц на 5 ГГц ⚙️ 5 ГГц ограничен U-NII-1, 5170-5260 МГц ⚙️ перестройка или смена диапазона занимает около 25 с, это перезагрузка радиомодуля Wi-Fi ⚙️ только приём: во время захвата MAC заблокирован на передачу, а при загрузке и после остановки штатный стек Wi-Fi передавать может Подход здесь другой, чем в w1700k-sdr. Там прошивку MediaTek выкинули и написали свою целиком, здесь её оставили штатной и управляют ей из Linux. Всё, что нужно, - производитель на ассемблере nds32 размером 1660 байт, впаянный в диспетчер команд прошивки Wi-Fi-модуля. Он идёт по указателю записи блока захвата ICAP и выкладывает отсчёты в кольцо DMA, дальше их забирает драйвер mt76. Кросс-компилятор не обязателен: в репозитории лежит собранный кусок, apply-producer.py вносит те же правки в стоковую прошивку с самой платы и проверяет контрольную сумму. Патч на закрытую прошивку MediaTek не тиражируют, каждый собирает под свою плату. Регистровую часть удалось унаследовать. MT7981 стоит на той же A-дие MT7976, что и MT7996, и блок захвата у них по одним и тем же адресам шины с теми же значениями сброса. Расшифровку радиотракта брали с MT7996. Формат 14 бит: I в битах 29:16, Q в 13:0, без знакового расширения. На 2,4 ГГц берётся каждый второй упакованный отсчёт, на 5 ГГц все, из-за чего шаг отсчёта разный, 8 байт против 4. С пропускной способностью вышло впритык. 40 млн отсчётов в секунду по 16 бит на I и на Q дают 1,28 ГБ/с, это чуть больше половины 2,5 GbE. Пакеты собирает ядро: Ethernet, IPv4 и UDP лепятся прямо в ядре и уходят мимо пользовательской программы, промежуточной пересылки нет. В каждом UDP-пакете 1448 байт, это 360 пар I/Q. Контекстный пакет VITA 49 с несущей, частотой дискретизации и форматом данных идёт раз на 128 пакетов с отсчётами, приёмник сначала ждёт его. Восемьдесят мегаотсчётов в секунду проверяли, но результат автор трактует осторожно. В 16 бит такое не влезает, нужно 2,56 ГБ/с. В 8 бит один ограниченный прогон отдал 819,2 млн слов отсчётов за 10,24 с, но внутри были повторы. То есть это не 80 МГц полосы и не 80 млн независимых отсчётов в секунду. Упаковка 14 бит в 28 бит на пару уменьшила бы поток ещё на 12 процентов, но пакет под это на плате так и не сделан. С драйвером пришлось повозиться. Периодический опрос статистики по MCU отваливается по таймауту, и штатная проверка состояния чипа после этого перезагружает прошивку и рвёт поток примерно на 4-й секунде. Обновление состояния точек доступа блокирует путь приёма событий от модуля, и без обхода буфер захвата переполняется раз в 150-200 с. В обоих случаях обход сделали в mt76: опрос отключается, а таймаут возвращает ошибку вместо перезагрузки. 🟢Подписаться на канал 🟢Подписаться в MAX
ПОЛЕЗНАЯ НАГРУЗКА
Subscribers
13.8K
+0 24h
Reach per post (ERR)
26.1%3.6K avg views
Posting
5.3/day
last 5 hours ago
Reactions per 1K views
2.1
❤ 😁 🔥
Views over time
| When | Views |
|---|---|
| 19 Oct 2026, 23:46 | 0 |
| 10 Nov 2026, 08:53 | 4.1K |
Who shared this post
Posts in other channels we index that link to this one. (Forwards with a hidden source can't be traced.)
Nobody yet.