Mismatch USB wMaxPacketSize: debug della dimensione pacchetto endpoint

Come diagnosticare mismatch della dimensione massima dei pacchetti endpoint USB, errori nel descrittore wMaxPacketSize, short packet, STALL bulk, differenze high-speed/full-speed e bug nei buffer firmware.

USB, wMaxPacketSize, endpoint USB, short packet, bulk transfer, descrittori USB, debug firmware

Il campo endpoint USB wMaxPacketSize sembra un dettaglio piccolo del descrittore, ma un valore sbagliato può rompere trasferimenti bulk, report interrupt, funzionamento high-speed, buffering firmware e assunzioni del driver host. Gli utenti cercano "USB wMaxPacketSize mismatch", "USB short packet problem", "bulk transfer stops at 64 bytes", "USB endpoint packet size high speed full speed" e "USB descriptor max packet size bug" quando i trasferimenti falliscono solo a certe dimensioni o velocità.

Bus Scope è utile perché il guasto diventa visibile solo confrontando insieme descrittori e pacchetti di trasferimento. Il descrittore può dichiarare una dimensione pacchetto mentre firmware, codice host o hardware endpoint si comportano come se fosse un'altra.

Cosa controlla wMaxPacketSize

Ogni descrittore endpoint include wMaxPacketSize. Indica all'host il payload massimo di pacchetto per quell'endpoint. I valori tipici dipendono da velocità e tipo di endpoint.

Esempi:

  • Un endpoint bulk full-speed usa spesso 64 byte.
  • Un endpoint bulk high-speed usa spesso 512 byte.
  • Gli endpoint interrupt variano per velocità e intervallo.
  • Gli endpoint isocroni usano dimensioni pacchetto specifiche per la banda.

Se il firmware configura buffer endpoint da 64 byte ma dichiara 512 byte, l'host può inviare trasferimenti che il dispositivo non riesce a gestire correttamente.

Sintomi comuni

I bug sulla dimensione massima dei pacchetti endpoint possono apparire come:

  • Il trasferimento bulk riesce per messaggi piccoli ma fallisce per messaggi grandi.
  • Il dispositivo funziona in full-speed ma fallisce in high-speed.
  • Il trasferimento si ferma esattamente dopo 64 byte.
  • L'host attende per sempre uno short packet.
  • Il firmware riceve dati spezzati in modo inatteso.
  • Il dispositivo manda in STALL i trasferimenti OUT.
  • I trasferimenti IN restituiscono dati troncati.
  • Il driver segnala timeout anche se il traffico esiste.
  • Un dispositivo composito funziona su un'interfaccia ma non su un'altra.

Il conteggio esatto dei byte è spesso l'indizio.

Comportamento degli short packet

I trasferimenti bulk USB spesso usano short packet per indicare la fine di un trasferimento quando la lunghezza richiesta è maggiore dei dati reali. Se il dispositivo restituisce esattamente un multiplo della dimensione massima del pacchetto, l'host può attendere altri dati a meno che il protocollo definisca la lunghezza separatamente o invii un zero-length packet.

Per esempio:

max packet size: 64
payload length: 128
packets: 64 + 64
end condition: ambiguous unless length is known or ZLP is sent

Per questo "USB short packet" e "USB zero length packet" sono termini di ricerca forti. Un dispositivo può superare test semplici e poi bloccarsi quando la lunghezza del payload cade esattamente su un confine di pacchetto.

Mismatch high-speed vs full-speed

Alcuni dispositivi si comportano correttamente in full-speed ma falliscono in high-speed. Le cause includono:

  • Il descrittore high-speed dichiara 512 byte.
  • Il buffer firmware resta da 64 byte.
  • L'allineamento DMA cambia in high-speed.
  • La FIFO dell'endpoint è troppo piccola.
  • Il driver host assume la pacchettizzazione high-speed.
  • Il descrittore dispositivo differisce tra le modalità di velocità.

Bus Scope dovrebbe aiutare a confrontare velocità di enumerazione, valori dei descrittori endpoint e chunking effettivo dei trasferimenti.

Errori di copia e incolla nei descrittori

I team firmware spesso copiano descrittori endpoint tra interfacce o modalità. Questo può creare bug sottili:

  • Un endpoint interrupt dichiara una dimensione simile a un bulk.
  • La dimensione dell'endpoint OUT differisce da quella IN in modo inatteso.
  • Un alternate setting ha una dimensione diversa ma il firmware non riconfigura l'endpoint.
  • Gli alberi descrittori full-speed e high-speed non concordano.
  • I companion descriptor non corrispondono al throughput atteso.

La vista diagnostica corretta collega l'indirizzo endpoint al suo descrittore e a ogni trasferimento su quell'endpoint.

Bug nei buffer firmware

Anche quando il descrittore è corretto, il firmware può elaborare i dati in modo sbagliato:

  • Assume che un pacchetto USB equivalga a un messaggio applicativo.
  • Non gestisce messaggi spezzati.
  • Scarta zero-length packet.
  • Tratta uno short packet come errore.
  • Sovrascrive il buffer di ricezione dopo il primo pacchetto.
  • Fallisce quando la lunghezza del trasferimento è uguale alla dimensione massima del pacchetto.
  • Non fa flush dell'endpoint IN dopo lo short packet finale.

Questi bug sono comuni nei dispositivi vendor-specific e nei bootloader perché il protocollo è di solito personalizzato.

Assunzioni del driver host

Anche il codice host può essere sbagliato. Potrebbe:

  • Richiedere un buffer troppo piccolo.
  • Aspettarsi che una chiamata read equivalga a un messaggio del dispositivo.
  • Ignorare la terminazione tramite short packet.
  • Usare un timeout invece di un framing con lunghezza di protocollo.
  • Inviare un comando più grande del buffer firmware.
  • Dimenticare il comportamento zero-length packet.

Quando entrambi i lati sono personalizzati, la traccia dei pacchetti diventa il contratto.

Evidenze da raccogliere

Per una diagnosi sulla dimensione massima dei pacchetti, raccogli:

  • Velocità del dispositivo.
  • Descrittore endpoint.
  • Indirizzo e direzione dell'endpoint.
  • wMaxPacketSize.
  • Dimensione del trasferimento richiesta dall'host.
  • Dimensioni dei pacchetti effettivamente osservate.
  • Presenza di short packet o zero-length packet.
  • STALL, NAK, timeout o reset dopo il trasferimento.
  • Differenza tra enumerazione full-speed e high-speed.
  • Log firmware, se disponibili.

I report migliori includono conteggi di byte esatti. Anche i motori di ricerca intercettano bene questi dettagli pratici.

Checklist di debug

Usa questo processo:

  1. Identifica il descrittore endpoint.
  2. Registra wMaxPacketSize.
  3. Confronta la modalità di velocità.
  4. Invia payload sotto, uguali e sopra la dimensione massima del pacchetto.
  5. Testa multipli esatti della dimensione massima del pacchetto.
  6. Cerca short packet o zero-length packet.
  7. Controlla se l'host attende dopo il pacchetto finale.
  8. Confronta il comportamento degli endpoint IN e OUT.
  9. Controlla cambi di alternate setting.
  10. Conserva la sequenza di trasferimento fallita.

Diagnosi finale

I bug sulla dimensione massima dei pacchetti endpoint USB sono problemi di descrittore, trasferimento e contratto firmware. Le evidenze utili sono il wMaxPacketSize dichiarato, la pacchettizzazione reale, il comportamento degli short packet, la gestione degli zero-length packet, la modalità di velocità e i guasti specifici per endpoint.

Bus Scope aiuta gli ingegneri a provare se il bug sta nel descrittore, nella gestione dei buffer firmware, nelle assunzioni del driver host o nel framing dei trasferimenti.