Поделиться через


Дескрипторы USB-устройств

Дескриптор устройства содержит сведения о USB-устройстве в целом. В этом разделе описывается структура USB_DEVICE_DESCRIPTOR и содержатся сведения о том, как драйвер клиента может отправить запрос get-descriptor для получения дескриптора устройства.

Каждое устройство универсальной последовательной шины (USB) должно иметь возможность предоставить один дескриптор устройства, содержащий соответствующие сведения об устройстве. Структура USB_DEVICE_DESCRIPTOR описывает дескриптор устройства. Windows использует эти сведения для получения различных наборов информации. Например, в полях idVendor и idProduct указываются идентификаторы поставщика и продукта соответственно. Windows использует эти значения полей для создания идентификатора оборудования для устройства. Чтобы просмотреть идентификатор оборудования конкретного устройства, откройте диспетчер устройств и просмотрите свойства устройства. На вкладке Сведения значение свойства Hardware Ids указывает идентификатор оборудования ("USB\XXX"), созданный Windows. Поле bcdUSB указывает версию спецификации USB, которой соответствует устройство. Например, 0x0200 указывает, что устройство разработано согласно спецификации USB 2.0. Значение bcdDevice указывает номер редакции, определяемый устройством. Стек драйверов USB использует bcdDevice, а также idVendor и idProduct для создания аппаратных и совместимых идентификаторов для устройства. Эти идентификаторы можно просмотреть в диспетчер устройств. Дескриптор устройства также указывает общее количество конфигураций, поддерживаемых устройством.

Если устройство подключено к хост-компьютеру с высокой скоростью, в дескрипторове устройства может передаваться другая информация, чем при подключении с полной скоростью. Устройство не должно изменять сведения, содержащиеся в дескрипторе устройства, в течение жизненного цикла подключения, в том числе во время изменения состояния питания.

Узел получает дескриптор устройства через передачу элемента управления. При передаче типом запроса является GET DESCRIPTOR, а получателем является устройство. Драйвер клиента может инициировать передачу двумя способами: с помощью целевого объекта целевого устройства ПЛАТФОРМы USB или путем отправки URB с информацией о запросе.

Получение дескриптора устройства

Драйвер клиента Windows Driver Framework (WDF) может получить дескриптор устройства только после создания объекта целевого устройства USB платформы.

Драйвер KMDF должен получить дескриптор WDFUSBDEVICE для объекта целевого устройства USB, вызвав WdfUsbTargetDeviceCreate. Как правило, драйвер клиента вызывает WdfUsbTargetDeviceCreate в реализации обратного вызова EvtDevicePrepareHardware драйвера. После этого драйвер клиента должен вызвать метод WdfUsbTargetDeviceGetDeviceDescriptor . После завершения вызова дескриптор устройства получается в структуре, выделенной вызывающим объектом USB_DEVICE_DESCRIPTOR .

Драйвер UMDF должен запросить объект устройства платформы для указателя IWDFUsbTargetDevice , а затем вызвать метод IWDFUsbTargetDevice::RetrieveDescriptor и указать USB_DEVICE_DESCRIPTOR_TYPE в качестве типа дескриптора.

Узел также может получить дескриптор устройства, отправив URB. Этот метод применяется только к драйверам в режиме ядра. Однако драйверу клиента никогда не нужно отправлять URB для этого типа запроса, если драйвер не основан на модели драйвера Windows (WDM). Такой драйвер должен выделить структуру URB , а затем вызвать макрос UsbBuildGetDescriptorRequest , чтобы указать формат URB для запроса. Затем драйвер может отправить запрос, отправив URB в стек драйверов USB. Дополнительные сведения см. в разделе Отправка URB.

В этом примере кода показан вызов UsbBuildGetDescriptorRequest, который форматирует буфер, на который указывает pURB, с соответствующим 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
);

Пример дескриптора устройства

В этом примере показан дескриптор устройства USB-веб-камеры (см. макет USB-устройства), полученный с помощью приложения 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

В предыдущем примере вы увидите, что устройство разработано в спецификации USB версии 2.0. Запишите значения bDeviceClass, bDeviceSubClass и bDeviceProtocol . Эти значения указывают, что устройство содержит один или несколько дескрипторов ассоциации usb-интерфейса, которые можно использовать для группировки нескольких интерфейсов для каждой функции. Дополнительные сведения см. в разделе Дескриптор ассоциации интерфейса USB.

Далее см. значение bMaxPacketSize0. Это значение указывает максимальный размер пакета конечной точки по умолчанию. Этот пример устройства может передавать до 64 байт данных через конечную точку по умолчанию.

Как правило, для настройки устройства драйвер клиента получает сведения о поддерживаемых конфигурациях на устройстве после получения дескриптора устройства. Чтобы определить количество конфигураций, поддерживаемых устройством, проверьте элемент bNumConfigurations возвращаемой структуры. Это устройство поддерживает одну конфигурацию. Чтобы получить сведения о конфигурации USB, драйвер должен получить дескрипторы конфигурации USB.