Driver sul lato host USB in Windows

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

Nella figura seguente viene illustrato il diagramma a blocchi dell'architettura 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 dei registri MMIO e le strutture di dati basate sulla memoria host per l'hardware del controller xHCI, il mapping delle richieste da driver di livello superiore a 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 nello stack di driver. Controlla anche gli slot e i contesti dell'endpoint del controller xHCI.

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 a KMDF) è la nuova estensione per il driver del controller host specifico della classe sottostante, ad esempio il driver xHCI. Il nuovo driver è estendibile ed è progettato per supportare altri tipi di driver controller host che si prevede di sviluppare in futuro. L'estensione del controller host USB funge da interfaccia astratta comune al driver dell'hub, fornisce un meccanismo generico per le richieste di accodamento al driver del controller host e esegue l'override di determinate funzioni selezionate. Tutte le richieste di I/O avviate da 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 le 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 porte.
  • Enumera i dispositivi e altri hub collegati alle porte downstream.
  • Crea oggetti dispositivo fisici (PDO) per i dispositivi e gli hub enumerati.

Windows carica il driver hub come fdO nello stack di dispositivi hub. L'enumerazione del dispositivo e la gestione dell'hub nel nuovo driver vengono implementate tramite un set di computer di stato. 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 di driver client USB. Ad esempio, il driver hub analizza una richiesta di configurazione selezionata per determinare quali endpoint verranno configurati dalla richiesta. Dopo aver analizzato le informazioni, il driver dell'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 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 è 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 tali 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 (interfaccia del controller host aperto) 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 di 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 del dispositivo per ogni hub nel sistema.

Driver padre generico della classe comune 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 oggetto PDO per ognuno di essi. In questo modo, la classe o il driver client appropriati devono essere caricati per ogni funzione nel dispositivo. Ogni driver di funzione (PDO figlio) invia richieste al driver padre, che li 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).

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 dinamica 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 I/O del dispositivo o chiamando funzioni di WinUsb_Xxx . Per altre informazioni, vedere WinUSB.

In Windows 8, il file INF (Microsoft-provided information) per WinUSB, Winusb.inf, contiene USB\MS_COMP_WINUSB come stringa di identificatore del dispositivo. Ciò consente di Winusb.sys di caricare automaticamente come driver di funzione per tali dispositivi che dispongono di un ID compatibile WinUSB corrispondente nel descrittore del sistema operativo MS. Tali dispositivi sono denominati dispositivi WinUSB. I produttori hardware non sono necessari per distribuire un file INF per il dispositivo WinUSB, rendendo più semplice il processo di installazione del driver 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 i driver specifici della classe e del dispositivo da Microsoft o da un fornitore di terze parti. Per visualizzare un elenco di driver di classe forniti da Microsoft, vedere Driver per le classi di dispositivo 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 stratiato direttamente sopra il driver dell'hub.

Per un dispositivo USB composito che espone più funzioni e non dispone di un driver di classe padre di Windows windows carica windows generico (Usbccgp.sys) tra il driver hub e il livello del 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 in modalità 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 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 richieste 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 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 URB allocati dalle nuove routine hanno un contesto ODBC usato dal driver USB per una migliore verifica ed elaborazione. Per altre informazioni, vedere Allocazione e compilazione di URB.

  • Winusb.dll

    Winusb.dll è una DLL in modalità utente che espone le 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 Come accedere a un dispositivo USB tramite funzioni WinUSB.