[RFC PATCH v2 2/5] usb_kbd: Do not fail the keyboard if it does not have an interrupt pending
Jason Wessel
jason.wessel at windriver.com
Tue Jun 30 22:47:48 CEST 2020
After the initial configuration some USB keyboard+mouse devices never
return any kind of event on the interrupt line. In particular, the
device identified by "Cypress Cypress USB Keyboard / PS2 Mouse as
/devices/platform/soc/3f980000.usb/usb1/1-1/1-1.3/1-1.3:1.0/0003:04B4:0101.0001/input/input0"
never returns a data packet until the first external input event.
I found this was also true with some newer model Dell keyboards.
When the device is plugged into a xhci controller there is also no
point in waiting 5 seconds for a device that is never going to present
data, so the call to the interrupt service was changed to a
nonblocking operation for the controllers that support this.
With the patch applied, the rpi3 and rpi4 work well with the more
complex keyboard devices.
Signed-off-by: Jason Wessel <jason.wessel at windriver.com>
---
common/usb_kbd.c | 4 +++-
1 file changed, 3 insertions(+), 1 deletion(-)
diff --git a/common/usb_kbd.c b/common/usb_kbd.c
index b316807844..3c0056e1b9 100644
--- a/common/usb_kbd.c
+++ b/common/usb_kbd.c
@@ -519,7 +519,9 @@ static int usb_kbd_probe_dev(struct usb_device *dev, unsigned int ifnum)
1, 0, data->new, USB_KBD_BOOT_REPORT_SIZE) < 0) {
#else
if (usb_int_msg(dev, data->intpipe, data->new, data->intpktsize,
- data->intinterval, false) < 0) {
+ data->intinterval, true) < 0) {
+ /* Read first packet if the device provides it, else pick it up later */
+ return 1;
#endif
printf("Failed to get keyboard state from device %04x:%04x\n",
dev->descriptor.idVendor, dev->descriptor.idProduct);
--
2.17.1
More information about the U-Boot
mailing list