Partager via


Allocation de bande passante USB

Cet article fournit des conseils sur la gestion minutieuse de la bande passante USB. Il incombe à chaque pilote client USB de réduire la bande passante USB qu’il utilise et de renvoyer la bande passante inutilisée au pool de bande passante libre aussi rapidement que possible.

Pourquoi mon pilote USB sort-il des erreurs de bande passante ?

La concurrence pour la bande passante sur le bus USB provient de plusieurs sources, tant matérielles que logicielles. Il est difficile de prédire exactement la quantité de bande passante disponible pour un pilote client USB. Le contrôleur hôte USB nécessite une certaine quantité de bande passante pour ses opérations. La quantité requise varie selon que le contrôleur est à haute vitesse ou non. Elle varie d’un système à l’autre. Les hubs USB qui fonctionnent à grande vitesse doivent parfois traduire les transactions entre les ports de amont à haut débit et les appareils à faible vitesse en aval, et ce processus de traduction consomme de la bande passante. Toutefois, si la bande passante est nécessaire pour la traduction des transactions dépend du type d’appareils connectés et de la topologie de l’arborescence des appareils.

La contrainte la plus grave sur la ressource de bande passante provient généralement des pilotes clients USB qui monopolisent la bande passante. Le système alloue la bande passante sur la base du premier arrivé, premier servi. Si le premier pilote USB chargé demande toute la bande passante disponible, un pilote USB qui se charge ultérieurement n’est autorisé à aucune bande passante pour son appareil. Le système ne peut pas configurer l’appareil et ne parvient pas à l’énumérer. Étant donné que la raison de l’échec de l’énumération n’est pas évidente, l’utilisateur a une mauvaise expérience.

Parfois, un pilote client épuise la bande passante disponible avec un transfert d’interruption à grande vitesse. Mais le cas le plus courant, de loin, est celui d’un pilote client qui alloue trop de bande passante pour un transfert isochronieux, puis ne parvient pas à libérer la bande passante en temps opportun. Le système réserve la bande passante allouée jusqu’à ce que le pilote qui l’a demandé ferme son point de terminaison (en ouvrant un autre point de terminaison) ou que l’appareil pour lequel la bande passante a été allouée soit supprimé. Comme le système n’alloue pas de bande passante garantie pour les transferts en bloc, les transferts en bloc ne sont jamais à l’origine d’échecs d’énumération. Toutefois, les performances des appareils de transfert en bloc dépendent de la quantité de bande passante allouée aux appareils qui effectuent des transferts périodiques (isochronieux et interrompent).

La spécification USB 2.0 nécessite qu’un appareil isochronisé ait des points de terminaison de bande passante zéro sur son paramètre d’interface par défaut. Cela garantit qu’aucune bande passante n’est réservée à l’appareil tant qu’un pilote de fonction n’ouvre pas une interface non par défaut, ce qui permet d’éviter les échecs d’énumération causés par des demandes de bande passante excessives pendant la configuration de l’appareil. Cela n’empêche pas un pilote client d’allouer trop de bande passante après la configuration de son appareil, empêchant ainsi d’autres appareils de fonctionner correctement.

La clé d’une bonne gestion de la bande passante est que chaque périphérique USB du système qui effectue des transferts isochronieux doit offrir plusieurs paramètres alternatifs (Alt) pour chaque interface qui contient des points de terminaison isochronieux, et que les pilotes clients doivent utiliser judicieusement ces paramètres Alt. Les pilotes clients doivent commencer par demander le paramètre d’interface avec la bande passante la plus élevée. Si la demande échoue, le pilote client doit demander des paramètres d’interface avec des bandes passantes de plus en plus petites jusqu’à ce qu’une demande aboutisse.

Par instance, supposons qu’un appareil de webcam possède les interfaces suivantes :

Interface 0 (Paramètre d’interface par défaut : aucun point de terminaison avec une bande passante isochronaise différente de zéro dans le paramètre par défaut)

Point de terminaison isochrone 1 : taille maximale du paquet = 0 octet

Point de terminaison isochrone 2 : taille maximale du paquet = 0 octet

Interface 0 Alt, paramètre 1

Point de terminaison isochrone 1 : taille maximale du paquet = 256 octets

Point de terminaison isochrone 2 : taille maximale du paquet = 256 octets

Interface 0 Alt, paramètre 2

Point de terminaison isochrone 1 : taille maximale du paquet = 512 octets

Point de terminaison isochrone 2 : taille maximale du paquet = 512 octets

Le pilote de la webcam configure la webcam pour qu’elle utilise le paramètre d’interface par défaut lors de son initialisation. Le paramètre par défaut n’ayant pas de bande passante isochronisée, l’utilisation du paramètre par défaut pendant l’initialisation évite le risque que la webcam ne parvient pas à énumérer, en raison d’un échec de la demande de bande passante isochrouse.

Lorsque le pilote client est prêt à effectuer un transfert isochrone, il doit essayer d’utiliser le paramètre Alt 2, car le paramètre Alt 2 a la plus grande taille de paquet. Si la demande échoue, le pilote peut effectuer une deuxième tentative, à l’aide du paramètre Alt 1. Étant donné que le paramètre Alt 1 nécessite moins de bande passante, cette demande peut réussir, même si la première demande a échoué. Plusieurs paramètres alt permettent au pilote d’effectuer plusieurs tentatives avant d’abandonner.

Une fois la webcam inactive, elle peut renvoyer la bande passante allouée au pool de bande passante libre en sélectionnant à nouveau le paramètre par défaut.

Les utilisateurs peuvent voir la quantité de bande passante allouée par un contrôleur USB en vérifiant les propriétés du contrôleur dans Windows Gestionnaire de périphériques. Sélectionnez les propriétés du contrôleur, puis regardez sous l’onglet Avancé. Cette lecture n’indique pas la quantité de bande passante allouée par les hubs USB pour la traduction de transaction.

La fonctionnalité Gestionnaire de périphériques qui signale l’utilisation de la bande passante d’un contrôleur USB ne fonctionne pas correctement dans Windows XP.

Transfert USB et tailles de paquets

Cet article décrit les tailles de transfert USB autorisées dans différentes versions du système d’exploitation Windows.

Taille maximale du transfert

La taille maximale de transfert spécifie les limites codées en dur dans la pile de pilotes USB. Il est possible que les tailles de transfert inférieures à ces limites échouent en raison de limitations des ressources système. Pour éviter ces types de défaillances et garantir la compatibilité entre toutes les versions de Windows, évitez d’utiliser des tailles de transfert importantes pour les transferts USB.

Notes

Le membre MaximumTransferSize de la structure USBD_PIPE_INFORMATION est obsolète. La pile de pilotes USB ignore la valeur dans MaximumTransferSize pour les appareils composites et non composites.

Dans Windows 2000, la pile de pilotes USB initialise MaximumTransferSize en USBD_DEFAULT_MAXIMUM_TRANSFER_SIZE. Un pilote client peut définir une valeur plus petite lors de la configuration de l’appareil. Pour un périphérique composite, le pilote client pour chaque fonction peut uniquement modifier MaximumTransferSize pour les canaux dans le paramètre d’interface non par défaut.

Les tailles de transfert USB sont soumises aux limites suivantes :

Canal de transfert Windows 8.1, Windows 8 Windows 7, Windows Vista Windows XP, Windows Server 2003 Windows 2000
Control 64 K pour SuperSpeed et haute vitesse (xHCI)

4K pour pleine et basse vitesse (xHCI, EHCI, UHCI, OHCI)

Pour UHCI, 4K sur le point de terminaison par défaut ; 64 000 canaux de contrôle non par défaut
64K pour haute vitesse (EHCI)

4K pour pleine et basse vitesse (EHCI, UHCI, OHCI)

Pour UHCI, 4K sur le point de terminaison par défaut ; 64 000 canaux de contrôle non par défaut (UHCI)
64K pour haute vitesse (EHCI)

4K pour pleine et basse vitesse (EHCI, UHCI, OHCI)

Pour UHCI, 4K sur le point de terminaison par défaut ; 64 000 canaux de contrôle non par défaut (UHCI)
4 Ko sur le point de terminaison par défaut ; 64 000 canaux de contrôle non par défaut (OHCI)
Interruption 4 Mo pour SuperSpeed, haute, pleine et basse vitesse (xHCI, EHCI, UHCI, OHCI) 4 Mo pour haute, pleine et basse vitesse (EHCI, UHCI, OHCI) Illimité Non déterminé (OHCI)
Bloc 32 Mo pour SuperSpeed (xHCI)

4 Mo pour haute et pleine vitesse (xHCI)

4 Mo pour haute et pleine vitesse (EHCI et UHCI)

256 000 à pleine vitesse (OHCI)
4 Mo pour haute vitesse et pleine vitesse (EHCI, UHCI)

256 K pour pleine vitesse (OHCI)
3 Mo pour haute et pleine vitesse (EHCI)

Non déterminé (UHCI)

256 K pour pleine vitesse (OHCI)
Non déterminé (OHCI)
Isochrone 1024 * wBytesPerInterval pour SuperSpeed (xHCI)
(voir USB_SUPERSPEED_ENDPOINT_COMPANION_DESCRIPTOR)

1024 * MaximumPacketSize pour la vitesse élevée (xHCI, EHCI)

256 * MaximumPacketSize pour une vitesse maximale (xHCI, EHCI)

64K pour les pleines vitesses (UHCI, OHCI)
1024 * MaximumPacketSize pour haute vitesse (EHCI)

256 * MaximumPacketSize pour la pleine vitesse (EHCI)

64K pour les pleines vitesses (UHCI, OHCI)
1024 * MaximumPacketSize pour haute vitesse (EHCI)

256 * MaximumPacketSize pour pleine vitesse (EHCI)

64K pour les pleines vitesses (UHCI, OHCI)
64K pour les pleines vitesses (OHCI)

La restriction de la taille de transfert avec MaximumTransferSize n’affecte pas directement la quantité de bande passante consommée par un appareil. Le pilote client doit modifier le paramètre d’interface ou restreindre la taille de paquet maximale définie dans le membre MaximumPacketSize de USBD_PIPE_INFORMATION.

Taille maximale des paquets

La taille maximale du paquet est définie par le champ wMaxPacketSize du descripteur de point de terminaison. Un pilote client peut régler la taille du paquet USB dans une demande d’interface de sélection à l’appareil. La modification de cette valeur ne modifie pas le wMaxPacketSize sur l’appareil.

Dans l’URB de la requête se trouve une structure USBD_PIPE_INFORMATION pour le canal. Dans cette structure,

  • Modifiez le membre MaximumPacketSize de la structure USBD_PIPE_INFORMATION . Définissez-le sur une valeur inférieure ou égale à la valeur de wMaxPacketSize définie dans le microprogramme de l’appareil pour le paramètre d’interface actuel.
  • Définissez l’indicateur USBD_PF_CHANGE_MAX_PACKET dans la structure USBD_PIPE_INFORMATION membre PipeFlags.

Pour plus d’informations sur la sélection d’un paramètre d’interface, consultez Comment sélectionner une configuration pour un périphérique USB.

Restriction de taille maximale des paquets sur les mémoires tampons de transfert en lecture

Lorsqu’un pilote client effectue une demande de lecture, la mémoire tampon de transfert doit être un multiple de la taille maximale des paquets. Même lorsque le pilote attend des données inférieures à la taille maximale du paquet, il doit toujours demander le paquet entier. Lorsque l’appareil envoie un paquet inférieur à la taille maximale (un paquet court), cela indique que le transfert est terminé.

Sur les contrôleurs plus anciens, le pilote client peut remplacer le comportement. Dans le membre TransferFlags de l’URB de transfert de données, le pilote client doit définir l’indicateur USBD_SHORT_TRANSFER_OK. Cet indicateur permet à l’appareil d’envoyer des paquets plus petits que wMaxPacketSize.

Sur les contrôleurs hôtes xHCI, USBD_SHORT_TRANSFER_OK ignorés pour les points de terminaison en bloc et d’interruption. Le transfert de paquets courts sur les contrôleurs EHCI n’entraîne pas de condition d’erreur.

Sur les contrôleurs hôtes EHCI, USBD_SHORT_TRANSFER_OK est ignoré pour les points de terminaison en bloc et d’interruption.

Sur les contrôleurs hôtes UHCI et OHCI, si USBD_SHORT_TRANSFER_OK n’est pas défini pour un transfert en bloc ou une interruption, un transfert de paquets court arrête le point de terminaison et un code d’erreur est retourné pour le transfert.

Limitation des transferts d’écriture avec des paquets courts

Le pilote de pile de pilotes USB n’impose pas les mêmes restrictions sur la taille des paquets, lors de l’écriture sur le périphérique, qu’il impose lors de la lecture à partir du périphérique. Certains pilotes clients doivent effectuer des transmissions fréquentes de petites quantités de données de contrôle pour gérer leurs appareils. Il est peu pratique de restreindre les transmissions de données à des paquets de taille uniforme dans de tels cas. Par conséquent, la pile de pilotes n’attribue aucune importance particulière aux paquets dont la taille est inférieure à la taille maximale du point de terminaison pendant les écritures de données. Cela permet à un pilote client d’interrompre un transfert important vers l’appareil en plusieurs URB de toute taille inférieure ou égale à la valeur maximale.

Le pilote doit soit terminer la transmission avec un paquet de taille inférieure à la taille maximale, soit délimiter la fin de la transmission avec un paquet de longueur nulle. La transmission n’est pas terminée tant que le pilote n’envoie pas un paquet inférieur à wMaxPacketSize. Si la taille de transfert est un multiple exact de la valeur maximale, le pilote doit envoyer un paquet de limitation de longueur nulle pour arrêter explicitement le transfert.

Le pilote client est chargé de limiter la transmission de données avec des paquets de longueur nulle, comme l’exige la spécification USB. La pile de pilotes USB ne génère pas ces paquets automatiquement.

Limitation des transferts de données USB avec des paquets inférieurs à wMaxPacketSize

Les pilotes USB 2.0 et USB 1.1 conformes doivent transmettre des paquets de taille maximale (wMaxPacketSize), puis mettre fin à la transmission avec un paquet de taille inférieure à la taille maximale, ou délimiter la fin de la transmission avec un paquet de longueur nulle. La transmission n’est pas terminée tant que le pilote n’envoie pas un paquet inférieur à wMaxPacketSize. Si la taille de transfert est un multiple exact de la valeur maximale, le pilote doit envoyer un paquet de limitation de longueur nulle pour arrêter explicitement le transfert.

Le pilote de périphérique est chargé de limiter la transmission de données avec des paquets de longueur nulle, comme l’exige la spécification USB. La pile USB système ne génère pas ces paquets automatiquement.