Баузбенд FM100B: - найден прозрачный мост ПК<->модуль (включение с зажатой МЕНЮ), проверен живьём - расшифрована контрольная сумма кадров (one's complement, BE), сверена с ответом рации - инструмент tools/fm100b.py (ping/send/raw/scan) - cmd 0x25 = запрос версии, модуль отвечает V1.2.0.32 (совпало с офиц. образом) - разобран диспетчер входящих кадров: 193 записи, реальный код у 10 команд - cmd 0x59 = индикация приёма, она же управляет гейтом звука PA14 - исправлено: boot-handshake это cmd 0x84, а не 0x64 (research/re/dmr.md) Спектроанализатор REFV DualTachyon (docs/refw-spectrum.md): - вызывается как функция горячей клавиши №22 Analog Spectrum - вход 0x08009CAA -> обычный 0x080139E4 / по зоне 0x08015318 - спектр это экран №11; тик 0x08013BA4 (автомат на 4 состояния), клавиши 0x08013BFC Декомпозиция (docs/firmware-parts.md): - два процессора + внешний SPI = три канала внедрения - карта ресурсов SPI: шрифты, пиньинь, голос, таблица Unicode - найден штатный загрузчик ресурсов FontVoicePicture (шрифты/голос/картинки) - дерево меню целиком: MIC/SPK Gain, RX/TX Limit, SMS Format уже в стоке - аудио двухступенчатое: PA2 питание УНЧ, PA14 гейт от DMR-модуля Прочее: - везде исправлен режим прошивки: тангента PTT вместо клавиши "*" - устаревший Ru-4D_Flasher.exe удалён из репозитория - добавлены инструменты реверса: xref, refs, gpiomap, gpioscan, schem
85 строки
5.5 KiB
Markdown
85 строки
5.5 KiB
Markdown
# Разбор кастомной прошивки REFV beta42 (DualTachyon)
|
|
|
|
Файл: `refw/rt-4d-refw-beta42.bin` — 251 904 Б (`0x3D800`, ровно размер app-региона).
|
|
Собственная, написанная **с нуля** реализация прошивки RT-4D. Используется здесь как
|
|
**независимая перепроверка** наших выводов по железу.
|
|
|
|
## 1. Структура образа
|
|
|
|
| Параметр | REFV beta42 | Сток V3.25 |
|
|
|---|---|---|
|
|
| База загрузки | `0x08002800` | `0x08002800` |
|
|
| Начальный SP | `0x2000BFF0` | `0x2000AE48` |
|
|
| Reset | `0x080029E5` | `0x08002AC1` |
|
|
| Объём кода | ~137 КБ (до `0x21AAF`), дальше `0xFF` | ~152 КБ |
|
|
| Таблица векторов | минимальная (почти все → `0x080029E1/E3`) | полная, 81 обработчик |
|
|
|
|
Брендинг: `"RT-4D REFW v0.42"` @`0x0801E83A`, `"Dual Tachyon"` @`0x0801E84B`.
|
|
|
|
## 2. Перепроверка железа — совпало полностью ✅
|
|
|
|
Перепись периферии REFV (по literal-пулам) совпадает с нашим разбором стока:
|
|
|
|
| Периферия | Ссылок в REFV | Назначение (наш вывод по стоку) |
|
|
|---|---:|---|
|
|
| GPIOA `0x40020000` | 54 | основные линии управления |
|
|
| RCC `0x40023800` | 27 | тактирование |
|
|
| ADC1 `0x40012000` | 21 | батарея |
|
|
| GPIOB / GPIOF / GPIOC | 19 / 14 / 7 | периферийные линии |
|
|
| TIM1 `0x40010000` | 14 | генерация тона/бипа |
|
|
| SPI2 `0x40003800` | 10 | SPI-флеш |
|
|
| **USART6** `0x40011400` | 9 | **CPS-линк** |
|
|
| TIM9 `0x40014000` | 9 | таймер |
|
|
| DAC `0x40007400` | 6 | аудио-тракт |
|
|
| **USART3** `0x40004800` | 6 | **линк к DMR-баузбенду FM100B** |
|
|
|
|
**Совпадения по конкретным битам GPIO:**
|
|
|
|
| Бит | REFV | Сток | Смысл |
|
|
|---|---|---|---|
|
|
| **GPIOA bit2** | `movs r2,#4; str r2,[GPIOA+0x18]` @`0x08003FCC` | SCR@`0x08014D44`, CLR@`0x0801A836` | **усилитель звука (AF MUTE4898 → LN4898 EN)** |
|
|
| GPIOA bit10 | CLR@`0x080064F6`, SCR@`0x08006516` | CLR@`0x080047B8`, SCR@`0x080047C8` | band-select / PA |
|
|
| GPIOA bit13/bit14 | активно используются (в т.ч. TOGR) | то же | служебные линии |
|
|
|
|
⇒ Вывод по аудио (**GPIOA бит 2 = вкл/выкл УНЧ**) подтверждён двумя независимыми прошивками
|
|
и принципиальной схемой. Регистры AT32: `SCR +0x18` (вкл), `CLR +0x28` (выкл), `TOGR +0x2C`.
|
|
|
|
## 3. Протокол баузбенда
|
|
|
|
REFV работает с FM100B через тот же **USART3** и то же обрамление кадра (`0x68 …`):
|
|
immediate `#0x68` встречается в 12+ местах построения пакетов.
|
|
Реализован аккуратный HAL поверх USART:
|
|
|
|
| vaddr (REFV) | роль |
|
|
|---|---|
|
|
| `0x08003D30` | конфигурация UART |
|
|
| `0x08003E56` | чтение DR |
|
|
| `0x08003E5C` | проверка флага статуса (маски `0x20` RXNE, `0x80` TC) |
|
|
| `0x080199EA`, `0x0801A056`, `0x0801A0AE` | обёртки приёма/передачи для FM100B |
|
|
|
|
## 4. Что интересного есть в REFV (по строкам)
|
|
|
|
- **Обновление прошивки самого DMR-модуля**: `"Upgrade DMR FW"`, `"Update DMR Chip"`,
|
|
`"Initialising DMR"`, `"DMR FW ERROR!"`, `"DMR FW returned "` — т.е. реализован протокол
|
|
прошивки FM100B по USART3 (самая глубокая форма «рулить бекеном»).
|
|
- **Talker Alias** (`"Talker Alias On/Off"`), `"Channel Alias"`.
|
|
- **Зоны**: `"Zone Setup"`, `"Zone selected"`, `"Zone is empty!"`, `"not in zone mode"`, `"Zone- CH-"`.
|
|
- **Скан**: `"Scan Start/End"`, `"Scan Duration/Dwell/Return/Continue"`, `"channels to scan"`.
|
|
- **Хоткеи**: `"Extra Hotkey"`, `"0 Hotkey"` … `"9 Hotkey"`.
|
|
- **Мониторинг/сервис**: `"Monitor success!/failed!"`, `"Being Monitored"`, `"Check Failed"`,
|
|
`"Command Failed"`, `"repeater failed"`, `"Calibration OK!"`, `"Calibration"`.
|
|
- **Версии**: `"Main Firmware"`, `"DMR Firmware"`, `"Flash Type"` — отображение версий обеих
|
|
прошивок и типа флеш-микросхемы.
|
|
- Прочее: `"Dual Standby On/Off"`, `"Dual Display"`, `"DMR Remote Kill/Stun"`,
|
|
`"DMR Time Slot: 1/2"`, `"DMR Encrypt: Off"`, `"Not DMR Channel!"`, `"DMR compatible"`.
|
|
|
|
## 5. Как это использовать
|
|
|
|
1. **Верификация** — любой наш вывод по железу можно проверить, поискав тот же регистр/бит в REFV.
|
|
2. **Протокол FM100B** — у REFV есть код прошивки баузбенда; при разборе команд обновления
|
|
можно получить полный список сервисных команд FM100B.
|
|
3. **Ориентир по фичам** — список выше показывает, что реально достижимо на этом железе.
|
|
|
|
> REFV распространяется только бинарём (исходников нет). Здесь он используется исключительно
|
|
> для сверки/исследования собственной работы.
|