Реверс прошивки модуля FM100B: архитектура + что такое вокодер

docs/fm100b-firmware-re.md: образ = ARM(старт)+Thumb-2/FPU, 1.5МБ, без символов,
база RAM ~0x0360xxxx. Карта регионов. КЛЮЧЕВОЕ: «Vocoder» в прошивке = WebRTC
audio (шумодав NSX + AGC, открытый код), а НЕ AMBE. Сам AMBE — вне ARM-образа
(DSP/ROM A6), в прошивке только интерфейс ATVoiceEnc/Dec + RecvAmbedata. Найдены
open-source либы: EasyFlash (NV/калибровка), WebRTC (аудио). Честная оценка: свой
вокодер для эфирного DMR невозможен (нет AMBE-совместимости); реально моддить —
WebRTC-параметры, кодек-гейны, NV-калибровку, логику DMR.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01NikMGoqQWWk9wy2ww2vJAr
Этот коммит содержится в:
2026-07-24 04:28:45 +09:00
co-authored by Claude Opus 4.8
родитель f2617a2e79
Коммит 7c6c2dfea7
2 изменённых файлов: 59 добавлений и 5 удалений
+51
Просмотреть файл
@@ -0,0 +1,51 @@
# 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** (`b580` push, `ed4d` VPUSH, `f38b` MSR) — основной код 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).
## Реальные следующие шаги (реверс+правка+тест)
1. **API-поверхность:** извлечь полный список ATC_*/SP*-команд (это протокол 0x68 между AT32 и модулем)
— карта того, чем вообще можно управлять. Уже частично в docs/fm100b-commands.md.
2. **WebRTC-параметры:** найти конфиг NSX/AGC (режим/пороги) в коде, изменить, перешить модуль
(режим «Обновление DMR чипа»), проверить звук/приём. Это и есть «поменять и посмотреть заведётся ли».
3. **EasyFlash NV:** распарсить NV-регион (cal) во flash-дампе — прямой доступ к калибровке без live-протокола.