]> git.dujemihanovic.xyz Git - u-boot.git/commitdiff
usb: kbd: implement special keys
authorHeinrich Schuchardt <xypron.glpk@gmx.de>
Sat, 23 Nov 2019 17:15:21 +0000 (18:15 +0100)
committerMarek Vasut <marek.vasut+renesas@gmail.com>
Mon, 25 Nov 2019 12:28:53 +0000 (13:28 +0100)
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>
common/usb_kbd.c
drivers/usb/Kconfig

index d177b97d67ed2fdc01a73238412de9f2583ed355..d6b340bbe7b8a42031cc1a1da09c7da8b6034eb6 100644 (file)
@@ -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)
index 9af78e88226a6f296528c926b5fadf99de8112f8..bea4a92b61f02d7a41f8532456ab731e83cd8e5e 100644 (file)
@@ -100,6 +100,12 @@ config USB_KEYBOARD
 
 if USB_KEYBOARD
 
+config USB_KEYBOARD_FN_KEYS
+       bool "USB keyboard function key support"
+       help
+         Say Y here if you want support for keys F1 - F12, INS, HOME, DELETE,
+         END, PAGE UP, and PAGE DOWN.
+
 choice
        prompt "USB keyboard polling"
        default SYS_USB_EVENT_POLL