Condividi tramite


Descrittori di dispositivi USB

Il descrittore di dispositivo contiene informazioni su un dispositivo USB nel suo complesso. Questo articolo descrive la struttura USB_DEVICE_DESCRIPTOR e include informazioni su come un driver client può inviare una richiesta get-descrittore per ottenere il descrittore del dispositivo.

Ogni dispositivo USB (Universal Serial Bus) deve essere in grado di fornire un singolo descrittore del dispositivo che contiene informazioni pertinenti sul dispositivo. La struttura USB_DEVICE_DESCRIPTOR descrive un descrittore di dispositivo. Windows usa tali informazioni per derivare vari set di informazioni. Ad esempio, i campi idVendor e idProduct specificano rispettivamente gli identificatori fornitore e prodotto. Windows usa questi valori di campo per costruire un ID hardware per il dispositivo. Per visualizzare l'ID hardware di un particolare dispositivo:

  1. Aprire Gestione dispositivi.
  2. Fare clic con il pulsante destro del mouse sul dispositivo USB e scegliere Proprietà.
  3. Selezionare la scheda Dettagli nella finestra di dialogo delle proprietà.
  4. Elenco a discesa Proprietà .
  5. Selezionare la proprietà Id hardware

I valori indicano gli ID hardware ("USB\XXX") generati da Windows.

Il campo bcdUSB della struttura USB_DEVICE_DESCRIPTOR indica la versione della specifica USB alla quale il dispositivo è conforme. Ad esempio, 0x0200 indica che il dispositivo è progettato in base alla specifica USB 2.0. Il valore bcdDevice indica il numero di revisione definito dal dispositivo.

Lo stack di driver USB usa bcdDevice, insieme a idVendor e idProduct, per generare ID hardware e ID compatibili per il dispositivo. È possibile visualizzare tali identificatori in Gestione dispositivi. Il descrittore del dispositivo indica anche il numero totale di configurazioni supportate dal dispositivo.

Un dispositivo potrebbe segnalare informazioni diverse nel descrittore del dispositivo quando il dispositivo si connette al computer host in una capacità ad alta velocità rispetto a quando si connette a una capacità a velocità completa. Un dispositivo non deve modificare le informazioni contenute nel descrittore del dispositivo durante la durata di una connessione, incluso durante le modifiche dello stato di alimentazione.

L'host ottiene il descrittore del dispositivo tramite un trasferimento del controllo. Nel trasferimento il tipo di richiesta è GET DESCRIPTOR e il destinatario è il dispositivo. Il driver client può avviare il trasferimento in uno dei due modi seguenti: usando l'oggetto dispositivo di destinazione USB del framework o inviando un'eccezione ODBC con le informazioni sulla richiesta.

Recupero del descrittore del dispositivo

Un driver client Windows Driver Frameworks (WDF) può ottenere il descrittore del dispositivo solo dopo la creazione dell'oggetto dispositivo di destinazione USB del framework.

Un driver KMDF (Kernel-Mode Driver Framework) deve ottenere un handle WDFUSBDEVICE per l'oggetto dispositivo di destinazione USB chiamando WdfUsbTargetDeviceCreate. In genere, un driver client chiama WdfUsbTargetDeviceCreate nell'implementazione del callback EvtDevicePrepareHardware del driver. Successivamente, il driver client deve chiamare il metodo WdfUsbTargetDeviceGetDeviceDescriptor . Al termine della chiamata, il descrittore del dispositivo viene ricevuto nella struttura USB_DEVICE_DESCRIPTOR allocata dal chiamante.

Un driver UMDF (User-Mode Driver Framework) deve eseguire una query sull'oggetto dispositivo framework per un puntatore IWDFUsbTargetDevice e quindi chiamare il metodo IWDFUsbTargetDevice::RetrieveDescriptor e specificare USB_DEVICE_DESCRIPTOR_TYPE come tipo descrittore.

L'host può anche ottenere il descrittore del dispositivo inviando un'eccezione DEVICE. Questo metodo si applica solo ai driver in modalità kernel. Tuttavia, un driver client non deve mai inviare un'eccezione ODBC per questo tipo di richiesta, a meno che il driver non sia basato su Windows Driver Model (WDM). Un driver di questo tipo deve allocare unastrutturaae e quindi chiamare la macro UsbBuildGetDescriptorRequest per specificare il formato dell'elemento VB per la richiesta. Il driver può quindi inviare la richiesta inviando l'ESTENSIONe ALLO stack di driver USB. Per altre informazioni, vedere How to Submit an ASSEMBLY .

In questo esempio di codice viene illustrata una chiamata UsbBuildGetDescriptorRequest che formatta il buffer a cui punta pURB con l'oggetto CSV appropriato:

UsbBuildGetDescriptorRequest(
    pURB,                                                 // Points to the URB to be formatted
    sizeof(struct _URB_CONTROL_DESCRIPTOR_REQUEST),
    USB_DEVICE_DESCRIPTOR_TYPE,
    0,                                                    // Not used for device descriptors
    0,                                                    // Not used for device descriptors
    pDescriptor,                                          // Points to a USB_DEVICE_DESCRIPTOR structure
    NULL,
    sizeof(USB_DEVICE_DESCRIPTOR),
    NULL
);

Descrittore di dispositivo di esempio

Questo esempio mostra il descrittore del dispositivo per un dispositivo webcam USB (vedi Layout dispositivo USB), ottenuto usando l'applicazione USBView:

Device Descriptor:
bcdUSB:             0x0200
bDeviceClass:         0xEF
bDeviceSubClass:      0x02
bDeviceProtocol:      0x01
bMaxPacketSize0:      0x40 (64)
idVendor:           0x045E (Microsoft Corporation)
idProduct:          0x0728
bcdDevice:          0x0100
iManufacturer:        0x01
0x0409: "Microsoft"
iProduct:             0x02
0x0409: "Microsoft LifeCam VX-5000"
0x0409: "Microsoft LifeCam VX-5000"
iSerialNumber:        0x00
bNumConfigurations:   0x01

Nell'esempio precedente il dispositivo è stato sviluppato in base alla specifica USB versione 2.0. Prendere nota dei valori bDeviceClass, bDeviceSubClass e bDeviceProtocol . Questi valori indicano che il dispositivo contiene uno o più descrittori di associazione dell'interfaccia USB che possono essere usati per raggruppare più interfacce per funzione. Per altre informazioni, vedere Descrittore dell'associazione dell'interfaccia USB.

Vedere quindi il valore di bMaxPacketSize0. Questo valore indica la dimensione massima del pacchetto dell'endpoint predefinito. Questo dispositivo di esempio può trasferire fino a 64 byte di dati tramite l'endpoint predefinito.

In genere, per configurare il dispositivo, il driver client ottiene informazioni sulle configurazioni supportate nel dispositivo dopo aver ottenuto il descrittore del dispositivo. Per determinare il numero di configurazioni supportate dal dispositivo, esaminare il membro bNumConfigurations della struttura restituita. Questo dispositivo supporta una configurazione. Per ottenere informazioni su una configurazione USB, il driver deve ottenere descrittori di configurazione USB.