le mie informazioni di contatto
Posta[email protected]
2024-07-12
한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina
In questo articolo vengono fornite indicazioni su come gestire attentamente la larghezza di banda USB. Ciascun driver client USB è responsabile di ridurre al minimo la larghezza di banda USB utilizzata e di restituire la larghezza di banda inutilizzata al pool di larghezza di banda disponibile il più rapidamente possibile.
In questo caso, riteniamo che la velocità di USB 2.0 sia 480 Mbps, 12 Mbps e 1,5 Mbps, che corrispondono rispettivamente ad alta velocità, massima velocità e bassa velocità. Ma in realtà, anche la larghezza di banda di USB 2.0 è molto ridotta delle premesse di questo articolo. USB 3.0 sembra Ciò allevia il problema della larghezza di banda, ma il problema della larghezza di banda non è un limite superiore insufficiente ma un problema di ibisco di pianificazione.
La concorrenza per la larghezza di banda sul bus USB proviene da più fonti, inclusi hardware e software. È difficile prevedere con precisione la quantità di larghezza di banda disponibile per un driver client USB. I controller host USB richiedono una certa quantità di larghezza di banda per funzionare. La quantità richiesta dipende dal fatto che il controller sia ad alta velocità. Varia da sistema a sistema. Gli hub USB che funzionano ad alta velocità devono talvolta tradurre le transazioni tra porte upstream ad alta velocità e dispositivi downstream a velocità inferiore e questo processo di traduzione consuma larghezza di banda. Tuttavia, se la conversione delle transazioni richiede larghezza di banda dipende dal tipo di dispositivo connesso e dalla topologia dell'albero dei dispositivi.
La pressione più grave sulle risorse di larghezza di banda proviene solitamente dai driver client USB che monopolizzano la larghezza di banda. Il sistema assegna la larghezza di banda in base all'ordine di arrivo. Se il primo driver USB caricato richiede tutta la larghezza di banda disponibile, i successivi driver USB caricati non consentiranno alcuna larghezza di banda ai propri dispositivi. Il sistema non può configurare o enumerare il dispositivo. Poiché il motivo dell'errore di enumerazione non è ovvio, l'esperienza dell'utente è scarsa.
A volte i driver client esauriscono la larghezza di banda disponibile tramite trasferimenti di interruzione ad alta velocità. Ma lo scenario di gran lunga più comune è che il driver client alloca troppa larghezza di banda per un trasferimento costante e non riesce a liberarla in modo tempestivo. Il sistema conserva la larghezza di banda allocata finché il driver che lo ha richiesto non chiude il proprio endpoint aprendo un altro endpoint o finché il dispositivo a cui è stata allocata la larghezza di banda non viene rimosso. Il sistema non alloca larghezza di banda garantita per i trasferimenti in blocco, pertanto i trasferimenti in blocco non sono mai la causa di errori di enumerazione. Tuttavia, le prestazioni di un dispositivo di trasferimento di massa dipendono dalla quantità di larghezza di banda allocata al dispositivo per trasferimenti regolari (attese e interruzioni costanti).
La specifica USB 2.0 richiede che i dispositivi costanti abbiano endpoint con larghezza di banda pari a zero nelle impostazioni di interfaccia predefinite. Ciò garantisce che non venga riservata alcuna larghezza di banda per il dispositivo finché il driver della funzione non apre un'interfaccia non predefinita, il che aiuta a prevenire errori di enumerazione dovuti a richieste di larghezza di banda eccessive durante la configurazione del dispositivo. Non impedisce ai driver client di allocare una larghezza di banda eccessiva dopo aver configurato i propri dispositivi, impedendo così il corretto funzionamento di altri dispositivi.
La chiave per una corretta gestione della larghezza di banda è che ogni dispositivo USB nel sistema che esegue trasferimenti costanti deve fornire più impostazioni alternative (Alt) per ciascuna interfaccia contenente endpoint costanti e il driver client deve utilizzare saggiamente queste impostazioni Alt. I driver client devono richiedere prima l'impostazione dell'interfaccia con la larghezza di banda più elevata. Se la richiesta fallisce, il driver client dovrebbe richiedere le impostazioni dell'interfaccia con larghezze di banda sempre più piccole finché la richiesta non ha esito positivo.
Ad esempio, supponiamo che un dispositivo webcam abbia la seguente interfaccia:
Interfaccia 0 (impostazioni predefinite dell'interfaccia: non sono presenti endpoint con larghezza di banda costante diversa da zero nelle impostazioni predefinite)
Endpoint costante 1: dimensione massima del pacchetto = 0 byte
Endpoint cost 2: dimensione massima del pacchetto = 0 byte
Interfaccia 0 Impostazione alternativa 1
Endpoint cost 1: dimensione massima del pacchetto = 256 byte
Endpoint cost 2: dimensione massima del pacchetto = 256 byte
Interfaccia 0 Impostazione alternativa 2
Endpoint cost 1: dimensione massima del pacchetto = 512 byte
Endpoint cost 2: dimensione massima del pacchetto = 512 byte
Il driver della webcam configura la webcam per utilizzare le impostazioni dell'interfaccia predefinite al momento dell'inizializzazione. Le impostazioni predefinite non hanno una larghezza di banda costante, quindi l'utilizzo delle impostazioni predefinite durante l'inizializzazione evita il pericolo che la webcam non sia in grado di enumerare a causa di una richiesta di larghezza di banda costante non riuscita.
Quando il driver client è pronto per eseguire trasferimenti isocroni costanti, dovrebbe provare a utilizzare l'impostazione Alt 2 perché l'impostazione Alt 2 ha la dimensione del pacchetto maggiore. Se la richiesta fallisce, il conducente può riprovare una seconda volta utilizzando 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 fallisce. Molteplici impostazioni Alt consentono al conducente di effettuare più tentativi prima di arrendersi.
Una volta che la webcam diventa inattiva, la larghezza di banda allocata può essere restituita al pool di larghezza di banda disponibile selezionando nuovamente le impostazioni predefinite.
Gli utenti possono vedere la quantità di larghezza di banda allocata da un controller USB controllando le proprietà del controller in Gestione dispositivi di Windows. Seleziona le proprietà del controller e guarda nella scheda Avanzate. Questa lettura non indica la quantità di larghezza di banda assegnata dall'hub USB per la traduzione delle transazioni.
La funzionalità Gestione dispositivi che segnala l'utilizzo della larghezza di banda del controller USB non funziona correttamente in Windows XP.
La dimensione massima di trasferimento specifica un limite codificato nello stack di driver USB. Le dimensioni di trasferimento inferiori a questi limiti potrebbero non riuscire a causa delle limitazioni delle risorse di sistema. Per evitare questi tipi di errori e garantire la compatibilità con tutte le versioni di Windows, evitare di utilizzare dimensioni di trasferimento di grandi dimensioni per i trasferimenti USB.
Il membro MaximumTransferSize della struttura USBD_PIPE_INFORMATION è obsoleto. Lo stack di driver USB ignora il valore in MaximumTransferSize per i dispositivi compositi e non compositi.
In Windows 2000, lo stack di driver USB inizializza MaximumTransferSize su USBD_DEFAULT_MAXIMUM_TRANSFER_SIZE. I driver client possono impostare un valore inferiore durante la configurazione del dispositivo. Per i dispositivi compositi, i driver client per funzione possono modificare solo il valore MaximumTransferSize della pipe nelle impostazioni dell'interfaccia non predefinite.
La dimensione del trasferimento USB è limitata da:
La limitazione delle dimensioni del trasferimento utilizzando MaximumTransferSize non influisce direttamente sulla larghezza di banda consumata dal dispositivo. Il driver client deve modificare le impostazioni dell'interfaccia o limitare la dimensione massima del pacchetto impostata nel membro MaximumPacketSize di USBD_PIPE_INFORMATION.
La dimensione massima del pacchetto è definita dal campo wMaxPacketSize del descrittore dell'endpoint. I driver client possono regolare la dimensione del pacchetto USB in determinate richieste di interfaccia al dispositivo. La modifica di questo valore non modifica wMaxPacketSize sul dispositivo.
All'interno dell'URB richiesto c'è la struttura USBD_PIPE_INFORMATION della pipe. In questa struttura,
Quando un driver client invia una richiesta di lettura, il buffer di trasmissione deve essere un multiplo della dimensione massima del pacchetto. Anche se il driver richiede meno dati rispetto alla dimensione massima del pacchetto, deve comunque richiedere l'intero pacchetto. Il trasferimento è completo quando il dispositivo invia un pacchetto di dimensioni inferiori alla dimensione massima (pacchetto corto).
Sui controller meno recenti, i driver client possono ignorare questo comportamento. Nel membro TransferFlags dell'URB di trasferimento dati, il driver client deve impostare il flag USBD_SHORT_TRANSFER_OK. Questo flag consente al dispositivo di inviare pacchetti più piccoli di wMaxPacketSize.
Sui controller host xHCI, USBD_SHORT_TRANSFER_OK ignora gli endpoint in blocco e gli endpoint di interruzione. La trasmissione di pacchetti brevi sul controller EHCI non causa una condizione di errore.
Sui controller host EHCI, USBD_SHORT_TRANSFER_OK viene ignorato per gli endpoint di massa e di interruzione.
Sui controller host UHCI e OHCI, se USBD_SHORT_TRANSFER_OK non è impostato per trasferimenti di massa o di interruzione, i trasferimenti di pacchetti brevi interromperanno l'endpoint e restituiranno il codice di errore del trasferimento.
Il driver dello stack di driver USB impone limiti diversi sulla dimensione del pacchetto durante la scrittura su un dispositivo rispetto alla lettura dal dispositivo. Alcuni conducenti client devono trasmettere frequentemente piccole quantità di dati di controllo per gestire i propri dispositivi. In questo caso non è pratico limitare il trasferimento dei dati a pacchetti di dimensioni uniformi. Pertanto, durante la scrittura dei dati, lo stack dei driver non assegna alcun significato speciale ai pacchetti più piccoli della dimensione massima dell'endpoint. Ciò consente al driver client di suddividere trasferimenti di grandi dimensioni al dispositivo in più URB di dimensioni inferiori o uguali al massimo.
Il driver deve terminare il trasferimento con un pacchetto più piccolo della dimensione massima oppure utilizzare un pacchetto di lunghezza zero per delimitare la fine del trasferimento. Il trasferimento non è completo finché il driver non invia un pacchetto più piccolo di wMaxPacketSize. Se la dimensione del trasferimento è esattamente un multiplo del valore massimo, il driver deve inviare un pacchetto delimitato di lunghezza zero per terminare esplicitamente il trasferimento.
Come richiesto dalle specifiche USB, il driver client è responsabile di delimitare i trasferimenti di dati utilizzando pacchetti di lunghezza zero. Lo stack di driver USB non genera automaticamente questi pacchetti.
I driver USB 2.0 e USB 1.1 compatibili devono trasmettere un pacchetto di dimensione massima (wMaxPacketSize) e quindi terminare la trasmissione con un pacchetto inferiore alla dimensione massima oppure utilizzare un pacchetto di lunghezza zero per delimitare la fine della trasmissione. Il trasferimento non è completo finché il driver non invia un pacchetto più piccolo di wMaxPacketSize. Se la dimensione del trasferimento è esattamente un multiplo del valore massimo, il driver deve inviare un pacchetto delimitato di lunghezza zero per terminare esplicitamente il trasferimento
Il driver del dispositivo è responsabile di delimitare i trasferimenti di dati utilizzando pacchetti di lunghezza zero come richiesto dalle specifiche USB. Lo stack USB del sistema non genera automaticamente questi pacchetti.