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

73 строки
6.6 KiB
Markdown
Исходник Ответственный История

Этот файл содержит неоднозначные символы Юникода
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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-протокола.