Композитный RNDIS HID с дескрипторами MS OS 2.0
Я разрабатываю USB RNDIS и HID композитное устройство. Для устройства RNDIS я использую дескрипторы MS OS 2.0, описанные в документе Microsoft "Спецификация дескрипторов Microsoft OS 2.0" от апреля 2017 года (ссылка внизу https://docs.microsoft.com/en-us/windows-hardware/drivers/usbcon/microsoft-defined-usb-descriptors). Я работаю с хостом Windows 10.
Оба устройства распознаются, но только устройство HID распознается правильно; Windows назначает устройство RNDIS последовательным портом.
Вот некоторые из уместных. Дескриптор устройства:
.bLength = 18
.bDescriptorType = 1
.bcdUSB = 0x0201
.bDeviceClass = 0xef
.bDeviceSubClass = 2
.bDeviceProtocol = 1
.bMaxPacketSize0 = 64
.idVendor = USB_DEVICE_VENDOR_ID,
.idProduct = USB_DEVICE_PRODUCT_ID,
.bcdDevice = (USB_DEVICE_MAJOR_VERSION << 8) | USB_DEVICE_MINOR_VERSION,
.iManufacturer = 1
.iProduct = 2
.iSerialNumber = 3
.bNumConfigurations = 1
Дескриптор конфигурации
Configuration Header:
.bLength = 9
.bDescriptorType = 2
.wTotalLength = 100
.bNumInterfaces = 3
.bConfigurationValue = 1
.iConfiguration = 0,
.bmAttributes = 0xc0
.bMaxPower = 0xfa
Interface Association Descritpor
.bLength = 8
.bDescriptorType = 11
.bFirstInterface = 0
.bInterfaceCount = 2
.bFunctionClass = 2
.bFunctionSubClass = 2
.bFunctionProtocol = 0xff,
.iFunction = 0
RNDIS Descriptor
CDC IF Descriptor
.bLength = 9
.bDescriptorType = 4
.bInterfaceNumber = 0
.bAlternateSetting = 0,
.bNumEndpoints = 1
.bInterfaceClass = 2
.bInterfaceSubClass = 2
.bInterfaceProtocol = 0xff,
.iInterface = 0
[Remainder of RNDIS Control & Data interface]
HID Descriptor
[HID Descriptor details]
BOS Descriptor
Header
.bLength = 5
.bDescriptorType = 15
.wTotalLength = 33
.bNumDeviceCaps = 1
Platform Capabilities Descriptor
.bLength = 28
.bDescriptorType = 16
.bDevCapability = 5
.bReserved = 0,
.capabilityId = {0xdf, 0x60, 0xdd, 0xd8, 0x89, 0x45, 0xc7, 0x4c, 0x9c, 0xd2, 0x65, 0x9d, 0x9e, 0x64, 0x8a, 0x9f}
Windows Descriptor Set
.dwWindowsVersion = 0x06030000
.wLength = 46
.bMsVendorCode = 1
.bAltEnumCode = 0
Дескриптор совместимости MS:
Header
.wLength = 10
.wDescriptorType = 0
.dwWindowsVersion = 0x06030000
.wTotalLength = 46
Configuration Subset Header
.wLength = 8
.wDescriptorType = 1
.bConfigurationValue = 1
.bReserved = 0,
.wTotalLength = 36
Function Subset Header
.wLength = 8
.wDescriptorType = 2
.bFirstInterface = 0
.bReserved = 0,
.wSubsetLength = 28
Compatibility ID
.wLength = 20
.wDescriptorType = 3
.compatibleId = {'R', 'N', 'D', 'I', 'S', 0, 0, 0},
.subCompatibleId = {'5', '1', '6', '2', '0', '0', '1', 0}
Если я создаю свое устройство как устройство с строгой RNDIS, то все работает должным образом - устройство распознается Windows как устройство RNDIS; Я не устанавливаю никаких драйверов. Вот краткий обзор изменений, которые я делаю для устройства только для RNDIS (также были сделаны необходимые изменения размера):
- Изменить поля класса устройства дескриптора устройства
- Удалите разделы IAD и HID дескриптора конфигурации
- Уменьшите количество дескрипторов конфигурации bNumInterfaces до 2
- Удалите заголовок подмножества конфигурации и заголовок подмножества функций из дескриптора совместимости MS
Обратите внимание, что если я оставлю заголовок подмножества конфигурации и заголовок подмножества функций в дескрипторе совместимости MS, Windows ответит, как указано выше - назначит устройство RNDIS последовательным портом.
Я пробовал различные перестановки, но не могу выйти за рамки этого. Я еще не пробовал создавать INF для пользовательского устройства, но это то, чего я хочу избежать.
Любая помощь или предложения?
Благодарю.
1 ответ
Попробуйте изменить значение bConfigurationValue в дескрипторах Microsoft OS 2.0 (в частности, заголовок поднабора конфигурации) с 1 на 0. На самом деле это индекс в массиве конфигураций; это не то же самое, что bConfigurationValue в спецификации USB 2.0.
У меня была та же проблема, как описано здесь:
Я не проверял остальные ваши дескрипторы, поэтому вполне могут быть и другие проблемы.