mirror of
https://github.com/u-boot/u-boot.git
synced 2024-11-26 05:34:30 +08:00
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:
parent
28dfa7d80d
commit
3352c2114b
@ -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)
|
||||
|
Loading…
Reference in New Issue
Block a user