1

我正在开发 USB RNDIS 和 HID 复合设备。对于 RNDIS 设备,我正在使用 2017 年 4 月的 Microsoft 文档“Microsoft OS 2.0 描述符规范”中描述的 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 设备所做修改的摘要(还进行了所需的大小更改):

  • 更改设备描述符设备类字段
  • 删除配置描述符的 IAD 和 HID 部分
  • 将配置描述符 bNumInterfaces 数量减少到 2
  • 从 MS 兼容性描述符中删除配置子集标头和功能子集标头

请注意,如果我在 MS 兼容性描述符中保留配置子集标头和功能子集标头,Windows 会如上响应 - 将 RNDIS 设备分配为串行端口。

我尝试了各种排列,但似乎无法超越这一点。我还没有尝试为自定义设备创建 INF,但这是我想要避免的。

有什么帮助或建议吗?

谢谢。

4

1 回答 1

0

尝试将 Microsoft OS 2.0 描述符(特别是配置子集标头)中的 bConfigurationValue 从 1 更改为 0。它实际上是配置数组中的索引;它与 USB 2.0 规范中名为 bConfigurationValue 的东西不同。

我遇到了同样的问题,如此处所述:

https://social.msdn.microsoft.com/Forums/windowsdesktop/en-US/ae64282c-3bc3-49af-8391-4d174479d9e7/microsoft-os-20-descriptors-not-working-on-an-interface-of- a-composite-usb-device?forum=wdk

我没有检查您的其余描述符,因此很可能还有其他问题。

于 2018-08-06T22:59:34.703 回答