Driver lato host USB in Windows

Questo articolo offre una panoramica dell'architettura dello stack di driver USB (Universal Serial Bus).

La figura seguente mostra il diagramma a blocchi architetturali dello stack di driver USB per Windows. Il diagramma mostra stack di driver USB separati per USB 2.0 e USB 3.0. Windows carica lo stack di driver USB 3.0 quando un dispositivo è collegato a un controller xHCI.

Diagramma a blocchi dell'architettura per gli stack di driver USB 2.0 e 3.0.

Windows carica lo stack di driver USB 2.0 per i dispositivi collegati ai controller eHCI, oHCI o uHCI. Lo stack di driver USB 2.0 viene fornito in Windows XP con Service Pack 1 (SP1) e versioni successive del sistema operativo Windows.

Stack di driver USB 3.0

Microsoft ha creato i driver USB 3.0 usando le interfacce del framework del driver in modalità kernel (KMDF). Il modello di driver KMDF riduce la complessità e migliora la stabilità.

Driver del controller host USB 3.0 (Usbxhci.sys)

Il driver xHCI è il driver del controller host USB 3.0. Le responsabilità del driver xHCI includono l'inizializzazione di registri MMIO e le strutture di dati basate sulla memoria host per l'hardware del controller xHCI, il mapping delle richieste di trasferimento dai driver di livello superiore ai blocchi di richiesta di trasferimento e l'invio delle richieste all'hardware. Dopo aver completato un trasferimento, il driver gestisce gli eventi di completamento del trasferimento dall'hardware e propaga gli eventi fino allo stack di driver. Controlla anche gli slot del dispositivo controller xHCI e i contesti endpoint.

Windows carica il driver xHCI come oggetto dispositivo funzione (FDO) nello stack di dispositivi per il controller host.

Estensione del controller host USB (Ucx01000.sys)

Il driver di estensione del controller host USB (estensione per KMDF) è la nuova estensione per il driver controller host specifico della classe sottostante, ad esempio il driver xHCI. Il nuovo driver è estendibile ed è progettato per supportare altri tipi di driver del controller host che dovrebbero essere sviluppati in futuro. L'estensione del controller host USB funge da interfaccia astratta comune per il driver hub, fornisce un meccanismo generico per accodare le richieste al driver del controller host ed esegue l'override di determinate funzioni selezionate. Tutte le richieste di I/O avviate dai driver superiori raggiungono il driver di estensione del controller host prima del driver xHCI. Dopo aver ricevuto una richiesta di I/O, l'estensione del controller host convalida la richiesta e quindi inoltra la richiesta alla coda kmDF appropriata associata all'endpoint di destinazione. Il driver xHCI, quando è pronto per l'elaborazione, recupera la richiesta dalla coda. Le responsabilità del driver di estensione del controller host USB sono:

  • Fornisce oggetti specifici di USB al driver xHCI.
  • Fornisce routine di callback degli eventi kmdf al driver xHCI.
  • Gestisce e controlla le operazioni dell'hub radice associato al controller host.
  • Implementa funzionalità configurabili dal driver client, ad esempio mdls concatenati, flussi e così via.

Driver hub USB (Usbhub3.sys)

Il nuovo driver hub, nello stack di driver USB per i dispositivi 3.0, usa il modello di driver KMDF. Il driver hub esegue principalmente queste attività:

  • Gestisce hub USB e le relative porte.
  • Enumera i dispositivi e altri hub collegati alle porte downstream.
  • Crea oggetti dispositivo fisico (PDO) per i dispositivi e gli hub enumerati.

Windows carica il driver hub come fdO nello stack di dispositivi hub. L'enumerazione dei dispositivi e la gestione dell'hub nel nuovo driver vengono implementate tramite un set di macchine a stati. Il driver hub si basa su KMDF per le funzioni di risparmio energia e PnP. Oltre alla gestione dell'hub, il driver hub esegue anche controlli preliminari ed elaborazione di determinate richieste inviate dal livello driver client USB. Ad esempio, il driver hub analizza una richiesta di configurazione select per determinare quali endpoint verranno configurati dalla richiesta. Dopo l'analisi delle informazioni, il driver hub invia la richiesta all'estensione del controller host USB o a un'ulteriore elaborazione.

Stack di driver USB 2.0

Windows carica lo stack di driver USB 2.0 per i dispositivi collegati ai controller eHCI, oHCI o uHCI. I driver nello stack di driver USB 2.0 vengono forniti in Windows XP con SP1 e versioni successive del sistema operativo Windows. Lo stack di driver USB 2.0 è progettato per facilitare i dispositivi USB ad alta velocità, come definito nella specifica USB 2.0.

Nella parte inferiore dello stack di driver USB è presente il driver del controller host. È costituito dal driver di porta, Usbport.sys e uno o più di tre driver miniport che vengono eseguiti simultaneamente. Quando il sistema rileva l'hardware del controller host, carica uno di questi driver miniport. Il driver miniport, dopo il caricamento, carica il driver della porta Usbport.sys. Il driver di porta gestisce gli aspetti dei compiti del driver del controller host indipendenti dal protocollo specifico.

Il driver miniport Usbuhci.sys (interfaccia controller host universale) sostituisce il driver miniclasse Uhcd.sys fornito con Windows 2000. Il driver miniport Usbohci.sys (open host controller interface) sostituisce Openhci.sys. Il driver miniport Usbehci.sys supporta dispositivi USB ad alta velocità ed è stato introdotto in Windows XP con SP1 e versioni successive e Windows Server 2003 e versioni successive.

In tutte le versioni di Windows che supportano USB 2.0, il sistema operativo è in grado di gestire contemporaneamente i controller host USB 1.1 e USB 2.0. Ogni volta che il sistema operativo rileva che sono presenti entrambi i tipi di controller, crea due nodi dispositivo separati, uno per ogni controller host. Windows carica successivamente il driver miniport Usbehci.sys per l'hardware del controller host conforme a USB 2.0 e Usbohci.sys o Openhci.sys per l'hardware conforme a USB 1.1, a seconda della configurazione del sistema.

Sopra il driver della porta è il driver del bus USB, Usbhub.sys, noto anche come driver hub. Si tratta del driver di dispositivo per ogni hub nel sistema.

Driver padre generico della classe USB (Usbccgp.sys)

Il driver padre generico della classe COMUNE USB è il driver padre fornito da Microsoft per i dispositivi compositi. Il driver hub enumera e carica il driver composito padre se deviceClass è 0 o 0xef e numInterfaces è maggiore di 1 nel descrittore del dispositivo. Il driver hub genera l'ID compatibile per il driver composito padre come "USB\COMPOSITE". Usbccgp.sys usa routine wdM (Windows Driver Model).

Il driver composito padre enumera tutte le funzioni in un dispositivo composito e crea un PDO per ognuno di essi. In questo modo viene caricata la classe o il driver client appropriato per ogni funzione nel dispositivo. Ogni driver di funzione (PDO figlio) invia richieste al driver padre, che le invia al driver dell'hub USB.

Usbccgp.sys è incluso in Windows XP con SP1 e versioni successive del sistema operativo Windows. In Windows 8 il driver è stato aggiornato per implementare le funzionalità di sospensione della funzione e riattivazione remota, come definito nella specifica USB 3.0.

Per altre informazioni, vedere Driver padre generico USB (Usbccgp.sys).For more information, see USB Generic Parent Driver (Usbccgp.sys).

WinUSB (Winusb.sys)

Windows USB (WinUSB) è un driver generico fornito da Microsoft per i dispositivi USB. L'architettura WinUSB è costituita da un driver in modalità kernel (Winusb.sys) e da una libreria di collegamento dinamico in modalità utente (Winusb.dll). Per i dispositivi che non richiedono un driver di funzione personalizzato, Winusb.sys può essere installato nello stack in modalità kernel del dispositivo come driver di funzione. I processi in modalità utente possono quindi comunicare con Winusb.sys usando un set di richieste di controllo di I/O del dispositivo o chiamando WinUsb_Xxx funzioni. Per altre informazioni, vedere Introduzione a WinUSB per sviluppatori.

In Windows 8, il file di informazioni fornite da Microsoft (INF) per WinUSB, Winusb.inf, contiene USB\MS_COMP_WINUSB come stringa di identificatore del dispositivo. In questo modo Winusb.sys di essere caricati automaticamente come driver di funzione per i dispositivi che dispongono di un ID compatibile WinUSB corrispondente nel descrittore del sistema operativo MS. Tali dispositivi sono denominati dispositivi WinUSB. I produttori di hardware non sono tenuti a distribuire un file INF per il dispositivo WinUSB, rendendo il processo di installazione del driver più semplice per l'utente finale. Per altre informazioni, vedere Dispositivo WinUSB.

Driver client USB

Ogni dispositivo USB, composito o non composito, viene gestito da un driver client. Un driver client USB è una classe o un driver di dispositivo che è un client dello stack di driver USB. Tali driver includono driver specifici della classe e del dispositivo di Microsoft o di un fornitore di terze parti. Per visualizzare un elenco dei driver di classe forniti da Microsoft, vedere Driver per le classi di dispositivi USB supportate. Un driver client crea richieste per comunicare con il dispositivo chiamando interfacce pubbliche esposte dallo stack di driver USB.

Un driver client per un dispositivo composito non è diverso da un driver client per un dispositivo non composito, ad eccezione della posizione nello stack di driver.

Un driver client per un dispositivo non composito viene sovrapposto direttamente sopra il driver hub.

Per un dispositivo USB composito che espone più funzioni e non dispone di un driver di classe padre padre, Windows carica il driver padre generico USB (Usbccgp.sys) tra il driver hub e il livello driver client. Il driver padre crea un PDO separato per ogni funzione di un dispositivo composito. I driver client (FDO per le funzioni) vengono caricati sopra il driver padre generico. I fornitori possono scegliere di fornire un driver client separato per ogni funzione.

Un driver client USB può essere eseguito in modalità utente o kernel, a seconda dei requisiti del driver. I driver client USB possono essere scritti usando routine KMDF, UMDF o WDM.

Librerie helper per i driver client

Microsoft offre le librerie helper seguenti per aiutare i driver e le applicazioni in modalità kernel a comunicare con lo stack di driver USB:

  • Usbd.sys

    Microsoft fornisce la libreria di Usbd.sys che esporta routine per i driver client USB. Le routine helper semplificano le attività operative di un driver client. Ad esempio, usando le routine helper, un driver client USB può creare blocchi di richiesta USB (URB) per determinate operazioni specifiche, ad esempio la selezione di una configurazione e l'invio di tali URL allo stack di driver USB.

  • Usbdex.lib

    Questa libreria helper è una novità per Windows 8. La libreria esporta le routine principalmente per l'allocazione e la compilazione di URI. Queste routine sostituiscono alcune delle routine legacy esportate da Usbd.sys. Le nuove routine richiedono che il driver client registri con lo stack di driver USB, che gestisce l'handle per la registrazione. Tale handle viene usato per le chiamate ad altre routine Usbdex.lib. Alcuni URI allocati dalle nuove routine hanno un contesto ODBC usato dal driver USB per una migliore tracciabilità ed elaborazione. Per altre informazioni, vedere Allocazione e compilazione di URI.

  • Winusb.dll

    Winusb.dll è una DLL in modalità utente che espone funzioni WinUSB per la comunicazione con Winusb.sys, che viene caricata come driver di funzione di un dispositivo in modalità kernel. Le applicazioni usano queste funzioni per configurare il dispositivo, recuperare informazioni sul dispositivo ed eseguire operazioni di I/O. Per informazioni sull'uso di queste funzioni, vedere How to Access a USB Device by Using WinUSB Functions.For information about using these functions, see How to Access a USB Device by Using WinUSB Functions.