docs/fm100b-firmware-re.md: пути дампа NV/RF Firmware — загрузчик Beken (экосистема openshwprojects, проверить протокол 378x) или flash-read в update-протоколе (в API нет). Обе — живые операции при владельце. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01NikMGoqQWWk9wy2ww2vJAr
11 KiB
FM100B (HF6853/Auctus A6) — реверс прошивки модуля и вокодера
Образы: firmware/FM100B_V1.2.0.32_20260130.bin (1 527 808 Б), FM100B_V1.2.0.13 (тот же размер).
Грузятся из внешнего SPI-flash модуля (см. rt4d-fm100b-is-hf6853).
Архитектура кода
- ARM. Вектор @0x0:
EA00000E(B reset) + 7×LDR PC,[PC,#0x14](undef/SWI/abort/IRQ/FIQ). - Reset @0x40: маскирует IRQ/FIQ, ставит режимы CPSR (SYS/FIQ/IRQ стеки) — классический ARM-старт,
затем переключается в Thumb-2 с FPU (
b580push,ed4dVPUSH,f38bMSR) — основной код Thumb-2. - Значит ядро XCPU — ARM с VFP (ARM11/Cortex-A/R класс), не Cortex-M. База RAM ≈ 0x0360_xxxx (по литералам векторов). Символов НЕТ (release), строки — PC-relative (базу в лоб по литералу не взять).
Карта регионов (по энтропии + строкам)
| Offset | Что |
|---|---|
| 0x000000 | вектора ARM + startup |
| 0x000100–0x0b0000 | основной код (Thumb-2), ent≈6.3 |
| 0x0b0000–0x0d0000 | разреженная регулярная таблица (нули + повтор 80 29), ent 2.5–3.6 — коэфф./LUT (не AMBE-кодбук) |
| 0x0cc000–0x0d0000 | символы/лог-строки аудио-подсистемы (ATC_*, «vocoder mutex», «codec ad/da») |
| 0x0d0000–0x160000 | код/данные |
| 0x15b000–0x15e000 | WebRTC-аудио: VocoderVersion\WebRTC\source\nsx_core.c (шумодав NSX), digital_agc.c (AGC); функции WebRtcNsx_ProcessCore, WebRtcAgc_CalculateGain |
| ~0x160000 | строки/константы, EasyFlash (NV) |
| 0x170000–конец | хвост (padding) |
⭐ Что такое «вокодер» в прошивке
«Vocoder» здесь = WebRTC audio processing (noise suppression NSX + digital AGC), т.е. пред/пост- обработка ГОЛОСА, а НЕ AMBE-кодек. Это открытый код (github WebRTC) — можно понять и тюнить.
Сам AMBE (DMR-кодек) — вне модифицируемого ARM-кода. В образе только ИНТЕРФЕЙС к нему:
ATVoiceEncCnf/ATVoiceDecCnf, ATCRecvAmbedataCnf/ATCRecvAmbe6sdataCnf, vocoder mutex.
AMBE выполняется на отдельном DSP-ядре/хардварном блоке A6 (RDA8809 двухъядерный; jhart99:
«вокодер на шине XCPU»). Отдельного DSP-блоба в этом образе по энтропии не видно → AMBE, вероятно,
в ROM чипа или в кремнии.
Используемые open-source библиотеки (найдены по строкам)
- EasyFlash (armink/EasyFlash) — NV-хранилище во flash. Здесь лежит калибровка (VCCN/Mod/PWR, см. docs/tuning-software-protocol.md). Формат документирован → можно читать/править cal прямо во flash-дампе.
- WebRTC (nsx, digital_agc) — аудио.
Честная оценка «свой вокодер»
- Заменить AMBE на свой кодек для эфирного DMR нельзя — другие рации ждут AMBE (нет совместимости).
- Сам AMBE в этом ARM-образе не лежит (DSP/ROM) → «переписать вокодер» здесь нечего.
- РЕАЛЬНО моддится: параметры WebRTC (агрессивность шумодава/AGC, качество звука), кодек-гейны
(
ATC_MICCodecGainSet/ATC_SPKCodecGainSet), DTMF, логика управления DMR, NV-калибровка (EasyFlash).
⭐ Таблица разделов flash модуля (найдена @0x15e828)
Bootloader | Application | RF Firmware | NET info
SoC модуля = Beken, серия «beken378» (пути beken378\intercom\ в образе; HAL bk_gpio_*/bk_pwm_*/
bk_flash_*; приложение INTERCOM; синтезатор DPLL; RTOS + RT-Thread FAL/EasyFlash + WebRTC).
Это ОКОНЧАТЕЛЬНАЯ идентификация — НЕ Auctus A6/RDA8809 (та гипотеза неверна; RDA-debug молчал именно
потому, что чип не RDA). Схемная маркировка чипа — «HF6853».
Разбивка flash модуля:
- Bootloader — загрузчик (в т.ч. режим «Обновление DMR чипа»).
- Application — ЭТО наш
FM100B_*.bin(управление + WebRTC-аудио + интерфейс к AMBE). - RF Firmware — ОТДЕЛЬНЫЙ раздел: DMR-baseband / модем / предположительно AMBE-DSP. У нас его НЕТ.
- NET info — NV-настройки (EasyFlash ENV — то, что нужно для доступа к хранимым параметрам).
Плюс сырые cal-таблицы во flash: manual_cal_write_flash, save txpwr tab to flash (темп-компенсация
мощности), efuse-cal ADC/батареи (efuse get cal, CodeOffset, dvbatref), кодек set dac vol dig/ana.
Как получить NV/RF Firmware: ДАМП flash модуля
Ни NV, ни RF Firmware в образе Application нет — нужен дамп SPI-flash модуля (все разделы).
Путь: протокол загрузчика/апдейтера (режим «Обновление DMR чипа» активен) — у него есть чтение flash.
Реверснуть команду чтения из RT-4D Upgrade V3_25_260205.exe (как сделали с тюнером) → безопасно
снять полный дамп → распарсить EasyFlash ENV (NET info) + разобрать RF Firmware (vocoder/DMR).
Это разблокирует СРАЗУ: NV-настройки, калибровку, и сам DMR-baseband для реверса.
ВАЖНО (проверено 24.07): RT-4D Upgrade шьёт AT32, НЕ модуль (см. ниже). Реальные пути дампа:
- Через загрузчик Beken модуля (download-режим): если модуль выставить в штатный UART-bootloader Beken, подойдёт экосистема bk7231tools / BKFIL / BK7231GUIFlashTool (openshwprojects) — они умеют backup/read flash. НО эти тулы под WiFi-чипы BK7231; протокол загрузчика 378x надо проверить. Как войти в download модуля из RT-4D — неизвестно (возможно boot-пин/спец-команда); ЖИВАЯ операция.
- Либо найти команду чтения flash в протоколе «Обновление DMR чипа» (у приложения её нет — см. API). Оба варианта — при владельце (риск). Ссылки: github.com/openshwprojects/BK7231GUIFlashTool.
Апдейтеры: кто что прошивает (реверс .NET)
- RT-4D Upgrade V3_25 (
Ido_Update, DES+RSA) прошивает AT32 (главный CPU рации), НЕ модуль: командыSend_Connect=39 33 05 10 c9,Send_Update=39 33 05 55 0e,Send_End=39 33 05 ee a7— это протокол загрузчика AT32 (тот же39 33 05, что вtools/flash_ps.py). Для дампа flash модуля НЕ годится. - Radio Tuning Software — калибровка модуля по 0x68 (см. docs/tuning-software-protocol.md).
- Отдельного PC-апдейтера МОДУЛЯ на рабочем столе нет; образы
FM100B_*.bin= раздел Application (0x175000 = ровно размер раздела), т.е. из вендорского пакета, не live-дамп.
API-поверхность модуля (172 команды, research/module-fw/module_api_commands.txt)
Полный список ATC_/SP-команд (протокол 0x68 AT32↔модуль). Важное:
- Калибровка (NV):
SPCaliic_FreqOpt/SPCaliFreqSetCnf(частота!),SPCali_AnaVccnOpt(VCCN аналог=0x80),SPCali_DigMod1Opt(девиация),SPCali_ChannelParamOpt,SPCali_AnaSQthOpt,SPCali_SQRXFreqOpt,SPCali_HeadGQParamOpt. Это NV-элементы, которые читаются/пишутся B-командами (0xB0–0xBD). - ⚠️
ATC_ClearNVdataReq— СТИРАНИЕ NV (не слать!). - Команды дампа flash в приложении НЕТ → полный дамп NV(«NET info»)/RF Firmware возможен только через загрузчик модуля (download-режим), не через рабочую прошивку. Это живая операция (при владельце). Сами cal-значения доступны и так — через B-команды (tools/tuning_read.py).
Возможности модуля (по API, 172 команды)
- SMS:
ATC_Msg,ATC_SMSProc,ATC_SmsmodeSetReq,ATUploadRxSmsCnf,ATCRxSmsSendAck— полный DMR-SMS. - Шифрование голоса:
ATC_CurChKeySetReq,ATC_SetEncrypt,ATVoiceEncryptQuery,ATC_KeyHandle_*. - DMR-вызовы: call setup/roaming (
SPRoamList), группы/контакты, digital monitor, emergency (ATRecvEmgCallInd), busy-status. - Аудио/голос:
ATVoiceEncCnf/DecCnf,ATCRecvAmbedataCnf(AMBE-кадры),SPATVoicedata(сырой голос-путь), кодек-гейны, DTMF,ATC_PlaySingleToneReq,SPKirisunEffectCnf(→ общий кодбейс с Kirisun). - Запись/данные:
ATC_LocalRecordPlayReq/ATC_RecordDataPlayReq(запись голоса!), inband-данные (SPSendInBandDataReq/SPCclSpInBandDataInd). Вывод: модуль — универсальный Beken-378x DMR/intercom SoC, используемый разными брендами (Radtel/Kirisun/iRadio). Многое из этого можно дёргать по 0x68 через мост (осторожно — только Query/Read вслепую).
Реальные следующие шаги (реверс+правка+тест)
- API-поверхность: извлечь полный список ATC_/SP-команд (это протокол 0x68 между AT32 и модулем) — карта того, чем вообще можно управлять. Уже частично в docs/fm100b-commands.md.
- WebRTC-параметры: найти конфиг NSX/AGC (режим/пороги) в коде, изменить, перешить модуль (режим «Обновление DMR чипа»), проверить звук/приём. Это и есть «поменять и посмотреть заведётся ли».
- EasyFlash NV: распарсить NV-регион (cal) во flash-дампе — прямой доступ к калибровке без live-протокола.