Отладка составных USB-устройств: номера интерфейсов, IAD, конечные точки и привязка драйверов

Как отлаживать составные USB-устройства, когда один интерфейс работает, другой падает, или хост привязывает неверный драйвер.

USB, составное устройство, IAD, интерфейс, привязка драйвера, composite

Составные USB-устройства удобны и опасны. Одно физическое устройство может выставить HID-управление, CDC serial, mass storage, вендорные конечные точки, аудио, видео или диагностические интерфейсы. Когда всё описано корректно, хост привязывает правильные драйверы, и каждая функция работает. Когда одно поле дескриптора неверно, всё устройство может выглядеть ненадёжным.

Запросы вроде «USB composite device not recognized», «CDC interface not showing», «HID works but serial does not», «wrong driver binding USB interface» обычно указывают на структуру дескриптора, нумерацию интерфейсов, назначение конечных точек или поведение Interface Association Descriptor.

Составные устройства требуют связной конфигурации

Configuration descriptor — это верхнеуровневая карта. Он должен описывать полную длину, число интерфейсов, характеристики питания и все вложенные interface и endpoint дескрипторы. Если wTotalLength неверный, хост может не прочитать все функции. Если число интерфейсов неверно, хост может проигнорировать последующие. Если адреса конечных точек сталкиваются, передачи становятся двусмысленными или невалидными.

Изучите:

  • полную длину конфигурации
  • число интерфейсов
  • номера интерфейсов
  • alternate settings
  • адреса конечных точек
  • направления конечных точек
  • значения class, subclass, protocol
  • порядок дескрипторов

Захват должен показать, запросил ли хост полную конфигурацию и какие байты вернуло устройство.

IAD помогает группировать связанные интерфейсы

Interface Association Descriptors часто используются, чтобы сгруппировать несколько интерфейсов, принадлежащих одной функции, например CDC communication + CDC data. Без корректной группировки хост может привязать драйверы некорректно или выставить только часть функции.

Что изучать в IAD:

  • номер первого интерфейса
  • число интерфейсов
  • function class, subclass, protocol
  • размещение перед группируемыми интерфейсами
  • согласованность с реальными interface descriptor'ами

Если CDC serial не появляется, а HID работает — HID-интерфейс может быть в порядке, а группировка CDC — нет.

Коллизии адресов конечных точек легко пропустить

Адреса конечных точек включают направление. Endpoint 0x81 и 0x01 — разные направления, но две IN-конечные точки с одинаковым адресом в одной конфигурации устройства невалидны. Команды прошивок иногда копируют endpoint дескрипторы между интерфейсами и забывают обновить адреса.

Симптомы:

  • один интерфейс работает, другой молчит
  • хост шлёт передачи на неожиданную конечную точку
  • класс-драйвер загружается, но приложение не получает данные
  • STALL или тайм-аут конечной точки после конфигурации
  • только одна функция работает одновременно

Захват должен показать endpoint descriptors и последующий трафик передач бок о бок.

Привязка драйверов — тоже доказательство

Хост выбирает драйверы на основе дескрипторов. Устройство, которое привязалось неверно, может иметь дескрипторные доказательства, объясняющие почему. Class, subclass, protocol, interface association, compatible IDs и OS-специфичные дескрипторы могут влиять на привязку.

Не диагностируйте привязку драйвера только по Диспетчеру устройств или логам приложения. Сравните класс-управляющие запросы хоста с деревом дескрипторов. Если ожидаемые класс-запросы не пришли, хост, скорее всего, не привязал ожидаемый драйвер.

Место Bus Scope

Bus Scope помогает командам прошивок изучать составные устройства на двух уровнях:

  • карта дескрипторов
  • доказательства передач после привязки драйвера

Хороший .bscope-сеанс по отладке составного устройства показывает:

  • все интерфейсы
  • IAD-группировку
  • назначения конечных точек
  • класс-управляющие запросы на интерфейс
  • сырые байты дескрипторов
  • статус передач после конфигурации

Это делает разговор поддержки конкретным. Вместо «Windows не любит наше составное устройство» отчёт может сказать «интерфейс 2 не получает CDC класс-запросы, потому что grouping descriptor не совпадает с заявленной раскладкой».

Это и есть уровень доказательств, нужный командам прошивок.

<!-- bus-scope-localized-transaction-foundation-v1:start -->

Проверка USB-контракта для «Отладка составных USB-устройств: номера интерфейсов, IAD, конечные точки и привязка драйверов»

Краткий ответ: 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 -->

Прямой ответ и граница приемки

Краткий ответ по теме «Отладка составных USB-устройств: номера интерфейсов, IAD, конечные точки и привязка драйверов»: Как отлаживать составные USB-устройства, когда один интерфейс работает, другой падает, или хост привязывает неверный драйвер. Считайте это проверяемым результатом, а не обещанием для любого входа, устройства, проекта или окружения. Полный результат фиксирует исходное состояние, точное действие, видимый выход и условие, подтверждающее завершение задачи в Bus Scope.

Порядок работы от доказательств

Начните с небольшого повторяемого случая до изменения полного проекта. Запишите версию приложения, систему, идентификатор входа или устройства, важные настройки и ожидаемый результат. Выполните одно осознанное действие, сохраните первый неожиданный переход и сравните с исправным случаем, если он есть. Одновременная смена нескольких параметров скрывает условие, создавшее или устранившее проблему.

Контрольная точка 1: Отладка составных USB-устройств: номера интерфейсов, IAD, конечные точки и привязка драйве

Проверяйте «Отладка составных USB-устройств: номера интерфейсов, IAD, конечные точки и привязка драйверов» на минимальном репрезентативном входе. Не меняйте несвязанные настройки, повторите то же действие и проверьте результат после повторного открытия или подключения. Один снимок слабее записи с входом, настройкой, действием, выходом и временем.

Контрольная точка 2: Как отлаживать составные USB-устройства, когда один интерфейс работает, другой падает, или

Если «Как отлаживать составные USB-устройства, когда один интерфейс работает, другой падает, или хост привязывает неверный драйвер.» неоднозначен, сравните исправный и ошибочный случаи в одинаковых условиях. Отметьте первое значимое различие вместо списка последующих симптомов. Эта граница дает более ясное обращение в поддержку и безопасный следующий опыт.

Контрольная точка 3: Составные устройства требуют связной конфигурации

Проверяйте «Составные устройства требуют связной конфигурации» на минимальном репрезентативном входе. Не меняйте несвязанные настройки, повторите то же действие и проверьте результат после повторного открытия или подключения. Один снимок слабее записи с входом, настройкой, действием, выходом и временем.

Контрольная точка 4: IAD помогает группировать связанные интерфейсы

Если «IAD помогает группировать связанные интерфейсы» неоднозначен, сравните исправный и ошибочный случаи в одинаковых условиях. Отметьте первое значимое различие вместо списка последующих симптомов. Эта граница дает более ясное обращение в поддержку и безопасный следующий опыт.

Контрольная точка 5: Коллизии адресов конечных точек легко пропустить

Проверяйте «Коллизии адресов конечных точек легко пропустить» на минимальном репрезентативном входе. Не меняйте несвязанные настройки, повторите то же действие и проверьте результат после повторного открытия или подключения. Один снимок слабее записи с входом, настройкой, действием, выходом и временем.

Контрольная точка 6: Привязка драйверов — тоже доказательство

Если «Привязка драйверов — тоже доказательство» неоднозначен, сравните исправный и ошибочный случаи в одинаковых условиях. Отметьте первое значимое различие вместо списка последующих симптомов. Эта граница дает более ясное обращение в поддержку и безопасный следующий опыт.

Контрольная точка 7: Место Bus Scope

Проверяйте «Место Bus Scope» на минимальном репрезентативном входе. Не меняйте несвязанные настройки, повторите то же действие и проверьте результат после повторного открытия или подключения. Один снимок слабее записи с входом, настройкой, действием, выходом и временем.

Контрольная точка 8: Проверка USB-контракта для «Отладка составных USB-устройств: номера интерфейсов, IAD, коне

Если «Проверка USB-контракта для «Отладка составных USB-устройств: номера интерфейсов, IAD, конечные точки и привязка драйверов»» неоднозначен, сравните исправный и ошибочный случаи в одинаковых условиях. Отметьте первое значимое различие вместо списка последующих симптомов. Эта граница дает более ясное обращение в поддержку и безопасный следующий опыт.

Контрольная точка 9: Как написать цитируемый ответ?

Проверяйте «Как написать цитируемый ответ?» на минимальном репрезентативном входе. Не меняйте несвязанные настройки, повторите то же действие и проверьте результат после повторного открытия или подключения. Один снимок слабее записи с входом, настройкой, действием, выходом и временем.

Контрольная точка 10: полную длину конфигурации

Если «полную длину конфигурации» неоднозначен, сравните исправный и ошибочный случаи в одинаковых условиях. Отметьте первое значимое различие вместо списка последующих симптомов. Эта граница дает более ясное обращение в поддержку и безопасный следующий опыт.

Матрица приемки

Точка Сохраняемое доказательство Критерий успеха
Отладка составных USB-устройств: номера интерфейсов, IAD, конечные точки и привязка драйверов Исходное состояние, одно действие и результат Второй оператор воспроизводит заявленный результат
Как отлаживать составные USB-устройства, когда один интерфейс работает, другой падает, или хост привязывает неверный дра Исходное состояние, одно действие и результат Второй оператор воспроизводит заявленный результат
Составные устройства требуют связной конфигурации Исходное состояние, одно действие и результат Второй оператор воспроизводит заявленный результат
IAD помогает группировать связанные интерфейсы Исходное состояние, одно действие и результат Второй оператор воспроизводит заявленный результат
Коллизии адресов конечных точек легко пропустить Исходное состояние, одно действие и результат Второй оператор воспроизводит заявленный результат
Привязка драйверов — тоже доказательство Исходное состояние, одно действие и результат Второй оператор воспроизводит заявленный результат

Изоляция, восстановление и передача

Остановитесь на первой неуспешной границе. Сохраните источник, проект, сеанс или захват, сделайте копию перед разрушающим редактированием и меняйте одну переменную за опыт. Повтор широкого процесса после нескольких изменений может дать иной результат без объяснения причины.

Отличайте отсутствие доказательств от доказательства отсутствия. Пустой экран может означать неверный вход, область, фильтр, права, устройство, период или состояние проекта. Подтвердите получение или импорт до толкования decoder, редактора, отчета или экспорта.

Перед передачей повторно откройте артефакт и проверьте начало, точку решения и конец. Запишите версию, платформу, конфигурацию, ожидание, наблюдение и минимальное воспроизведение. Удалите или скройте чувствительные данные и проверьте полномочия получателя.

Вопросы и ответы

Как надежнее всего начать?

Возьмите минимальный репрезентативный случай, запишите ожидаемый результат и меняйте одну переменную. Подтвердите базовый путь до добавления фильтров, эффектов, правок, автоматизации или большого источника.

Какие доказательства сохранять?

Сохраните идентификатор входа, версию, платформу, настройки, точное действие, первый неожиданный переход и конечный выход. Закройте и повторно откройте проект, сеанс, отчет или экспорт.

Когда повторять процедуру?

После значимого изменения приложения, системы, драйвера, прошивки, модели, источника или процесса. Сохраните предыдущий принятый случай как неизменную основу сравнения.

Когда результат готов к передаче?

Когда другой уполномоченный человек определяет вход, повторяет действие, видит тот же результат, понимает ограничения и открывает артефакт без недокументированного локального состояния.

Связанные руководства

Эти страницы на том же языке описывают соседние этапы, не меняя канонического владельца темы:

<!-- multilingual-blog-closeout:end -->