summaryrefslogtreecommitdiff
path: root/common/usb_kbd.c
diff options
context:
space:
mode:
authorHeinrich Schuchardt <xypron.glpk@gmx.de>2019-11-23 20:15:21 +0300
committerMarek Vasut <marek.vasut+renesas@gmail.com>2019-11-25 15:28:53 +0300
commit87e91bccaee63d70fd3ada0bee5e861edf8967a5 (patch)
tree5f93115460f7082f9efdc2020a35c5ada55665df /common/usb_kbd.c
parent3352c2114b69aeadf54feb8140071a55fb580c30 (diff)
downloadu-boot-87e91bccaee63d70fd3ada0bee5e861edf8967a5.tar.xz
usb: kbd: implement special keys
Provide support for F1-F12, Insert, Delete, Home, End, Page Up, Page Down. As this leads to a size increase provide a customizing setting CONFIG_USB_KEYBOARD_FN_KEYS. Signed-off-by: Heinrich Schuchardt <xypron.glpk@gmx.de>
Diffstat (limited to 'common/usb_kbd.c')
-rw-r--r--common/usb_kbd.c42
1 files changed, 42 insertions, 0 deletions
diff --git a/common/usb_kbd.c b/common/usb_kbd.c
index d177b97d67..d6b340bbe7 100644
--- a/common/usb_kbd.c
+++ b/common/usb_kbd.c
@@ -76,7 +76,11 @@ static const unsigned char usb_kbd_num_keypad[] = {
};
static const u8 usb_special_keys[] = {
+#ifdef CONFIG_USB_KEYBOARD_FN_KEYS
+ '2', 'H', '5', '3', 'F', '6', 'C', 'D', 'B', 'A'
+#else
'C', 'D', 'B', 'A'
+#endif
};
/*
@@ -233,6 +237,43 @@ static int usb_kbd_translate(struct usb_kbd_pdata *data, unsigned char scancode,
return 0;
}
+#ifdef CONFIG_USB_KEYBOARD_FN_KEYS
+ if (scancode < 0x3a || scancode > 0x52 ||
+ scancode == 0x46 || scancode == 0x47)
+ return 1;
+
+ usb_kbd_put_queue(data, 0x1b);
+ if (scancode < 0x3e) {
+ /* F1 - F4 */
+ usb_kbd_put_queue(data, 0x4f);
+ usb_kbd_put_queue(data, scancode - 0x3a + 'P');
+ return 0;
+ }
+ usb_kbd_put_queue(data, '[');
+ if (scancode < 0x42) {
+ /* F5 - F8 */
+ usb_kbd_put_queue(data, '1');
+ if (scancode == 0x3e)
+ --scancode;
+ keycode = scancode - 0x3f + '7';
+ } else if (scancode < 0x49) {
+ /* F9 - F12 */
+ usb_kbd_put_queue(data, '2');
+ if (scancode > 0x43)
+ ++scancode;
+ keycode = scancode - 0x42 + '0';
+ } else {
+ /*
+ * INSERT, HOME, PAGE UP, DELETE, END, PAGE DOWN,
+ * RIGHT, LEFT, DOWN, UP
+ */
+ keycode = usb_special_keys[scancode - 0x49];
+ }
+ usb_kbd_put_queue(data, keycode);
+ if (scancode < 0x4f && scancode != 0x4a && scancode != 0x4d)
+ usb_kbd_put_queue(data, '~');
+ return 0;
+#else
/* Left, Right, Up, Down */
if (scancode > 0x4e && scancode < 0x53) {
usb_kbd_put_queue(data, 0x1b);
@@ -241,6 +282,7 @@ static int usb_kbd_translate(struct usb_kbd_pdata *data, unsigned char scancode,
return 0;
}
return 1;
+#endif /* CONFIG_USB_KEYBOARD_FN_KEYS */
}
static uint32_t usb_kbd_service_key(struct usb_device *dev, int i, int up)