Partager via


Descripteurs de périphériques USB

Le descripteur d’appareil contient des informations sur un périphérique USB dans son ensemble. Cette rubrique décrit la structure USB_DEVICE_DESCRIPTOR et inclut des informations sur la façon dont un pilote client peut envoyer une demande get-descriptor pour obtenir le descripteur de périphérique.

Chaque périphérique USB (Universal Serial Bus) doit être en mesure de fournir un descripteur d’appareil unique qui contient des informations pertinentes sur l’appareil. La structure USB_DEVICE_DESCRIPTOR décrit un descripteur d’appareil. Windows utilise ces informations pour dériver différents ensembles d’informations. Par exemple, les champs idVendor et idProduct spécifient respectivement les identificateurs de fournisseur et de produit. Windows utilise ces valeurs de champ pour construire un ID matériel pour l’appareil. Pour afficher l’ID matériel d’un appareil particulier, ouvrez Gestionnaire de périphériques et affichez les propriétés de l’appareil. Sous l’onglet Détails , la valeur de la propriété Id de matériel indique l’ID matériel (« USB\XXX ») généré par Windows. Le champ bcdUSB indique la version de la spécification USB à laquelle l’appareil est conforme. Par exemple, 0x0200 indique que l’appareil est conçu conformément à la spécification USB 2.0. La valeur bcdDevice indique le numéro de révision défini par l’appareil. La pile de pilotes USB utilise bcdDevice, ainsi que idVendor et idProduct, pour générer du matériel et des ID compatibles pour l’appareil. Vous pouvez afficher ces identificateurs dans Gestionnaire de périphériques. Le descripteur d’appareil indique également le nombre total de configurations que l’appareil prend en charge.

Un appareil peut signaler des informations différentes dans son descripteur d’appareil lorsque l’appareil est connecté à l’ordinateur hôte dans une capacité haute vitesse par rapport à une capacité à pleine vitesse. Un appareil ne doit pas modifier les informations contenues dans le descripteur d’appareil pendant la durée de vie d’une connexion, y compris pendant les changements d’état d’alimentation.

L’hôte obtient le descripteur d’appareil par le biais d’un transfert de contrôle. Dans le transfert, le type de requête est GET DESCRIPTOR et le destinataire est l’appareil. Le pilote client peut lancer ce transfert de deux manières : à l’aide de l’objet de périphérique cible USB du framework ou en envoyant un URB avec les informations de demande.

Obtention du descripteur d’appareil

Un pilote client WDF (Windows Driver Frameworks) peut obtenir le descripteur de périphérique uniquement après la création de l’objet périphérique cible USB du framework.

Un pilote KMDF doit obtenir un handle WDFUSBDEVICE pour l’objet périphérique cible USB en appelant WdfUsbTargetDeviceCreate. En règle générale, un pilote client appelle WdfUsbTargetDeviceCreate dans l’implémentation de rappel EvtDevicePrepareHardware du pilote. Après cela, le pilote client doit appeler la méthode WdfUsbTargetDeviceGetDeviceDescriptor . Une fois l’appel terminé, le descripteur d’appareil est reçu dans la structure USB_DEVICE_DESCRIPTOR allouée à l’appelant .

Un pilote UMDF doit interroger l’objet de périphérique d’infrastructure à la recherche d’un pointeur IWDFUsbTargetDevice , puis appeler la méthode IWDFUsbTargetDevice ::RetrieveDescriptor et spécifier USB_DEVICE_DESCRIPTOR_TYPE comme type de descripteur.

L’hôte peut également obtenir le descripteur d’appareil en envoyant un URB. Cette méthode s’applique uniquement aux pilotes en mode noyau. Toutefois, un pilote client ne doit jamais avoir à envoyer un URB pour ce type de requête, sauf si le pilote est basé sur le modèle de pilote Windows (WDM). Un tel pilote doit allouer une structure URB , puis appeler la macro UsbBuildGetDescriptorRequest pour spécifier le format de l’URB pour la requête. Le pilote peut ensuite envoyer la demande en envoyant l’URB à la pile de pilotes USB. Pour plus d’informations, consultez Comment envoyer un URB.

Cet exemple de code montre un appel UsbBuildGetDescriptorRequest qui met en forme la mémoire tampon pointée par pURB avec l’URB approprié :

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
);

Exemple de descripteur d’appareil

Cet exemple montre le descripteur de périphérique pour un périphérique de webcam USB (voir Disposition du périphérique USB), obtenu à l’aide de l’application 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

Dans l’exemple précédent, vous verrez que l’appareil a été développé conformément à la spécification USB, version 2.0. Notez les valeurs bDeviceClass, bDeviceSubClass et bDeviceProtocol . Ces valeurs indiquent que l’appareil contient un ou plusieurs descripteurs d’association d’interface USB qui peuvent être utilisés pour regrouper plusieurs interfaces par fonction. Pour plus d’informations, consultez Descripteur d’association d’interface USB.

Ensuite, consultez la valeur de bMaxPacketSize0. Cette valeur indique la taille maximale des paquets du point de terminaison par défaut. Cet exemple d’appareil peut transférer jusqu’à 64 octets de données via son point de terminaison par défaut.

En règle générale, pour configurer l’appareil, le pilote client obtient des informations sur les configurations prises en charge dans l’appareil après avoir obtenu le descripteur de périphérique. Pour déterminer le nombre de configurations que l’appareil prend en charge, examinez le membre bNumConfigurations de la structure retournée. Cet appareil prend en charge une seule configuration. Pour obtenir des informations sur une configuration USB, le pilote doit obtenir des descripteurs de configuration USB.