
On Tue, Nov 6, 2012 at 1:26 PM, Allen Martin amartin@nvidia.com wrote:
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
Tested-by: Simon Glass sjg@chromium.org Acked-by: Simon Glass sjg@chromium.org
common/usb_kbd.c | 13 +++++++++++++ 1 file changed, 13 insertions(+)
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];
-- 1.7.10.4