docs/fm100b-firmware-re.md: функциональная разбивка 172 команд модуля. SPKirisunEffectCnf -> общий Beken-378x кодбейс с Kirisun/др. брендами. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01NikMGoqQWWk9wy2ww2vJAr
106 строки
10 KiB
Markdown
106 строки
10 KiB
Markdown
# 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).
|
||
|
||
## Возможности модуля (по API, 172 команды)
|
||
- **SMS:** `ATC_Msg`, `ATC_SMSProc`, `ATC_SmsmodeSetReq`, `ATUploadRxSmsCnf`, `ATCRxSmsSendAck` — полный DMR-SMS.
|
||
- **Шифрование голоса:** `ATC_CurChKeySetReq`, `ATC_SetEncrypt`, `ATVoiceEncryptQuery`, `ATC_KeyHandle_*`.
|
||
- **DMR-вызовы:** call setup/roaming (`SPRoamList`), группы/контакты, digital monitor, emergency (`ATRecvEmgCallInd`), busy-status.
|
||
- **Аудио/голос:** `ATVoiceEncCnf/DecCnf`, `ATCRecvAmbedataCnf` (AMBE-кадры), `SPATVoicedata` (сырой голос-путь),
|
||
кодек-гейны, DTMF, `ATC_PlaySingleToneReq`, `SPKirisunEffectCnf` (→ общий кодбейс с **Kirisun**).
|
||
- **Запись/данные:** `ATC_LocalRecordPlayReq`/`ATC_RecordDataPlayReq` (запись голоса!), inband-данные
|
||
(`SPSendInBandDataReq`/`SPCclSpInBandDataInd`).
|
||
Вывод: модуль — универсальный Beken-378x DMR/intercom SoC, используемый разными брендами
|
||
(Radtel/Kirisun/iRadio). Многое из этого можно дёргать по 0x68 через мост (осторожно — только Query/Read вслепую).
|
||
|
||
## Реальные следующие шаги (реверс+правка+тест)
|
||
1. **API-поверхность:** извлечь полный список ATC_*/SP*-команд (это протокол 0x68 между AT32 и модулем)
|
||
— карта того, чем вообще можно управлять. Уже частично в docs/fm100b-commands.md.
|
||
2. **WebRTC-параметры:** найти конфиг NSX/AGC (режим/пороги) в коде, изменить, перешить модуль
|
||
(режим «Обновление DMR чипа»), проверить звук/приём. Это и есть «поменять и посмотреть заведётся ли».
|
||
3. **EasyFlash NV:** распарсить NV-регион (cal) во flash-дампе — прямой доступ к калибровке без live-протокола.
|