Udostępnij przez


Deskryptory urządzeń USB

Deskryptor urządzenia zawiera informacje o urządzeniu USB jako całości. 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.

Każde urządzenie uniwersalnej magistrali szeregowej (USB) musi mieć możliwość zapewnienia pojedynczego deskryptora urządzenia zawierającego odpowiednie informacje o urządzeniu. The USB_DEVICE_DESCRIPTOR structure describes a device descriptor. System Windows używa tych informacji do uzyskiwania różnych zestawów informacji. 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. Aby wyświetlić identyfikator sprzętu określonego urządzenia:

  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. Na przykład 0x0200 wskazuje, że urządzenie jest zaprojektowane zgodnie ze specyfikacją USB 2.0. 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. Deskryptor urządzenia wskazuje również łączną liczbę konfiguracji, które obsługuje urządzenie.

Urządzenie może zgłaszać różne informacje w deskryptorze urządzenia, gdy urządzenie łączy się z komputerem hosta o dużej szybkości niż w przypadku nawiązania połączenia z pełną szybkością. Urządzenie nie może zmieniać informacji zawartych w deskryptorze urządzenia w okresie istnienia połączenia, w tym podczas zmian stanu zasilania.

Host uzyskuje deskryptor urządzenia za pośrednictwem transferu kontrolek. W transferze typ żądania to GET DESCRIPTOR, a adresatem jest urządzenie. Sterownik klienta może zainicjować ten transfer na jeden z dwóch sposobów: przy użyciu obiektu docelowego USB platformy lub wysyłając urB z informacjami o żądaniu.

Pobieranie deskryptora urządzenia

Sterownik klienta programu Windows Driver Frameworks (WDF) może uzyskać deskryptor urządzenia dopiero po utworzeniu obiektu docelowego USB platformy.

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.

Host może również uzyskać deskryptor urządzenia, wysyłając adres URB. Ta metoda dotyczy tylko sterowników trybu jądra. Jednak sterownik klienta nigdy nie powinien wysyłać identyfikatora URB dla tego typu żądania, chyba że sterownik jest oparty na modelu sterowników systemu Windows (WDM). Such a driver must allocate an URB structure and then call the UsbBuildGetDescriptorRequest macro to specify format the URB for the request. Sterownik może następnie wysłać żądanie, przesyłając identyfikator URB do stosu sterowników USB. Aby uzyskać więcej informacji, zobacz jak przesłać URB .

W tym przykładzie kodu pokazano wywołanie UsbBuildGetDescriptorRequest, które formatuje bufor wskazywany przez wartość pURB z odpowiednim identyfikatorem 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
);

Przykładowy deskryptor urządzenia

W tym przykładzie pokazano deskryptor urządzenia dla urządzenia kamery internetowej USB (zobacz Układ urządzenia USB), uzyskany przy użyciu aplikacji 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

W poprzednim przykładzie urządzenie zostało opracowane zgodnie ze specyfikacją USB w wersji 2.0. Note the bDeviceClass, bDeviceSubClass, and bDeviceProtocol values. Te wartości wskazują, że urządzenie zawiera co najmniej jeden deskryptor skojarzenia interfejsu USB, który może służyć do grupowania wielu interfejsów na funkcję. Aby uzyskać więcej informacji, zobacz Deskryptor skojarzeń interfejsu USB.

Next, see the value of bMaxPacketSize0. Ta wartość wskazuje maksymalny rozmiar pakietu domyślnego punktu końcowego. To przykładowe urządzenie może przesyłać maksymalnie 64 bajty danych za pośrednictwem domyślnego punktu końcowego.

Zazwyczaj w celu skonfigurowania urządzenia sterownik klienta pobiera informacje o obsługiwanych konfiguracjach w urządzeniu po uzyskaniu deskryptora urządzenia. To determine the number of configurations that the device supports, inspect the bNumConfigurations member of the returned structure. To urządzenie obsługuje jedną konfigurację. Aby uzyskać informacje o konfiguracji USB, sterownik musi uzyskać deskryptory konfiguracji USB.