# Разбор кастомной прошивки 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 распространяется только бинарём (исходников нет). Здесь он используется исключительно
> для сверки/исследования собственной работы.
