Supporting a USB HID device interface that is missing a interrupt input endpoint

Matt Silva msilva-dev at protonmail.com
Wed May 18 18:04:14 EDT 2022


Hi, Greg. Thanks for the response, I really appreciate it! Awesome to get a reply from the man himself.

Probably wasn't the best from me to refer to the Windows software as a driver. As far as I can tell it
is just a userspace application using the Windows interface to communicate, as you described below.

>From my understanding, the device intends to operate as a HID device (unless your comment below about
all devices claiming to be HID when they're not on Windows applies here), it even provides a HID descriptor
with usages to Windows. It's also my understanding that for certain devices with "quirks" that don't
operate normally, the Linux kernel has quirks that allow these edge case devices to operate as intended.

So while your feedback about using libusb for OpenRGB in userspace definitely doable, I was curious if this device
would benifit from having support for its quirk added to the kernel so that it can be exposed in userspace
as it intends, rather than just solving my specific problem for OpenRGB. As far as I can tell, the
interface never communicated to directly through its single OUT endpoint. The communication is through
the control endpoint via a SET REPORT request. I did some reading and you are correct, HID class
interfaces require a interrupt in endpoint. But like I said, the fact that it only communicates via the
control endpoint made me think that maybe this requirement may not be necessary for the interface
to function as intended.

Please let me know if I'm off the mark at all on this (I feel there is a solid chance I am haha).

I really appreciate the response. Thanks.

------- Original Message -------
On Tuesday, May 17th, 2022 at 2:18 AM, Greg KH <greg at kroah.com> wrote:


> 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