复合 RNDIS HID 与 MS OS 2.0 描述符
Composite RNDIS HID with MS OS 2.0 Descriptors
我正在开发 USB RNDIS 和 HID 复合设备。对于 RNDIS 设备,我使用的是 2017 年 4 月的 Microsoft 文档 "Microsoft OS 2.0 Descriptors Specification" 中描述的 MS OS 2.0 描述符(链接在 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 描述符
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-only 设备所做修改的总结(还进行了所需的尺寸更改):
- 更改设备描述符设备 class 字段
- 删除配置描述符的 IAD 和 HID 部分
- 将配置描述符 bNumInterfaces 计数减少到 2
- 从 MS 兼容性描述符中删除配置子集 Header 和功能子集 Header
请注意,如果我在 MS 兼容性描述符中保留配置子集 Header 和功能子集 Header,Windows 的响应如上 - 将 RNDIS 设备指定为串行端口.
我尝试了各种排列,但似乎无法超越这一点。我还没有尝试为自定义设备创建 INF,但这是我想避免的事情。
有什么帮助或建议吗?
谢谢。
尝试将 Microsoft OS 2.0 描述符(特别是配置子集 Header)中的 bConfigurationValue 从 1 更改为 0。它实际上是一个 index在配置数组中;它与 USB 2.0 规范中名为 bConfigurationValue 的东西不同。
我遇到了同样的问题,如下所述:
我没有检查您的其余描述符,因此很可能还有其他问题。
我正在开发 USB RNDIS 和 HID 复合设备。对于 RNDIS 设备,我使用的是 2017 年 4 月的 Microsoft 文档 "Microsoft OS 2.0 Descriptors Specification" 中描述的 MS OS 2.0 描述符(链接在 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 描述符
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-only 设备所做修改的总结(还进行了所需的尺寸更改):
- 更改设备描述符设备 class 字段
- 删除配置描述符的 IAD 和 HID 部分
- 将配置描述符 bNumInterfaces 计数减少到 2
- 从 MS 兼容性描述符中删除配置子集 Header 和功能子集 Header
请注意,如果我在 MS 兼容性描述符中保留配置子集 Header 和功能子集 Header,Windows 的响应如上 - 将 RNDIS 设备指定为串行端口.
我尝试了各种排列,但似乎无法超越这一点。我还没有尝试为自定义设备创建 INF,但这是我想避免的事情。
有什么帮助或建议吗?
谢谢。
尝试将 Microsoft OS 2.0 描述符(特别是配置子集 Header)中的 bConfigurationValue 从 1 更改为 0。它实际上是一个 index在配置数组中;它与 USB 2.0 规范中名为 bConfigurationValue 的东西不同。
我遇到了同样的问题,如下所述:
我没有检查您的其余描述符,因此很可能还有其他问题。