summaryrefslogtreecommitdiff
path: root/common/usb_kbd.c
diff options
context:
space:
mode:
authorHeinrich Schuchardt <xypron.glpk@gmx.de>2019-11-23 18:15:20 +0100
committerMarek Vasut <marek.vasut+renesas@gmail.com>2019-11-25 13:28:53 +0100
commit3352c2114b69aeadf54feb8140071a55fb580c30 (patch)
tree69c55fc6464ffe15733dda10f421aca4bcce13a3 /common/usb_kbd.c
parent28dfa7d80d8ddf7ef795f518230964d2c393b25b (diff)
usb: kbd: simplify coding for arrow keys
Avoid duplicate translation of arrow key codes. Reduce code size by avoiding strings and eliminating usb_kbd_put_sequence(). Signed-off-by: Heinrich Schuchardt <xypron.glpk@gmx.de>
Diffstat (limited to 'common/usb_kbd.c')
-rw-r--r--common/usb_kbd.c47
1 files changed, 12 insertions, 35 deletions
diff --git a/common/usb_kbd.c b/common/usb_kbd.c
index e4711eb655..d177b97d67 100644
--- a/common/usb_kbd.c
+++ b/common/usb_kbd.c
@@ -75,13 +75,8 @@ 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
+static const u8 usb_special_keys[] = {
+ 'C', 'D', 'B', 'A'
};
/*
@@ -146,12 +141,6 @@ static void usb_kbd_put_queue(struct usb_kbd_pdata *data, u8 c)
data->usb_kbd_buffer[data->usb_in_pointer] = c;
}
-static void usb_kbd_put_sequence(struct usb_kbd_pdata *data, char *s)
-{
- for (; *s; s++)
- usb_kbd_put_queue(data, *s);
-}
-
/*
* Set the LEDs. Since this is used in the irq routine, the control job is
* issued with a timeout of 0. This means, that the job is queued without
@@ -214,10 +203,6 @@ 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];
@@ -242,28 +227,20 @@ static int usb_kbd_translate(struct usb_kbd_pdata *data, unsigned char scancode,
}
/* Report keycode if any */
- if (keycode)
+ if (keycode) {
debug("%c", keycode);
-
- switch (keycode) {
- case 0x0e: /* Down arrow key */
- usb_kbd_put_sequence(data, "\e[B");
- break;
- case 0x10: /* Up arrow key */
- usb_kbd_put_sequence(data, "\e[A");
- break;
- case 0x06: /* Right arrow key */
- usb_kbd_put_sequence(data, "\e[C");
- break;
- case 0x02: /* Left arrow key */
- usb_kbd_put_sequence(data, "\e[D");
- break;
- default:
usb_kbd_put_queue(data, keycode);
- break;
+ return 0;
}
- return 0;
+ /* Left, Right, Up, Down */
+ if (scancode > 0x4e && scancode < 0x53) {
+ usb_kbd_put_queue(data, 0x1b);
+ usb_kbd_put_queue(data, '[');
+ usb_kbd_put_queue(data, usb_special_keys[scancode - 0x4f]);
+ return 0;
+ }
+ return 1;
}
static uint32_t usb_kbd_service_key(struct usb_device *dev, int i, int up)