Dispositivo WinUSB
Informazioni su come Windows riconosce un dispositivo WinUSB in questo articolo.
Le informazioni contenute in questo articolo si applicano a te se sei un OEM o un fornitore di hardware indipendente (IHV) che sviluppa dispositivi che utilizzano Winusb.sys come driver di funzione. Questo articolo illustra come caricare automaticamente il driver senza dover fornire un INF personalizzato.
Che cos'è un dispositivo WinUSB
Un dispositivo WinUSB è un dispositivo USB (Universal Serial Bus) il cui firmware definisce alcuni descrittori di funzionalità del sistema operativo Microsoft che segnalano "WINUSB" come ID compatibile.
Lo scopo di un dispositivo WinUSB è consentire a Windows di caricare Winusb.sys come driver di funzione del dispositivo senza un file INF personalizzato. Per un dispositivo WinUSB, non è necessario distribuire i file INF per il dispositivo, semplificando il processo di installazione dei driver per gli utenti finali. Viceversa, se devi fornire un INF personalizzato, non devi definire il dispositivo come dispositivo WinUSB e specificare l'ID hardware del dispositivo in INF.
Microsoft fornisce Winusb.inf che contiene informazioni necessarie per installare Winusb.sys come driver di dispositivo per un dispositivo USB.
Prima di Windows 8, per caricare Winusb.sys come driver di funzione, è necessario fornire un INF personalizzato. L'INF personalizzato specifica l'ID hardware specifico del dispositivo e include anche sezioni del file Winusb.inf preinstallato. Queste sezioni sono necessarie per creare un'istanza del servizio, copiare i file binari della posta in arrivo e registrare un GUID dell'interfaccia del dispositivo richiesto dalle applicazioni per trovare il dispositivo e comunicare con esso. Per informazioni su come redigere un INF personalizzato, consultare WinUSB (Winusb.sys) Installazione.
In Windows 8 il file Winusb.inf in-box viene aggiornato per consentire a Windows di associare automaticamente l'INF a un dispositivo WinUSB.
Installazione del dispositivo WinUSB tramite winusb.inf
In Windows 8 il file Winusb.inf in-box viene aggiornato. INF include una sezione di installazione che fa riferimento a un ID compatibile denominato USB\MS_COMP_WINUSB.
[Generic.Section.NTamd64]
%USB\MS_COMP_WINUSB.DeviceDesc%=WINUSB,USB\MS_COMP_WINUSB
L'INF aggiornato include anche una nuova classe di installazione denominata USBDevice.
La classe di configurazione USBDevice è disponibile per i dispositivi per i quali Microsoft non fornisce un driver preinstallato. In genere, tali dispositivi non appartengono a classi USB ben definite, ad esempio Audio, Bluetooth e così via, e richiedono un driver personalizzato. Se il dispositivo è un dispositivo WinUSB, molto probabilmente il dispositivo non appartiene a una classe USB. Pertanto, il dispositivo deve essere installato nella classe di installazione USBDevice. Winusb.inf aggiornato facilita tale requisito.
Informazioni sull'uso della classe USBDevice
Non usare la classe di installazione USB per i dispositivi non classificati. Tale classe è riservata per l'installazione di controller, hub e dispositivi compositi. L'uso non ottimale della classe USB può causare problemi significativi di affidabilità e prestazioni. Usare USBDevice per i dispositivi non classificati.
In Windows 8 aggiungere questa definizione al file INF per usare la classe di dispositivo USBDevice:
[Version]
...
Class=USBDevice
ClassGuid={88BAE032-5A81-49f0-BC3D-A4FF138216D6}
...
In Gestione dispositivi, vedi un nuovo nodo denominato dispositivi usb universali del bus serialee il dispositivo viene visualizzato in tale nodo.
In Windows 7, oltre alle righe precedenti, è necessario creare queste impostazioni del Registro di sistema in INF:
;---------- Add Registry Section ----------
[USBDeviceClassReg]
HKR,,,,"Universal Serial Bus devices"
HKR,,NoInstallClass,,1
HKR,,SilentInstall,,1
HKR,,IconPath,%REG_MULTI_SZ%,"%systemroot%\system32\setupapi.dll,-20"
In Gestione dispositivi, il dispositivo viene visualizzato in dispositivi USB Universal Serial Bus. Tuttavia, la descrizione della classe del dispositivo deriva dall'impostazione del Registro di sistema specificata nell'INF.
La classe USBDevice non è limitata a WinUSB. Se si dispone di un driver personalizzato per il dispositivo, è possibile usare la classe di installazione USBDevice nell'INF personalizzato.
Durante l'enumerazione del dispositivo, lo stack di driver USB legge l'ID compatibile dal dispositivo. Se "WINUSB" è l'ID compatibile, Windows lo usa come identificatore del dispositivo e trova una corrispondenza nella casella aggiornata Winusb.inf e quindi carica Winusb.sys come driver di funzione del dispositivo.
Questa immagine riguarda un dispositivo MUTT con un'unica interfaccia, definito come dispositivo WinUSB e, di conseguenza, Winusb.sys viene caricato come driver della funzione per il dispositivo.
Per le versioni di Windows precedenti a Windows 8, winusb.inf aggiornato è disponibile tramite Windows Update. Se il computer è configurato per ottenere automaticamente l'aggiornamento del driver, il driver WinUSB viene installato senza alcun intervento dell'utente usando il nuovo pacchetto INF.
Come modificare la descrizione del dispositivo per un dispositivo WinUSB
Per un dispositivo WinUSB, Gestione dispositivi mostra "Dispositivo WinUsb" come descrizione del dispositivo. Tale stringa è derivata da Winusb.inf. Se sono presenti più dispositivi WinUSB, tutti i dispositivi ottengono la stessa descrizione del dispositivo.
Per identificare e distinguere in modo univoco il dispositivo in Gestione dispositivi, Windows 8 fornisce una nuova proprietà in una classe di dispositivo che indica al sistema di assegnare la precedenza alla descrizione del dispositivo segnalata dal dispositivo (nel relativo descrittore di stringa iProduct) sulla descrizione in INF. La classe USBDevice definita in Windows 8 imposta questa proprietà. Quando un dispositivo viene installato nella classe USBDevice, Windows esegue una query sul dispositivo per una descrizione del dispositivo e imposta la stringa di Gestione dispositivi su qualsiasi elemento recuperato nella query. In tal caso, la descrizione del dispositivo fornita in INF viene ignorata. Si notino le stringhe di descrizione del dispositivo: "MUTT" nell'immagine precedente. La stringa viene fornita dal dispositivo USB nel descrittore della stringa del prodotto.
La nuova proprietà della classe non è supportata nelle versioni precedenti di Windows. Per avere una descrizione personalizzata del dispositivo in una versione precedente di Windows, è necessario scrivere il proprio INF personalizzato.
Come configurare un dispositivo WinUSB
Per identificare un dispositivo USB come dispositivo WinUSB, il firmware del dispositivo deve avere descrittori del sistema operativo Microsoft. Per informazioni sui descrittori, vedere le specifiche descritte qui: Descrittori del sistema operativo Microsoft.
Supporto dei descrittori delle funzionalità estese
Perché lo stack di driver USB riconosca che il dispositivo supporta i descrittori di funzionalità estesi, il dispositivo deve definire un descrittore di stringa del sistema operativo memorizzato all'indice stringa 0xEE. Durante l'enumerazione, lo stack di driver esegue query per il descrittore di stringa. Se il descrittore è presente, lo stack di driver presuppone che il dispositivo contenga uno o più descrittori di funzionalità del sistema operativo e i dati necessari per recuperare tali descrittori di funzionalità.
Il descrittore di stringa recuperato ha un valore di campo bMS_VendorCode. Il valore indica il codice del fornitore che lo stack di driver USB deve utilizzare per recuperare il descrittore della funzionalità estesa.
Per informazioni su come definire un descrittore di stringa del sistema operativo, vedere "Descrittore stringa del sistema operativo" nelle specifiche descritte qui: descrittori del sistema operativo Microsoft.
Impostazione dell'ID compatibile
Descrittore di funzionalità del sistema operativo con ID compatibile esteso necessario per la corrispondenza con Winusb.inf del sistema e per caricare il modulo driver WinUSB.
Il descrittore delle funzionalità del sistema operativo con ID compatibile esteso include una sezione di intestazione seguita da una o più sezioni funzionali, a seconda che il dispositivo sia un dispositivo composito o non composito. La sezione dell'intestazione specifica la lunghezza dell'intero descrittore, il numero delle sezioni funzionali e la versione. Per un dispositivo noncomposito, l'intestazione è seguita da una sezione della funzione associata all'unica interfaccia del dispositivo. Il campo compatibleID di tale sezione deve specificare "WINUSB" come valore. Per un dispositivo composito, sono disponibili più sezioni di funzione. Il campo compatibleID di ogni sezione della funzione deve specificare "WINUSB".
Registrazione di un GUID dell'interfaccia del dispositivo
Descrittore delle funzionalità estese del sistema operativo necessario per registrare il GUID dell'interfaccia del dispositivo. Il GUID è necessario per trovare il dispositivo da un'applicazione o un servizio, configurare il dispositivo ed eseguire operazioni di I/O.
Nelle versioni precedenti di Windows, la registrazione GUID dell'interfaccia dispositivo viene eseguita tramite l'INF personalizzato. A partire da Windows 8, il dispositivo deve segnalare il GUID dell'interfaccia tramite il descrittore delle funzionalità del sistema operativo relativo alle proprietà estese.
Il descrittore di funzionalità del sistema operativo delle proprietà estese include una sezione di intestazione seguita da una o più sezioni di proprietà personalizzate. La sezione dell'intestazione descrive il descrittore completo delle proprietà estesi, compresa la lunghezza totale, il numero di versione e il numero delle sezioni personalizzate di proprietà. Per registrare il GUID dell'interfaccia del dispositivo, aggiungere una sezione di proprietà personalizzata che imposta il campo bPropertyName su "DeviceInterfaceGUID" e wPropertyNameLength su 40 byte. Generare un GUID dell'interfaccia del dispositivo univoco utilizzando un generatore GUID e impostare il campo bPropertyData su tale GUID, ad esempio "{8FE6D4D7-49DD-41E7-9486-49AFC6BFE475}". Il GUID viene specificato come stringa Unicode e la lunghezza della stringa è di 78 byte (incluso il carattere di terminazione Null).
bPropertyData | 78 byte | 7B 00 38 00 46 00 45 00 36 00 44 00 34 00 44 00 37 00 2D 00 34 00 39 00 00 44 00 2D 00 34 00 31 00 45 00 37 00 2D 00 39 00 34 00 38 00 36 00 2D 00 34 00 39 00 41 00 46 00 43 00 36 00 42 00 46 00 45 00 34 00 37 00 35 00 7D 00 00 00 | Il valore della proprietà è {8FE6D4D7-49DD-41E7-9486-49AFC6BFE475}. |
Durante l'enumerazione del dispositivo, lo stack di driver USB recupera quindi il valore DeviceInterfaceGUID dal descrittore della funzionalità del sistema operativo delle proprietà estese e registra il dispositivo nella chiave hardware del dispositivo. Un'applicazione può recuperare il valore usando le API SetupDiXxx (vedere SetupDiOpenDevRegKey). Per ulteriori informazioni, vedere Come accedere a un dispositivo USB utilizzando le funzioni WinUSB.
Abilitazione o disabilitazione delle funzionalità di risparmio energia WinUSB
Prima di Windows 8, per configurare le funzionalità di risparmio energia di WinUSB, era necessario scrivere valori di voce del Registro di sistema nel HW. Sezione AddReg dell'INF personalizzato.
In Windows 8 e versioni successive è possibile specificare le impostazioni di risparmio energia nel dispositivo. È possibile segnalare valori tramite il descrittore delle proprietà estese di funzionalità del sistema operativo, che consente di abilitare o disabilitare le funzionalità in WinUSB per quel dispositivo. È possibile configurare due funzionalità: sospensione selettiva e riattivazione del sistema. La sospensione selettiva consente al dispositivo di entrare in uno stato di basso consumo quando è inattivo. La riattivazione del sistema si riferisce alla capacità di un dispositivo di riattivare un sistema quando il sistema è in stato a basso consumo.
Per informazioni sulle funzionalità di risparmio energia di WinUSB, vedere Power Management WinUSB.
Nome della proprietà | Descrizione |
---|---|
Modalità Inattiva Dispositivo Abilitata | Questo valore è impostato su 1 per indicare che il dispositivo può spegnere quando è inattivo (sospensione selettiva). |
StatoInattivoPredefinito | Questo valore è impostato su 1 per indicare che, per impostazione predefinita, il dispositivo può essere sospeso quando è inattivo. |
DefaultIdleTimeout | Questo valore è impostato su 5000 millisecondi per indicare il tempo di attesa in millisecondi prima di determinare che un dispositivo è inattivo. |
ImpostaDispositivoInattivoUtente | Questo valore è impostato su 1 per consentire all'utente di controllare la capacità del dispositivo di abilitare o disabilitare la sospensione selettiva USB. Una casella di controllo Consente al computer di spegnere il dispositivo per risparmiare energia nella pagina delle proprietà Gestione alimentazione e l'utente può selezionare o deselezionare la casella per abilitare o disabilitare la sospensione selettiva USB. |
SvegliamentoSistemaAbilitato | Questo valore è impostato su 1 per consentire all'utente di controllare la capacità del dispositivo di riattivare il sistema da uno stato a basso consumo. Se abilitata, la casella di controllo Consenti al dispositivo di riattivare il computer viene visualizzata nella pagina delle proprietà di risparmio energia del dispositivo. L'utente può selezionare o deselezionare la casella per abilitare o disabilitare la funzione di riattivazione via USB. |
Ad esempio, per abilitare la sospensione selettiva sul dispositivo, aggiungere una sezione della proprietà personalizzata che imposta il campo bPropertyName su una stringa Unicode, "DeviceIdleEnabled" e wPropertyNameLength su 36 byte. Impostare il campo bPropertyData su "0x00000001". I valori delle proprietà vengono archiviati come numeri interi little-endian a 32 bit.
Durante l'enumerazione, lo stack dei driver USB legge i descrittori delle proprietà estese e crea voci del Registro di sistema in questa chiave:
HKEY_LOCAL_MACHINE\System\CurrentControlSet\Enum\Identificatore di dispositivo\<USB>\<Identificatore di istanza>\Parametri del dispositivo
Questa immagine mostra le impostazioni di esempio per un dispositivo WinUSB.
Per altri esempi, consultare le specifiche su Descrittori del Sistema Operativo Microsoft.