diff options
author | Heinrich Schuchardt <xypron.glpk@gmx.de> | 2019-11-23 18:15:21 +0100 |
---|---|---|
committer | Marek Vasut <marek.vasut+renesas@gmail.com> | 2019-11-25 13:28:53 +0100 |
commit | 87e91bccaee63d70fd3ada0bee5e861edf8967a5 (patch) | |
tree | 5f93115460f7082f9efdc2020a35c5ada55665df /common/usb_kbd.c | |
parent | 3352c2114b69aeadf54feb8140071a55fb580c30 (diff) | |
download | u-boot-87e91bccaee63d70fd3ada0bee5e861edf8967a5.tar.gz |
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.c | 42 |
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) |