Files
rt-4d/docs/fm100b-firmware-re.md
T
viktorиClaude Opus 4.8 59e1acd36e КОРРЕКЦИЯ: SoC модуля = Beken 378x, НЕ Auctus A6/RDA8809
Прошивка: пути beken378\intercom, HAL bk_flash/bk_gpio/bk_pwm, app INTERCOM, DPLL-синтезатор,
EasyFlash+WebRTC. Прежняя идентификация Auctus A6/RDA8809 неверна (и объясняет молчание
RDA-debug: чип не RDA -> a6tools/AT+DMOFREQERR неприменимы). Обновлены: docs/fm100b-firmware-re.md,
пометка в docs/hf6853-auctus-a6.md, память. Калибровка идёт штатно через 0x68 SPCali (работает).

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

95 строки
9.0 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
```
**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 для реверса.
## Апдейтеры: кто что прошивает (реверс .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).
## Реальные следующие шаги (реверс+правка+тест)
1. **API-поверхность:** извлечь полный список ATC_*/SP*-команд (это протокол 0x68 между AT32 и модулем)
— карта того, чем вообще можно управлять. Уже частично в docs/fm100b-commands.md.
2. **WebRTC-параметры:** найти конфиг NSX/AGC (режим/пороги) в коде, изменить, перешить модуль
(режим «Обновление DMR чипа»), проверить звук/приём. Это и есть «поменять и посмотреть заведётся ли».
3. **EasyFlash NV:** распарсить NV-регион (cal) во flash-дампе — прямой доступ к калибровке без live-протокола.