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>
This commit is contained in:
Heinrich Schuchardt 2019-11-23 18:15:20 +01:00 committed by Marek Vasut
parent 28dfa7d80d
commit 3352c2114b

View File

@ -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)