# 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). ## ⭐ Таблица разделов flash модуля (найдена @0x15e828) ``` Bootloader | Application | RF Firmware | NET info ``` Чип на базе **Beken SDK** (API `bk_gpio_*`, `bk_pwm_*`, efuse-cal, RTOS + RT-Thread FAL/EasyFlash). Разбивка 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 для реверса. ## Реальные следующие шаги (реверс+правка+тест) 1. **API-поверхность:** извлечь полный список ATC_*/SP*-команд (это протокол 0x68 между AT32 и модулем) — карта того, чем вообще можно управлять. Уже частично в docs/fm100b-commands.md. 2. **WebRTC-параметры:** найти конфиг NSX/AGC (режим/пороги) в коде, изменить, перешить модуль (режим «Обновление DMR чипа»), проверить звук/приём. Это и есть «поменять и посмотреть заведётся ли». 3. **EasyFlash NV:** распарсить NV-регион (cal) во flash-дампе — прямой доступ к калибровке без live-протокола.