Delen via


USB-apparaatbeschrijvingen

De apparaatdescriptor bevat informatie over een USB-apparaat als geheel. This article describes the USB_DEVICE_DESCRIPTOR structure and includes information about how a client driver can send a get-descriptor request to obtain the device descriptor.

Elk USB-apparaat (Universal Serial Bus) moet één apparaatdescriptor kunnen opgeven die relevante informatie over het apparaat bevat. The USB_DEVICE_DESCRIPTOR structure describes a device descriptor. Windows gebruikt die informatie om verschillende gegevenssets af te leiden. For example, the idVendor and idProduct fields specify vendor and product identifiers, respectively. Windows uses those field values to construct a hardware ID for the device. De hardware-id van een bepaald apparaat weergeven:

  1. Open Device Manager.
  2. Right-click on the USB device and select Properties.
  3. Select the Details tab in the properties dialog box.
  4. Drop down the Property list.
  5. Select the Hardware Ids property

The values indicate the hardware IDs ("USB\XXX") that Windows generates.

The bcdUSB field of the USB_DEVICE_DESCRIPTOR structure indicates the version of the USB specification to which the device conforms. 0x0200 geeft bijvoorbeeld aan dat het apparaat is ontworpen volgens de USB 2.0-specificatie. The bcdDevice value indicates the device-defined revision number.

The USB driver stack uses bcdDevice, along with idVendor and idProduct, to generate hardware and compatible IDs for the device. You can view those identifiers in Device Manager. De apparaatdescriptor geeft ook het totale aantal configuraties aan dat het apparaat ondersteunt.

Een apparaat kan andere informatie in de apparaatdescriptor rapporteren wanneer het apparaat verbinding maakt met de hostcomputer in een hoge snelheidscapaciteit dan wanneer het apparaat verbinding maakt in een volledige capaciteit. Een apparaat mag de informatie in de apparaatdescriptor niet wijzigen tijdens de levensduur van een verbinding, inclusief tijdens wijzigingen in de energiestatus.

De host verkrijgt de apparaatdescriptor via een besturingsoverdracht. In de overdracht is het aanvraagtype GET DESCRIPTOR en is de ontvanger het apparaat. Het clientstuurprogramma kan deze overdracht op twee manieren initiëren: met behulp van het object usb-doelapparaat van het framework of door een URB met de aanvraaggegevens te verzenden.

De apparaatdescriptor verkrijgen

Een WDF-clientstuurprogramma (Windows Driver Frameworks) kan de apparaatdescriptor alleen verkrijgen nadat het object voor het USB-doelapparaat van het framework is gemaakt.

A Kernel-Mode Driver Framework (KMDF) driver must obtain a WDFUSBDEVICE handle to the USB target device object by calling WdfUsbTargetDeviceCreate. Typically, a client driver calls WdfUsbTargetDeviceCreate in the driver's EvtDevicePrepareHardware callback implementation. After that, the client driver must call the WdfUsbTargetDeviceGetDeviceDescriptor method. After the call completes, the device descriptor is received in the caller-allocated USB_DEVICE_DESCRIPTOR structure.

A User-Mode Driver Framework (UMDF) driver must query the framework device object for an IWDFUsbTargetDevice pointer and then call the IWDFUsbTargetDevice::RetrieveDescriptor method and specify USB_DEVICE_DESCRIPTOR_TYPE as the descriptor type.

De host kan ook de apparaatdescriptor verkrijgen door een URB te verzenden. Deze methode is alleen van toepassing op stuurprogramma's in de kernelmodus. Een clientstuurprogramma moet echter nooit een URB verzenden voor dit type aanvraag, tenzij het stuurprogramma is gebaseerd op Het Windows Driver Model (WDM). Such a driver must allocate an URB structure and then call the UsbBuildGetDescriptorRequest macro to specify format the URB for the request. Het stuurprogramma kan de aanvraag vervolgens verzenden door de URB in te dienen bij de USB-stuurprogrammastack. Zie Een URB verzenden voor meer informatie.

In dit codevoorbeeld ziet u een UsbBuildGetDescriptorRequest-aanroep die de buffer formatteert waarnaar pURB verwijst met de juiste URB:

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

Voorbeeldapparaatdescriptor

In dit voorbeeld ziet u de apparaatdescriptor voor een USB-webcamapparaat (zie USB-apparaatindeling), verkregen met behulp van de USBView-toepassing:

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

In het voorgaande voorbeeld is het apparaat ontwikkeld volgens USB-specificatie, versie 2.0. Note the bDeviceClass, bDeviceSubClass, and bDeviceProtocol values. Deze waarden geven aan dat het apparaat een of meer USB-interfacekoppelingsdescriptors bevat die kunnen worden gebruikt om meerdere interfaces per functie te groeperen. Zie Descriptor usb-interfacekoppeling voor meer informatie.

Next, see the value of bMaxPacketSize0. Deze waarde geeft de maximale pakketgrootte van het standaardeindpunt aan. Dit voorbeeldapparaat kan maximaal 64 bytes aan gegevens overdragen via het standaardeindpunt.

Voor het configureren van het apparaat krijgt het clientstuurprogramma doorgaans informatie over de ondersteunde configuraties op het apparaat nadat de apparaatdescriptor is opgehaald. To determine the number of configurations that the device supports, inspect the bNumConfigurations member of the returned structure. Dit apparaat ondersteunt één configuratie. Voor informatie over een USB-configuratie moet het stuurprogramma USB-configuratiedescriptors ophalen.