| Предыдущий | Следующий |
| 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 недостаточно для установления идемпотентности команды.
Ссылки
- Apple: аппаратные коды ошибок IOUSBFamily
- Apple: синхронизация данных, stall, halt и восстановление канала
- USB-IF: спецификация USB 2.0
Нужно найти другой код? Найти другой код состояния или ошибки.
