Files
viktorиClaude Opus 4.8 c10ab3c6f1 DMR-чип опознан по схеме: HF6853 = AUCTUS A6 (RDA8809), не SCT3258
Опознание БЕЗ разбора рации, по схеме RT4DDLT01 (Radtel v2.1):
DMR-модуль «FM100B» = один чип U700 HF6853 — одночиповый DMR-SoC
семейства Auctus A6 (внутри RDA8809): CPU + ВЧ-трансивер + DSP +
AMBE-вокодер + аудио-кодек в одном кристалле, прошивка во внешнем
SPI-flash, кварц 26 МГц. Прежняя версия «Sicomm SCT3258TD» неверна
(SCT3258 — baseband-only без ВЧ; и нативный протокол другой).

Скрытый ATE/CPS-интерфейс полностью реверснут (jhart99/a6tools,
вендорен в research/a6tools). Даёт КОНКРЕТНУЮ починку нашей
TX-проблемы: AT+GETFREQERR / AT+DMOFREQERR=N, offset=-2500+10*N,
±2500 Гц — наши ~1100 Гц внутри диапазона. Плюс DMR_ADJTXSYMDEV
(девиация), FGU_AFC, DMOSETPOWER, CPS chanInfo, дамп прошивки модуля.

- docs/hf6853-auctus-a6.md — идентификация + протокол + план TX-fix
- tools/a6_freqfix.py — заготовка тула (probe/read/write, не запускать вслепую)
- research/a6tools/ — вендоренный реверс (MIT), atcommands.md/cpecommands.md
- docs/dmr-tx-recovery.md, README — путь 0 (AT+DMOFREQERR) как лучший
- research/rt4ddlt01-dmr-module-sheet.png — рендер листа схемы DMR-модуля

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

110 строки
15 KiB
Markdown

# Radtel RT-4D — реверс, русификация и кастомный UI (Ru-4D)
Полный проект по модификации DMR-рации **Radtel RT-4D**: реверс-инжиниринг заводской прошивки V3.25, **русификация меню** (свой кириллический шрифт + перевод всех надписей), архитектурный разбор UI под полную переделку интерфейса, и **готовые флешеры** для раздачи конечным пользователям.
> Все правки делаются поверх стоковой прошивки бинарным патчингом. **Формат codeplug и serial-протокол не меняются — стоковый Radtel CPS продолжает работать.** Всё обратимо перепрошивкой стока (бутлоадер не трогается).
---
## Что сделано
-**Извлечена заводская прошивка** V3.25 из официального апгрейд-пакета (RAR → ZIP → .NET-апдейтер → Intel-HEX в строковой куче → бинарь).
-**Полный реверс** главного MCU (ARM Cortex-M4F, клон STM32F407) и DMR-баузбенда FM100B (ARM32): карта памяти, периферия, вектора/ISR, serial-протокол, формат codeplug, UI-архитектура.
-**Русификация:** узкий однобайтный CP1251-рендер (патч диспетчера + code-cave в blitter), **свой шрифт 33 заглавные буквы** (13 переиспользуют байты стокового ASCII-шрифта, 20 нарисованы), перевод **485 пунктов меню + ~300 надписей** на заглавный русский. Ребренд версии → **Ru-4D V3.25**.
-**Блюпринт кастомного UI:** точки перехвата главного цикла, «SDK» из вызываемых функций стока (отрисовка/клавиши/радио/DMR/codeplug), C-тулчейн (clang → thumbv7em) — доказано инъекцией своего экрана.
-**Флешер:** однофайловый веб-флешер (`.html`, WebSerial) со вшитой прошивкой — «в одну кнопку». Автономный `.exe` — в планах.
- ⏸️ **Полная переделка UI** — приостановлена: замена дежурного экрана ломает обработку клавиш (обход преамбулы стокового диспетчера). Возобновление — через *наложение* поверх стока. См. `docs/UI-Architecture.md`.
-**Открыт канал управления DMR-модулем FM100B.** Найден прозрачный мост ПК↔баузбенд (**включение с зажатой клавишей МЕНЮ**), расшифрована контрольная сумма кадров и **проверена на живой рации**. Инструмент — [`tools/fm100b.py`](tools/fm100b.py). Опрос подтвердил версию модуля **V1.2.0.32**, совпавшую с официальным образом.
-**Прошивка разложена на запчасти:** два процессора + внешний SPI = три независимых канала внедрения. Карта — [`docs/firmware-parts.md`](docs/firmware-parts.md).
-**Найден штатный загрузчик ресурсов** (`Unicode Download.exe`, внутри `FontVoicePicture`) — официальный путь замены **шрифтов, голосовых подсказок и картинок** (в т.ч. загрузочного логотипа) без патча MCU.
-**Разобран спектроанализатор REFV DualTachyon** — та самая реализация, которую хвалят пользователи. См. [`docs/refw-spectrum.md`](docs/refw-spectrum.md).
- 🎯 **DMR-чип опознан по схеме: FM100B = HF6853 / AUCTUS A6 (внутри RDA8809)** — одночиповый DMR-SoC (CPU+ВЧ-трансивер+DSP+AMBE-вокодер+кодек), прошивка во внешнем SPI-flash. См. [`docs/hf6853-auctus-a6.md`](docs/hf6853-auctus-a6.md). Скрытый ATE-интерфейс полностью реверснут ([`research/a6tools`](research/a6tools)) — **чинит частотную калибровку TX** (`AT+DMOFREQERR`) без Radtel. Родня: COTRE CO01D, GOCOM GD900, UV-4R. *(Прежняя версия «SCT3258» — ошибка по строкам вокодера; SCT3258 это baseband-only, HF6853 содержит ВЧ-тракт сам.)*
-**Приём Talker Alias** — позывной вызывающего крупно на экране (cmd `0x60`). Сборка [`tools/build_ta.py`](tools/build_ta.py).
-**Интерактивный агент** — управление FM100B через COM без перешивки ([`tools/build_agent.py`](tools/build_agent.py) + [`tools/agent.py`](tools/agent.py)); снят полный [список команд FM100B](docs/fm100b-commands.md).
-**Работа с SPI** — чтение/запись/восстановление codeplug и калибровки из дампа ([`tools/spi_read.py`](tools/spi_read.py), [`tools/spi_wr.py`](tools/spi_wr.py), [`tools/spi_restore.py`](tools/spi_restore.py)).
- ⚠️ **DMR TX-калибровка** — сбита в экспериментах, восстановление документировано в [`docs/dmr-tx-recovery.md`](docs/dmr-tx-recovery.md) (offset-компенсация / .updat Radtel / калибровка по прибору).
---
## Технический обзор
**Главный процессор:** ARM **Cortex-M4F**, STM32F407-совместимый клон (вероятно Artery AT32F407 — пишет расширенные RCC-регистры, которых нет у оригинала ST). Флеш `0x08000000` (бутлоадер `0x0..0x2800`, приложение с `0x08002800`, ~152 КБ). SRAM 128 КБ.
**DMR-баузбенд FM100B:** отдельный ARM-процессор (ARM-режим), ~1.5 МБ, RTOS + AMBE-вокодер + CSBK-сигнализация, общается с MCU по USART3.
**Прошивка (bootloader-протокол, 115200 бод):** хендшейк спамом `0xFF` до эха `0xFF` → двухфазный erase (`0x39 33 05 10/55`, чек-сумма seed `0x48`) → запись блоками 1 КБ (`0x57 …`), ACK `0x06`. Реализация: [`tools/flash_rt4d.py`](tools/flash_rt4d.py) и в обоих флешерах.
**Русификация (как работает):** `draw_string @0x08008A50` в стоке трактует байт ≥0x80 как двухбайтный GBK (полноширокий, 14px). Патч `cmp #0x80 → #0xFF` уводит `0x80–0xFE` на узкий однобайтный путь (7px), а code-cave в ASCII-blitter берёт глифы кириллицы из дописанной во флеш таблицы. Строки — CP1251. Подробно: [`docs/Russification.md`](docs/Russification.md).
---
## Структура репозитория
| Каталог | Что внутри |
|---|---|
| [`docs/`](docs/) | **Документация реверса.** `RE-Report.md` (полный разбор), `UI-Architecture.md` (блюпринт переделки UI), `Russification.md`, `highlight-value-editor.md`, и `subsystems/` — 7 детальных секций (main-loop, display, input, radio, dmr, codeplug, main-screen). |
| [`firmware/`](firmware/) | Извлечённая стоковая прошивка (`rt4d_stock_v3.25…bin` + `.ihex`), **русифицированная сборка** (`rt4d_ru_full.bin`), прошивка DMR-модуля (`FM100B…bin`). |
| [`tools/`](tools/) | Флешер (`flash_rt4d.py`) и сборочные скрипты: `build_ru_full.py` (русификация), `glyphs_ru2.py` (шрифт), `patch_fw.py`, `build_ui_home.py` (инъекция UI). |
| [`ui/`](ui/) | `my_ui.c` — кастомный UI-слой на C (компилируется clang'ом под Cortex-M4). |
| [`translations/`](translations/) | JSON-таблицы переводов (меню + rodata) и рабочие списки строк. |
| [`flasher/`](flasher/) | **Флешер для раздачи:** `Ru-4D_flasher.html` (WebSerial, прошивка внутри) + генераторы (`make_flasher.py`, `build_exe.py`). |
| [`backup/`](backup/) | `radio-spi-dump.bin` — полный дамп SPI рации (**калибровка + codeplug**, страховка). |
| [`research/`](research/) | Черновые скрипты разведки (реверс «в процессе»), для истории. |
---
## Как прошить рацию
Прошивается **русифицированная V3.25** (`firmware/rt4d_ru_full.bin`). Рацию нужно ввести в режим прошивки: **выключить → включить с зажатой тангентой PTT** → подключить USB-C.
1. **Просто (для любого пользователя):** открыть `flasher/Ru-4D_flasher.html` в Chrome/Edge → кнопка «Прошить» → выбрать COM-порт. Прошивка вшита внутрь файла.
2. **Из консоли:** `python tools/flash_rt4d.py COM7 firmware/rt4d_ru_full.bin` (нужен `pyserial`).
> ℹ️ Готового `.exe` в репозитории **нет** — прежняя сборка устарела (советовала клавишу «*»
> вместо тангенты PTT) и удалена. Нормальный прошивальщик будет собран отдельно.
> Сейчас актуальны `Ru-4D_flasher.html` и `tools/flash_rt4d.py`.
> ⚠️ **Не отключайте кабель во время записи.** Драйвер порта — CH343 (на Win10/11 обычно ставится сам).
## Восстановление / безопасность
- **Откат на сток:** прошить `firmware/rt4d_stock_v3.25_abs_0x08002800.bin` тем же способом. Бутлоадер (`0x0..0x2800`) никогда не трогается — полный «кирпич» невозможен, режим прошивки доступен всегда.
- **Калибровка** (SPI `0x000000`, 4 КБ) — заводская, невосстановимая; при прошивке MCU-флеша **не затрагивается** (она в отдельной SPI-микросхеме). Полный дамп на всякий случай — в `backup/`.
- **CPS:** формат codeplug и USART6-протокол не меняются → стоковый Radtel CPS читает/пишет как обычно.
## Пересборка русификации
```
# нужны: python, keystone-engine, clang (LLVM), radio-spi-dump.bin (для байтов ASCII-шрифта)
python tools/build_ru_full.py # -> rt4d_ru_full.bin (шрифт + переводы + Ru-4D)
python flasher/make_flasher.py # -> обновить .html
python flasher/build_exe.py # -> пересобрать .exe (PyInstaller)
```
Шрифт правится в `tools/glyphs_ru2.py` (битмапы 6×9), переводы — в `translations/*.json`.
> Генераторы флешеров (`make_flasher.py`, `build_exe.py`) вычисляют `ROOT` от своего расположения — переносимы. Остальные сборочные скрипты могут содержать пути с исходной dev-машины.
---
## Документация
- **[docs/RE-Report.md](docs/RE-Report.md)** — полный реверс: чип, карта памяти, вектора/ISR, serial-протокол, DMR, формат SPI/codeplug.
- **[docs/UI-Architecture.md](docs/UI-Architecture.md)** — как переписать весь UI поверх стока: машина экранов, точки перехвата, SDK вызываемых функций, план по фазам.
- **[docs/Russification.md](docs/Russification.md)** — осуществимость и механика русификации.
- **[docs/subsystems/](docs/subsystems/)** — детальные разборы: `main-loop`, `display`, `input`, `radio`, `dmr`, `codeplug`, `main-screen`.
- **[docs/firmware-parts.md](docs/firmware-parts.md)** — **прошивка по запчастям и точки внедрения**: два процессора, карта SPI-ресурсов, три приёма патчинга, дерево меню (181 пункт), где живут MIC Gain / спектр / RX-TX Limit.
- **[docs/baseband-and-audio.md](docs/baseband-and-audio.md)** — управление DMR-баузбендом и аудио-трактом (PA2 — питание УНЧ, PA14 — гейт звука от модуля).
- **[docs/refw-spectrum.md](docs/refw-spectrum.md)** — разбор спектроанализатора кастомной прошивки REFV DualTachyon: как вызывается, из каких функций состоит, что переносимо.
- **[docs/refw-analysis.md](docs/refw-analysis.md)**, **[docs/refw-strings.md](docs/refw-strings.md)** — анализ образа REFV DualTachyon и полная выгрузка его строк/меню.
- **[docs/SCT3258_packet_interface.txt](docs/SCT3258_packet_interface.txt)** — документация DMR-чипа Sicomm SCT3258 (= FM100B): формат пакетов, команды, калибровка, вокодер/AMBE.
- **[docs/fm100b-commands.md](docs/fm100b-commands.md)** — карта команд FM100B, снятая агентом с живой рации.
- **[docs/dmr-tx-recovery.md](docs/dmr-tx-recovery.md)** — диагноз и пути восстановления DMR-передачи (частотная калибровка).
- **[research/re/](research/re/)** — рабочие заметки по подсистемам (в т.ч. `dmr.md` — таблицы команд FM100B в обе стороны).
## История извлечения прошивки
Официальный пакет `RT-4D_20260205_Upgrade.rar` → вложенный ZIP → .NET-апдейтер `Ido_Update.exe` → firmware зашита **Intel-HEX-строкой в managed-куче `#US`** → декодирована в `rt4d_stock_v3.25*.bin` (база `0x08002800`). DMR-модуль (`FM100B…bin`) — из отдельного «DMR Upgrade Tool». Дамп SPI — прочитан с живой рации.
---
*Проект носит исследовательский/образовательный характер. Изменение прошивки — на свой риск.*