diff options
author | Marek Vasut <marek.vasut@gmail.com> | 2011-09-25 21:07:56 +0200 |
---|---|---|
committer | Gerrit <chrome-bot@google.com> | 2011-12-06 18:05:56 -0800 |
commit | 194928175871a0ef6dda9e36fe704b9539487e6e (patch) | |
tree | 636188a71218ec751637148ab77a106406d09580 | |
parent | f21753ec86379f432be2590f3b7188df8f5653d5 (diff) |
UPSTREAM: USB: Add usb_event_poll() to get keyboards working with EHCI
Signed-off-by: Marek Vasut <marek.vasut@gmail.com>
Cc: Remy Bohmer <linux@bohmer.net>
(cherry picked from u-boot-usb.git
commit 62d5f9a8b9e9a395b7e8af3344a2b2e47157c8f9)
BUG=chrome-os-partner:5752
TEST=on Lumpy, use USB keyboard to enter commands on U-Boot command line
Signed-off-by: Vincent Palatin <vpalatin@chromium.org>
Change-Id: I6986ebda2191caf641444fca8909b253867e873b
Reviewed-on: https://gerrit.chromium.org/gerrit/12510
Tested-by: Vincent Palatin <vpalatin@chromium.org>
Reviewed-by: Stefan Reinauer <reinauer@chromium.org>
Reviewed-by: Simon Glass <sjg@chromium.org>
Commit-Ready: Vincent Palatin <vpalatin@chromium.org>
-rw-r--r-- | drivers/usb/host/ehci-hcd.c | 33 |
1 files changed, 32 insertions, 1 deletions
diff --git a/drivers/usb/host/ehci-hcd.c b/drivers/usb/host/ehci-hcd.c index 6a40ac248be..e637a9b9560 100644 --- a/drivers/usb/host/ehci-hcd.c +++ b/drivers/usb/host/ehci-hcd.c @@ -26,6 +26,10 @@ #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" @@ -954,5 +958,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 */ |