Débogage de la phase status d'un transfert de contrôle USB
Comment déboguer les problèmes de phase status d'un transfert de contrôle USB, paquets de longueur zéro, stalls d'endpoint zéro, séquencement SETUP/DATA/STATUS, requêtes de descripteurs et échecs de commandes vendor.
Les transferts de contrôle USB semblent simples jusqu'à ce qu'un périphérique échoue en phase status. Les utilisateurs cherchent « USB control transfer status stage », « zero length packet USB », « endpoint zero stall », « SETUP DATA STATUS USB », « control transfer timeout » ou « vendor request fails » quand les descripteurs marchent mais qu'une commande stall ou timeout.
Bus Scope est utile car les échecs de transfert de contrôle exigent de voir toutes les phases ensemble. Le setup packet seul ne suffit pas. La data stage et la status stage prouvent si l'hôte et le périphérique ont terminé la transaction.
Les phases d'un transfert de contrôle
Un transfert de contrôle comporte généralement :
- SETUP stage
- DATA stage (optionnelle)
- STATUS stage
La status stage utilise souvent un paquet de longueur zéro dans la direction opposée à la data stage. Elle confirme la complétion.
Si la status stage échoue, l'hôte peut signaler un timeout même si le périphérique a déjà échangé des données.
Confusion autour du paquet de longueur zéro
Un paquet de longueur zéro n'est pas automatiquement « pas de données » au sens applicatif. Dans les transferts de contrôle, il peut s'agir du handshake status requis.
Erreurs fréquentes :
- le firmware n'ACK pas la status stage
- l'hôte attend un paquet status de longueur zéro et reçoit STALL
- le périphérique envoie des données là où le status devrait être vide
- la commande vendor termine la data stage mais échoue sur le handshake final
- la machine à états du firmware oublie d'armer l'endpoint zéro
Ces bugs sont fréquents dans les commandes vendor et les bootloaders personnalisés.
L'endpoint zéro est particulier
L'endpoint zéro gère l'énumération et les requêtes de contrôle. Si son état est corrompu, le périphérique entier peut devenir instable.
Symptômes :
- l'énumération démarre mais échoue sur un descripteur ultérieur
- la requête vendor marche une fois puis stall
- le périphérique nécessite un débranchement/rebranchement après un transfert de contrôle
- SET_ADDRESS ou SET_CONFIGURATION est peu fiable
- HID Feature Report sur le chemin de contrôle échoue
- la requête DFU detach revient mais le périphérique ne change jamais de mode
Bus Scope doit montrer si l'endpoint zéro s'est récupéré après un stall ou est resté cassé.
Transferts de contrôle IN vs OUT
La direction du contrôle change la direction de la status stage.
Pour une requête IN :
- l'hôte envoie SETUP
- le périphérique envoie DATA
- l'hôte envoie un paquet OUT status de longueur zéro
Pour une requête OUT :
- l'hôte envoie SETUP
- l'hôte envoie DATA s'il y en a
- le périphérique envoie un paquet IN status de longueur zéro
Les bugs firmware surviennent souvent quand une direction est plus testée que l'autre.
Échecs de descripteurs vs commandes vendor
Les requêtes de descripteurs standard peuvent marcher parce qu'elles utilisent des chemins firmware bien testés. Les requêtes vendor peuvent échouer parce qu'un handler personnalisé gère mal la longueur, la direction ou la status stage.
Preuves :
bmRequestTypebRequestwValuewIndexwLength- longueur de données réelle
- résultat de la status stage
- STALL, NAK, timeout ou reset
Les champs du setup packet doivent être interprétés avec le comportement observé des phases.
Checklist de débogage
Suivez ce flux :
- Capturez le transfert de contrôle complet.
- Décodez les champs SETUP.
- Identifiez la direction du transfert.
- Vérifiez la longueur de données attendue.
- Vérifiez les octets de la data stage.
- Vérifiez la direction de la status stage.
- Cherchez un paquet de longueur zéro.
- Vérifiez STALL ou timeout.
- Comparez requêtes standard et vendor.
- Conservez le comportement de récupération de l'endpoint zéro.
Diagnostic final
Les échecs de transfert de contrôle USB sont souvent des échecs de status stage, pas seulement des problèmes de setup packet. Les paquets de longueur zéro, l'état de l'endpoint zéro, la direction et le handshake final comptent.
Bus Scope aide les ingénieurs à prouver si un périphérique a échoué pendant SETUP, DATA, STATUS, la gestion ZLP, la récupération de l'endpoint zéro ou le traitement d'une commande vendor.