Freigeben über


USB-Bandbreitenzuweisung

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 nicht verwendete Bandbreite so schnell wie möglich an den freien Bandbreitenpool zurückzugeben.

Warum wird mein USB-Treiber aus Bandbreitenfehlern herauskommen?

Der Wettbewerb um Bandbreite auf dem USB-Bus stammt aus mehreren Quellen, sowohl von Hardware als auch von Software. Es ist schwierig, genau vorherzusagen, wie viel Bandbreite für einen USB-Clienttreiber verfügbar ist. Der USB-Hostcontroller benötigt eine bestimmte Bandbreite für seine Vorgänge. Der erforderliche Betrag hängt davon ab, ob der Controller hochgeschwindigkeits ist oder nicht. Es variiert von System zu System. USB-Hubs, die mit hoher Geschwindigkeit arbeiten, müssen manchmal Transaktionen zwischen Hochgeschwindigkeits-Upstreamports und Geräten mit niedriger Geschwindigkeit nachgelagert übersetzen, und dieser Übersetzungsprozess verbraucht Bandbreite. Ob jedoch Bandbreite für die Transaktionsübersetzung erforderlich ist, hängt von der Art der angeschlossenen Geräte und der Topologie der Gerätestruktur ab.

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

Gelegentlich verbraucht ein Clienttreiber die verfügbare Bandbreite mit einer Hochgeschwindigkeitsunterbruchübertragung. Der am häufigsten verwendete Fall ist jedoch das eines Clienttreibers, der zu viel Bandbreite für eine isochrone Übertragung zuweist und dann die Bandbreite nicht rechtzeitig freigeben kann. Das System reserviert die zugewiesene Bandbreite, bis der Treiber, der ihn 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 Übertragungen (isochron und unterbrechen) durchführen.

Laut der USB 2.0-Spezifikation muss ein isochrones Gerät auf seiner Standard-Schnittstelleneinstellung Endpunkte mit null Bandbreite haben. Dadurch wird sichergestellt, dass keine Bandbreite für das Gerät reserviert ist, bis ein Funktionstreiber eine nicht standardmäßige Schnittstelle öffnet, wodurch Enumerationsfehler vermieden werden, die durch übermäßige Bandbreitenanforderungen während der Gerätekonfiguration verursacht werden. Es hindert einen Clienttreiber nicht daran, nach der Konfiguration seines Geräts zu viel Bandbreite zu reservieren, wodurch verhindert wird, dass andere Geräte ordnungsgemäß funktionieren.

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

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

Schnittstelle 0 (Standardeinstellung der Schnittstelle: Keine Endpunkte mit nichtzero isochroner Bandbreite 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 beim Initialisieren die Standardeinstellung der Schnittstelle verwendet wird. Die Standardeinstellung weist keine isochrone Bandbreite auf. Die Verwendung der Standardeinstellung während der Initialisierung vermeidet somit die Gefahr, dass die Webcam aufgrund einer fehlgeschlagenen Anforderung für isochrone Bandbreite möglicherweise nicht enumeriert wird.

Wenn der Clienttreiber bereit ist, eine isochrone Übertragung durchzuführen, sollte die Alt-Einstellung 2 verwendet werden, 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 durchführen. Da die Alt-Einstellung 1 weniger Bandbreite erfordert, kann diese Anforderung erfolgreich sein, obwohl die erste Anforderung fehlgeschlagen ist. Mit mehreren Alt-Einstellungen kann der Treiber mehrere Versuche ausführen, bevor er aufgibt.

Nachdem die Webcam im Leerlauf ist, kann sie die zugewiesene Bandbreite wieder 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 im Windows Device Manager überprüfen. Wählen Sie die Eigenschaften des Controllers aus, und suchen Sie dann unter der Registerkarte "Erweitert". Dieser Wert gibt nicht an, wie viel Bandbreite USB-Hubs für die Transaktionsübersetzung zugewiesen wurden.

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

USB-Übertragung 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 hartcodierte Grenzwerte im USB-Treiberstapel an. Es ist möglich, dass Übertragungsgrößen unter diesen Grenzwerten aufgrund von Systemressourcenbeschränkungen fehlschlagen. Um diese Arten von Fehlern zu vermeiden und die Kompatibilität für alle Versionen von Windows sicherzustellen, vermeiden Sie die Verwendung großer Übertragungsgrößen für USB-Übertragungen.

Hinweis

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

In Windows 2000 wird MaximumTransferSize vom USB-Treiberstapel auf USBD_DEFAULT_MAXIMUM_TRANSFER_SIZE initialisiert. 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 Datenleitungen im nicht standardmäßigen Schnittstellenmodus ändern.

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

Übertragungsrohr Windows 8.1, Windows 8 Windows 7, Windows Vista Windows XP, Windows Server 2003 Windows 2000
Steuerung 64K für SuperSpeed und Hochgeschwindigkeit (xHCI)

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

Für UHCI, 4K auf dem Standardendpunkt; 64K bei 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 bei 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 bei nicht standardmäßigen Steuerrohren (UHCI)
4K auf dem Standardendpunkt; 64K bei nicht standardmäßigen Steuerrohren (OHCI)
Unterbrechen 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)
Masse 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 Vollgeschwindigkeit (OHCI)
4 MB für hohe und volle Geschwindigkeit (EHCI, UHCI)

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

Nicht bestimmt (UHCI)

256K für Vollgeschwindigkeit (OHCI)
Undetermined(OHCI)
Isochron 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 Vollgeschwindigkeit (UHCI, OHCI)
1024 * MaximumPacketSize für Hohe Geschwindigkeit (EHCI)

256 * MaximumPacketSize für Vollgeschwindigkeit (EHCI)

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

256 * MaximumPacketSize für Vollgeschwindigkeit (EHCI)

64K für Vollgeschwindigkeit (UHCI, OHCI)
64K für Vollgeschwindigkeit (OHCI)

Das Einschränken der Übertragungsgröße mit MaximumTransferSize wirkt sich nicht direkt auf die Bandbreite aus, die ein Gerät verbraucht. Der Clienttreiber muss entweder die Schnittstelleneinstellung ändern oder die maximale Paketgröße einschränken, die im MaximumPacketSize-Element 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 GRÖßE des USB-Pakets in einer Auswahlschnittstellenanforderung an das Gerät regeln. Das Ändern dieses Werts ändert nicht das wMaxPacketSize auf dem Gerät.

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

  • Ändern Sie das MaximumPacketSize-Element der USBD_PIPE_INFORMATION-Struktur . Legen Sie ihn auf einen Wert kleiner oder gleich dem Wert von wMaxPacketSize fest, der in der Gerätefirmware für die aktuelle Schnittstelleneinstellung definiert ist.
  • Legen Sie das Flag USBD_PF_CHANGE_MAX_PACKET im Element PipeFlags der Struktur USBD_PIPE_INFORMATION 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 sendet, muss der Übertragungspuffer ein Vielfaches der maximalen Paketgröße sein. Selbst wenn der Treiber Daten erwartet, die kleiner als die maximale Paketgröße sind, muss es dennoch das gesamte Paket anfordern. Wenn das Gerät ein Paket sendet, das kleiner als die maximale Größe (ein kurzes Paket) ist, ist es ein Hinweis darauf, dass die Übertragung abgeschlossen ist.

Auf älteren Controllern kann der Clienttreiber das Verhalten außer Kraft setzen. Im TransferFlags-Element der Datenübertragungs-URB muss der Clienttreiber das USBD_SHORT_TRANSFER_OK Flag festlegen. Mit diesem Kennzeichen kann das Gerät Pakete senden, die kleiner als wMaxPacketSize sind.

Auf xHCI-Hostcontrollern wird USBD_SHORT_TRANSFER_OK bei Massen- und Unterbrechungsendpunkten ignoriert. Die Übertragung kurzer Pakete auf EHCI-Controllern führt nicht zu einem Fehlerzustand.

Auf EHCI-Hostcontrollern wird USBD_SHORT_TRANSFER_OK für Bulk- und Interrupt-Endpunkte ignoriert.

Bei UHCI- und OHCI-Host-Controllern, wenn USBD_SHORT_TRANSFER_OK für eine Bulk- oder Interrupt-Übertragung nicht festgelegt ist, stoppt ein kurzer Pakettransfer den Endpunkt, und für die Übertragung wird ein Fehlercode zurückgegeben.

Trennen von Schreibübertragungen mit kurzen Paketen

Der Treiber der USB-Treiberstapel legt beim Schreiben auf das Gerät nicht dieselben Einschränkungen für die Paketgröße fest, die beim Lesen vom Gerät auferlegt werden. Einige Clienttreiber müssen häufige Übertragungen kleiner Mengen von Kontrolldaten durchführen, um ihre Geräte zu verwalten. Es ist unpraktisch, Datenübertragungen auf Pakete einheitlicher Größe in solchen Fällen einzuschränken. Daher weist der Treiberstapel keine besondere Bedeutung für Pakete mit geringerer Größe als die maximale Größe des Endpunkts bei Datenschreibvorgängen zu. Auf diese Weise 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 von weniger als der maximalen Größe beenden oder das Ende der Übertragung mit einem Paket mit einer Länge null trennen. Die Übertragung ist erst abgeschlossen, wenn der Treiber ein Paket sendet, das kleiner als wMaxPacketSize ist. Wenn es sich bei der Übertragungsgröße um ein genaues Vielfaches des Maximums handelt, muss der Treiber ein Paket mit Nulllänge 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 dies für die USB-Spezifikation erforderlich ist. Der USB-Treiberstapel generiert diese Pakete nicht automatisch.

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

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

Der Gerätetreiber ist für die Abgrenzung der Datenübertragung mit paketfreien Paketen verantwortlich, wie dies für die USB-Spezifikation erforderlich ist. Der SYSTEM-USB-Stapel generiert diese Pakete nicht automatisch.