USB: Add usb_event_poll() to get keyboards working with EHCI
authorMarek Vasut <marek.vasut@gmail.com>
Sun, 25 Sep 2011 19:07:56 +0000 (21:07 +0200)
committerRemy Bohmer <linux@bohmer.net>
Sun, 11 Dec 2011 13:40:38 +0000 (14:40 +0100)
Signed-off-by: Marek Vasut <marek.vasut@gmail.com>
Cc: Remy Bohmer <linux@bohmer.net>
drivers/usb/host/ehci-hcd.c

index 2197119cf7d656c5c97fdd44b93217e2d3a21faf..b4c9db84640de1a97bd8de380e0d678a01c099c0 100644 (file)
 #include <asm/io.h>
 #include <malloc.h>
 #include <watchdog.h>
+#ifdef CONFIG_USB_KEYBOARD
+#include <stdio_dev.h>
+extern unsigned char new[];
+#endif
 
 #include "ehci.h"
 
@@ -895,5 +899,32 @@ submit_int_msg(struct usb_device *dev, unsigned long pipe, void *buffer,
 
        debug("dev=%p, pipe=%lu, buffer=%p, length=%d, interval=%d",
              dev, pipe, buffer, length, interval);
-       return -1;
+       return ehci_submit_async(dev, pipe, buffer, length, NULL);
+}
+
+#ifdef CONFIG_SYS_USB_EVENT_POLL
+/*
+ * This function polls for USB keyboard data.
+ */
+void usb_event_poll()
+{
+       struct stdio_dev *dev;
+       struct usb_device *usb_kbd_dev;
+       struct usb_interface *iface;
+       struct usb_endpoint_descriptor *ep;
+       int pipe;
+       int maxp;
+
+       /* Get the pointer to USB Keyboard device pointer */
+       dev = stdio_get_by_name("usbkbd");
+       usb_kbd_dev = (struct usb_device *)dev->priv;
+       iface = &usb_kbd_dev->config.if_desc[0];
+       ep = &iface->ep_desc[0];
+       pipe = usb_rcvintpipe(usb_kbd_dev, ep->bEndpointAddress);
+
+       /* Submit a interrupt transfer request */
+       maxp = usb_maxpacket(usb_kbd_dev, pipe);
+       usb_submit_int_msg(usb_kbd_dev, pipe, &new[0],
+                       maxp > 8 ? 8 : maxp, ep->bInterval);
 }
+#endif /* CONFIG_SYS_USB_EVENT_POLL */