Несовпадение max packet size конечной точки USB: отладка wMaxPacketSize, коротких пакетов, bulk-передач и багов буфера
Как отлаживать несовпадения max packet size USB-конечной точки, ошибки wMaxPacketSize в дескрипторе, короткие пакеты, сбои bulk-передач, отличия high-speed/full-speed и баги буфера прошивки.
wMaxPacketSize конечной точки USB выглядит как маленькое поле дескриптора, но неверное значение может сломать bulk-передачи, interrupt-репорты, работу high-speed, буферизацию прошивки и предположения драйвера хоста. Пользователи ищут «USB wMaxPacketSize mismatch», «USB short packet problem», «bulk transfer stops at 64 bytes», «USB endpoint packet size high speed full speed», «USB descriptor max packet size bug», когда передачи падают только на определённых размерах или скоростях.
Bus Scope полезен тем, что сбой виден только при одновременном сравнении дескриптора и пакетов передачи. Дескриптор может заявлять один размер пакета, а прошивка, хост-код или аппаратура конечной точки ведут себя так, как будто размер другой.
Что задаёт wMaxPacketSize
Каждый дескриптор конечной точки содержит wMaxPacketSize. Он сообщает хосту максимальный размер полезной нагрузки пакета для этой конечной точки. Типичные значения зависят от скорости и типа конечной точки.
Примеры:
- Full-speed bulk-конечная точка часто использует 64 байта.
- High-speed bulk-конечная точка часто использует 512 байт.
- Interrupt-конечные точки варьируются по скорости и интервалу.
- Isochronous-конечные точки используют размеры пакетов под полосу.
Если прошивка настроила буферы на 64 байта, а в дескрипторе 512 — хост может слать передачи, которые устройство не способно нормально обработать.
Типичные симптомы
Баги max packet size могут выглядеть так:
- Bulk-передача работает на маленьких сообщениях, но падает на больших.
- Устройство работает на full-speed, но падает на high-speed.
- Передача останавливается ровно на 64 байтах.
- Хост бесконечно ждёт короткого пакета.
- Прошивка получает данные в разорванном виде.
- Устройство ставит stall на OUT-передачи.
- IN-передачи возвращают усечённые данные.
- Драйвер сообщает тайм-аут, хотя трафик идёт.
- Составное устройство работает на одном интерфейсе, но не на другом.
Точное число байт — часто главная подсказка.
Поведение коротких пакетов
USB bulk-передачи часто используют короткие пакеты, чтобы показать конец передачи, когда запрошенная длина больше реальных данных. Если устройство возвращает ровно кратное max packet size число байт, хост может ждать дальше, если только протокол не задаёт длину отдельно или не отправляет ZLP (пакет нулевой длины).
Например:
max packet size: 64
payload length: 128
packets: 64 + 64
end condition: ambiguous unless length is known or ZLP is sent
Поэтому «USB short packet» и «USB zero length packet» — сильные поисковые запросы. Устройство может проходить простые тесты и зависать, когда длина полезной нагрузки приходится ровно на границу пакета.
Несовпадение high-speed и full-speed
Часть устройств корректно работает на full-speed, но ломается на high-speed. Причины:
- Дескриптор high-speed заявляет 512 байт.
- Буфер прошивки остаётся 64 байта.
- На high-speed меняется выравнивание DMA.
- FIFO конечной точки слишком мал.
- Драйвер хоста рассчитывает на high-speed-пакетирование.
- Дескриптор устройства отличается между режимами скорости.
Bus Scope помогает сравнить скорость перечисления, значения дескриптора конечной точки и реальное разбиение передач на пакеты.
Ошибки копирования дескрипторов
Команды прошивок часто копируют дескрипторы конечных точек между интерфейсами или режимами. Это создаёт тонкие баги:
- Interrupt-конечная точка заявляет размер, как у bulk.
- Размер OUT-конечной точки неожиданно отличается от IN.
- Alternate setting имеет другой размер, а прошивка не перенастраивает конечную точку.
- Деревья дескрипторов full-speed и high-speed не совпадают.
- Соседние дескрипторы не соответствуют ожидаемой пропускной способности.
Правильный диагностический вид связывает адрес конечной точки с её дескриптором и каждой передачей по этой точке.
Баги буфера в прошивке
Даже при корректном дескрипторе прошивка может обрабатывать данные неправильно:
- Считает, что один USB-пакет = одно сообщение приложения.
- Не обрабатывает разорванные сообщения.
- Теряет пакеты нулевой длины.
- Считает короткий пакет ошибкой.
- Перезаписывает приёмный буфер после первого пакета.
- Падает, когда длина передачи равна max packet size.
- Не делает flush IN-конечной точки после финального короткого пакета.
Эти баги часто встречаются в вендорных устройствах и загрузчиках, потому что протокол обычно кастомный.
Предположения драйвера хоста
Код на хосте тоже может быть неправильным. Он может:
- Запрашивать слишком маленький буфер.
- Ожидать, что один вызов чтения равен одному сообщению устройства.
- Игнорировать завершение по короткому пакету.
- Использовать тайм-аут вместо фрейминга по длине.
- Слать команду больше буфера прошивки.
- Забывать про поведение ZLP.
Когда обе стороны кастомные, пакетная трасса становится контрактом.
Какие данные собирать
Для диагноза max packet size соберите:
- Скорость устройства.
- Дескриптор конечной точки.
- Адрес конечной точки и направление.
wMaxPacketSize.- Запрошенный хостом размер передачи.
- Реально наблюдаемые размеры пакетов.
- Наличие короткого пакета или ZLP.
- STALL, NAK, тайм-аут или reset после передачи.
- Отличие перечисления между full-speed и high-speed.
- Логи прошивки, если доступны.
Лучшие отчёты содержат точные счётчики байт. Поисковики тоже хорошо матчат такие практические детали.
Чек-лист отладки
Действуйте так:
- Определите дескриптор конечной точки.
- Зафиксируйте
wMaxPacketSize. - Сравните режим скорости.
- Пошлите полезные нагрузки меньше, равные и больше max packet size.
- Проверьте точные кратные max packet size.
- Ищите короткий пакет или ZLP.
- Проверьте, не ждёт ли хост после финального пакета.
- Сравните поведение IN и OUT-конечных точек.
- Проверьте смену alternate setting.
- Сохраните сбойную последовательность передач.
Итоговый диагноз
Баги max packet size USB-конечной точки — это проблемы дескриптора, передачи и контракта с прошивкой. Полезные данные — заявленный wMaxPacketSize, реальная пакетизация, поведение короткого пакета, обработка ZLP, режим скорости и сбои конкретной конечной точки.
Bus Scope помогает инженеру доказать, в чём именно баг — в дескрипторе, обработке буфера в прошивке, предположениях драйвера хоста или фрейминге передачи.
<!-- bus-scope-localized-transaction-foundation-v1:start -->Проверка USB-контракта для «Несовпадение max packet size конечной точки USB: отладка wMaxPacketSize, коротких пакетов, bulk-передач и багов буфера»
Краткий ответ: STALL, timeout или reset сам по себе не объясняет причину. Сначала докажите, что provider видит нужный device, затем прочитайте контракт transfer: тип, направление, recipient, wValue, wIndex, заявленная и фактическая длина, status и состояние до/после. Свяжите вывод с первой транзакцией, отличающейся от исправного запуска.
| Граница | Сравнение | Решение |
|---|---|---|
| Платформа | provider, права, Root Hub или usbmon/XHC20 | Records относятся к нужному соединению? |
| Setup | bmRequestType, bRequest, wValue, wIndex, wLength | Host отправил ожидаемый запрос? |
| Data | направление, длина и сохранённые bytes | Payload соответствует контракту? |
| Status | ACK, STALL, timeout или cancellation | Где завершилась транзакция? |
| Состояние | configuration, interface, alternate setting, halt | Device был готов к запросу? |
Начинайте до reset и enumeration, сохраняя descriptors, SET_CONFIGURATION, SET_INTERFACE и command перед отказом. Узкий endpoint filter может скрыть решающий control transfer. В одном опыте выполняйте одно USB-действие и меняйте только firmware, driver, port, cable, host command или timing.
Как написать цитируемый ответ?
Укажите request, setup fields, ответ и предыдущее состояние, затем тест с одной переменной. Не сохранённые из-за retention bytes не доказывают packet loss. Близость command и reset показывает корреляцию, но не причину без повторения или перехода состояния.
Сохраняйте VID/PID, firmware, speed, topology, provider, filter и trigger. Сравнивайте смысловые USB-фазы, а не frame numbers usbmon и USBPcap. Запишите начало, конец, версию, OS, подключение и checksum. Используйте устранение неполадок Bus Scope.
Semrush owners разделены: free USB analyzer принадлежит продукту, best USB protocol analyzer — сравнению, USB descriptor viewer — руководству descriptor. Для этой support-страницы не создаётся выдуманный volume или KD.
<!-- bus-scope-localized-transaction-foundation-v1:end --><!-- multilingual-blog-closeout:start -->Прямой ответ и граница приемки
Краткий ответ по теме «Несовпадение max packet size конечной точки USB: отладка wMaxPacketSize, коротких пакетов, bulk-передач и багов буфера»: Как отлаживать несовпадения max packet size USB-конечной точки, ошибки wMaxPacketSize в дескрипторе, короткие пакеты, сбои bulk-передач, отличия high-speed/full-speed и баги буфера прошивки. Считайте это проверяемым результатом, а не обещанием для любого входа, устройства, проекта или окружения. Полный результат фиксирует исходное состояние, точное действие, видимый выход и условие, подтверждающее завершение задачи в Bus Scope.
Порядок работы от доказательств
Начните с небольшого повторяемого случая до изменения полного проекта. Запишите версию приложения, систему, идентификатор входа или устройства, важные настройки и ожидаемый результат. Выполните одно осознанное действие, сохраните первый неожиданный переход и сравните с исправным случаем, если он есть. Одновременная смена нескольких параметров скрывает условие, создавшее или устранившее проблему.
Контрольная точка 1: Несовпадение max packet size конечной точки USB: отладка wMaxPacketSize, коротких пакетов,
Закрывайте «Несовпадение max packet size конечной точки USB: отладка wMaxPacketSize, коротких пакетов, bulk-передач и багов буфера» только когда сохраненный, экспортированный или повторно открытый результат соответствует наблюдению. Временный отклик интерфейса полезен, но долговечное доказательство сильнее. Запишите оставшиеся ограничения.
Контрольная точка 2: Как отлаживать несовпадения max packet size USB-конечной точки, ошибки wMaxPacketSize в де
Для «Как отлаживать несовпадения max packet size USB-конечной точки, ошибки wMaxPacketSize в дескрипторе, короткие пакеты, сбои bulk-передач, отличия high-» отделите решение продукта от границы системы, оборудования, исходного файла, прав или процесса. Установите, какой слой дал доказательство, прежде чем назначать причину. Так соседний симптом не станет якобы доказанной первопричиной.
Контрольная точка 3: Что задаёт wMaxPacketSize
Закрывайте «Что задаёт wMaxPacketSize» только когда сохраненный, экспортированный или повторно открытый результат соответствует наблюдению. Временный отклик интерфейса полезен, но долговечное доказательство сильнее. Запишите оставшиеся ограничения.
Контрольная точка 4: Типичные симптомы
Для «Типичные симптомы» отделите решение продукта от границы системы, оборудования, исходного файла, прав или процесса. Установите, какой слой дал доказательство, прежде чем назначать причину. Так соседний симптом не станет якобы доказанной первопричиной.
Контрольная точка 5: Поведение коротких пакетов
Закрывайте «Поведение коротких пакетов» только когда сохраненный, экспортированный или повторно открытый результат соответствует наблюдению. Временный отклик интерфейса полезен, но долговечное доказательство сильнее. Запишите оставшиеся ограничения.
Контрольная точка 6: Несовпадение high-speed и full-speed
Для «Несовпадение high-speed и full-speed» отделите решение продукта от границы системы, оборудования, исходного файла, прав или процесса. Установите, какой слой дал доказательство, прежде чем назначать причину. Так соседний симптом не станет якобы доказанной первопричиной.
Контрольная точка 7: Ошибки копирования дескрипторов
Закрывайте «Ошибки копирования дескрипторов» только когда сохраненный, экспортированный или повторно открытый результат соответствует наблюдению. Временный отклик интерфейса полезен, но долговечное доказательство сильнее. Запишите оставшиеся ограничения.
Контрольная точка 8: Баги буфера в прошивке
Для «Баги буфера в прошивке» отделите решение продукта от границы системы, оборудования, исходного файла, прав или процесса. Установите, какой слой дал доказательство, прежде чем назначать причину. Так соседний симптом не станет якобы доказанной первопричиной.
Контрольная точка 9: Предположения драйвера хоста
Закрывайте «Предположения драйвера хоста» только когда сохраненный, экспортированный или повторно открытый результат соответствует наблюдению. Временный отклик интерфейса полезен, но долговечное доказательство сильнее. Запишите оставшиеся ограничения.
Контрольная точка 10: Какие данные собирать
Для «Какие данные собирать» отделите решение продукта от границы системы, оборудования, исходного файла, прав или процесса. Установите, какой слой дал доказательство, прежде чем назначать причину. Так соседний симптом не станет якобы доказанной первопричиной.
Матрица приемки
| Точка | Сохраняемое доказательство | Критерий успеха |
|---|---|---|
| Несовпадение max packet size конечной точки USB: отладка wMaxPacketSize, коротких пакетов, bulk-передач и багов буфера | Исходное состояние, одно действие и результат | Второй оператор воспроизводит заявленный результат |
| Как отлаживать несовпадения max packet size USB-конечной точки, ошибки wMaxPacketSize в дескрипторе, короткие пакеты, сб | Исходное состояние, одно действие и результат | Второй оператор воспроизводит заявленный результат |
| Что задаёт wMaxPacketSize | Исходное состояние, одно действие и результат | Второй оператор воспроизводит заявленный результат |
| Типичные симптомы | Исходное состояние, одно действие и результат | Второй оператор воспроизводит заявленный результат |
| Поведение коротких пакетов | Исходное состояние, одно действие и результат | Второй оператор воспроизводит заявленный результат |
| Несовпадение high-speed и full-speed | Исходное состояние, одно действие и результат | Второй оператор воспроизводит заявленный результат |
Изоляция, восстановление и передача
Остановитесь на первой неуспешной границе. Сохраните источник, проект, сеанс или захват, сделайте копию перед разрушающим редактированием и меняйте одну переменную за опыт. Повтор широкого процесса после нескольких изменений может дать иной результат без объяснения причины.
Отличайте отсутствие доказательств от доказательства отсутствия. Пустой экран может означать неверный вход, область, фильтр, права, устройство, период или состояние проекта. Подтвердите получение или импорт до толкования decoder, редактора, отчета или экспорта.
Перед передачей повторно откройте артефакт и проверьте начало, точку решения и конец. Запишите версию, платформу, конфигурацию, ожидание, наблюдение и минимальное воспроизведение. Удалите или скройте чувствительные данные и проверьте полномочия получателя.
Вопросы и ответы
Как надежнее всего начать?
Возьмите минимальный репрезентативный случай, запишите ожидаемый результат и меняйте одну переменную. Подтвердите базовый путь до добавления фильтров, эффектов, правок, автоматизации или большого источника.
Какие доказательства сохранять?
Сохраните идентификатор входа, версию, платформу, настройки, точное действие, первый неожиданный переход и конечный выход. Закройте и повторно откройте проект, сеанс, отчет или экспорт.
Когда повторять процедуру?
После значимого изменения приложения, системы, драйвера, прошивки, модели, источника или процесса. Сохраните предыдущий принятый случай как неизменную основу сравнения.
Когда результат готов к передаче?
Когда другой уполномоченный человек определяет вход, повторяет действие, видит тот же результат, понимает ограничения и открывает артефакт без недокументированного локального состояния.
Связанные руководства
Эти страницы на том же языке описывают соседние этапы, не меняя канонического владельца темы:
<!-- multilingual-blog-closeout:end -->