Share via


USB-Bandbreitenzuordnung

Dieser Artikel enthält Anleitungen zur sorgfältigen Verwaltung der USB-Bandbreite. Es liegt in der Verantwortung jedes USB-Clienttreibers, die verwendete USB-Bandbreite zu minimieren und ungenutzte Bandbreite so schnell wie möglich an den kostenlosen Bandbreitenpool zurückzugeben.

Warum gibt es für meinen USB-Treiber keine Bandbreitenfehler mehr?

Der Wettbewerb um bandbreite auf dem USB-Bus kommt aus mehreren Quellen, sowohl hardware- als auch software. Es ist schwierig, genau vorherzusagen, wie viel Bandbreite für einen USB-Clienttreiber verfügbar ist. Der USB-Hostcontroller benötigt für seine Vorgänge eine bestimmte Bandbreite. Die erforderliche Menge hängt davon ab, ob der Controller eine hohe Geschwindigkeit hat oder nicht. Dies variiert von System zu System. USB-Hubs, die mit hoher Geschwindigkeit arbeiten, müssen manchmal Transaktionen zwischen High-Speed-Upstream-Ports und Low-Speed-Geräten im Downstream übersetzen, und dieser Übersetzungsprozess verbraucht Bandbreite. Ob jedoch Bandbreite für die Transaktionsübersetzung erforderlich ist, hängt von der Art der verbundenen Geräte und der Topologie der Gerätestruktur ab.

Die schwerwiegendste Belastung für die Bandbreitenressource kommt in der Regel von USB-Clienttreibern, die die Bandbreite monopolisieren. Das System ordnet Bandbreite nach first-come-first-serve-Basis zu. Wenn der erste geladene USB-Treiber die gesamte verfügbare Bandbreite anfordert, ist einem USB-Treiber, der zu einem späteren Zeitpunkt geladen wird, keine Bandbreite für sein Gerät zulässig. Das System kann das Gerät nicht konfigurieren und kann es nicht aufzählen. Da nicht ersichtlich ist, warum die Enumeration fehlgeschlagen ist, hat der Benutzer eine schlechte Erfahrung.

Gelegentlich verbraucht ein Clienttreiber die verfügbare Bandbreite mit einer Hochgeschwindigkeits-Interruptübertragung. Der mit Abstand häufigste Fall ist jedoch der eines Clienttreibers, der zu viel Bandbreite für eine isochrone Übertragung zuweist und dann die Bandbreite nicht rechtzeitig freigibt. Das System reserviert die zugeordnete Bandbreite, bis der Treiber, der dies angefordert hat, seinen Endpunkt schließt (durch Öffnen eines anderen Endpunkts) oder das Gerät, für das die Bandbreite zugewiesen wurde, entfernt wird. Das System weist keine garantierte Bandbreite für Massenübertragungen zu, sodass Massenübertragungen niemals die Ursache für Enumerationsfehler sind. Die Leistung von Massenübertragungsgeräten hängt jedoch davon ab, wie viel Bandbreite für Geräte zugewiesen wird, die regelmäßige (isochrone und unterbrechungsige) Übertragungen durchführen.

Die USB 2.0-Spezifikation erfordert, dass ein isochrones Gerät über Endpunkte ohne Bandbreite in seiner Standardschnittstelleneinstellung verfügt. Dadurch wird sichergestellt, dass keine Bandbreite für das Gerät reserviert ist, bis ein Funktionstreiber eine nicht standardmäßige Schnittstelle öffnet, wodurch Enumerationsfehler verhindert werden, die durch übermäßige Bandbreitenanforderungen während der Gerätekonfiguration verursacht werden. Es verhindert nicht, dass ein Clienttreiber nach der Konfiguration seines Geräts zu viel Bandbreite zugibt, wodurch andere Geräte daran gehindert werden, ordnungsgemäß zu funktionieren.

Der Schlüssel für eine ordnungsgemäße Bandbreitenverwaltung besteht darin, dass jedes USB-Gerät im System, das isochrone Übertragungen durchführt, mehrere alternative Einstellungen (Alt) für jede Schnittstelle mit isochronen Endpunkten bereitstellen muss, und Clienttreiber diese Alt-Einstellungen vernünftig verwenden müssen. Clienttreiber sollten zunächst die Schnittstelleneinstellung mit der höchsten Bandbreite anfordern. Wenn die Anforderung fehlschlägt, sollte der Clienttreiber Schnittstelleneinstellungen mit immer kleineren Bandbreiten anfordern, bis eine Anforderung erfolgreich ist.

Angenommen, ein Webcamgerät verfügt für instance über die folgenden Schnittstellen:

Schnittstelle 0 (Standardschnittstelleneinstellung: Keine Endpunkte mit isochroner Bandbreite ungleich null in der Standardeinstellung)

Isochroner Endpunkt 1: maximale Paketgröße = 0 Bytes

Isochroner Endpunkt 2: maximale Paketgröße = 0 Bytes

Schnittstelle 0 Alt-Einstellung 1

Isochroner Endpunkt 1: maximale Paketgröße = 256 Bytes

Isochroner Endpunkt 2: maximale Paketgröße = 256 Bytes

Schnittstelle 0 Alt-Einstellung 2

Isochroner Endpunkt 1: maximale Paketgröße = 512 Bytes

Isochroner Endpunkt 2: maximale Paketgröße = 512 Bytes

Der Treiber für die Webcam konfiguriert die Webcam so, dass sie bei der Initialisierung die Standardschnittstelleneinstellung verwendet. Die Standardeinstellung verfügt über keine isochrone Bandbreite, sodass die Verwendung der Standardeinstellung während der Initialisierung die Gefahr vermeidet, dass die Webcam aufgrund einer fehlerhaften Anforderung für isochrone Bandbreite möglicherweise nicht aufgezählt werden kann.

Wenn der Clienttreiber bereit ist, eine isochrone Übertragung durchzuführen, sollte er versuchen, die ALT-Einstellung 2 zu verwenden, da die Alt-Einstellung 2 die größte Paketgröße aufweist. Wenn die Anforderung fehlschlägt, kann der Treiber einen zweiten Versuch unter Verwendung der Alt-Einstellung 1 unternehmen. Da die Alt-Einstellung 1 weniger Bandbreite erfordert, kann diese Anforderung erfolgreich sein, auch wenn bei der ersten Anforderung ein Fehler aufgetreten ist. Mehrere Alt-Einstellungen ermöglichen es dem Treiber, mehrere Versuche durchzuführen, bevor er aufgibt.

Nachdem die Webcam im Leerlauf ist, kann sie die zugeordnete Bandbreite an den freien Bandbreitenpool zurückgeben, indem sie die Standardeinstellung erneut auswählen.

Benutzer können sehen, wie viel Bandbreite ein USB-Controller zugewiesen hat, indem sie die Eigenschaften des Controllers in Windows Geräte-Manager überprüfen. Wählen Sie die Eigenschaften des Controllers aus, und suchen Sie dann auf der Registerkarte Erweitert nach. Dieser Lesewert gibt nicht an, wie viel Bandbreite USB-Hubs für die Transaktionsübersetzung zugewiesen haben.

Das Geräte-Manager Feature, das die Bandbreitennutzung eines USB-Controllers meldet, funktioniert in Windows XP nicht ordnungsgemäß.

USB-Übertragungs- und Paketgrößen

In diesem Artikel werden usb-Übertragungsgrößen beschrieben, die in verschiedenen Versionen des Windows-Betriebssystems zulässig sind.

Maximale Übertragungsgröße

Die maximale Übertragungsgröße gibt festcodierte Grenzwerte im USB-Treiberstapel an. Es ist möglich, dass Übertragungsgrößen unterhalb dieser Grenzwerte aufgrund von Systemressourcenbeschränkungen fehlschlagen. Vermeiden Sie die Verwendung großer Übertragungsgrößen für USB-Übertragungen, um diese Arten von Fehlern zu vermeiden und die Kompatibilität für alle Versionen von Windows sicherzustellen.

Hinweis

Das MaximumTransferSize-Element der USBD_PIPE_INFORMATION-Struktur ist veraltet. Der USB-Treiberstapel ignoriert den Wert in MaximumTransferSize sowohl für zusammengesetzte als auch für nicht zusammengesetzte Geräte.

In Windows 2000 initialisiert der USB-Treiberstapel MaximumTransferSize in USBD_DEFAULT_MAXIMUM_TRANSFER_SIZE. Ein Clienttreiber kann beim Konfigurieren des Geräts einen kleineren Wert festlegen. Bei einem zusammengesetzten Gerät kann der Clienttreiber für jede Funktion nur MaximumTransferSize für Pipes in der nicht standardmäßigen Schnittstelleneinstellung ändern.

USB-Übertragungsgrößen unterliegen den folgenden Grenzwerten:

Übertragungspipe Windows 8.1, Windows 8 Windows 7, Windows Vista Windows XP, Windows Server 2003 Windows 2000
Control 64K für SuperSpeed und High Speed (xHCI)

4K für volle und niedrige Geschwindigkeit (xHCI, EHCI, UHCI, OHCI)

Für UHCI, 4K auf dem Standardendpunkt; 64K auf nicht standardmäßigen Steuerrohren
64K für hohe Geschwindigkeit (EHCI)

4K für volle und niedrige Geschwindigkeit (EHCI, UHCI, OHCI)

Für UHCI, 4K auf dem Standardendpunkt; 64K auf nicht standardmäßigen Steuerrohren (UHCI)
64K für hohe Geschwindigkeit (EHCI)

4K für volle und niedrige Geschwindigkeit (EHCI, UHCI, OHCI)

Für UHCI, 4K auf dem Standardendpunkt; 64K auf nicht standardmäßigen Steuerrohren (UHCI)
4K auf dem Standardendpunkt; 64K auf nicht standardmäßigen Steuerrohren (OHCI)
Interrupt 4 MB für SuperSpeed, hohe, volle und niedrige Geschwindigkeit (xHCI, EHCI, UHCI, OHCI) 4 MB für hohe, volle und niedrige Geschwindigkeit (EHCI, UHCI, OHCI) Unbegrenzt Undetermined (OHCI)
Massenvorgang 32 MB für SuperSpeed (xHCI)

4 MB für hohe und volle Geschwindigkeit (xHCI)

4 MB für hohe und volle Geschwindigkeit (EHCI und UHCI)

256K Full Speed (OHCI)
4 MB für hohe und volle Geschwindigkeit (EHCI, UHCI)

256K für volle Geschwindigkeit (OHCI)
3 MB für hohe und volle Geschwindigkeit (EHCI)

Undetermined (UHCI)

256K für volle Geschwindigkeit (OHCI)
Undetermined (OHCI)
Isochronen 1024 * wBytesPerInterval für SuperSpeed (xHCI)
(siehe USB_SUPERSPEED_ENDPOINT_COMPANION_DESCRIPTOR)

1024 * MaximumPacketSize für Hohe Geschwindigkeit (xHCI, EHCI)

256 * MaximumPacketSize für volle Geschwindigkeit (xHCI, EHCI)

64K für volle Geschwindigkeit (UHCI, OHCI)
1024 * MaximumPacketSize für hohe Geschwindigkeit (EHCI)

256 * MaximumPacketSize for Full-Speed (EHCI)

64K für volle Geschwindigkeit (UHCI, OHCI)
1024 * MaximumPacketSize für High-Speed (EHCI)

256 * MaximumPacketSize for full speed (EHCI)

64K für volle Geschwindigkeit (UHCI, OHCI)
64K für volle Geschwindigkeit (OHCI)

Das Einschränken der Übertragungsgröße mit MaximumTransferSize wirkt sich nicht direkt darauf aus, wie viel Bandbreite ein Gerät verbraucht. Der Clienttreiber muss entweder die Schnittstelleneinstellung ändern oder die maximale Paketgröße einschränken, die im MaximumPacketSize-Member von USBD_PIPE_INFORMATION festgelegt ist.

Maximale Paketgröße

Die maximale Paketgröße wird durch das wMaxPacketSize-Feld des Endpunktdeskriptors definiert. Ein Clienttreiber kann die USB-Paketgröße in einer Select-Interface-Anforderung an das Gerät regeln. Wenn Sie diesen Wert ändern, wird die wMaxPacketSize auf dem Gerät nicht geändert.

In der URB für die Anforderung befindet sich eine USBD_PIPE_INFORMATION Struktur für die Pipe. In dieser Struktur

  • Ändern Sie das MaximumPacketSize-Element der USBD_PIPE_INFORMATION-Struktur . Legen Sie ihn auf einen Wert fest, der kleiner oder gleich dem Wert von wMaxPacketSize ist, der in der Gerätefirmware für die aktuelle Schnittstelleneinstellung definiert ist.
  • Legen Sie das USBD_PF_CHANGE_MAX_PACKET-Flag in der PipeFlags-USBD_PIPE_INFORMATION-Struktur fest.

Informationen zum Auswählen einer Schnittstelleneinstellung finden Sie unter Auswählen einer Konfiguration für ein USB-Gerät.

Maximale Paketgrößeseinschränkung für Leseübertragungspuffer

Wenn ein Clienttreiber eine Leseanforderung stellt, muss der Übertragungspuffer ein Vielfaches der maximalen Paketgröße sein. Auch wenn der Treiber Daten unter der maximalen Paketgröße erwartet, muss er dennoch das gesamte Paket anfordern. Wenn das Gerät ein Paket sendet, das kleiner als die maximale Größe (ein kurzes Paket) ist, ist dies ein Hinweis darauf, dass die Übertragung abgeschlossen ist.

Auf älteren Controllern kann der Clienttreiber das Verhalten überschreiben. Im TransferFlags-Element der Datenübertragungs-URB muss der Clienttreiber das flag USBD_SHORT_TRANSFER_OK festlegen. Dieses Flag ermöglicht es dem Gerät, Pakete zu senden, die kleiner als wMaxPacketSize sind.

Auf xHCI-Hostcontrollern USBD_SHORT_TRANSFER_OK für Massen- und Interruptendpunkte ignoriert. Die Übertragung von kurzen Paketen auf EHCI-Controllern führt nicht zu einer Fehlerbedingung.

Auf EHCI-Hostcontrollern wird USBD_SHORT_TRANSFER_OK für Massen- und Unterbrechungsendpunkte ignoriert.

Wenn auf UHCI- und OHCI-Hostcontrollern USBD_SHORT_TRANSFER_OK nicht für eine Massen- oder Unterbrechungsübertragung festgelegt ist, wird der Endpunkt durch eine kurze Paketübertragung angehalten, und ein Fehlercode wird für die Übertragung zurückgegeben.

Abgrenzen von Schreibübertragungen mit kurzen Paketen

Der USB-Treiberstapeltreiber erzwingt beim Schreiben auf das Gerät nicht die gleichen Einschränkungen für die Paketgröße, die er beim Lesen vom Gerät auferlegt. Einige Clienttreiber müssen häufig kleine Mengen von Steuerungsdaten übertragen, um ihre Geräte zu verwalten. Es ist in solchen Fällen nicht praktikabel, Datenübertragungen auf Pakete von einheitlicher Größe zu beschränken. Daher weist der Treiberstapel Paketen, die kleiner als die maximale Größe des Endpunkts sind, beim Schreiben von Daten keine besondere Bedeutung zu. Dadurch kann ein Clienttreiber eine große Übertragung auf das Gerät in mehrere URBs einer beliebigen Größe unter oder gleich dem Maximum unterteilen.

Der Treiber muss die Übertragung entweder mit einem Paket beenden, das kleiner als die maximale Größe ist, oder das Ende der Übertragung mit einem Paket der Länge null abgrenzen. Die Übertragung ist erst abgeschlossen, wenn der Treiber ein Paket sendet, das kleiner als wMaxPacketSize ist. Wenn die Übertragungsgröße ein exaktes Vielfaches des Maximums ist, muss der Treiber ein Paket mit der Länge null senden, um die Übertragung explizit zu beenden.

Der Clienttreiber ist für die Abgrenzung der Datenübertragung mit Paketen der Länge null verantwortlich, wie es die USB-Spezifikation erfordert. Der USB-Treiberstapel generiert diese Pakete nicht automatisch.

Trennen von USB-Datenübertragungen mit Paketen, die kleiner als wMaxPacketSize sind

Kompatible USB 2.0- und USB 1.1-Treiber müssen Pakete mit maximaler Größe (wMaxPacketSize) übertragen und die Übertragung dann mit einem Paket von weniger als der maximalen Größe beenden oder das Ende der Übertragung mit einem Paket der Länge null abgrenzen. Die Übertragung ist erst abgeschlossen, wenn der Treiber ein Paket sendet, das kleiner als wMaxPacketSize ist. Wenn die Übertragungsgröße ein exaktes Vielfaches des Maximums ist, muss der Treiber ein Paket mit der Länge null senden, um die Übertragung explizit zu beenden.

Der Gerätetreiber ist dafür verantwortlich, die Datenübertragung mit Paketen der Länge null abzugrenzen, wie es die USB-Spezifikation erfordert. Der SYSTEM-USB-Stapel generiert diese Pakete nicht automatisch.