Condividi tramite


CONTENITORI USB in Windows

Questo articolo fornisce informazioni su USB ContainerIDs per il sistema operativo Windows. Include linee guida per i produttori di dispositivi per programmare i dispositivi USB multifunzione in modo che vengano rilevati correttamente da Windows.

Gli utenti possono sfruttare tutte le funzionalità dei dispositivi connessi ai computer. Sono inclusi dispositivi multifunzione, ad esempio una stampante combinata, uno scanner e un dispositivo di copiatore. Windows include il supporto per consolidare tutte le funzionalità di un singolo dispositivo fisico in un contenitore di dispositivi. Un contenitore di dispositivi è una rappresentazione virtuale del dispositivo fisico. Questo consolidamento viene ottenuto assegnando una proprietà ContainerID a ogni funzione del dispositivo enumerata per il dispositivo fisico. Assegnando lo stesso valore ContainerID a ogni funzione del dispositivo, Windows riconosce che tutte le funzioni del dispositivo appartengono allo stesso dispositivo fisico.

Tutti i tipi di dispositivi che si connettono a un computer tramite diversi tipi di bus possono supportare i contenitori di dispositivi. Tuttavia, non tutti i tipi di bus usano lo stesso meccanismo per generare un ContainerID. Per i dispositivi USB, i fornitori di dispositivi possono usare un descrittore ContainerID per descrivere l'ID contenitore per un dispositivo fisico. Un descrittore ContainerID è un descrittore di funzionalità del sistema operativo Microsoft che può essere archiviato nel firmware del dispositivo USB. I produttori di dispositivi USB devono implementare correttamente questi descrittori ContainerID nei propri dispositivi per sfruttare le nuove funzionalità del dispositivo disponibili in Windows. I produttori di dispositivi USB devono implementare solo un singolo ContainerID per ogni dispositivo fisico, indipendentemente dal numero di funzioni del dispositivo supportate dal dispositivo.

Per altre informazioni sul consolidamento di tutte le funzionalità di un singolo dispositivo in un contenitore di dispositivi, vedere Come vengono generati gli ID contenitore.

Per altre informazioni sui descrittori del sistema operativo Microsoft per i dispositivi USB, vedere Descrittori del sistema operativo Microsoft per dispositivi USB.

Come viene generato un CONTAINERID USB

Di seguito sono riportati due modi per generare un ContainerID per un dispositivo USB:

  • Il produttore del dispositivo USB specifica l'ID contenitore nel firmware del dispositivo usando un descrittore ContainerID del sistema operativo Microsoft.
  • Il driver dell'hub USB Microsoft crea automaticamente un Id contenitore per il dispositivo dalla combinazione dell'ID prodotto del dispositivo (PID), ID fornitore (VID), numero di revisione e numero di serie. In questo caso, il driver dell'hub USB Microsoft crea un ContainerID con funzionalità minime. Questo metodo si applica solo ai dispositivi con un numero di serie univoco.

Contenuto di USB ContainerID

Un CONTAINERID USB viene presentato al sistema operativo sotto forma di stringa UUID (Universally Unique Identifier). L'UUID ContainerID è contenuto all'interno di un descrittore ContainerID . Un descrittore ContainerID è un descrittore di funzionalità del sistema operativo Microsoft a livello di dispositivo. Di conseguenza, quando il sistema operativo richiede un ID contenitore USB, il campo wValue della richiesta del descrittore deve essere sempre impostato su zero. Per altre informazioni sui descrittori e sulle richieste dei descrittori delle funzionalità del sistema operativo Microsoft, vedere Microsoft OS 1.0 Descriptors Specification( Specifica dei descrittori del sistema operativo Microsoft).

Un descrittore ContainerID è costituito da una sezione di intestazione.

Contropartita Campo Dimensione Tipo Descrizione
0 dwLength 4 DWord senza segno Lunghezza, in byte, dell'intero descrittore ContainerID . Questo campo deve essere sempre impostato su un valore di 0x18.
4 bcdVersion 2 BCD Numero di versione del descrittore ContainerID , in decimale codificato binario (BCD), dove ogni nibble corrisponde a una cifra. Il byte più significativo (MSB) contiene le due cifre prima del separatore decimale e il byte meno significativo (LSB) contiene le due cifre dopo il separatore decimale. Ad esempio, la versione 1.00 è rappresentata come 0x0100. Questo campo deve essere sempre impostato su 0x0100.
6 wIndex 2 Word Questo campo è sempre impostato su 6 per i descrittori USB ContainerID .

Un descrittore ContainerID è costituito da una sezione ContainerID.

Contropartita Campo Dimensione Tipo Descrizione
0 bContainerID 16 DWord senza segno Dati ContainerID .

I produttori di dispositivi sono responsabili di garantire che ogni istanza di un dispositivo abbia un valore di 16 byte univoco universalmente per ContainerID. Inoltre, un dispositivo deve segnalare lo stesso valore ContainerID ogni volta che è acceso. Esistono diversi algoritmi stabiliti per la generazione di UUID con quasi zero probabilità di duplicazione. I produttori di dispositivi possono selezionare l'algoritmo di generazione UUID più adatto alle proprie esigenze. Non importa quale algoritmo di generazione UUID viene usato purché il risultato sia univoco.

Sintassi di USB ContainerID

Un ContainerID viene segnalato nel formato di stringa UUID standard di {xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx}. Di seguito è riportata una rappresentazione di esempio nel firmware per un 0C B4 A7 2C D1 7B 25 4F B5 73 A1 3A 97 5D DC 07 USB ContainerID, formattato come stringa UUID {2CA7B40C-7BD1-4F25-B573-A13A975DDC07} UUID.

UCHAR ExampleContainerIDDescriptor[24] =
{
    0x18, 0x00, 0x00, 0x00,     // dwLength - 24 bytes
    0x00, 0x01,                 // bcdVersion - 1.00
    0x06, 0x00,                 // wIndex – 6 for a ContainerID
    0x0C, 0xB4, 0xA7, 0x2C,     // bContainerID -
    0xD1, 0x7B, 0x25, 0x4F,     // {2CA7B40C-7BD1-4F25-B573-A13A975DDC07}
    0xB5, 0x73, 0xA1, 0x3A,     // 0C B4 A7 2C D1 7B 25 4F B5 73 A1 3A 97 5D DC 07
    0x97, 0x5D, 0xDC, 0x07      //
}

Si noti la modifica nell'ordine dei byte dei primi 8 byte quando viene formattata come stringa UUID.

Modifiche del descrittore del sistema operativo Microsoft

Per mantenere la funzionalità ContainerID legacy, il descrittore di stringa del sistema operativo Microsoft contiene un campo flag che può essere usato per indicare il supporto per il descrittore ContainerID.

La definizione corrente del descrittore di stringa del sistema operativo Microsoft include un campo del riquadro a 1 byte, bPad, alla fine del descrittore che in genere è impostato su zero. Per i dispositivi USB che supportano il nuovo ContainerID, il campo bPad viene ridefinito come campo flags, bFlags. Bit 1 di questo campo viene usato per indicare il supporto per il descrittore ContainerID . La tabella 3 descrive i campi del descrittore di stringa del sistema operativo Microsoft per i dispositivi USB.

Campo Lunghezza (byte) valore Descrizione
bLength 1 0x12 Lunghezza del descrittore.
bDescriptorType 1 0x03 Tipo descrittore. Un valore di 0x03 indica un descrittore di stringa del sistema operativo Microsoft.
qwSignature 14 'MSFT100' Campo Firma.
bMS_VendorCode 1 Codice fornitore Codice fornitore.
bFlags 1 0x02 Bit 0: riservato
Bit 1: Supporto di ContainerID
 0: non supporta ContainerID
 1: supporta ContainerID
Bit da 2 a 7: riservato

Attualmente la spedizione di dispositivi USB che supportano il descrittore del sistema operativo Microsoft, ma non supporta il descrittore ContainerID , il campo bPad è impostato su 0x00. Il driver dell'hub USB non esegue query su tali dispositivi per il descrittore USB ContainerID .

Visualizzazione contenitore di un dispositivo multifunzione USB

ContainerID fornisce informazioni per consolidare i dispositivi per dispositivi USB multifunzione. La figura 1 mostra un esempio di come tutti i dispositivi in una stampante multifunzione vengono consolidati in un singolo contenitore di dispositivi quando tutti i singoli dispositivi all'interno del prodotto usano lo stesso ContainerID.

Screenshot di Gestione dispositivi che mostra il consolidamento di tutti i dispositivi in una stampante multifunzione.

Requisiti HCK di CONTAINERID USB

I produttori di dispositivi devono assicurarsi che ogni istanza di un dispositivo prodotto abbia un valore ContainerID univoco globale in modo che Windows possa consolidare correttamente la funzionalità di ogni dispositivo multifunzione USB. Il Kit di certificazione hardware WindowsWindows include un requisito, DEVFUND-0034, per un CONTAINERID USB, se implementato in un dispositivo. Se un dispositivo implementa un CONTAINERID USB, la certificazione hardware Windows verifica l'ID contenitore come parte dei test del descrittore del sistema operativo Microsoft e verifica se il valore ContainerID è globalmente univoco. Per altre informazioni su questi requisiti di certificazione hardware Windows, vedere il sito Web Certificazione hardware Windows.

Raccomandazioni per l'implementazione di un CONTAINERID USB: di seguito sono riportati i consigli per i fornitori di dispositivi che progettano, producono e spediscono dispositivi USB:

  • Scopri in che modo Windows migliora il supporto per la funzionalità multifunzione e più dispositivi USB di trasporto usando un ContainerID. È consigliabile iniziare leggendo "Supporto per dispositivi multifunzione e Raggruppamenti di contenitori di dispositivi in Windows".

  • Assicurarsi che il numero di serie in ogni dispositivo USB sia univoco. Un requisito di certificazione hardware Windows indica che, se il dispositivo include un numero di serie, il numero di serie deve essere univoco per ogni istanza del dispositivo.

  • Non fornire un ContainerID per un dispositivo USB incorporato in un sistema. I dispositivi USB integrati devono basarsi sulle impostazioni DEL BIOS ACPI o sul descrittore dell'hub USB DeviceRemovable bit per la porta.

  • Assicurarsi che tutti i dispositivi USB collegati a un sistema abbiano valori ContainerID univoci. Non condividere valori ContainerID o numeri di serie USB tra le linee di prodotto.

  • Assicurarsi di impostare correttamente la funzionalità dispositivo rimovibile per il dispositivo.

    Nota

    I fornitori di dispositivi che aggiungono un descrittore USB ContainerID a un dispositivo USB di spedizione in precedenza devono incrementare il numero di versione del dispositivo (bcdDevice) nel descrittore del dispositivo. Questa operazione è necessaria perché il driver dell'hub USB memorizza nella cache il descrittore della stringa del sistema operativo Microsoft (o la mancanza di uno) in base all'ID fornitore, all'ID prodotto e al numero di rilascio del dispositivo di un dispositivo. Se non si incrementa il numero di versione del dispositivo, il driver hub non esegue una query per l'ID contenitore USB di un nuovo dispositivo se in precedenza enumerava un'istanza del dispositivo con lo stesso ID fornitore, ID prodotto e numero di versione del dispositivo che non supportava il descrittore CONTAINERID USB.