Полный реверс протокола калибровки тюнера (IL-декомпиляция)
- research/tuning-re/cil_disasm.py — минимальный CIL-дизассемблер (dnfile). - research/tuning-re/command-templates.txt — извлечённые шаблоны всех команд. - docs/tuning-software-protocol.md: точная карта команд-полей + раскладка bufDigTune + ВЫВОД: частотная калибровка = ЗАМКНУТЫЙ ЦИКЛ (Set-команды несут band/опорные частоты, не абсолютное смещение; WriteAll данных не несёт). Слепой скрипт записи freq-трима может снова сбить калибровку -> безопаснее гнать штатным тулом с MMDVM BER вместо частотомера, либо сперва рид-онли снять текущую калибровку. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01NikMGoqQWWk9wy2ww2vJAr
Этот коммит содержится в:
@@ -52,10 +52,56 @@ flags 00 ff 00
|
||||
12 e2 34 40 2a 4f b3 (×2)
|
||||
```
|
||||
|
||||
## Что осталось (для скриптования)
|
||||
Точное соответствие «num_U_DigFreq → cmd+байт» — в IL методов `btnRead_U_Freq_Click` /
|
||||
`ReadDigDataToUI` / `SaveDigTuneData`. Кандидат — `0xB7` (частотные точки/оффсет) или отдельный
|
||||
freq-cmd. Для ручной калибровки штатным тулом это не нужно: `num_U_DigFreq` крутится в UI.
|
||||
## Точная карта команд-полей (из .ctor через InitializeArray) — ПОДТВЕРЖДЕНО
|
||||
|
||||
Транспорт: **115200 8N1**, ответы 9 или 12 байт (`ReceivedBytesThreshold`). CK-поле `00 00`
|
||||
в шаблонах и НЕ пересчитывается → **модуль не проверяет CRC для cal-команд**.
|
||||
|
||||
Управление мостом (кадр `34 52 05 <cmd> <ck>` — к AT32, не к модулю):
|
||||
```
|
||||
CmdConnect 34 52 05 10 9b # войти в cal-мост
|
||||
CmdEnd 34 52 05 ee 79 # выход
|
||||
CmdTCOn 34 52 05 54 df #透传 (прозрачный TX) UHF
|
||||
CmdTCOn_V 34 52 05 58 e3 # прозрачный TX VHF
|
||||
```
|
||||
Калибровка (0x68 → модуль):
|
||||
```
|
||||
CmdOpenCal 68 b0 01 01 00 00 00 01 01 10 # 0xB0 payload 01 — открыть cal
|
||||
CmdColseCal 68 b0 01 01 00 00 00 01 00 10 # 0xB0 payload 00 — закрыть
|
||||
CmdWriteAll 68 bd 01 01 00 00 00 01 01 10 # 0xBD — сохранить cal в NV (БЕЗ данных!)
|
||||
SetCalFreq_U 68 b1 ...01 01 03 <400.125M×2><435.125M×2><469.975M×2> 10 # опорные UHF (BE Гц)
|
||||
SetCalFreq_V 68 b1 ...01 02 03 <136.125M×2><150.125M×2><174.125M×2> 10 # опорные VHF
|
||||
SetAnaTX 68 b3 ...01 01 02 02 10 # рантайм патч [8..11]=01 01 02 02
|
||||
SetDigTX 68 b5 ...01 01 00 02 10 # рантайм: [8]=1 [9]=1 [10]=DetectDevice [11]=2
|
||||
SetAnaVCCN 68 b2 ...01 01 80 10
|
||||
SetDigVCCN 68 b4 ...01 01 80 10
|
||||
SetCalPWR 68 b8 ...01 01 01 02 78 10
|
||||
SetCalMod 68 b6 ...01 01 01 96 10 # девиация, дефолт 0x96=150
|
||||
SetCalSlot 68 b7 ...01 00 05 9a 01 08 75 10
|
||||
Read*: ReadAnaVCCN 68 b2..00 02 | ReadDigVCCN 68 b4..00 02 | ReadMod 68 b6..00 01 00
|
||||
ReadPWR 68 b8..00 01 01 00 | ReadSlot 68 b7..00
|
||||
```
|
||||
|
||||
## Раскладка bufDigTune (частотные трим-значения, из Save/ReadDigDataToUI)
|
||||
```
|
||||
[0]=устройство(cboxDevice) [1]=V_DigFreq [2]=U_AnaFreq [3]=V_AnaFreq [4]=U_DigFreq
|
||||
дефолты bufDigTuneInit = 01 00 00 00 00 b9×6 32×6 9b×6 → все трим-смещения по умолчанию 0
|
||||
```
|
||||
Трим — **однобайтовый знаковый** (0 = центр). `num_U_DigFreq ↔ track_U_DigFreq`.
|
||||
|
||||
## ⚠️ ВАЖНО: частотная калибровка — ЗАМКНУТЫЙ ЦИКЛ (нужен частотомер)
|
||||
Реверс `RecvDataOperation`: Set-команды несут band/DetectDevice и опорные частоты, но **НЕ
|
||||
абсолютное смещение**; `CmdWriteAll` payload не несёт. Т.е. штатная калибровка: `CmdOpenCal` →
|
||||
модуль ПЕРЕДАЁТ несущую → оператор смотрит частотомер/SDR и крутит `num_U_DigFreq` → модуль
|
||||
подстраивается → `CmdWriteAll` фиксирует. Без прибора абсолютное значение не выставить «в одну
|
||||
команду», а слепой скрипт записи МОЖЕТ СНОВА СБИТЬ калибровку.
|
||||
|
||||
**Вывод по путям:**
|
||||
- Безопасно: гонять калибровку ШТАТНЫМ тулом (правильные кадры), MMDVM BER — вместо частотомера
|
||||
(перебор `num_U_DigFreq` → WriteAll → PTT → BER). Уточнить, пишет ли ручной num+WriteAll трим
|
||||
в NV модуля (WriteAll данных не несёт — возможно, только auto-cal реально пишет частоту).
|
||||
- Скрипт: сначала РИД-онли реплицировать Connect+Read и снять текущую калибровку, потом решать.
|
||||
Cлепую запись freq-трима НЕ слать.
|
||||
|
||||
## План применения (см. dmr-tx-recovery.md, путь через 0x68)
|
||||
Вариант A (штатный тул): пользователь открывает Tuning SW → Read → крутит `num_U_DigFreq` →
|
||||
|
||||
Ссылка в новой задаче
Block a user