Сбой обновления прошивки по USB DFU: режим загрузчика, управляющие передачи, тайм-ауты и переподключения

Как отлаживать сбои обновления прошивки по USB DFU, обнаружение загрузчика, переподключения устройства, stall управляющих передач, тайм-ауты, привязку драйверов и неудачные загрузки прошивки.

USB DFU failed, обновление прошивки failed, загрузчик USB, DFU mode, тайм-аут управляющей передачи, диагностика USB

Сбои обновления прошивки — стрессовые: "устройство может исчезнуть, войти в режим загрузчика, переподключиться с другим VID/PID или зависнуть на «initializing», «erasing», «downloading», «rebooting». Пользователи ищут «USB DFU failed», «firmware update stuck initializing», «USB bootloader not detected», «DFU device not found», «firmware update timeout», потому что updater редко показывает стейт-машину USB." Воркфлоу USB Device Firmware Upgrade обычно построены на управляющих передачах и переходах состояний устройства. Updater может разговаривать с обычной прошивкой, командовать перезагрузку в загрузчик, ждать, пока перечислится другое USB-устройство, слать блоки прошивки, запрашивать статус, а потом командовать detach или reset.

Bus Scope полезен тем, что каждый этап виден на шине, если захват идёт с самого начала.

Обновление прошивки — часто два устройства

Многие продукты перечисляются как одно USB-устройство в обычном режиме и как другое в режиме загрузчика. VID/PID, строка продукта, интерфейсы и привязка драйвера могут меняться.

Последовательность может выглядеть так:

  1. Подключено обычное устройство.
  2. Updater шлёт команду входа в загрузчик.
  3. Устройство отключается.
  4. Перечисляется устройство-загрузчик.
  5. Updater шлёт блоки DFU download.
  6. Устройство сообщает статус.
  7. Устройство сбрасывается в обычный режим.

Если пользователь начал захват после исчезновения устройства, важный переход уже потерян.

Типичные точки сбоя

Обновления DFU ломаются, когда:

  • Режим загрузчика вообще не входит.
  • Загрузчик перечисляется, но драйвер не привязывается.
  • Updater ждёт один VID/PID, а устройство выдаёт другой.
  • Stall управляющей передачи.
  • Размер блока прошивки неверный.
  • Устройство тайм-аутит во время erase.
  • Опрос статуса слишком агрессивный.
  • Устройство отключается во время download.
  • Проблема кабеля или питания вызывает reset.
  • Проверка безопасности/версии отклоняет образ.

Updater может сообщать обо всём этом как «firmware update failed».

Доказательства по управляющим передачам

DFU-операции класса используют управляющие передачи. Трасса покажет, слал ли updater данные download, запрашивал статус, сбрасывал состояние или наткнулся на stall.

Ищите:

  • DFU_DNLOAD
  • DFU_UPLOAD
  • DFU_GETSTATUS
  • DFU_CLRSTATUS
  • DFU_ABORT
  • reset или отключение устройства
  • STALL на endpoint 0

Если управляющая передача ставит stall на одном и том же блоке каждый раз, вероятны валидность образа прошивки, размер блока, поведение flash erase/write или баг загрузчика.

Тайминги переподключения

После входа в режим загрузчика updater должен ждать пере-нумерации. Если он ищет слишком рано, может сказать «device not found», даже если загрузчик появится секундой позже.

Трасса шины покажет тайминги:

  • Время отключения обычного устройства.
  • Время подключения загрузчика.
  • Чтения дескрипторов.
  • Привязку драйвера.
  • Первый DFU-запрос.

Эти данные отделяют тайм-аут updater-а от сбоя устройства.

Проблемы привязки драйвера

В Windows загрузчику может требоваться другой драйвер, чем обычному устройству. В Linux права могут отличаться по VID/PID. В macOS классовое поведение тоже может быть другим.

Если загрузчик перечисляется корректно, но updater не может его открыть — проблема выше базового перечисления USB. Если загрузчик вообще не перечисляется — сначала отлаживайте прошивку, кабель, reset и питание.

Чек-лист отладки

Используйте такой сценарий:

  1. Захватите до старта updater-а.
  2. Зафиксируйте дескрипторы обычного устройства.
  3. Захватите команду входа в загрузчик.
  4. Следите за отключением и пере-нумерацией загрузчика.
  5. Зафиксируйте VID/PID и дескрипторы загрузчика.
  6. Изучите DFU-управляющие передачи.
  7. Найдите первый STALL, тайм-аут, reset или отсутствующий ответ.
  8. Сравните номер сбойного блока, если повторяется.
  9. Проверьте привязку драйвера и права после перечисления.
  10. Сохраните весь таймлайн обновления до обрезки.

Итоговый диагноз

Сбои USB DFU — это сбои стейт-машины. Корневая причина может быть в входе в загрузчик, пере-нумерации, привязке драйвера, поведении DFU-управляющей передачи, размере блока, таймингах flash, валидации образа или таймингах reset.

Bus Scope помогает тем, что вытаскивает обновление прошивки как USB-доказательства, а не как progress bar, который остановился.