USB: add arrow key support to usb_kbd
authorAllen Martin <amartin@nvidia.com>
Tue, 6 Nov 2012 21:26:03 +0000 (13:26 -0800)
committerMarek Vasut <marex@denx.de>
Mon, 19 Nov 2012 23:16:06 +0000 (00:16 +0100)
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>
common/usb_kbd.c

index 24467cec143663a96c7c8eddcf1645e8b2db2efe..4efbcfe90d369fdc60028640c74efba05d3442b6 100644 (file)
@@ -93,6 +93,15 @@ static const unsigned char usb_kbd_num_keypad[] = {
        '.', 0, 0, 0, '='
 };
 
+/*
+ * 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];