]> git.dujemihanovic.xyz Git - u-boot.git/commitdiff
usb: kbd: Also accept keyboards with Interrupt OUT endpoint
authorStefan Brüns <stefan.bruens@rwth-aachen.de>
Sat, 20 Feb 2021 16:26:06 +0000 (17:26 +0100)
committerMarek Vasut <marex@denx.de>
Fri, 26 Feb 2021 14:30:55 +0000 (15:30 +0100)
The OUT endpoint can just be ignored as it is not used, just as the
corresponding Set_Report request for IN-only interfaces. E.g. the
Linux gadget hid keyboard also provides an interrupt endpoint.

Also cleanup confusing debug messages like "found set protocol", which
is printed when a keyboard device is found, while the Set_Protocol request
is issued quite some time later.

Signed-off-by: Stefan Brüns <stefan.bruens@rwth-aachen.de>
common/usb_kbd.c

index 60c6027e048d5864aafecd40e5a0594cf5cc0e32..afad260d3dc52f44d78eb4ab78ffb08c6d8fe4bc 100644 (file)
@@ -443,6 +443,7 @@ static int usb_kbd_probe_dev(struct usb_device *dev, unsigned int ifnum)
        struct usb_interface *iface;
        struct usb_endpoint_descriptor *ep;
        struct usb_kbd_pdata *data;
+       int epNum;
 
        if (dev->descriptor.bNumConfigurations != 1)
                return 0;
@@ -458,19 +459,21 @@ static int usb_kbd_probe_dev(struct usb_device *dev, unsigned int ifnum)
        if (iface->desc.bInterfaceProtocol != USB_PROT_HID_KEYBOARD)
                return 0;
 
-       if (iface->desc.bNumEndpoints != 1)
-               return 0;
+       for (epNum = 0; epNum < iface->desc.bNumEndpoints; epNum++) {
+               ep = &iface->ep_desc[epNum];
 
-       ep = &iface->ep_desc[0];
+               /* Check if endpoint is interrupt IN endpoint */
+               if ((ep->bmAttributes & 3) != 3)
+                       continue;
 
-       /* Check if endpoint 1 is interrupt endpoint */
-       if (!(ep->bEndpointAddress & 0x80))
-               return 0;
+               if (ep->bEndpointAddress & 0x80)
+                       break;
+       }
 
-       if ((ep->bmAttributes & 3) != 3)
+       if (epNum == iface->desc.bNumEndpoints)
                return 0;
 
-       debug("USB KBD: found set protocol...\n");
+       debug("USB KBD: found interrupt EP: 0x%x\n", ep->bEndpointAddress);
 
        data = malloc(sizeof(struct usb_kbd_pdata));
        if (!data) {
@@ -498,13 +501,15 @@ static int usb_kbd_probe_dev(struct usb_device *dev, unsigned int ifnum)
        data->last_report = -1;
 
        /* We found a USB Keyboard, install it. */
+       debug("USB KBD: set boot protocol\n");
        usb_set_protocol(dev, iface->desc.bInterfaceNumber, 0);
 
-       debug("USB KBD: found set idle...\n");
 #if !defined(CONFIG_SYS_USB_EVENT_POLL_VIA_CONTROL_EP) && \
     !defined(CONFIG_SYS_USB_EVENT_POLL_VIA_INT_QUEUE)
+       debug("USB KBD: set idle interval...\n");
        usb_set_idle(dev, iface->desc.bInterfaceNumber, REPEAT_RATE / 4, 0);
 #else
+       debug("USB KBD: set idle interval=0...\n");
        usb_set_idle(dev, iface->desc.bInterfaceNumber, 0, 0);
 #endif