Дескрипторы USB-устройства
Дескриптор устройства содержит сведения о USB-устройстве в целом. В этой статье описывается структура USB_DEVICE_DESCRIPTOR и содержится информация о том, как драйвер клиента может отправлять запрос get-descriptor для получения дескриптора устройства.
Каждое устройство универсальной последовательной шины (USB) должно иметь возможность предоставить один дескриптор устройства, содержащий соответствующие сведения об устройстве. Структура USB_DEVICE_DESCRIPTOR описывает дескриптор устройства. Windows использует эти сведения для получения различных наборов сведений. Например, поля idVendor и idProduct указывают идентификаторы поставщика и продукта соответственно. Windows использует эти значения полей для создания идентификатора оборудования для устройства. Чтобы просмотреть идентификатор оборудования определенного устройства, выполните следующие действия.
- Откройте диспетчер устройств.
- Щелкните правой кнопкой мыши USB-устройство и выберите "Свойства".
- Выберите вкладку "Сведения" в диалоговом окне свойств.
- Раскрывающийся список свойств .
- Выберите свойство "Идентификаторы оборудования"
Значения указывают идентификаторы оборудования ("USB\XXX"), создаваемые Windows.
Поле bcdUSB структуры USB_DEVICE_DESCRIPTOR указывает версию спецификации 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.