Périphérique USB qui se déconnecte en boucle : débogage des reset loops, événements d'alimentation et échecs d'énumération
Comment diagnostiquer un périphérique USB qui se déconnecte, reset, ré-énumère ou échoue après suspend à l'aide de preuves USB au niveau paquet.
Un périphérique USB qui se déconnecte en boucle est l'un des problèmes hardware les plus frustrants car le symptôme est bruité et incohérent. Le périphérique apparaît, disparaît, se reconnecte, change de port COM, échoue à s'énumérer, ou marche quelques secondes puis reset. Les utilisateurs cherchent « USB device keeps disconnecting », « USB reset loop », « USB device not recognized after reconnect » ou « why does my USB device re-enumerate » car le message de l'OS explique rarement ce qui s'est réellement passé.
La preuve utile est sous la couche applicative. Vous devez savoir si l'hôte a resete le port, si le périphérique a cessé de répondre, si la lecture de descripteur a échoué, si la gestion d'alimentation a suspendu le périphérique, si le pilote a émis une requête de classe, ou si l'endpoint a stallé.
Bus Scope est conçu pour ce style de dépannage USB. Au lieu de traiter l'USB comme une boîte noire, il aide à inspecter les transferts de contrôle, lectures de descripteurs, resets, comportement des endpoints et chronologie autour de la déconnexion.
Ce que « se déconnecte » peut signifier
L'expression « USB disconnecting » peut décrire plusieurs défaillances différentes :
- détachement physique ou mouvement de câble
- bruit électrique ou mauvaise stabilité d'alimentation
- reset de port du contrôleur hôte
- crash et reboot du firmware du périphérique
- échec d'énumération après reset
- déchargement et rechargement du pilote
- selective suspend ou gestion d'alimentation runtime
- stall d'endpoint suivi d'un échec de récupération
- défaillance d'interface de périphérique composite
- surcharge de transfert haut débit
Ces défaillances se ressemblent dans une notification de bureau, mais se distinguent dans la preuve USB.
Boucle de reset d'énumération
Une reset loop commence souvent par l'hôte qui détecte un périphérique, reset le port, lit les descripteurs, attribue une adresse, puis échoue avant que la configuration ne se termine. Le cycle se répète.
Une séquence simplifiée ressemble à :
Port reset
GET_DESCRIPTOR device
SET_ADDRESS
GET_DESCRIPTOR configuration
SET_CONFIGURATION
Disconnect
Port reset
GET_DESCRIPTOR device
...
Si le périphérique échoue avant SET_CONFIGURATION, le problème peut être le contenu du descripteur, le timing firmware, l'alimentation ou la compatibilité hôte. S'il échoue après SET_CONFIGURATION, le problème peut être l'initialisation de classe, le setup d'endpoint ou une requête de pilote.
Les problèmes d'alimentation peuvent ressembler à des problèmes de protocole
Les périphériques USB peuvent reset quand la tension chute, quand le courant pointe, ou quand un hub ne peut pas fournir assez de courant. C'est courant avec :
- caméras USB
- cartes de capture USB
- disques externes
- cartes de développement
- modems cellulaires
- périphériques connectés via des hubs passifs
- câbles longs ou de mauvaise qualité
Au niveau paquet, un reset lié à l'alimentation peut ressembler à un silence soudain suivi d'une ré-énumération. Le périphérique cesse de répondre aux requêtes, l'hôte reset le port et l'énumération recommence.
Bus Scope ne peut pas mesurer la tension directement, mais il peut montrer la chronologie et la séquence autour du reset. Si la dernière opération réussie était un démarrage de stream gros débit ou une commande de mode moteur/alimentation, la preuve pointe vers un stress d'alimentation ou de firmware.
Selective suspend et gestion d'alimentation runtime
Les systèmes d'exploitation peuvent suspendre les périphériques USB inactifs pour économiser l'énergie. C'est normal quand le périphérique et le pilote le supportent correctement. Cela devient un problème quand le firmware du périphérique ne resume pas proprement ou quand le pilote suspend un périphérique que l'application attend actif.
Symptômes :
- le périphérique marche après branchement mais échoue après une période d'inactivité
- la première requête après inactivité renvoie une erreur
- le périphérique disparaît après veille ou verrouillage d'écran
- un périphérique série change d'état après resume
- un périphérique HID manque des entrées après wake
La trace USB peut montrer si le trafic s'est arrêté avant la défaillance et si une séquence resume/reset s'est produite. C'est plus utile que de deviner à partir du message d'erreur applicatif.
Stall d'endpoint avant déconnexion
Certains signalements de déconnexion sont en réalité des échecs au niveau endpoint. Le périphérique peut stall un endpoint bulk, interrupt ou une requête de contrôle. Le pilote tente de clear le stall. Si la récupération échoue, le pilote reset le périphérique ou l'application ferme le handle.
Cherchez :
STALLsur un transfert de contrôle- transferts bulk échoués répétés
CLEAR_FEATURE(ENDPOINT_HALT)- un reset après la même requête à chaque fois
- un timeout avant la déconnexion
Si la même commande déclenche le reset à chaque fois, le firmware du périphérique peut crasher en traitant cette commande.
Reset loops de périphériques composites
Les périphériques USB composites exposent plusieurs interfaces sous un même périphérique. Par exemple, un périphérique peut fournir :
- interface CDC série
- interface de contrôle HID
- interface de stockage de masse
- interface de diagnostic vendor
Le périphérique peut s'énumérer partiellement puis échouer quand un pilote d'interface s'attache. Les utilisateurs peuvent voir « USB device recognized » suivi d'une déconnexion immédiate parce qu'une interface déclenche un crash firmware ou un conflit de pilote.
Dans une trace, inspectez les descripteurs d'interfaces, alternate settings, descripteurs d'endpoints et requêtes spécifiques à la classe. Le reset peut survenir seulement après que l'hôte commence à configurer une interface spécifique.
Périphériques haut débit
Les périphériques vidéo, audio, capture et acquisition de données USB peuvent se déconnecter sous charge. Le périphérique peut s'énumérer correctement et passer des requêtes de contrôle simples, puis échouer au démarrage du streaming.
Causes fréquentes :
- échec de réservation de bande passante isochrone
- timeout d'endpoint bulk
- pression de bande passante du contrôleur hôte
- bottleneck de hub
- décalage de mode USB 2.0 vs USB 3.x
- overflow de buffer firmware
- pilote choisissant un alternate setting non supporté
Si la déconnexion arrive après une requête de démarrage de stream ou un changement d'alternate setting, inspectez le transfert exact qui précède le reset. C'est souvent l'indice le plus important.
Que capturer
Pour une déconnexion reproductible, capturez depuis avant le branchement ou avant l'action défaillante. Vous voulez l'histoire complète :
- Attachement du périphérique.
- Reset du port.
- Lectures de descripteurs.
- Attribution d'adresse.
- Sélection de configuration.
- Requêtes du pilote d'interface.
- Premier transfert applicatif normal.
- Dernier transfert réussi avant la défaillance.
- Timeout, stall, reset ou déconnexion.
- Ré-énumération après la défaillance.
Commencer la capture après que le périphérique a déjà échoué fait manquer la preuve la plus importante.
Checklist de débogage
Suivez cet ordre :
- Reproduisez avec un câble court et réputé bon.
- Évitez les hubs passifs pendant le premier test.
- Capturez l'énumération depuis le branchement.
- Vérifiez si la défaillance arrive avant ou après
SET_CONFIGURATION. - Identifiez la dernière requête réussie.
- Cherchez stalls, timeouts et resets répétés.
- Comparez défaillance en inactivité vs sous charge.
- Testez un autre port ou contrôleur USB.
- Désactivez la selective suspend seulement après avoir collecté les preuves.
- Comparez le même périphérique sur un autre OS si possible.
Diagnostic final
« USB device keeps disconnecting » est un symptôme, pas une cause racine. Le correctif dépend de ce que la preuve montre : instabilité d'alimentation, reset firmware, échec de descripteur, échec de requête de classe du pilote, stall d'endpoint, problème de suspend/resume ou surcharge haut débit.
Bus Scope aide en montrant les transactions USB autour de la défaillance, pour que vous arrêtiez de deviner à partir des notifications de bureau et commenciez à déboguer à partir du comportement réel du bus.