mirror of
https://github.com/brain-hackers/u-boot-brain
synced 2024-06-09 23:36:03 +09: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, '='
|
'.', 0, 0, 0, '='
|
||||||
};
|
};
|
||||||
|
|
||||||
/*
|
static const u8 usb_special_keys[] = {
|
||||||
* map arrow keys to ^F/^B ^N/^P, can't really use the proper
|
'C', 'D', 'B', 'A'
|
||||||
* 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
|
|
||||||
};
|
};
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -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;
|
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
|
* 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
|
* 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];
|
keycode = usb_kbd_numkey[scancode - 0x1e];
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Arrow keys */
|
|
||||||
if ((scancode >= 0x4f) && (scancode <= 0x52))
|
|
||||||
keycode = usb_kbd_arrow[scancode - 0x4f];
|
|
||||||
|
|
||||||
/* Numeric keypad */
|
/* Numeric keypad */
|
||||||
if ((scancode >= 0x54) && (scancode <= 0x67))
|
if ((scancode >= 0x54) && (scancode <= 0x67))
|
||||||
keycode = usb_kbd_num_keypad[scancode - 0x54];
|
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 */
|
/* Report keycode if any */
|
||||||
if (keycode)
|
if (keycode) {
|
||||||
debug("%c", 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);
|
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)
|
static uint32_t usb_kbd_service_key(struct usb_device *dev, int i, int up)
|
||||||
|
|
Loading…
Reference in New Issue
Block a user