Как я превратил модем LG D325 в SDR‑приёмник и принял на него Meteor

—

от автора

Этот снимок облаков в инфракрасном канале принял телефон LG D325 2014 года. Без RTL‑SDR и без внешнего радиочипа: только собственный сотовый модем телефона, которому я поменял 2 672 байта в прошивке.

Meteor‑M N2-3, HRPT, канал MSU‑MR 5 (ИК), ночной пролёт. Принят на LG D325.

Проект называется D325f‑SDR. Модем отдаёт в Android сырые IQ‑отсчёты: 7,68 MS/s, около 5 МГц полосы, 8 бит. Телефон сам рисует спектр и водопад, демодулирует AM, FM, SSB и CW и пишет IQ в файл. Ниже 1000 МГц роль гетеродина играет Bluetooth того же телефона, это, пожалуй, самая необычная часть.

В статье расскажу, как это устроено: доработка платы, патч прошивки модема Qualcomm Hexagon, ядро, приложение, измерения в сравнении с RTL‑SDR V4 и приём спутников на 1,7 ГГц. Всё открыто: GitHub, лицензия GPL-3.0. Видео на 3 минуты — YouTube.

https://youtu.be/WKFZM0AXKjU

В каждом телефоне уже есть SDR

Современный сотовый модем — это и есть программное радио. Радиочасть (в LG D325 это трансивер семейства WTR) переносит сигнал в нулевую промежуточную частоту и оцифровывает, а всё остальное — демодуляция, синхронизация, декодирование — делает программа на DSP. В телефоне стоит Qualcomm MSM8610 (Snapdragon 200), в нём DSP Hexagon с прошивкой модема M8610B‑AAAANAZM-1.0.6047.

Проблема в том, что эти IQ‑отсчёты никогда не покидают модем. Android видит только готовые данные: звонки, SMS, пакеты. А ещё модем слушает только свои сотовые диапазоны, и на его входе стоят фильтры этих диапазонов.

Значит, чтобы сделать из модема приёмник, нужно три вещи:

  • Подать сигнал в обход фильтров — это железо.

  • Заставить модем настраиваться на любую частоту и отдавать IQ наружу — это патч прошивки модема.

  • Забрать IQ в Android и обработать — это ядро, вспомогательная программа и приложение.

тракт сигнала D325f‑SDR · 7 звеньев

Ниже 1000 МГц к принимаемому сигналу подмешивается несущая Bluetooth — об этом отдельный раздел ниже.

Железо: два провода и гнездо наушников

Антенну нужно подать прямо на линии приёма перед трансивером, в обход дуплексеров и фильтров. Я подпаял два тонких провода: к тракту B8 (у дуплексера FL2002, ближе к трансиверу) и к тракту B1 (у FL2001). Провода выведены на гнездо наушников 3,5 мм.

Точки подпайки B8 и B1. Рисунок перерисован мной по фото платы, не в масштабе.

Тонкий провод на плате телефона легко оторвать вместе с пятачком, поэтому все спайки я залил УФ‑отверждаемой паяльной маской: точечно наносил пинцетом и засвечивал УФ‑лампой. Это хорошо видно в видео.

Распиновка гнезда получилась такая:

Контакт

В телефоне

В переходнике SMA

Ring

обход B1

центр SMA — штатно

Tip

обход B8

центр SMA только для 1090 МГц

Sleeve

антенна Wi‑Fi/BT

не подключён

Антенна подключается через самодельный переходник SMA → 3,5 мм, обёрнутый медной фольгой. Корпус SMA я намеренно оставил неподключённым: с ним приём заметно хуже.

Патч модема: 2 672 байта в прошивке Hexagon

Патч меняет шесть файлов прошивки модема, всего 2 672 байта, и делает три вещи:

  • Команда в заводском режиме. В режим заводского теста (FTM) добавлен обработчик команды FTM902, через него потоком управляет Android.

  • Производитель по прерыванию. На каждый аппаратный блок IQ он копирует отсчёты в кольцевой буфер в общей памяти SMEM, в формате CI8 (8 бит I и Q).

  • Хук расчёта PLL (D3FQ). Перед штатным расчётом синтезатора можно подставить любую частоту в герцах, а не только сетку каналов LTE. Поток стартует только после того, как модем сообщит о захвате PLL.

Кольцо — 126 976 байт, это всего около 8,3 мс на 7,68 MS/s. Забирает его нативная вспомогательная программа с root: она переводит модем в FTM через DIAG, настраивает частоту, запускает кольцо и передаёт блоки приложению, а на выходе возвращает обычный режим. Самый длинный задокументированный приём — 158 с, 1 186 008 блоков без потерь.

Захват PLL на прямом приёме подтверждён на 1700 и 2120–2170 МГц, а в измерениях ниже — до 2400 МГц. 5000 МГц уже не захватывается, и патч такую частоту отклоняет.

Как ставится патч

Прошивку Qualcomm я не распространяю. Патчер — отдельное приложение Modem Patcher — применяет разницу к собственному modem‑разделу телефона:

  • Проверяет модель телефона и SHA-256 шести изменяемых файлов; с чужой прошивкой не работает.

  • Save dump — сохраняет дамп раздела, его нужно скопировать на ПК.

  • Apply patch — записывает и сразу читает каждую запись обратно, в конце лога — PATCHED и READBACK_VERIFIED.

  • После перезагрузки версия baseband меняется на P8610B‑AAAANAZM-1.0.6047.

Restore stock возвращает сток, а для оборванной записи есть восстановление из дампа и ZIP‑файлы для TWRP.

Ядро и загрузка с microSD

Ядру LineageOS 14.1 нужна одна реальная правка: при загрузке оно выделяет элемент SMEM № 471 на 128 КиБ, и туда пропатченный модем пишет кольцо IQ. Патч лежит на GitHub вместе с полным конфигом, а полный исходник дерева — в релизе рядом с boot.img, как требует GPL.

Есть и необычная деталь: у моего телефона умерла встроенная память eMMC, и он целиком работает с microSD‑карты с той же разметкой разделов, что и у eMMC. Чтобы Android увидел карту как основной диск, в дереве устройств выключен контроллер eMMC: SD‑карта становится mmcblk0, и штатные номера разделов в fstab указывают на неё.

Поэтому образов два:

Образ

Для какого телефона

Статус

boot.img

работает с microSD, контроллер eMMC выключен

работает на моём телефоне

boot‑emmc.img

работает со встроенной eMMC, то же ядро и ramdisk

на телефоне пока не проверен

Разница между ними — одно свойство в дереве устройств: status у sdhci@f9824900, «disabled» или «ok». Скрипт, который делает второй образ из первого, тоже в репозитории.

Приложение

Интерфейс и DSP взяты из RF Analyzer Денниса Манца (Dennis Mantz), к нему я добавил источник «LG D325 · SDR». В версии 2.0 есть:

  • спектр и водопад в реальном времени, демодуляция AM, NFM, WFM, USB, LSB и CW;

  • запись IQ и звука, причём водопад и звук работают и во время записи; воспроизведение IQ‑файлов;

  • запись по расписанию при погашенном экране — удобно для спутниковых пролётов;

  • восстановление при сбоях модема: разрыв в записи заполняется нулями, и время в файле не съезжает;

  • контроль температуры и действия после записи;

  • переключатель инверсии IQ, настройки LNA, DVGA и Bluetooth, 13 языков.

Сетевых функций (сервер, стриминг) нет намеренно: пока Bluetooth работает как непрерывная несущая, Wi‑Fi на этом телефоне нормально не работает — у них один чип.

FM 102–109 МГц на экране телефона, через Bluetooth‑гетеродин.

Bluetooth как гетеродин

Сам модем строится только выше примерно гигагерца. Чтобы принимать FM, КВ и UHF, я использую Bluetooth‑чип того же телефона (WCN3620) как гетеродин. Приложение включает непрерывную несущую на 2402 + канал МГц, а модем настраивается на разность:

f_{\text{модем}} = (2402 + \text{канал}) - F

где F — частота, которую хочется принять. Несущая и принимаемый сигнал смешиваются на входе, и модем слышит разностную частоту. Например, для FM на 100 МГц и канала 0 модем стоит на 2302 МГц. Спектр при этом зеркальный, поэтому в приложении есть переключатель инверсии. Выше границы (в 2.0 по умолчанию 1000 МГц) модем принимает напрямую.

Так я принял FM‑вещание (в IQ видны стереопилот 19 кГц и RDS), аналоговое ТВ на 551,25 МГц и КВ на 8–15 МГц, включая речь на 14,970 МГц. Как именно несущая попадает в приёмный тракт, я измерениями ещё не определил.

Канал и LTE

Канал Bluetooth решает, где настроен сам модем, и это важно:

  • на КВ канал должен быть не выше 30 (2432 МГц), иначе PLL модема не захватывается;

  • если частота модема попадает в канал базовой станции (в основном LTE 1800 и 2300 МГц), поднимается вся полоса и приём пропадает. Канал надо подобрать так, чтобы модем оказался между несущими.

92 МГц: частота модема попала в канал LTE, и поднялась вся полоса. Помогает сдвиг канала Bluetooth.

Уровень мощности

У несущей 10 уровней мощности, от 0 до 9. Лучше всего у меня работает уровень 7. На 8 и 9 растёт только мощность в эфире, а приём становится хуже, поэтому в 2.0 по умолчанию стоит 7, а на 8–9 приложение показывает предупреждение. Измерения — в следующем разделе.

Измерения

Чтобы понять, насколько телефон годится как приёмник, я сравнил его с RTL‑SDR V4. Источник — CW‑сигнал HackRF, всё внутри экранированного бокса: источник и антенна приёмника внутри, наружу ничего не излучалось. На LG я записал 23 файла (CI8, 7,68 MS/s), на RTL‑SDR — 16 (CU8, 2,5 MS/s), с одним источником и одинаковым расположением антенн.

мои измерения, предварительные · 14 частот, где есть оба приёмника

Связь идёт через эфир, поэтому уровень на входе в дБм неизвестен: это сравнение двух приёмников, а не калиброванная чувствительность. На 1800–2400 МГц LG тоже принимает (SNR 41–51 дБ), там RTL‑SDR V4 сравнить не с чем. На 433 и 1565 МГц LG перегружался, эти точки на график не попали. На 1190–1565 МГц и выше 2400 МГц PLL у меня захватывается нестабильно. Моя гипотеза — недоступны калибровки NV, ведь eMMC мертва, но это я не проверял.

Второе измерение — мощность самой несущей Bluetooth на каждом уровне. HackRF в одинаковых условиях, без перегрузки: каждый шаг — 3–5 дБ, от 0 до 9 — 39 дБ.

мои измерения HackRF, 3 ноября 2026 · абсолютные значения — оценка

Абсолютную мощность я не мерил, график построен от данных даташита. С поправкой на усиление антенны цифры могут немного сдвинуться.

Спутники на 1,7 ГГц

Раз модем без проблем захватывает PLL на 1700 МГц, телефон должен слышать метеоспутники в L‑диапазоне. Антенна — самодельная спираль с рефлектором как облучатель спутниковой тарелки, запись на 7,68 MS/s, декодер — SatDump.

Спираль с рефлектором на 1,7 ГГц и тарелка, перед которой она стоит.

Meteor‑M № 2–3, HRPT. Пролёт принят на LG D325 и декодирован в SatDump, это тот самый снимок из начала статьи. Исходную IQ‑запись я, к сожалению, потерял, остались только кадры. Я проверил их своим декодером без SatDump: восстанавливается 2019 из примерно 2050 строк MSU‑MR. Пролёт ночной, поэтому изображение есть только в ИК‑каналах.

MetOp‑B, AHRPT, 1701,3 МГц. Здесь сигнал на самом пороге. Демодулятор QPSK держит сигнал (SNR ≈ 2–5 дБ), Viterbi и синхронизация кадров захвачены, но Reed‑Solomon ошибки уже не исправляет, и чистой картинки пока нет. В спектре записи чётко видна линия символьной частоты 2,333 МГц, на констелляции — QPSK. Для чистого изображения не хватает примерно 2–3 дБ: следующий шаг — LNA прямо у антенны и фильтр.

MetOp‑B AHRPT, фрагмент 3,9 с с LG D325: спектр, линия символьной частоты и созвездие QPSK.

Кадры Meteor, фрагмент IQ MetOp и записи несущей Bluetooth лежат в отдельном релизе с SHA-256 — можно проверить самостоятельно.

А другие телефоны?

Первый вопрос, который мне задают. Я пробовал три, и ни на одном пока не получилось то же, что на LG:

Телефон

Чип

Что получилось

Во что упёрлось

Redmi Note 8T

Snapdragon 665

снимки IQ через штатный FTM без патча модема, чувствительность очень хорошая

только штатные диапазоны LTE, нужны мой модуль Magisk и ядро

ASUS ZenFone 2 Laser ZE500KL

MSM8916

хук частоты работает, снимки IQ через FTM есть

не нашёл место в прошивке, откуда IQ можно непрерывно писать в общую память

Itel Vision 3

Unisoc SC9863A

—

модем не принимает изменённую прошивку из‑за подписи

Идея сама по себе общая: приёмник есть в любом модеме. Но на каждом чипе приходится заново искать, как настроить частоту, откуда взять IQ и как вывести их наружу, а на свежих телефонах ещё и обходить проверку подписи модема.

Ограничения и честные оговорки

  • Одна модель. SDR работал на двух LG D325f: на первом прототипе, который я потом вывел из строя доработками, и на нынешнем. Нужны root, TWRP, LineageOS 14.1 и стоковый baseband M8610B‑AAAANAZM-1.0.6047.

  • Нет калибровки. Измерения — сравнение с RTL‑SDR, а не чувствительность в дБм. Усиление пока фиксировано.

  • Маленький буфер. Кольцо в модеме — всего 8 мс, при перегрузке процессора или перегреве поток останавливается.

  • Риск для телефона. Патч пишет в раздел модема. Сначала копия Boot и дамп модема, потом всё остальное.

Передатчик. В режиме Bluetooth‑гетеродина телефон передаёт непрерывную несущую в диапазоне 2,4 ГГц. В России для устройств малого радиуса действия общего назначения в полосе 2400–2483,5 МГц предел — 10 мВт ЭИИМ (решение ГКРЧ № 07–20-03-001), в ЕС для такой несущей тоже 10 мВт, в США — около 0,75 мВт. Уровень 7 по моей оценке — около 3,5 мВт. Модуль Bluetooth сертифицирован для обычной работы, а не для непрерывной несущей, так что проверяйте правила своей страны. На прямом приёме выше 1000 МГц Bluetooth‑несущая не включается.

Прошивки. Ни прошивка Qualcomm, ни файлы LG в репозитории не распространяются: патч применяется на телефоне к его собственному разделу.

Что дальше

  • LNA у антенны и фильтр — чтобы получить чистую картинку MetOp.

  • Повторить всю установку ещё на двух D325 и проверить boot‑emmc.img.

  • Набор для загрузки с microSD без прошивок LG и Qualcomm — чтобы оживлять D325 с мёртвой eMMC.

Если у вас есть LG D325 или опыт с прошивками модемов Qualcomm и Unisoc — пишите в комментарии или в Issues на GitHub.

Ссылки

ссылка на оригинал статьи https://habr.com/ru/articles/1107808/