Supporting a USB HID device interface that is missing a interrupt input endpoint
Greg KH
greg at kroah.com
Tue May 17 02:18:50 EDT 2022
On Mon, May 16, 2022 at 11:40:09PM +0000, Matt Silva wrote:
> Hi, first time emailing here, so if there are any issues with my question, let me know and I'll fix it.
>
> Basically, I'm working with a USB HID microphone that also supports RGB features. I'm working to reverse engineer the RGB features provided by a proprietary Windows driver and add support to OpenRGB.
If this is a custom windows kernel driver, perhaps you don't need to
talk HID to the device at all?
Or is this just a device that is using the userspace Windows HID
interface to talk to the device directly without any kernel code needed
(that used to be the only way userspace programs could talk to USB
devices on Windows for vendor-specific devices, so they all claim to be
HID when they really are not.)
> The issue is that the interface that handles the RGB packets only has an OUT interrupt endpoint (rather than an IN interrupt) and as such doesn't get picked up by the usbhid driver (and therefore can't be picked up by the HIDAPI library that OpenRGB uses). However, on Windows this interface is detected as a HID device. I've narrowed down where this happens to "drivers/hid/usbhid/hid-core.c:1350", and making some testing changes there to check when the device idVendor, idProd, and interface number match and then only check for endpoint being interrupt rather than input interrupt, I can get the kernel to properly associate the interface with the usbhid driver.
A USB HID device has to have an interrupt IN endpoint to be HID
compliant from what I remember in the specification, so the kernel is
correct here. But you should double check this with the specification
to be sure (they are free to download from usb.org).
> My main question is regarding how this change should be implemented.
Why not just talk directly to the device using libusb from userspace?
I don't know how openrgb works, but odds are there are other devices
that do not register as HID devices that it supports?
Hope this helps,
greg k-h
More information about the Kernelnewbies
mailing list