Что означает код возврата ядра macOS 0xE0004003 (kIOUSBDataToggleErr)?

 
Предыдущий Следующий
kIOUSBBitstufErr kIOUSBPIDCheckErr

kIOUSBDataToggleErr

Синхронизация DATA0/DATA1 потеряна

kIOUSBDataToggleErr относится к состоянию data toggle, используемому для синхронизации неизохронных USB-передач. Хост и конечная точка поддерживают согласованное состояние переключателя, чтобы распознавать принятый пакет и не считать повторную передачу новыми данными. Документация Apple по USB указывает, что отправитель переключается после положительного подтверждения, а получатель — после принятия безошибочного пакета с ожидаемым идентификатором.

Поэтому код принципиально отличается от kIOUSBCRCErr: CRC указывает на повреждённое поле, а ошибка data toggle — на несовпадение состояния двух сторон конечной точки. Он также отличается от общего тайм-аута, который означает отсутствие своевременного завершения, но не определяет эту рассинхронизацию.

Восстановление должно соответствовать состоянию конечной точки

Остановка конечной точки и data toggle связаны. Apple документирует, что снятие halt сбрасывает переключатель на стороне хоста, тогда как восстановление, которому также нужно снять halt и сбросить состояние конечной точки, должно выполняться явно или через API для обеих сторон. Поэтому одного сброса на стороне хоста может быть недостаточно, если требуется изменить и состояние устройства.

  • Запишите адрес конечной точки, направление и тип передачи, последний завершённый запрос, все отмены и прерывания, а также предшествующие сбросы, смены альтернативной настройки или конфигурации и операции восстановления после stall.
  • Не смешивайте обычную отправку с восстановлением на одной конечной точке. Сериализуйте переход через явные состояния draining и reinitialization, чтобы callbacks не ставили трафик в очередь с устаревшим состоянием переключателя.
  • Учтите каждый незавершённый асинхронный запрос до возобновления трафика. Команда верхнего уровня могла быть принята до потери синхронизации.
  • Используйте спецификацию класса устройства, чтобы определить безопасность повтора команды после восстановления конечной точки; одного значения IOKit недостаточно для установления идемпотентности команды.

Ссылки


Нужно найти другой код? Найти другой код состояния или ошибки.