- Полный RE стока V3.25 (Cortex-M4F) + FM100B: карта памяти, протокол, codeplug, UI-архитектура - Русификация: свой CP1251-шрифт + патч рендера, перевод меню и надписей, ребренд Ru-4D V3.25 - Блюпринт переделки UI + C-тулчейн (clang thumbv7em), доказан инъекцией - Готовые флешеры: WebSerial .html и Windows .exe со вшитой прошивкой - Дамп SPI рации, стоковая прошивка, инструменты сборки Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
10 KiB
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 и в обоих флешерах.
Русификация (как работает): draw_string @0x08008A50 в стоке трактует байт ≥0x80 как двухбайтный GBK (полноширокий, 14px). Патч cmp #0x80 → #0xFF уводит 0x80–0xFE на узкий однобайтный путь (7px), а code-cave в ASCII-blitter берёт глифы кириллицы из дописанной во флеш таблицы. Строки — CP1251. Подробно: docs/Russification.md.
Структура репозитория
| Каталог | Что внутри |
|---|---|
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/ |
Извлечённая стоковая прошивка (rt4d_stock_v3.25…bin + .ihex), русифицированная сборка (rt4d_ru_full.bin), прошивка DMR-модуля (FM100B…bin). |
tools/ |
Флешер (flash_rt4d.py) и сборочные скрипты: build_ru_full.py (русификация), glyphs_ru2.py (шрифт), patch_fw.py, build_ui_home.py (инъекция UI). |
ui/ |
my_ui.c — кастомный UI-слой на C (компилируется clang'ом под Cortex-M4). |
translations/ |
JSON-таблицы переводов (меню + rodata) и рабочие списки строк. |
flasher/ |
Готовые флешеры для раздачи: Ru-4D_flasher.html (WebSerial) и Ru-4D_Flasher.exe, + генераторы. |
backup/ |
radio-spi-dump.bin — полный дамп SPI рации (калибровка + codeplug, страховка). |
research/ |
Черновые скрипты разведки (реверс «в процессе»), для истории. |
Как прошить рацию
Прошивается русифицированная V3.25 (firmware/rt4d_ru_full.bin). Рацию нужно ввести в режим прошивки: выключить → включить с зажатой * → подключить USB-C.
- Просто (для любого пользователя): открыть
flasher/Ru-4D_flasher.htmlв Chrome/Edge или запуститьflasher/Ru-4D_Flasher.exe→ кнопка «Прошить» → выбрать COM-порт. Прошивка вшита внутрь. - Из консоли:
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 — полный реверс: чип, карта памяти, вектора/ISR, serial-протокол, DMR, формат SPI/codeplug.
- docs/UI-Architecture.md — как переписать весь UI поверх стока: машина экранов, точки перехвата, SDK вызываемых функций, план по фазам.
- docs/Russification.md — осуществимость и механика русификации.
- 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 — прочитан с живой рации.
Проект носит исследовательский/образовательный характер. Изменение прошивки — на свой риск.