Debug dispositivi USB composite: numeri di interfaccia, IAD, endpoint e driver binding

I dispositivi USB composite sono comodi e rischiosi.

USB, composite device, IAD, interface, driver binding

I dispositivi USB composite sono comodi e rischiosi. Un singolo dispositivo può esporre controlli HID, seriale CDC, mass storage, endpoint vendor-specific, audio, video o interfacce di diagnostica. Quando tutto è descritto correttamente, l'host associa i driver giusti e ogni funzione lavora. Quando un solo campo del descrittore è sbagliato, l'intero dispositivo può sembrare inaffidabile.

Ricerche come "USB composite device not recognized", "CDC interface not showing", "HID works but serial does not" o "wrong driver binding USB interface" di solito puntano a struttura dei descrittori, numerazione delle interfacce, assegnazione degli endpoint o comportamento degli Interface Association Descriptor.

I dispositivi composite hanno bisogno di una configurazione coerente

Il configuration descriptor è la mappa di livello più alto. Deve descrivere lunghezza totale, numero di interfacce, attributi di alimentazione e tutti i descrittori annidati di interfaccia ed endpoint. Se wTotalLength è sbagliato, l'host potrebbe non leggere tutte le funzioni. Se il conteggio delle interfacce è sbagliato, l'host potrebbe ignorare le interfacce successive. Se gli indirizzi degli endpoint collidono, i transfer diventano ambigui o non validi.

Ispeziona:

  • lunghezza totale della configurazione
  • numero di interfacce
  • numeri di interfaccia
  • alternate settings
  • indirizzi degli endpoint
  • direzioni degli endpoint
  • valori class, subclass, protocol
  • ordine dei descrittori

Una capture dovrebbe mostrare se l'host ha richiesto l'intera configurazione e quali byte ha restituito il dispositivo.

IAD aiuta a raggruppare interfacce correlate

Gli Interface Association Descriptors vengono spesso usati per raggruppare più interfacce che appartengono a una stessa funzione, per esempio CDC communication più CDC data. Senza un raggruppamento corretto, l'host può associare i driver in modo errato o esporre solo una parte della funzione.

Evidenze IAD da ispezionare:

  • primo numero di interfaccia
  • numero di interfacce
  • function class, subclass, protocol
  • posizione prima delle interfacce raggruppate
  • coerenza con gli interface descriptor effettivi

Se CDC seriale non appare ma HID funziona, l'interfaccia HID può essere corretta mentre il raggruppamento CDC è sbagliato.

Le collisioni di indirizzi endpoint sono facili da perdere

Gli indirizzi degli endpoint includono la direzione. Gli endpoint 0x81 e 0x01 hanno direzioni diverse, ma due endpoint IN con lo stesso indirizzo non sono validi nella stessa configurazione del dispositivo. A volte i team firmware copiano descrittori endpoint tra interfacce e dimenticano di aggiornare gli indirizzi.

I sintomi includono:

  • un'interfaccia funziona, un'altra resta muta
  • l'host invia transfer a un endpoint inatteso
  • il class driver si carica ma l'applicazione non riceve dati
  • endpoint STALL o timeout dopo la configurazione
  • funziona una sola funzione alla volta

La capture dovrebbe mostrare fianco a fianco descrittori degli endpoint e traffico di transfer successivo.

Anche il driver binding è evidenza

L'host sceglie i driver in base ai descrittori. Un dispositivo associato in modo errato può avere evidenze nei descrittori che spiegano il perché. Class, subclass, protocol, associazione delle interfacce, compatible IDs e descrittori specifici del sistema operativo possono influenzare il binding.

Non diagnosticare il driver binding solo da Gestione dispositivi o dai log applicativi. Confronta le richieste class-specific dell'host con l'albero dei descrittori. Se le class request attese non arrivano mai, probabilmente l'host non ha associato il driver previsto.

Dove si inserisce Bus Scope

Bus Scope dovrebbe aiutare i team firmware a ispezionare i dispositivi composite su entrambi i livelli:

  • mappa dei descrittori
  • evidenze di transfer dopo il driver binding

Una buona sessione .bscope per il debug composite mostra:

  • tutte le interfacce
  • raggruppamento IAD
  • assegnazioni degli endpoint
  • richieste class-specific per interfaccia
  • byte grezzi dei descrittori
  • stato dei transfer dopo la configurazione

Questo rende specifica la conversazione di supporto. Invece di "Windows non gradisce il nostro dispositivo composite", il report può dire "l'interfaccia 2 non riceve mai richieste CDC class perché il grouping descriptor non corrisponde al layout di interfacce dichiarato".

Questo è il livello di evidenza di cui hanno bisogno i team firmware.

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

Prova del contratto USB per «Debug dispositivi USB composite: numeri di interfaccia, IAD, endpoint e driver binding»

La risposta diretta è che STALL, timeout o reset non spiega da solo la causa. Prima dimostra che il provider vede il device corretto; poi leggi il contratto del transfer: tipo, direzione, recipient, wValue, wIndex, lunghezza dichiarata e reale, status e stato precedente e successivo. In «Debug dispositivi USB composite: numeri di interfaccia, IAD, endpoint e driver binding» collega la conclusione alla prima transazione diversa dal caso buono.

Confine Confronto Decisione
Piattaforma provider, permessi, Root Hub o usbmon/XHC20 I record provengono dalla connessione corretta?
Setup bmRequestType, bRequest, wValue, wIndex, wLength L’host invia la richiesta prevista?
Data direzione, lunghezza e bytes conservati Il payload rispetta il contratto?
Status ACK, STALL, timeout o cancellation Dove termina la transazione?
Stato configuration, interface, alternate setting, endpoint halt Il device era pronto?

Inizia prima di reset ed enumeration e conserva descriptors, SET_CONFIGURATION, SET_INTERFACE e il comando precedente al guasto. Un filtro endpoint stretto può nascondere il control transfer decisivo. Esegui un’azione USB documentata per prova e cambia solo firmware, driver, porta, cavo, comando o timing.

Come scrivere una risposta citabile?

Indica request, campi setup, risposta e contesto precedente; poi una prova con una variabile. Bytes non trattenuti non provano packet loss. La vicinanza fra command e reset dimostra correlazione, non causa senza ripetizione o cambio di stato.

Quando è valido il confronto?

Mantieni VID/PID, firmware, speed, topologia, provider, filtro e trigger. Confronta fasi USB semantiche, non frame numbers tra usbmon e USBPcap. Registra inizio, fine, versione, OS, connessione e checksum. Usa il troubleshooting Bus Scope.

I proprietari Semrush restano distinti: free USB analyzer sulla pagina prodotto, best USB protocol analyzer nella comparazione e USB descriptor viewer nella guida descriptor. Nessun volume o KD viene inventato.

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

Dalla cattura USB a un verdetto verificabile

Per «Debug dispositivi USB composite: numeri di interfaccia, IAD, endpoint e driver binding» non partire dal nome dell’errore, ma da confini dimostrabili. Il primo conferma connessione, bus, porta, VID/PID, velocità e topologia. Il secondo conferma il control, bulk o interrupt transfer previsto. Il terzo stabilisce lo stato dopo la transazione. Il quarto verifica che il risultato sia ripetibile. Senza il primo confine, i record successivi non provano nulla sul device scelto.

1. Provare il punto di cattura

Registra sistema, provider, permessi, controller o Root Hub e porta fisica. Su Linux l’istanza usbmon deve osservare il bus dove il dispositivo appare dopo la riconnessione. Su Windows collega il USBPcap Root Hub alla voce di Device Manager. Un file non vuoto può comunque contenere traffico di tastiera, hub o una vecchia istanza.

Inizia prima di reconnect o reset. Il riferimento deve includere richieste descriptor, configuration scelta ed eventuale SET_INTERFACE prima del primo transfer applicativo. Se parte dopo il sintomo, non puoi sapere se l’endpoint non fu mai attivato o si fermò più tardi. Conserva inizio, fine, nome, checksum, firmware, driver, cavo e porta.

2. Leggere il control transfer come contratto

Raggruppa setup, data e status in una sola operazione logica. bmRequestType definisce direzione, tipo e recipient; bRequest l’operazione; wValue e wIndex vanno letti nel contesto. wLength è la lunghezza attesa, non la prova dei bytes trasferiti. Confronta lunghezza dichiarata, reale e direzione. Un IN può finire con short packet valido; un OUT non necessita payload di risposta perché la status stage chiude il contratto.

Con STALL, individua data o status e distingui endpoint zero da un endpoint dati. Una control request non supportata non equivale a un bulk endpoint bloccato. Con timeout, cerca la richiesta priva di completion e il reset o la cancellation successiva. Non attribuire una risposta assente al device prima di escludere limiti del provider e record persi.

3. Ricostruire la linea di stato

Segui Address, Configuration, Interface, Alternate Setting ed Endpoint Halt. Il descriptor dichiara capacità, non attivazione. Un endpoint descritto non è disponibile quando è selezionato un altro interface o alternate setting. Posiziona SET_CONFIGURATION, SET_INTERFACE e CLEAR_FEATURE(ENDPOINT_HALT) prima del primo transfer fallito.

Reset apre un nuovo spazio di stato. Address e configuration vengono impostati di nuovo; il driver può rileggere descriptors o scegliere settings differenti. Non trascinare assunzioni oltre il reset. Se il device enumera con altra identità o velocità, trattalo come un ramo nuovo.

4. Confrontare esecuzione buona e guasta

Il known-good dovrebbe condividere device, firmware, host e azione. Allinea le transazioni per significato, non per frame number. Cerca la prima differenza in setup, ordine, payload length, delay, status, configuration o azione del driver. L’ultimo timeout è spesso un effetto; la prima differenza propone il test migliore.

Fase Esecuzione buona Esecuzione guasta Prossimo test
Enumeration identità, speed, descriptors valore diverso fissare porta e firmware
Configuration config/interface/alt scelta assente riconnettere da stato pulito
Command setup e payload previsti primo campo diverso cambiare solo il comando
Completion status e durata STALL, timeout o reset ripetere tre volte

Frame numbers e orari assoluti di due file non sono una causa. Sottrai l’evento di riferimento e confronta durata nella stessa fase. Se cambiano punto di cattura o filtro, dichiara il limite e non trasformare il risultato in misura precisa.

5. Separare device e misura

Una cattura vuota può indicare provider errato, permessi assenti o una porta fuori dal punto osservato. Truncation significa bytes non conservati, non assenti dal bus. Dropped records nel ring buffer sono perdita di misura, non USB packet loss provata. Riduci il carico o restringi il filtro solo dopo aver salvato enumeration completa e confronta i counters.

Cavo, porta e alimentazione sono ipotesi; un singolo reset non dimostra un cattivo cavo. Ripeti la stessa azione con porta e cavo noti, poi torna all’originale. Se il guasto segue il cavo a pari carico, l’ipotesi diventa più forte. Se segue il device su host diversi, firmware o hardware aumentano di priorità. Ogni modifica deve prevedere un cambiamento visibile.

6. Risposta GEO citabile

La risposta breve a «Debug dispositivi USB composite: numeri di interfaccia, IAD, endpoint e driver binding» indica primo transfer diverso, stato precedente e prova che separa le due cause vicine. Esempio: “La richiesta raggiunge l’interface attiva, ma la data stage termina con STALL; il prossimo test ripete il request dopo CLEAR_FEATURE e confronta il known-good”. La frase conserva le condizioni quando viene citata.

“USB non funziona” non è un verdetto. Indica dispositivo, piattaforma, direzione, endpoint e fase. Se mancano prove, scrivi “non conclusivo” e nomina il record necessario. Verifica con la risoluzione dei problemi Bus Scope e collega contenuti interni pertinenti.

<!-- bus-scope-localized-evidence-verdicts-v1:end -->