USB Interface Association Descriptor (IAD) и неправильная привязка драйверов составного устройства
Исправление ошибок IAD и привязки драйверов составного USB-устройства. Покрывает Windows usbccgp.sys, Code 10, Code 43, interface descriptors и частичные сбои перечисления устройства.
Составные USB-устройства выставляют несколько функций через одно физическое USB-устройство. Одно устройство может выдавать HID-управление, CDC serial, mass storage, вендорную диагностику, аудио, видео и интерфейсы обновления прошивки. Когда привязка драйверов идёт неправильно, пользователи видят «USB Composite Device driver error», «This device cannot start Code 10», «Code 43», «interface not working», «COM port missing», «one function works but another does not».
Запросы вроде «USB composite device wrong driver», «Windows usbccgp Code 10», «USB interface driver not binding», «IAD descriptor debugging» обычно требуют доказательств на уровне шины. Состояние драйвера Windows само по себе не показывает, корректно ли дескрипторы описывают функции.
Bus Scope помогает потому что привязка составного устройства задаётся дескрипторами.
Как структурированы составные устройства
Составное устройство содержит один device descriptor и одну или несколько конфигураций. Внутри конфигурации оно выставляет несколько интерфейсов. У каждого интерфейса есть значения class/subclass/protocol и конечные точки.
Пример функций:
- Interface 0: HID
- Interface 1: CDC control
- Interface 2: CDC data
- Interface 3: Vendor-specific diagnostics
Windows использует generic parent-драйвер USB, часто usbccgp.sys, чтобы перечислить дочерние функции и привязать подходящие драйверы.
Interface Association Descriptor
IAD группирует несколько интерфейсов в одну функцию. CDC ACM часто использует control interface и data interface. Без корректного IAD ОС может привязать их неправильно или трактовать как несвязанные интерфейсы.
Симптомы неверного IAD:
- CDC serial COM-порт отсутствует.
- Аудиофункция появляется частично.
- UVC-камера перечисляется, но видео-интерфейс падает.
- Вендорный интерфейс перехватывает не тот драйвер.
- Только одна подфункция работает.
Аккуратно проверяйте номера интерфейсов и диапазоны IAD.
Класс-коды и выбор драйвера
Привязка драйвера зависит от class/subclass/protocol-кодов на уровне устройства или интерфейса. Device-level class 0x00 означает, что класс задаётся на интерфейс. Device-level class 0xEF часто используется для разных составных устройств с IAD.
Если прошивка объявляет неверный код класса, Windows может выбрать не тот драйвер.
Для кастомных устройств будьте осознанны:
- HID-интерфейсы должны корректно описывать HID.
- CDC-интерфейсы должны соответствовать ожиданиям CDC.
- Вендорные интерфейсы должны использовать вендорный класс.
- WinUSB-интерфейсам могут быть нужны Microsoft OS-дескрипторы.
Code 10 и Code 43
Code 10 и Code 43 — это симптомы ОС, а не корневые причины. USB-трасса покажет, было ли:
- Device descriptor прочитан.
- Configuration descriptor валиден.
- Interface descriptors согласованы.
- Endpoint descriptors совпадают с ожиданиями интерфейса.
- Класс-управляющие дескрипторы искажены.
- Драйвер послал класс-запрос, который ставит stall.
- Устройство сбросилось во время привязки.
Если перечисление прошло, а класс-запрос упал — проблема позже базового чтения дескрипторов.
Частичный сбой устройства
Составные устройства могут работать частично. Например, HID-кнопки работают, но CDC serial — нет. Это значит, что устройство не просто «мёртвое». Это значит, что один интерфейсный путь упал.
Сохраните:
- Все interface descriptor'ы.
- Класс-управляющие дескрипторы.
- Номера интерфейсов.
- Класс-запросы драйвера.
- Трафик конечных точек для сбойного интерфейса.
Чек-лист отладки
Используйте такой сценарий:
- Захватите с момента подключения.
- Изучите device-level class/subclass/protocol.
- Изучите полную длину конфигурации и число интерфейсов.
- Изучите каждый interface descriptor.
- Изучите IAD-дескрипторы и диапазоны интерфейсов.
- Изучите класс-управляющие дескрипторы.
- Определите, какой интерфейс не привязался.
- Ищите stalled класс-запросы.
- Сравните Windows, Linux и другую Windows-машину, если нужно.
- Сохраните дескрипторы до правки захватов.
Итоговый диагноз
Сбои привязки драйверов составного USB-устройства обычно идут от контракта дескрипторов: кодов класса, номеров интерфейсов, IAD-группировки, класс-управляющих дескрипторов, Microsoft OS-дескрипторов или класс-запросов при старте драйвера.
Bus Scope помогает вытащить эти контракты наружу, чтобы «USB Composite Device driver error» можно было отследить до конкретного интерфейса и доказательств в дескрипторах.