ESC-протоколы: 4-way interface и EEPROM AM32 — факты для тулы (AD-856)
Статус: research / discovery + фактическая база, используемая кодом
(web/static/js/tools/esc_fourway.js). Документ фиксирует, откуда взяты
протокольные факты, где проходит граница уверенности и что НЕ реализовано
(честность важнее охвата). Лицензионный анализ и решение — в ADR
docs/adr/ad-856-esc-clean-room.md.
1. Clean-room и источники
Код кодека написан с нуля по открытым описаниям (без копирования GPL/AGPL):
- 4-way interface — спецификация интерфейса BLHeliSuite (описание кадров,
команд, ACK-кодов; опубликована в дистрибутиве BLHeliSuite,
https://github.com/bitdump/BLHeli) и вики Betaflight «4 way interface». - MSP-вход в passthrough — открытые таблицы MSP INAV/Betaflight:
MSP_SET_4WAY_IF/MSP_SET_PASSTHROUGH= 245; без payload = переход в
4-way, ответ — 1 байт (число выходов ESC), после ответа порт полётника
говорит на протоколе 4-way до командыInterfaceExit. - AM32 — открытая документация проекта (https://github.com/am32-firmware/AM32,
https://am32.ca): раскладка блока настроек, адреса блока по таргетам,
формулы производных величин.
2. Протокол 4-way interface (реализовано)
запрос : 0x2F cmd addr_hi addr_lo len params[len] crc_hi crc_lo
ответ : 0x2E cmd addr_hi addr_lo len params[len] ack crc_hi crc_lo
len == 0означает 256 байт параметров; «без параметров» не бывает —
кодируется один dummy-байт0x00(len=1);- CRC — CRC16/XMODEM (poly 0x1021, init 0), от стартового байта
включительно; в ответе ack входит в CRC; на проводе — big-endian; - device info (ответ
DeviceInitFlash) — 4 байта:
[sig_lo, sig_hi, метка bootloader-сообщения, режим интерфейса]; - режимы интерфейса: 0 SiLabs C2, 1 SiLabs BLB (BLHeli_S), 2 Atmel BLB,
3 Atmel SK, 4 ARM BLB (AM32).
Реализованное подмножество команд (v1 read-only): InterfaceTestAlive 0x30,
ProtocolGetVersion 0x31, InterfaceGetName 0x32, InterfaceGetVersion 0x33,
InterfaceExit 0x34, DeviceReset 0x35, DeviceInitFlash 0x37,
DeviceRead 0x3A. Команды записи/стирания (0x38, 0x39, 0x3B, 0x3E и др.)
сознательно не реализованы — инвариант v1, закреплён тестом.
3. EEPROM AM32 (реализовано, с границей уверенности)
- Блок настроек лежит во флеше по фиксированному смещению таргета:
0x7C00 (классические 32К-таргеты: STM32F051, AT32F421 и др.) или
0xF800 (таргеты с большим флешем, например G071). Оба адреса влезают в
16-битное поле адреса кадра. Тула пробует адреса по порядку и принимает блок
только после валидации формы (looksLikeAm32Eeprom: правдоподобная версия
прошивки + читаемое имя таргета; иначе — только сырой дамп). - Читается 48 байт — документированная зона настроек.
- Разбираемая раскладка (байты): 0 boot byte, 1 версия EEPROM-раскладки,
2 версия загрузчика, 3/4 версия прошивки (major/minor), 5–16 имя таргета
(12 ASCII), 17–45 — настройки (полный список с идентификаторами — в
AM32_SETTINGS_LAYOUT,web/static/js/tools/esc_fourway.js). - Производные величины показываются только там, где формула документирована:
timing advance = байт × 7.5°, KV = байт × 40 + 20, порог ячейки =
(байт + 250)/100 В, лимит тока = байт × 2 А, серво-пороги
(×2+750 / ×2+1750 / +1374 мкс). Сырой байт показывается всегда. - Байты 46+ и любые поля вне списка не разбираются — видны только в
HEX-дампе (принцип «не выдумываем»).
4. Телеметрия (реализовано частично)
- RPM через полётник: MSP2
INAV_ESC_RPM= 0x2040 (INAV с esc-sensor),
ответ — по u32 LE RPM на мотор. Прошивка без esc-sensor отвечает
MSP-ошибкой → тула честно показывает «недоступно». - KISS/AM32-телеметрия по сигнальному проводу (температура/напряжение/ток)
в режиме passthrough недоступна (регулятор в загрузчике, не в рабочей
прошивке) — кандидат на v2 через MSP-каналы полётника
(BetaflightMSP_ESC_SENSOR_DATA= 134, INAVMSP2_INAV_ESC_TELEM).
5. Не реализовано / отложено (v2+)
- запись настроек AM32 и прошивка (write/erase/verify) — отдельное решение
основателя, новый класс риска; - BLHeli_S/Bluejay (SiLabs BLB): чтение настроек — другой EEPROM-формат
(адресация/раскладка BLHeli_S), в v1 тула честно сообщает «BLHeli_S — в v1
не поддерживается»; - BLHeli_32 — NO-GO навсегда (закрытый протокол, лицензионная программа
остановлена); - карта «сигнатура MCU → таргет/размер флеша»: в открытых источниках есть
таблицы соответствий, но мы их не проверяли на железе — v1 показывает
сигнатуру hex как есть и подбирает адрес EEPROM перебором с валидацией; - прямое подключение USB-UART к сигнальному проводу (без полётника) —
осознанно вне v1 (дефолт основателя: только passthrough).
6. Проверка на железе
Кодек и разбор покрыты юнит-тестами (tests/test_esc_fourway.js — CRC-вектор,
кадры, синтетический EEPROM), но на реальном AM32-регуляторе v1 ещё не
прогонялся — тула помечена «предальфа», включение — только фича-флагом
esc_tools через /admin/flags. Первый прогон на железе — обязательный шаг
перед снятием пометки.