Condividi tramite


Allocazione della larghezza di banda USB

Questo articolo fornisce indicazioni sulla gestione attenta della larghezza di banda USB. È responsabilità di ogni driver client USB ridurre al minimo la larghezza di banda USB usata e restituire la larghezza di banda inutilizzata al pool di larghezza di banda libero il più rapidamente possibile.

Perché il driver USB si esce da errori di larghezza di banda?

La concorrenza per la larghezza di banda sul bus USB proviene da più origini, sia hardware che software. È difficile prevedere esattamente la quantità di larghezza di banda disponibile per un driver client USB. Il controller host USB richiede una certa quantità di larghezza di banda per le sue operazioni. La quantità richiesta dipende dal fatto che il controller sia ad alta velocità o meno. Varia dal sistema al sistema. Gli hub USB che operano ad alta velocità devono talvolta tradurre transazioni tra porte upstream ad alta velocità e dispositivi a bassa velocità downstream e questo processo di traduzione usa la larghezza di banda. Tuttavia, se la larghezza di banda è necessaria per la conversione delle transazioni dipende dal tipo di dispositivi connessi e dalla topologia dell'albero dei dispositivi.

La più grave tensione sulla risorsa di larghezza di banda deriva in genere dai driver client USB che monopolizzano la larghezza di banda. Il sistema alloca la larghezza di banda in base al primo servizio. Se il primo driver USB caricato richiede tutta la larghezza di banda disponibile, un driver USB che carica in un secondo momento non è consentita alcuna larghezza di banda per il dispositivo. Il sistema non può configurare il dispositivo e non lo enumera. Poiché non è evidente perché l'enumerazione non è riuscita, l'utente ha un'esperienza errata.

Occasionalmente, un driver client esaurisce la larghezza di banda disponibile con un trasferimento di interruzioni ad alta velocità. Ma il caso più comune, per molto tempo, è quello di un driver client che alloca troppo larghezza di banda per un trasferimento isochronoo, quindi non riesce a rilasciare la larghezza di banda in modo tempestivo. Il sistema riserva la larghezza di banda allocata fino a quando il driver che ha richiesto di chiudere l'endpoint (aprendo un altro endpoint) o il dispositivo per cui è stata allocata la larghezza di banda viene rimossa. Il sistema non alloca la larghezza di banda garantita per i trasferimenti bulk, quindi i trasferimenti bulk non sono mai la causa di errori di enumerazione. Tuttavia, le prestazioni dei dispositivi di trasferimento bulk dipendono dalla quantità di larghezza di banda allocata per i dispositivi che eseguono trasferimenti periodici (isochrono e interruzioni).

La specifica USB 2.0 richiede un dispositivo isochronous per avere endpoint a larghezza di banda zero nell'impostazione predefinita dell'interfaccia. Ciò garantisce che nessuna larghezza di banda sia riservata al dispositivo finché un driver di funzione apre un'interfaccia non predefinita, che consente di evitare errori di enumerazione causati da richieste di larghezza di banda eccessive durante la configurazione del dispositivo. Non impedisce a un driver client di allocare troppo larghezza di banda dopo aver configurato il dispositivo, impedendo così il corretto funzionamento di altri dispositivi.

La chiave per la gestione della larghezza di banda appropriata è che ogni dispositivo USB nel sistema che esegue trasferimenti isochronous deve offrire più impostazioni alternative (ALT) per ogni interfaccia che contiene endpoint isochronous e i driver client devono usare in modo descrittivo queste impostazioni alt. I driver client devono iniziare richiedendo l'impostazione dell'interfaccia con la larghezza di banda più elevata. Se la richiesta ha esito negativo, il driver client deve richiedere le impostazioni dell'interfaccia con larghezza di banda più piccola e minore fino a quando una richiesta non riesce.

Si supponga, ad esempio, che un dispositivo webcam disponga delle interfacce seguenti:

Interfaccia 0 (impostazione predefinita dell'interfaccia: nessun endpoint con larghezza di banda isocrona non zero nell'impostazione predefinita)

Endpoint isochronous 1: dimensioni massime dei pacchetti = 0 byte

Endpoint isochronous 2: dimensioni massime dei pacchetti = 0 byte

Impostazione alt dell'interfaccia 0 1

Endpoint Isochronous 1: dimensioni massime dei pacchetti = 256 byte

Endpoint isochronous 2: dimensioni massime dei pacchetti = 256 byte

Impostazione alt dell'interfaccia 0 2

Endpoint Isochronous 1: dimensioni massime dei pacchetti = 512 byte

Endpoint isochronous 2: dimensioni massime dei pacchetti = 512 byte

Il driver per la webcam configura la webcam per usare l'impostazione predefinita dell'interfaccia quando inizializza. L'impostazione predefinita non ha una larghezza di banda isochronous, quindi l'uso dell'impostazione predefinita durante l'inizializzazione evita il pericolo che la webcam non riesca ad enumerare, a causa di una richiesta non riuscita per la larghezza di banda isocrona.

Quando il driver client è pronto per eseguire un trasferimento isochronous, deve tentare di usare l'impostazione ALT 2, perché l'impostazione ALT 2 ha le dimensioni più grandi del pacchetto. Se la richiesta ha esito negativo, il driver può eseguire un secondo tentativo usando l'impostazione ALT 1. Poiché l'impostazione ALT 1 richiede meno larghezza di banda, questa richiesta potrebbe avere esito positivo, anche se la prima richiesta non è riuscita. Più impostazioni alt consentono al driver di eseguire diversi tentativi, prima di rinunciare.

Dopo che la webcam diventa inattiva, può restituire la larghezza di banda allocata al pool di larghezza di banda gratuita selezionando nuovamente l'impostazione predefinita.

Gli utenti possono vedere la quantità di larghezza di banda allocata da un controller USB controllando le proprietà del controller in Windows Gestione dispositivi. Selezionare le proprietà del controller e quindi cercare nella scheda Avanzate. Questa lettura non indica la quantità di hub USB con larghezza di banda allocata per la conversione delle transazioni.

La funzionalità Gestione dispositivi che segnala l'utilizzo della larghezza di banda di un controller USB non funziona correttamente in Windows XP.

Dimensioni del trasferimento e dei pacchetti USB

Questo articolo descrive le dimensioni di trasferimento USB consentite in varie versioni del sistema operativo Windows.

Dimensioni massime del trasferimento

Le dimensioni massime di trasferimento specificano limiti hardcoded nello stack di driver USB. È possibile che le dimensioni di trasferimento al di sotto di questi limiti non riescano a causa delle limitazioni delle risorse di sistema. Per evitare questi tipi di errori e garantire la compatibilità tra tutte le versioni di Windows, evitare di usare dimensioni di trasferimento di grandi dimensioni per i trasferimenti USB.

Nota

Il membro MaximumTransferSize della struttura USBD_PIPE_INFORMATION è obsoleto. Lo stack di driver USB ignora il valore in MaximumTransferSize per dispositivi compositi e non compositi.

In Windows 2000 lo stack di driver USB inizializza MaximumTransferSize per USBD_DEFAULT_MAXIMUM_TRANSFER_SIZE. Un driver client può impostare un valore più piccolo durante la configurazione del dispositivo. Per un dispositivo composito, il driver client per ogni funzione può modificare solo MaximumTransferSize per le pipe nell'impostazione dell'interfaccia non predefinita.

Le dimensioni di trasferimento USB sono soggette ai limiti seguenti:

Pipe di trasferimento Windows 8.1, Windows 8 Windows 7, Windows Vista Windows XP, Windows Server 2003 Windows 2000
Control 64K per SuperSpeed e alta velocità (xHCI)

4K per velocità piena e bassa (xHCI, EHCI, UHCI, OHCI)

Per UHCI, 4K nell'endpoint predefinito; 64K su pipe di controllo non predefinite
64K per velocità elevata (EHCI)

4K per velocità piena e bassa (EHCI, UHCI, OHCI)

Per UHCI, 4K nell'endpoint predefinito; 64K su pipe di controllo non predefinite (UHCI)
64K per velocità elevata (EHCI)

4K per velocità piena e bassa (EHCI, UHCI, OHCI)

Per UHCI, 4K nell'endpoint predefinito; 64K su pipe di controllo non predefinite (UHCI)
4K nell'endpoint predefinito; 64K su pipe di controllo non predefinite (OHCI)
Interrompere 4MB per SuperSpeed, high, full e low speed (xHCI, EHCI, UHCI, OHCI) 4 MB per velocità elevata, piena e bassa (EHCI, UHCI, OHCI) Nessuna limitazione Undetermined(OHCI)
In blocco 32 MB per SuperSpeed (xHCI)

4 MB per velocità elevata e completa (xHCI)

4 MB per velocità elevata e piena (EHCI e UHCI)

Velocità completa 256K (OHCI)
4MB per velocità elevata e completa (EHCI, UHCI)

256K per la velocità completa (OHCI)
3 MB per velocità elevata e completa (EHCI)

Undetermined (UHCI)

256K per la velocità completa (OHCI)
Undetermined(OHCI)
Isocroni 1024 * wBytesPerInterval per SuperSpeed (xHCI)
(vedere USB_SUPERSPEED_ENDPOINT_COMPANION_DESCRIPTOR)

1024 * MaximumPacketSize per velocità elevata (xHCI, EHCI)

256 * MaximumPacketSize per la massima velocità (xHCI, EHCI)

64K per la massima velocità (UHCI, OHCI)
1024 * MaximumPacketSize per velocità elevata (EHCI)

256 * MaximumPacketSize per velocità completa (EHCI)

64K per la massima velocità (UHCI, OHCI)
1024 * MaximumPacketSize per L'alta velocità (EHCI)

256 * MaximumPacketSize per la massima velocità (EHCI)

64K per la massima velocità (UHCI, OHCI)
64K per la massima velocità (OHCI)

La limitazione delle dimensioni del trasferimento con MaximumTransferSize non influisce direttamente sulla larghezza di banda utilizzata da un dispositivo. Il driver client deve modificare l'impostazione dell'interfaccia o limitare le dimensioni massime dei pacchetti impostate nel membro MaximumPacketSize di USBD_PIPE_INFORMATION.

Dimensioni massime dei pacchetti

Le dimensioni massime dei pacchetti sono definite dal campo wMaxPacketSize del descrittore dell'endpoint. Un driver client può regolare le dimensioni dei pacchetti USB in una richiesta di interfaccia select al dispositivo. La modifica di questo valore non modifica wMaxPacketSize nel dispositivo.

Nell'OGGETTO CRITERI per la richiesta è una struttura USBD_PIPE_INFORMATION per la pipe. In tale struttura,

  • Modificare il membro MaximumPacketSize della struttura USBD_PIPE_INFORMATION . Impostarlo su un valore minore o uguale al valore di wMaxPacketSize definito nel firmware del dispositivo per l'impostazione dell'interfaccia corrente.
  • Impostare il flag USBD_PF_CHANGE_MAX_PACKET nella struttura USBD_PIPE_INFORMATION membro PipeFlags.

Per informazioni sulla selezione di un'impostazione di interfaccia, vedere Come selezionare una configurazione per un dispositivo USB.

Restrizione massima delle dimensioni dei pacchetti nei buffer di trasferimento in lettura

Quando un driver client effettua una richiesta di lettura, il buffer di trasferimento deve essere un multiplo delle dimensioni massime dei pacchetti. Anche quando il driver prevede dati inferiori alla dimensione massima del pacchetto, deve comunque richiedere l'intero pacchetto. Quando il dispositivo invia un pacchetto inferiore alla dimensione massima (un pacchetto breve), è un'indicazione del completamento del trasferimento.

Nei controller meno recenti, il driver client può eseguire l'override del comportamento. Nel membro TransferFlags del trasferimento dei dati ODBC, il driver client deve impostare il flag di USBD_SHORT_TRANSFER_OK. Questo flag consente al dispositivo di inviare pacchetti di dimensioni inferiori a wMaxPacketSize.

Nei controller host xHCI USBD_SHORT_TRANSFER_OK ignorati per gli endpoint bulk e interrupt. Il trasferimento di pacchetti brevi nei controller EHCI non genera una condizione di errore.

Nei controller host EHCI USBD_SHORT_TRANSFER_OK viene ignorato per gli endpoint bulk e interrupt.

Nei controller host UHCI e OHCI, se USBD_SHORT_TRANSFER_OK non è impostato per un trasferimento bulk o interrupt, un trasferimento di pacchetti breve interrompe l'endpoint e viene restituito un codice di errore per il trasferimento.

Delimitazione dei trasferimenti di scrittura con pacchetti brevi

Il driver dello stack di driver USB non impone le stesse restrizioni alle dimensioni dei pacchetti, durante la scrittura nel dispositivo, che impone durante la lettura dal dispositivo. Alcuni driver client devono effettuare frequenti trasmissioni di piccole quantità di dati di controllo per gestire i propri dispositivi. In questi casi è poco pratico limitare le trasmissioni di dati ai pacchetti di dimensioni uniformi. Di conseguenza, lo stack di driver non assegna alcun significato speciale ai pacchetti di dimensioni inferiori alle dimensioni massime dell'endpoint durante le operazioni di scrittura dei dati. Ciò consente a un driver client di suddividere un trasferimento di grandi dimensioni nel dispositivo in più URL di qualsiasi dimensione minore o uguale al valore massimo.

Il conducente deve terminare la trasmissione con un pacchetto di dimensioni inferiori a quelle massime oppure delimitare la fine della trasmissione con un pacchetto di lunghezza zero. La trasmissione non viene completata finché il driver non invia un pacchetto più piccolo di wMaxPacketSize. Se la dimensione del trasferimento è un multiplo esatto del valore massimo, il driver deve inviare un pacchetto di delimitazione di lunghezza zero per terminare in modo esplicito il trasferimento

Il driver client è responsabile della delimitazione della trasmissione dei dati con pacchetti di lunghezza zero, come richiesto dalla specifica USB. Lo stack di driver USB non genera automaticamente questi pacchetti.

Delimitazione dei trasferimenti di dati USB con pacchetti più piccoli di wMaxPacketSize

I driver USB 2.0 e USB 1.1 conformi devono trasmettere pacchetti di dimensioni massime (wMaxPacketSize) e quindi terminare la trasmissione con un pacchetto di dimensioni inferiori a quelle massime o delimitare la fine della trasmissione con un pacchetto di lunghezza zero. La trasmissione non viene completata finché il driver non invia un pacchetto più piccolo di wMaxPacketSize. Se la dimensione del trasferimento è un multiplo esatto del valore massimo, il driver deve inviare un pacchetto di delimitazione di lunghezza zero per terminare in modo esplicito il trasferimento

Il driver di dispositivo è responsabile della delimitazione della trasmissione dei dati con pacchetti di lunghezza zero, come richiesto dalla specifica USB. Lo stack USB di sistema non genera automaticamente questi pacchetti.