USB endpoint STALL e timeout bulk: leggere l'acquisizione prima del firmware

Come diagnosticare STALL degli endpoint USB, timeout dei trasferimenti bulk e guasti del percorso dati firmware usando le evidenze dei trasferimenti.

USB, endpoint USB, STALL, bulk transfer, timeout USB, firmware

Dopo che l'enumerazione riesce, i dispositivi USB possono ancora fallire in modi misteriosi per gli sviluppatori applicativi: "letture bulk in timeout, scritture che non completano, report HID che smettono di arrivare o l'host che segnala un endpoint STALL. Questi guasti vengono spesso trattati come bug del driver o blocchi casuali del firmware. Un'acquisizione di solito restringe il problema molto più rapidamente." I guasti degli endpoint sono evidenze del percorso dati. Avvengono dopo che l'host ha imparato la forma del dispositivo. Questo significa che i descrittori possono essere corretti mentre il comportamento degli endpoint resta sbagliato.

STALL è un segnale, non solo un errore

Un endpoint USB può restituire STALL per indicare che non può elaborare una richiesta o che un comando di classe/vendor non è supportato. Gli STALL dell'endpoint di controllo durante richieste di classe possono essere legittimi se la richiesta non è valida. Gli STALL degli endpoint dati durante il normale flusso di trasferimento di solito richiedono un'ispezione più attenta.

Domande da fare sull'acquisizione:

  • quale endpoint è andato in STALL?
  • era control, bulk, interrupt o isochronous?
  • quale richiesta o trasferimento ha preceduto lo STALL?
  • l'host ha cancellato la condizione di halt?
  • il traffico è ripreso dopo CLEAR_FEATURE(ENDPOINT_HALT)?
  • il firmware ha intenzionalmente mandato in STALL comandi non supportati?

Senza questo contesto, "endpoint stalled" è troppo vago per decidere cosa fare.

I timeout bulk richiedono direzione e contesto della coda

Un timeout di trasferimento bulk può significare molte cose:

  • l'host si aspettava dati IN ma il dispositivo non ne aveva pronti
  • il dispositivo si aspettava dati OUT ma l'applicazione ha smesso di scrivere
  • il buffer endpoint del firmware non era preparato
  • il driver host ha inviato una read più grande di quanto supporti il firmware
  • il dispositivo ha fatto NAK fino al timeout
  • indirizzo o direzione dell'endpoint erano sbagliati
  • uno STALL precedente non è mai stato cancellato

La prima cosa da ispezionare è la direzione. Un timeout bulk IN e un timeout bulk OUT sono casi diversi. Per IN, chiediti se il dispositivo ha mai restituito dati. Per OUT, chiediti se l'host ha inviato dati e se il dispositivo li ha riconosciuti.

La correttezza dei descrittori è necessaria ma non sufficiente

Un descrittore può dichiarare correttamente un endpoint bulk IN e il dispositivo può comunque non riuscire a inviare dati utili. Un dispositivo CDC può enumerare come porta seriale e comunque ignorare line coding o control line state. Un'interfaccia vendor-specific può esporre endpoint ma richiedere un comando di inizializzazione prima che i dati si muovano.

Questo significa che il debug degli endpoint deve combinare:

  • evidenze dei descrittori
  • richieste di setup di classe o vendor
  • direzione del trasferimento
  • lunghezza del payload
  • risultato di stato
  • timing e tentativi ripetuti

L'acquisizione dovrebbe mostrare se l'host sta chiedendo qualcosa di irragionevole o se il firmware non sta soddisfacendo una richiesta valida.

I team firmware dovrebbero acquisire prima e dopo la correzione

Per i bug sugli endpoint, le acquisizioni prima e dopo sono preziose. La prima acquisizione prova il guasto. La seconda prova la correzione. Un buon confronto mostra:

  • stesso dispositivo e configurazione
  • stessi indirizzi endpoint
  • stesso pattern di richieste dell'host
  • la vecchia acquisizione va in STALL o timeout
  • la nuova acquisizione completa e trasporta il payload atteso

Questo rende molto più facile la review delle regressioni firmware. Offre anche ai team di supporto un artefatto ripetibile quando i clienti segnalano che "USB si blocca a caso".

Dove si inserisce Bus Scope

Bus Scope è orientato alle evidenze USB, non a una dispersione generica su molti protocolli. Nei casi di endpoint STALL e timeout, dovrebbe tenere vicini dettaglio pacchetto, metadati endpoint, byte grezzi, tipo di trasferimento e interpretazione di classe.

L'output utile è:

  • endpoint e direzione
  • tipo di trasferimento
  • richiesta o trasferimento prima del guasto
  • evidenza di stato
  • payload grezzo intorno al guasto
  • se il problema segue enumerazione, setup di classe o traffico applicativo

Queste sono le informazioni che servono agli ingegneri firmware prima di toccare la logica dei buffer endpoint o il comportamento di retry lato host.

Se la tua ricerca è "USB bulk transfer timeout" o "USB endpoint stalled", non iniziare riscrivendo l'intero stack del dispositivo. Acquisisci prima le evidenze dell'endpoint.