Реверс апдейтеров + API-карта модуля (172 команды)

RT-4D Upgrade (.NET, DES+RSA) прошивает AT32 (протокол 39 33 05 = загрузчик рации),
НЕ модуль. Полный список 172 ATC/SP-команд модуля (research/module-fw/). У приложения
модуля НЕТ команды дампа flash -> полный дамп NV/RF Firmware только через загрузчик
модуля (download-режим, live). Cal-значения (SPCali_*: FreqOpt/AnaVccn/DigMod) доступны
B-командами. docs/fm100b-firmware-re.md.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01NikMGoqQWWk9wy2ww2vJAr
Этот коммит содержится в:
2026-07-24 04:52:15 +09:00
co-authored by Claude Opus 4.8
родитель 4e93d9a4dd
Коммит 1d196eff89
2 изменённых файлов: 191 добавлений и 0 удалений
+19
Просмотреть файл
@@ -64,6 +64,25 @@ Bootloader | Application | RF Firmware | NET info
снять полный дамп → распарсить EasyFlash ENV (NET info) + разобрать RF Firmware (vocoder/DMR).
Это разблокирует СРАЗУ: NV-настройки, калибровку, и сам DMR-baseband для реверса.
## Апдейтеры: кто что прошивает (реверс .NET)
- **RT-4D Upgrade V3_25** (`Ido_Update`, DES+RSA) прошивает **AT32 (главный CPU рации)**, НЕ модуль:
команды `Send_Connect=39 33 05 10 c9`, `Send_Update=39 33 05 55 0e`, `Send_End=39 33 05 ee a7`
— это протокол **загрузчика AT32** (тот же `39 33 05`, что в `tools/flash_ps.py`). Для дампа
flash модуля НЕ годится.
- **Radio Tuning Software** — калибровка модуля по 0x68 (см. docs/tuning-software-protocol.md).
- Отдельного PC-апдейтера МОДУЛЯ на рабочем столе нет; образы `FM100B_*.bin` = раздел Application
(0x175000 = ровно размер раздела), т.е. из вендорского пакета, не live-дамп.
## API-поверхность модуля (172 команды, research/module-fw/module_api_commands.txt)
Полный список ATC_*/SP*-команд (протокол 0x68 AT32↔модуль). Важное:
- Калибровка (NV): `SPCaliic_FreqOpt`/`SPCaliFreqSetCnf` (частота!), `SPCali_AnaVccnOpt` (VCCN аналог=0x80),
`SPCali_DigMod1Opt` (девиация), `SPCali_ChannelParamOpt`, `SPCali_AnaSQthOpt`, `SPCali_SQRXFreqOpt`,
`SPCali_HeadGQParamOpt`. Это NV-элементы, которые читаются/пишутся B-командами (0xB0–0xBD).
- ⚠️ `ATC_ClearNVdataReq` — СТИРАНИЕ NV (не слать!).
- **Команды дампа flash в приложении НЕТ** → полный дамп NV(«NET info»)/RF Firmware возможен только
через **загрузчик модуля** (download-режим), не через рабочую прошивку. Это живая операция (при владельце).
Сами cal-значения доступны и так — через B-команды (tools/tuning_read.py).
## Реальные следующие шаги (реверс+правка+тест)
1. **API-поверхность:** извлечь полный список ATC_*/SP*-команд (это протокол 0x68 между AT32 и модулем)
— карта того, чем вообще можно управлять. Уже частично в docs/fm100b-commands.md.
+172
Просмотреть файл
@@ -0,0 +1,172 @@
ATAlarmStatusCnf
ATAlarmStatus_s
ATAnaCallSetupC
ATAnaCalledStartCnf
ATAssi
ATBtlLevelQueryCnf
ATCAgcthSetReq
ATCAnaCtCdGainSetReq
ATCCmdUploadDigBusyIsStatus
ATCEQLevelSetReq
ATCRFCompanderSetReqGy
ATCRecvAmbe6sdataCnf
ATCRfChipQu
ATCRxSmsSendAckCn7
ATCScancallCnfParser
ATCSqlGe
ATC_
ATC_ANATX9
ATC_Al
ATC_AnaChGroupSetReq
ATC_AnaSignalNumSetReq
ATC_AssignChDataQuery_Reqs
ATC_AssignRecGroup_Query
ATC_CMD
ATC_Cal
ATC_CalledContactINfoQuery
ATC_ChDcdmSwitchRe
ATC_ChFreqSetReq
ATC_ChModeSet
ATC_ChRFChipS
ATC_ChSlotSetReq
ATC_ChannelSetCnf
ATC_CheckSumFail
ATC_ClearNVdataReq
ATC_CurCHAnaS
ATC_CurCHDigdataSetReq
ATC_CurChKeySetReq
ATC_CurChTOTTime_SETRa
ATC_CurChannelWaitSetReq
ATC_DTMFToneSetReq
ATC_DigChGroupSetReq
ATC_DigMonitorEnSetReq
ATC_DigS
ATC_EMGtype
ATC_FreqopP
ATC_In
ATC_Inbanddatb
ATC_KeyHandle_MonitorSetProc
ATC_KeyHandle_POWERSetPr
ATC_KeyHandle_S
ATC_LocalRecordPlayReq
ATC_MICCodecGainS4met
ATC_Mon
ATC_MonitorTxtimeSetReq
ATC_Msg
ATC_PlaySingleToneReq
ATC_PowerlevelSet
ATC_PrintInfo
ATC_RFRegs
ATC_RXKillDecodeEnS
ATC_RadioIDSetReq
ATC_RecordDataPlayReq
ATC_RecordEnReq
ATC_ReportDigInfo
ATC_RfDeviati
ATC_Roq
ATC_RssiReadReq
ATC_SMSPr
ATC_SPKCodecGainSet
ATC_Sca
ATC_SeGTtDeepSleepReq
ATC_SendCallPromptReq
ATC_SendSmsfailInfo
ATC_SendVcdNoi3
ATC_SetC
ATC_SetEncryptLi
ATC_SetLanguageSe
ATC_SetRfPowerLevelReq
ATC_SleepStatusCLnng
ATC_SmsmodeSetReq
ATC_SwitchChannela
ATC_T5hholdtimesetReq
ATC_TxCon
ATC_UVFreqGpio_SE
ATC_VCDInterleavEnReq
ATCall
ATCallDisCo
ATCallN
ATChChgCnf
ATCmdBSStatus
ATCmdSetCnf
ATCurChScanlistQueryCnf
ATDataStatus
ATDigBroadcastCnf5
ATDigCallSetupCnf
ATDigCalledStartCnf
ATModule
ATNoiselevSetCnf
ATQuerySY
ATRadioIDQueryCnf
ATRecvEmgCallInd
ATRssiQueryCnf
ATSPSendSleepReq
ATSPWak
ATScanStatusQueryCnf
ATScanSwitchCnf
ATUploadRxSmsCnf
ATVCDInterleavQueryCnf
ATVoicL
ATVoiceDecCnf
ATVoiceEncryptQum
ATVoiceProd
SPATCDigChBusyIsCnf
SPATCRecvEmgDi
SPATSetCnf
SPATSysReadyInd
SPATVoicedata
SPATWkInd
SPAnaCallsetupCnf
SPAssignC
SPAssignRecGroupQuery
SPAtcAnaCallRxStartCnfK
SPAtcAnaSqlBusyStatus
SPAtcBSActiveStat
SPAtcSleepTimerOPT
SPBSActTimeoverCnf
SPBreakCnf
SPCaliFreqSetCnf
SPCali_AnaSQthOpt
SPCali_AnaVccnOpt
SPCali_ChannelParamOpt
SPCali_DigMod1Opt
SPCali_HeadGQParamOpt
SPCali_SQRXFreqOyYpt
SPCaliic_FreqOpt
SPCalledIDQuer
SPCclPwsSetReq
SPCclSpDP
SPCclSpInBandDataInd
SPContactProcessHandleReq
SPCurZoneChinfoQuery
SPDigMonitorReportInfo
SPEMG_StopAlarmReq
SPGetVcdNoiseTHReq
SPGroupListI
SPKirisunEffectCnf
SPMicVoiceCnf
SPMmiCh
SPMmiSetupCnf
SPModuleInitQuery
SPNullMsgSendReq
SPRadioIDQuery
SPResetC
SPRoamList_SoPetReq
SPRssi_glitchQueryCnf
SPRssi_noiselevQueryCnf
SPRssilev0
SPSCAN_ScanInd
SPScanH
SPSendInBandDataReq
SPSetVcdNo
SPSlo
SPSpMmi
SPSwVerQuery
SPSysLanguageQuery
SPT
SPUpData
SPVcdInterleavQuery
SPVoiceDa
SPVoiceEncryptQuery
SPWaitChDi
SP_ID