Décalage de taille de paquet max d'endpoint USB
Comment déboguer les décalages de taille de paquet max d'endpoint USB, erreurs de descripteur wMaxPacketSize, paquets courts, stalls de transfert bulk, différences high-speed vs full-speed et bugs de buffer firmware.
Le wMaxPacketSize d'un endpoint USB ressemble à un petit champ de descripteur, mais une valeur erronée peut casser les transferts bulk, les rapports interrupt, le fonctionnement high-speed, le buffering firmware et les hypothèses du pilote hôte. Les utilisateurs cherchent « USB wMaxPacketSize mismatch », « USB short packet problem », « bulk transfer stops at 64 bytes », « USB endpoint packet size high speed full speed » ou « USB descriptor max packet size bug » quand les transferts échouent seulement à certaines tailles ou vitesses.
Bus Scope est utile car la défaillance n'est visible que quand descripteurs et paquets de transfert sont comparés ensemble. Le descripteur peut annoncer une taille de paquet tandis que le firmware, le code hôte ou le hardware de l'endpoint se comporte comme une autre taille.
Ce que contrôle wMaxPacketSize
Chaque descripteur d'endpoint inclut wMaxPacketSize. Il indique à l'hôte la taille de payload max pour cet endpoint. Les valeurs typiques dépendent de la vitesse et du type d'endpoint.
Exemples :
- Un endpoint bulk full-speed utilise souvent 64 octets.
- Un endpoint bulk high-speed utilise souvent 512 octets.
- Les endpoints interrupt varient selon la vitesse et l'intervalle.
- Les endpoints isochrones utilisent des tailles de paquet spécifiques à la bande passante.
Si le firmware configure des buffers d'endpoint pour 64 octets mais en annonce 512, l'hôte peut envoyer des transferts que le périphérique ne peut pas gérer correctement.
Symptômes courants
Les bugs de taille de paquet max d'endpoint peuvent apparaître comme :
- Transfert bulk qui réussit pour les petits messages mais échoue pour les gros.
- Périphérique qui marche en full-speed mais échoue en high-speed.
- Transfert qui s'arrête après exactement 64 octets.
- Hôte qui attend indéfiniment un paquet court.
- Firmware qui reçoit des données splittées de façon inattendue.
- Périphérique qui stall les transferts OUT.
- Transferts IN qui renvoient des données tronquées.
- Pilote qui signale un timeout alors qu'il y a du trafic.
- Périphérique composite qui marche sur une interface mais pas une autre.
Le compte exact d'octets est souvent l'indice.
Comportement de paquet court
Les transferts bulk USB utilisent souvent des paquets courts pour indiquer la fin d'un transfert quand la longueur demandée est plus grande que les données réelles. Si le périphérique renvoie exactement un multiple de la taille de paquet max, l'hôte peut attendre plus de données sauf si le protocole définit la longueur séparément ou envoie un paquet de longueur zéro.
Par exemple :
taille de paquet max : 64
longueur de payload : 128
paquets : 64 + 64
condition de fin : ambiguë sauf si la longueur est connue ou ZLP envoyé
C'est pourquoi « USB short packet » et « USB zero length packet » sont des termes de recherche forts. Un périphérique peut passer des tests simples puis se bloquer quand la longueur de payload tombe exactement sur une frontière de paquet.
Décalage high-speed vs full-speed
Certains périphériques se comportent correctement en full-speed mais échouent en high-speed. Causes possibles :
- Le descripteur high-speed annonce 512 octets.
- Le buffer firmware reste à 64 octets.
- L'alignement DMA change en high-speed.
- Le FIFO d'endpoint est trop petit.
- Le pilote hôte suppose une packetization high-speed.
- Le Device Descriptor diffère entre modes de vitesse.
Bus Scope doit aider à comparer la vitesse d'énumération, les valeurs de descripteurs d'endpoint et le chunking réel des transferts.
Erreurs de copier-coller de descripteurs
Les équipes firmware copient souvent des descripteurs d'endpoint entre interfaces ou modes. Cela peut créer des bugs subtils :
- Endpoint interrupt qui annonce une taille de type bulk.
- Taille d'endpoint OUT qui diffère de IN de façon inattendue.
- Alternate setting avec taille différente mais firmware qui ne reconfigure pas l'endpoint.
- Arborescences de descripteurs full-speed et high-speed en désaccord.
- Descripteurs compagnons qui ne correspondent pas au débit attendu.
La bonne vue diagnostique lie l'adresse de l'endpoint à son descripteur et à chaque transfert sur cet endpoint.
Bugs de buffer firmware
Même quand le descripteur est correct, le firmware peut traiter les données incorrectement :
- Suppose qu'un paquet USB égale un message applicatif.
- Ne gère pas les messages splittés.
- Laisse tomber les paquets de longueur zéro.
- Traite un paquet court comme une erreur.
- Écrase le buffer de réception après le premier paquet.
- Échoue quand la longueur de transfert égale la taille de paquet max.
- Ne flush pas l'endpoint IN après le paquet court final.
Ces bugs sont fréquents dans les périphériques vendor et les bootloaders car le protocole est généralement personnalisé.
Hypothèses du pilote hôte
Le code hôte peut aussi être faux. Il peut :
- Demander un buffer trop petit.
- S'attendre à ce qu'un read corresponde à un message du périphérique.
- Ignorer la terminaison par paquet court.
- Utiliser un timeout au lieu du framing par longueur de protocole.
- Envoyer une commande plus grande que le buffer firmware.
- Oublier le comportement de paquet de longueur zéro.
Quand les deux côtés sont personnalisés, la trace de paquets devient le contrat.
Preuves à collecter
Pour un diagnostic de taille de paquet max, collectez :
- Vitesse du périphérique.
- Descripteur d'endpoint.
- Adresse et direction de l'endpoint.
wMaxPacketSize.- Taille de transfert demandée par l'hôte.
- Tailles de paquets réellement observées.
- Présence de paquet court ou de paquet de longueur zéro.
- STALL, NAK, timeout ou reset après le transfert.
- Différence entre énumération full-speed et high-speed.
- Logs firmware si disponibles.
Les meilleurs rapports incluent les comptes exacts d'octets. Les moteurs de recherche matchent aussi bien ces détails pratiques.
Checklist de débogage
Suivez ce processus :
- Identifiez le descripteur d'endpoint.
- Enregistrez
wMaxPacketSize. - Comparez le mode de vitesse.
- Envoyez des payloads en dessous, à égalité et au-dessus de la taille de paquet max.
- Testez les multiples exacts de la taille de paquet max.
- Cherchez un paquet court ou de longueur zéro.
- Vérifiez si l'hôte attend après le paquet final.
- Comparez le comportement IN et OUT.
- Vérifiez les changements d'alternate setting.
- Conservez la séquence de transfert défaillante.
Diagnostic final
Les bugs de taille de paquet max d'endpoint USB sont des problèmes de descripteur, de transfert et de contrat firmware. La preuve utile est le wMaxPacketSize annoncé, la packetization réelle, le comportement de paquet court, la gestion du paquet de longueur zéro, le mode de vitesse et les défaillances spécifiques à l'endpoint.
Bus Scope aide les ingénieurs à prouver si le bug est dans le descripteur, la gestion des buffers firmware, les hypothèses du pilote hôte ou le framing du transfert.