IAD y depuración de dispositivos compuestos USB: cuando el driver equivocado se enlaza

Arregla errores de binding de driver en dispositivos compuestos USB y en el Interface Association Descriptor (IAD). Cubre usbccgp.sys de Windows, Code 10, Code 43, descriptores de interfaz y fallos parciales de enumeración.

dispositivo compuesto USB, binding de driver incorrecto, usbccgp, code 10, code 43, interface descriptor, diagnóstico USB

Los dispositivos compuestos USB exponen varias funciones a través de un único dispositivo USB físico. Un solo dispositivo puede ofrecer controles HID, CDC serie, mass storage, diagnósticos vendor, audio, vídeo e interfaces de actualización de firmware. Cuando el binding de driver se rompe, los usuarios ven "USB Composite Device driver error", "This device cannot start Code 10", "Code 43", "interface not working", "COM port missing" o "one function works but another does not".

Búsquedas como "USB composite device wrong driver", "Windows usbccgp Code 10", "USB interface driver not binding" e "IAD descriptor debugging" suelen necesitar evidencia a nivel de bus. El estado de driver en Windows por sí solo no muestra si los descriptores describen correctamente las funciones.

Bus Scope ayuda porque el binding en compuestos está dirigido por los descriptores.

Cómo se estructuran los dispositivos compuestos

Un dispositivo compuesto contiene un device descriptor y una o más configurations. Dentro de una configuración, expone varias interfaces. Cada interfaz tiene valores de class/subclass/protocol y endpoints.

Ejemplos de funciones:

  • Interface 0: HID.
  • Interface 1: control CDC.
  • Interface 2: datos CDC.
  • Interface 3: diagnósticos vendor-specific.

Windows usa el driver genérico USB parent, a menudo usbccgp.sys, para enumerar las funciones hijas y enlazar los drivers apropiados.

Interface Association Descriptor

El IAD agrupa varias interfaces en una sola función. CDC ACM suele usar una interfaz de control y una de datos. Sin un IAD correcto, el SO puede enlazarlas mal o tratarlas como interfaces no relacionadas.

Síntomas de un IAD mal:

  • Falta el puerto COM CDC serie.
  • La función de audio aparece parcialmente.
  • La cámara UVC enumera pero la interfaz de vídeo falla.
  • La interfaz vendor se lleva el driver equivocado.
  • Solo una subfunción funciona.

Revisa con cuidado los números de interfaz y los rangos del IAD.

Class codes y elección de driver

El binding depende de los códigos class/subclass/protocol a nivel de dispositivo o de interfaz. Un class a nivel de dispositivo de 0x00 significa que la clase se define por interfaz. Un class a nivel de dispositivo de 0xEF se suele usar para dispositivos compuestos varios con IAD.

Si el firmware declara el class code incorrecto, Windows puede elegir el driver que no es.

Para dispositivos a medida, sé deliberado:

  • Las interfaces HID deben describir HID correctamente.
  • Las interfaces CDC deben coincidir con las expectativas CDC.
  • Las interfaces vendor-specific deben usar vendor class.
  • Las interfaces WinUSB pueden necesitar Microsoft OS descriptors.

Code 10 y Code 43

Code 10 y Code 43 son síntomas del SO, no causas raíz. La traza USB puede revelar si:

  • El device descriptor se leyó.
  • El configuration descriptor es válido.
  • Los interface descriptors son consistentes.
  • Los endpoint descriptors encajan con la interfaz esperada.
  • Los class-specific descriptors están mal formados.
  • El driver lanzó una class request que hizo STALL.
  • El dispositivo se reseteó durante el binding.

Si la enumeración va bien pero falla una class request, el problema es posterior a la lectura básica de descriptores.

Fallo parcial del dispositivo

Los dispositivos compuestos pueden fallar parcialmente. Por ejemplo, los botones HID funcionan pero el CDC serie no. Eso significa que el dispositivo no está simplemente "muerto". Significa que falló el camino de una interfaz.

Conserva:

  • Todos los interface descriptors.
  • Class-specific descriptors.
  • Números de interfaz.
  • Class requests del driver.
  • Tráfico de endpoints de la interfaz que falla.

Checklist de depuración

Usa este flujo:

  1. Captura desde el momento del plug-in.
  2. Inspecciona class/subclass/protocol a nivel de dispositivo.
  3. Inspecciona la longitud total de la configuración y el número de interfaces.
  4. Inspecciona cada interface descriptor.
  5. Inspecciona los IAD y los rangos de interfaces.
  6. Inspecciona los class-specific descriptors.
  7. Identifica qué interfaz no llega a enlazar.
  8. Busca class requests stalled.
  9. Compara Windows, Linux y otro Windows si hace falta.
  10. Conserva los descriptores antes de tocar la captura.

Diagnóstico final

Los fallos de binding de driver en compuestos USB suelen venir de contratos de descriptor: class codes, números de interfaz, agrupamiento IAD, class-specific descriptors, Microsoft OS descriptors o class requests durante el arranque del driver.

Bus Scope ayuda a exponer esos contratos para que un "USB Composite Device driver error" se pueda rastrear hasta la interfaz exacta y la evidencia de descriptor.