viktorиClaude Opus 4.8 7e64e7a902 TX-фикс: DMR VCXO-трим 0x40->0x80 (= проверенный аналоговый) через 0x68, сохранён в NV
Гипотеза: кварц общий (аналог TX на частоте), а DMR трим (0xB4)=0x40 vs аналог 0x80 давал сдвиг.
Записал DMR VCCN band1&2=0x80 + CmdWriteAll. Обратимо (baseline 0x3f/0x40). tools/module_calfix.py.
Осталось проверить DMR TX в обычном режиме.

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

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. Опрос подтвердил версию модуля V1.2.0.32, совпавшую с официальным образом.
  • Прошивка разложена на запчасти: два процессора + внешний SPI = три независимых канала внедрения. Карта — docs/firmware-parts.md.
  • Найден штатный загрузчик ресурсов (Unicode Download.exe, внутри FontVoicePicture) — официальный путь замены шрифтов, голосовых подсказок и картинок (в т.ч. загрузочного логотипа) без патча MCU.
  • Разобран спектроанализатор REFV DualTachyon — та самая реализация, которую хвалят пользователи. См. docs/refw-spectrum.md.
  • 🎯 DMR-чип опознан по схеме: FM100B = HF6853 / AUCTUS A6 (внутри RDA8809) — одночиповый DMR-SoC (CPU+ВЧ-трансивер+DSP+AMBE-вокодер+кодек), прошивка во внешнем SPI-flash. См. docs/hf6853-auctus-a6.md. Скрытый ATE-интерфейс полностью реверснут (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.
  • Интерактивный агент — управление FM100B через COM без перешивки (tools/build_agent.py + tools/agent.py); снят полный список команд FM100B.
  • Работа с SPI — чтение/запись/восстановление codeplug и калибровки из дампа (tools/spi_read.py, tools/spi_wr.py, tools/spi_restore.py).
  • ⚠️ DMR TX-калибровка — сбита в экспериментах, восстановление документировано в 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 и в обоих флешерах.

Русификация (как работает): 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, прошивка внутри) + генераторы (make_flasher.py, build_exe.py).
backup/ radio-spi-dump.bin — полный дамп SPI рации (калибровка + codeplug, страховка).
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 — полный реверс: чип, карта памяти, вектора/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.
  • docs/firmware-parts.mdпрошивка по запчастям и точки внедрения: два процессора, карта SPI-ресурсов, три приёма патчинга, дерево меню (181 пункт), где живут MIC Gain / спектр / RX-TX Limit.
  • docs/baseband-and-audio.md — управление DMR-баузбендом и аудио-трактом (PA2 — питание УНЧ, PA14 — гейт звука от модуля).
  • docs/refw-spectrum.md — разбор спектроанализатора кастомной прошивки REFV DualTachyon: как вызывается, из каких функций состоит, что переносимо.
  • docs/refw-analysis.md, docs/refw-strings.md — анализ образа REFV DualTachyon и полная выгрузка его строк/меню.
  • docs/SCT3258_packet_interface.txt — документация DMR-чипа Sicomm SCT3258 (= FM100B): формат пакетов, команды, калибровка, вокодер/AMBE.
  • docs/fm100b-commands.md — карта команд FM100B, снятая агентом с живой рации.
  • docs/dmr-tx-recovery.md — диагноз и пути восстановления DMR-передачи (частотная калибровка).
  • 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 — прочитан с живой рации.


Проект носит исследовательский/образовательный характер. Изменение прошивки — на свой риск.

S
Описание
Radtel RT-4D reverse engineering, russification, custom UI, flashers
Readme
17 MiB
Languages
HTML 54.9%
Python 44.8%
C 0.3%