| Предыдущий | Следующий |
| kIOUSBDataToggleErr | kIOUSBWrongPIDErr |
kIOUSBPIDCheckErr
Самому идентификатору пакета нельзя доверять
kIOUSBPIDCheckErr означает, что стек USB не смог проверить идентификатор пакета и потому не мог надёжно классифицировать пакет. USB PID содержит тетраду идентификатора и комплементарную контрольную тетраду. Это отдельный механизм от CRC5 и CRC16 для полей токена и данных, хотя старые формулировки IOUSBFamily могут называть состояние ошибкой CRC идентификатора.
Различие важно для диагностики. При kIOUSBWrongPIDErr PID читается, но не соответствует фазе транзакции, ожидаемой хостом. При kIOUSBPIDCheckErr не проходит собственная проверка PID, поэтому верхние уровни не могут надёжно определить тип принятого пакета. Это не следует трактовать как ошибку формата прикладного запроса.
Полезные диагностические границы
- Сохраните конечную точку, направление, скорость, контроллер и путь концентраторов, затем при наличии сопоставьте результат с трассой USB-анализатора или журналами контроллера.
- Запишите, ограничена ли ошибка одной конечной точкой или сопровождается ошибками CRC и bit stuffing на нескольких endpoint. Смешанная картина сильнее характеризует транспортный путь, чем один код результата.
- Сравните работу через прямой порт и через другой кабель или концентратор до изменения логики протокола устройства. PID проверяется на уровне распознавания пакетов, до интерпретации полезной нагрузки этой логикой.
- Не считайте успешное повторное подключение доказательством завершения транзакции. Повторное перечисление восстанавливает связь с устройством, но не позволяет установить, дошла ли конкретная команда до функции.
Почему всё равно необходим контекст передачи
macOS различает поведение управляющих, interrupt, bulk и isochronous передач. Требования к повтору и восстановлению зависят от класса передачи, поэтому в журнале должны быть класс и конечная точка, а не только числовой результат IOKit.
Ссылки
- Apple: kIOUSBPIDCheckErr
- Apple: аппаратные коды ошибок IOUSBFamily
- USB-IF: поля проверки PID и защита CRC в пакетах USB
Нужно найти другой код? Найти другой код состояния или ошибки.
