# 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) и автономный Windows-`.exe` со вшитой прошивкой — прошивка «в одну кнопку». - ⏸️ **Полная переделка UI** — приостановлена: замена дежурного экрана ломает обработку клавиш (обход преамбулы стокового диспетчера). Возобновление — через *наложение* поверх стока. См. `docs/UI-Architecture.md`. --- ## Технический обзор **Главный процессор:** 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) и `Ru-4D_Flasher.exe`, + генераторы. | | [`backup/`](backup/) | `radio-spi-dump.bin` — полный дамп SPI рации (**калибровка + codeplug**, страховка). | | [`research/`](research/) | Черновые скрипты разведки (реверс «в процессе»), для истории. | --- ## Как прошить рацию Прошивается **русифицированная V3.25** (`firmware/rt4d_ru_full.bin`). Рацию нужно ввести в режим прошивки: **выключить → включить с зажатой `*`** → подключить USB-C. 1. **Просто (для любого пользователя):** открыть `flasher/Ru-4D_flasher.html` в Chrome/Edge **или** запустить `flasher/Ru-4D_Flasher.exe` → кнопка «Прошить» → выбрать COM-порт. Прошивка вшита внутрь. 2. **Из консоли:** `python tools/flash_rt4d.py COM7 firmware/rt4d_ru_full.bin` (нужен `pyserial`). > ⚠️ **Не отключайте кабель во время записи.** Драйвер порта — CH343 (на Win10/11 обычно ставится сам). `.exe` не подписан → SmartScreen может предупредить («Подробнее» → «Выполнить»). ## Восстановление / безопасность - **Откат на сток:** прошить `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`. > ⚠️ Сборочные скрипты — с оригинальной dev-машины и содержат абсолютные пути (`C:/Users/.../rt-4d`); при переносе поправьте `ROOT`/пути под новую раскладку каталогов. --- ## Документация - **[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`. ## История извлечения прошивки Официальный пакет `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 — прочитан с живой рации. --- *Проект носит исследовательский/образовательный характер. Изменение прошивки — на свой риск.*