summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAllen Martin <amartin@nvidia.com>2012-11-06 13:26:03 -0800
committerMarek Vasut <marex@denx.de>2012-11-20 00:16:06 +0100
commit4151a400cfcd4762ca422a04890cd5869bac155c (patch)
treed9d752c63ec145953b8fc685a28b00a6fe3e1622
parent5ddcc38bee7c4e58197ff8de7919aca2532a8e03 (diff)
downloadu-boot-imx-4151a400cfcd4762ca422a04890cd5869bac155c.zip
u-boot-imx-4151a400cfcd4762ca422a04890cd5869bac155c.tar.gz
u-boot-imx-4151a400cfcd4762ca422a04890cd5869bac155c.tar.bz2
USB: add arrow key support to usb_kbd
Check for scancodes for arrow keys and map them to ^F/^B, ^N/^P. Control characters are used instead of ANSI sequence because the queueing code in usb_kbd doesn't handle the data increase when one keypress generates 3 keycodes. The real fix is to convert this driver to use the input subsystem and queue, but this allows arrow keys to work until this driver is converted. Signed-off-by: Allen Martin <amartin@nvidia.com>
-rw-r--r--common/usb_kbd.c13
1 files changed, 13 insertions, 0 deletions
diff --git a/common/usb_kbd.c b/common/usb_kbd.c
index 24467ce..4efbcfe 100644
--- a/common/usb_kbd.c
+++ b/common/usb_kbd.c
@@ -94,6 +94,15 @@ static const unsigned char usb_kbd_num_keypad[] = {
};
/*
+ * map arrow keys to ^F/^B ^N/^P, can't really use the proper
+ * ANSI sequence for arrow keys because the queuing code breaks
+ * when a single keypress expands to 3 queue elements
+ */
+static const unsigned char usb_kbd_arrow[] = {
+ 0x6, 0x2, 0xe, 0x10
+};
+
+/*
* NOTE: It's important for the NUM, CAPS, SCROLL-lock bits to be in this
* order. See usb_kbd_setled() function!
*/
@@ -224,6 +233,10 @@ static int usb_kbd_translate(struct usb_kbd_pdata *data, unsigned char scancode,
keycode = usb_kbd_numkey[scancode - 0x1e];
}
+ /* Arrow keys */
+ if ((scancode >= 0x4f) && (scancode <= 0x52))
+ keycode = usb_kbd_arrow[scancode - 0x4f];
+
/* Numeric keypad */
if ((scancode >= 0x54) && (scancode <= 0x67))
keycode = usb_kbd_num_keypad[scancode - 0x54];