Files
rt-4d/docs/fm100b-firmware-re.md
T
viktorиClaude Opus 4.8 4e93d9a4dd Найдена таблица разделов flash модуля + путь к NV/vocoder
Beken-SDK чип. Разделы flash модуля: Bootloader|Application|RF Firmware|NET info.
Application = наш образ (control+WebRTC). RF Firmware = ОТДЕЛЬНЫЙ раздел с DMR-baseband/
AMBE (у нас нет). NET info = EasyFlash NV. Путь ко всему — дамп flash модуля через
протокол апдейтера. docs/fm100b-firmware-re.md.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01NikMGoqQWWk9wy2ww2vJAr
2026-07-24 04:37:10 +09:00

6.6 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 (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-протокола.