Windows USB HID driver questions

I have two questions related to Windows USB HID driver. Hopefully the experts here can shed some light. Thanks in advance.

Reference discussion:
https://github.com/libusb/hidapi/issues/274

Question 1: I am puzzled why I have not seen any USB High Speed HID device with the Interrupt IN/OUT Endpoints’ wMaxPacketSize > 64 Bytes.

Does Windows inbox USB HID driver support High Speed USB HID device with the Interrupt IN/OUT Endpoints’ wMaxPacketSize > 64 Bytes? If the answer is NO, what is the reason? If yes, does it support high bandwidth Interrupt Endpoint?

Question 2: Does the following limitation of Hidclass/Hidparse driver pair put a hard limit of HID device’ Input, Output, and Feature Reports to be 8KB even though the underline transport (USB, Bluetooth, BLE, I2C, SPI) supports up to 64 KB?
https://learn.microsoft.com/en-us/windows-hardware/drivers/hid/hid-transports

The Hidclass/Hidparse driver pair defines lengths of HID Input, Output, and Feature Reports. The limit is 8 KB (minus 1 bit). Even if a HID minidriver can request a transfer of more than 8 KB for a report, only reports smaller than 8 KB are successfully transferred.

Q1: It’s because of the H in HID. When humans are involved, there’s rarely a need for high bandwidth. We just aren’t that quick.

@Tim_Roberts said:
Q1: It’s because of the H in HID. When humans are involved, there’s rarely a need for high bandwidth. We just aren’t that quick.

Probably true for last time. Now HID is used quite widely. You may want to take a look at this discussion:
https://github.com/Yubico/libfido2/issues/335

I found one potential answer to the first question but I am not so sure if it is still relevant or not as the post was more than 8 years ago.

Ref: https://e2e.ti.com/support/processors-group/processors/f/processors-forum/413867/usb---high-speed-degredation

As of HID interrupt IN/OUT endpoints,

In the default interface after high-speed enumeration, interrupt endpoint should have 64 bytes (or less) MPS (Max Packet Size, bMaxPacketSize) on the endpoint descriptor. Greater MPS should be placed in an alternate interface. Unfortunately, the in-box HID drivers of Windows/Linux don’t provide any way to send Set_Interface to HID device, to switch to an alternate interface. And then, the max transfer speed under the in-box HID drivers is limited to

64 bytes/transaction x 1 transaction/micro-frame x 8000 micro-frames/sec

= 512,000 bytes/sec

You may get more speed over the default endpoint (ie. Set_/Get_Report) than interrupt endpoints. The MPS of the default endpoint is also 64 bytes, but two or more transactions are allowed per micro-frame.

Tsuneo

As for high bandwidth high speed Interrupt Endpoint (not limited to USB HID device), it was reported that Windows XP/Vista/7 do not support that. I am not so sure if later version of Windows like 8/8.1/10/11 support this or not.

Reference from this forum.
https://community.osr.com/discussion/161236/high-bandwidth-usb-2-0-endpoints

XP is confirmed not to support this feature as per Cypress KB as well (now part of Infineon).
https://community.infineon.com/t5/Knowledge-Base-Articles/High-Bandwidth-Interrupt-Transfers-Three-Packets-per-Microframe-in-Windows-XP/ta-p/250912

Got one report which says 1024 wMaxPacketSize is okay for High Speed USB HID device Interrupt IN/OUT endpoint.
https://community.nxp.com/t5/LPC-Microcontrollers/MCUXpresso-USB-Generic-HID-Example-High-Speed-and-1kB-Packet/m-p/847552

And another confirmation that it works.
https://community.nxp.com/t5/Kinetis-Microcontrollers/Modifying-USB-Generic-HID-Example-Code-for-Custom-Report/m-p/900868

I am also playing at the FX2HID example from Jan Axelson, using a Cypress (now part of Infineon) EZ-USB FX2LP breakout board.
http://janaxelson.com/hidpage.htm

I modified the wMaxPacketSize of the Interrupt IN/OUT endpoint and the HID IN/OUT report size to 128 Bytes. The FW is not fully working yet but at least Windows 10/11 can enumerate the device.

There is one more confirmation here with wMaxPacketSize of the Interrupt IN/OUT Endpoint to be 512 Bytes. And this device MIcrochip Power Debugger should work under Windows 7 onward (not so sure about Windows XP and Vista).

https://github.com/libusb/hidapi/issues/274#issuecomment-1547861126

Interface Descriptor:
  bLength                 9
  bDescriptorType         4
  bInterfaceNumber        0
  bAlternateSetting       0
  bNumEndpoints           2
  bInterfaceClass         3 
  bInterfaceSubClass      0 
  bInterfaceProtocol      0 
  iInterface              4 Power Debugger CMSIS-DAP
    HID Device Descriptor:
      bLength                 9
      bDescriptorType        33
      bcdHID               1.11
      bCountryCode            0 Not supported
      bNumDescriptors         1
      bDescriptorType        34 Report
      wDescriptorLength      35
     Report Descriptors: 
       ** UNAVAILABLE **
  Endpoint Descriptor:
    bLength                 7
    bDescriptorType         5
    bEndpointAddress     0x01  EP 1 OUT
    bmAttributes            3
      Transfer Type            Interrupt
      Synch Type               None
      Usage Type               Data
    wMaxPacketSize     0x0200  1x 512 bytes
    bInterval               1
  Endpoint Descriptor:
    bLength                 7
    bDescriptorType         5
    bEndpointAddress     0x82  EP 2 IN
    bmAttributes            3
      Transfer Type            Interrupt
      Synch Type               None
      Usage Type               Data
    wMaxPacketSize     0x0200  1x 512 bytes
    bInterval               1

Reference:
https://github.com/libusb/hidapi/issues/478#issuecomment-1550841201

I have used Jan Axelson’s FX2HID example and Cypress’ Bulkloop example and created high speed USB HID devices with Interrupt IN/OUT endpoint with wMaxPacketSize = 512 Bytes and it seems to work fine under Windows 10/11.

So I think the answer is clear for Windows 7/10/11. I have no idea about Windows XP SP2 and Windows Vista but anyway I do not care about them.

As for high bandwidth high speed Interrupt Endpoint (not limited to USB HID device), it was reported that Windows XP/Vista/7 do not support that. I am not so sure if later version of Windows like 8/8.1/10/11 support this or not.

It seems to me that Windows seems to support wMaxPacketSize = 3072 bytes for High Speed USB device but there may be a limit for the bInerval value.

The following device with bInterval = 1 enumerates successfully under Ubuntu Linux 20.04 but not Windows 11 (same laptop, dual boot). The error says that there are not enough system resource. It is a simple mod of Cypress BulkLoop FW. Once I change bInterval to 2, then it can enumerate under Windows 11.
`
mcuee@UbuntuSwift3:~$ lsusb -vvv -d 04b4:1004

Bus 003 Device 002: ID 04b4:1004 Cypress Semiconductor Corp. EZ-USB
Device Descriptor:
bLength 18
bDescriptorType 1
bcdUSB 2.00
bDeviceClass 0
bDeviceSubClass 0
bDeviceProtocol 0
bMaxPacketSize0 64
idVendor 0x04b4 Cypress Semiconductor Corp.
idProduct 0x1004
bcdDevice 0.00
iManufacturer 1 Cypress
iProduct 2 EZ-USB
iSerial 0
bNumConfigurations 1
Configuration Descriptor:
bLength 9
bDescriptorType 2
wTotalLength 0x0020
bNumInterfaces 1
bConfigurationValue 1
iConfiguration 0
bmAttributes 0x80
(Bus Powered)
MaxPower 100mA
Interface Descriptor:
bLength 9
bDescriptorType 4
bInterfaceNumber 0
bAlternateSetting 0
bNumEndpoints 2
bInterfaceClass 255 Vendor Specific Class
bInterfaceSubClass 0
bInterfaceProtocol 0
iInterface 0
Endpoint Descriptor:
bLength 7
bDescriptorType 5
bEndpointAddress 0x02 EP 2 OUT
bmAttributes 3
Transfer Type Interrupt
Synch Type None
Usage Type Data
wMaxPacketSize 0x1400 3x 1024 bytes
bInterval 1
Endpoint Descriptor:
bLength 7
bDescriptorType 5
bEndpointAddress 0x86 EP 6 IN
bmAttributes 3
Transfer Type Interrupt
Synch Type None
Usage Type Data
wMaxPacketSize 0x1400 3x 1024 bytes
bInterval 1
Device Qualifier (for other device speed):
bLength 10
bDescriptorType 6
bcdUSB 2.00
bDeviceClass 0
bDeviceSubClass 0
bDeviceProtocol 0
bMaxPacketSize0 64
bNumConfigurations 1
can’t get debug descriptor: Resource temporarily unavailable
Device Status: 0x0000
(Bus Powered)
`

As for high bandwidth high speed Interrupt Endpoint (not limited to USB HID device), it was reported that Windows XP/Vista/7 do not support that. I am not so sure if later version of Windows like 8/8.1/10/11 support this or not.

It seems to me Windows 10 and Windows 11 do support high bandwidth Interrupt IN/OUT endpoint. I have modified Cypress’ BulkSrcSink example to IntrSrcSink with high bandwidth endpoint (using either Cypress driver or WinUSB driver). However, I am not able to get bInterval=1 for both the IN/OUT endpoint, only one of them. Windows complains that resource is not available

And the Interrupt IN endpoint does not seem to be able to achieve the 24MB/sec bandwidth. Only the Interrupt OUT endpoint can do that.

Cypress CyStream bandwidth measurement for the OUT endpoint when bInterval=1

Cypress CyStream bandwidth measurement for the IN endpoint when bInterval=1

For those who have the Cypress EZ-USB FX2LP boards, you can check out the FW here. Take note I am not a software/firmware developer so the modification may not be totally correct. Comments welcome. Thanks.

  1. High Speed USB HID device
    https://github.com/libusb/hidapi/issues/478

  2. High bandwidth Interrupt IN/OUT Endoint (not USB HID Device)
    https://github.com/mcuee/libusbk/issues/48

And the Interrupt IN endpoint does not seem to be able to achieve the 24MB/sec bandwidth. Only the Interrupt OUT endpoint can do that.

This seems to be a FW implementation issue. Once I use CyStream FW as the base and change ISOC endpoints to Interrupt endpoints, I can get the expected results for both Interrupt IN and OUT endpoint (at about 24Mbps).

Reference test results: using libusbK kList/kBench application. Same results from Cypress CySteam host application.
https://github.com/mcuee/libusbk/issues/48#issuecomment-1556459721