Timeout de transfert bulk USB : débogage high-speed, full-speed, STALL, NAK et délais firmware
Comment diagnostiquer les timeouts de transfert bulk USB, lectures lentes, écritures stalled, comportement NAK, récupération de halt d'endpoint, décalage de vitesse et délais firmware avec preuves USB.
Les transferts bulk USB sont utilisés quand la correctness compte plus qu'une chronologie fixe. Périphériques de stockage, adaptateurs série, sondes de debug, outils de mise à jour firmware, scanners, périphériques vendor et beaucoup de produits d'acquisition de données utilisent des endpoints bulk. Quand ils échouent, les utilisateurs cherchent « USB bulk transfer timeout », « bulk endpoint stalled », « USB read timeout », « USB write timeout », « libusb bulk transfer failed » ou « USB device stops responding during bulk transfer ».
L'application voit généralement un timeout ou une erreur d'I/O. Le bus peut raconter une histoire plus riche : le périphérique a NAKé trop longtemps, l'endpoint a stallé, l'hôte a retenté, le périphérique a été reseter, la taille du transfert était erronée, la vitesse du périphérique plus basse qu'attendue, ou le firmware était bloqué en préparant les données.
Bus Scope est utile car les échecs de transfert bulk exigent des preuves au niveau de l'endpoint, pas seulement une stack trace de l'application.
Ce que les transferts bulk font bien
Les transferts bulk sont fiables au niveau du protocole USB. Ils utilisent la bande passante disponible et peuvent retenter. Ils conviennent aux mouvements de données importants où la latence est moins stricte que la correctness.
Périphériques bulk courants :
- stockage de masse USB
- adaptateurs série CDC
- outils firmware vendor
- sondes de debug
- appareils de mesure
- imprimantes et scanners
- certains périphériques de capture
- pipes de données FPGA ou microcontrôleur
Comme les transferts bulk utilisent la bande passante résiduelle, les performances peuvent varier selon le trafic USB et l'ordonnancement de l'hôte.
Un timeout ne signifie pas toujours perte de paquets
Un timeout de transfert bulk signifie généralement que la requête côté hôte ne s'est pas terminée dans le délai de l'application. Cela peut arriver même si le bus USB se comporte légalement.
Causes possibles :
- le périphérique n'a pas de données prêtes et continue de NAKer
- le firmware est occupé et retarde la réponse
- l'endpoint est halted après un STALL
- l'hôte a envoyé la requête au mauvais endpoint
- la taille du transfert ne correspond pas à l'attente du protocole
- le périphérique a été resete ou déconnecté
- le pilote n'a pas soumis le transfert correctement
- le chemin full-speed est trop lent pour le débit attendu
- un autre périphérique consomme la bande passante du bus
- le timeout applicatif est trop agressif
La trace doit indiquer lequel de ces cas est plausible.
Comportement NAK
Les périphériques USB peuvent répondre avec NAK pour indiquer qu'ils ne sont pas prêts temporairement. NAK n'est pas nécessairement une erreur. C'est un signal de contrôle de flux.
Pour un endpoint bulk IN, des NAK répétés peuvent signifier que le périphérique n'a pas encore de données. Pour un endpoint bulk OUT, des NAK peuvent signifier que le périphérique ne peut pas encore accepter plus de données.
Le problème, c'est la durée et le contexte. Quelques NAK sont normaux. Des NAK continus jusqu'au timeout applicatif signifient soit que le périphérique n'a jamais été prêt, soit que l'hôte attendait des données au mauvais moment.
STALL et halt d'endpoint
Un STALL est différent d'un NAK. Il signifie généralement que l'endpoint a halté ou que la requête n'est pas supportée dans ce contexte. La récupération nécessite souvent :
CLEAR_FEATURE(ENDPOINT_HALT)
Si l'hôte ne clear pas le halt, les transferts suivants peuvent continuer à échouer. Si l'endpoint stall à nouveau immédiatement après le clear, le firmware du périphérique rejette peut-être la séquence de commandes.
Cherchez :
- premier STALL avant le timeout
CLEAR_FEATURE(ENDPOINT_HALT)- si le transfert reprend après le clear
- même commande provoquant le STALL à chaque fois
- reset après STALL répétés
Attentes high-speed vs full-speed
La vitesse USB change ce qu'un débit réaliste représente. Un périphérique en full-speed ne peut pas délivrer un débit high-speed. Un périphérique capable high-speed peut retomber à cause du câble, du hub, du port, de l'intégrité du signal ou de la négociation.
Si une application suppose une performance high-speed mais que le périphérique s'est énuméré en full-speed, des timeouts peuvent apparaître sur les gros transferts.
Vérifiez descripteurs, vitesse négociée, taille de paquet max du endpoint et rythme réel des transferts. N'inférez pas la vitesse de la forme du connecteur ou du label marketing.
Protocoles de commande firmware
Beaucoup de périphériques bulk implémentent un protocole commande/réponse au-dessus d'USB. L'hôte écrit une commande sur bulk OUT et attend les données sur bulk IN.
Les timeouts surviennent quand :
- le format de commande est mauvais
- le périphérique attend une requête de contrôle avant le transfert bulk
- le périphérique envoie le statut sur un autre endpoint
- l'hôte lit trop tôt
- l'hôte lit trop
- le firmware bloque en traitant la commande
- le périphérique requiert une frontière de paquet de longueur zéro
- un état d'erreur précédent n'a pas été clearé
Les preuves de paquets peuvent montrer si le périphérique a ignoré la commande, l'a stallée, l'a acceptée sans jamais répondre, ou a répondu sur un autre endpoint.
Taille de transfert bulk et paquets courts
Les protocoles bulk USB utilisent souvent des paquets courts pour signaler la fin du transfert. Si l'hôte attend une longueur fixe mais que le périphérique envoie un paquet court, l'application peut interpréter le résultat incorrectement. Si l'hôte attend plus de données après que le périphérique a déjà terminé le transfert, un timeout peut survenir au niveau applicatif.
Cherchez :
- longueur de transfert demandée
- longueur réellement renvoyée
- paquet court
- paquet de longueur zéro
- framing de protocole au-dessus d'USB
C'est particulièrement important pour le firmware custom et les outils basés libusb.
Checklist de débogage
Suivez ce processus :
- Capturez énumération et descripteurs d'endpoint.
- Confirmez la vitesse du périphérique et la taille de paquet max.
- Identifiez les endpoints bulk IN et bulk OUT.
- Capturez la commande ou le transfert qui timeout.
- Vérifiez si l'endpoint renvoie NAK, STALL, données ou déconnexion.
- Inspectez la récupération
CLEAR_FEATURE(ENDPOINT_HALT)en cas de STALL. - Comparez longueur demandée et longueur réelle.
- Vérifiez si le périphérique envoie un paquet court ou de longueur zéro.
- Comparez port direct vs hub et chemin high-speed vs full-speed.
- Corrélez avec les logs firmware si disponibles.
Diagnostic final
Le timeout de transfert bulk USB n'est pas un bug unique. Il peut signifier qu'un comportement NAK normal a dépassé le timeout applicatif, qu'un STALL d'endpoint n'a pas été récupéré, que le firmware n'a pas répondu, que la vitesse était plus basse qu'attendue, que le framing de protocole était mauvais, ou que le périphérique a été resete.
Bus Scope aide en exposant la séquence au niveau de l'endpoint, pour qu'un timeout devienne une preuve USB diagnostiquable plutôt qu'un échec d'I/O générique.