Descripteurs de périphériques USB
Le descripteur d’appareil contient des informations sur un périphérique USB dans son ensemble. Cet article 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 d’appareil.
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.
- Cliquez avec le bouton droit sur le périphérique USB et sélectionnez Propriétés.
- Sélectionnez l’onglet Détails dans la boîte de dialogue Propriétés.
- Déposez la liste des propriétés .
- Sélectionnez la propriété Id de matériel
Les valeurs indiquent les ID matériels (« USB\XXX ») générés par Windows.
Le champ bcdUSB de la structure USB_DEVICE_DESCRIPTOR 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 des ID matériels et 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 se connecte à l’ordinateur hôte dans une capacité haute vitesse que lorsqu’il se connecte dans une capacité complète. Un appareil ne doit pas modifier les informations contenues dans le descripteur de l’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 via 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 périphérique cible USB framework ou en envoyant un URB avec les informations de requête.
Obtention du descripteur d’appareil
Un pilote client WDF (Windows Driver Frameworks) peut obtenir le descripteur d’appareil uniquement après la création de l’objet périphérique cible USB du framework.
Un pilote KMDF (Kernel-Mode Driver Framework) doit obtenir un handle WDFUSBDEVICE sur 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 de l’appareil est reçu dans la structure USB_DEVICE_DESCRIPTOR allouée par l’appelant.
Un pilote UMDF (User-Mode Driver Framework) doit interroger l’objet d’appareil framework pour 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 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ée :
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 d’appareil pour un appareil 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, 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 le descripteur de l’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 l’appareil. Pour déterminer le nombre de configurations que l’appareil prend en charge, inspectez le membre bNumConfigurations de la structure retournée. Cet appareil prend en charge une configuration. Pour obtenir des informations sur une configuration USB, le pilote doit obtenir des descripteurs de configuration USB.