[U-Boot] [PATCH v4 4/7] usb: kbd: implement special keys

Heinrich Schuchardt xypron.glpk at gmx.de
Sat Nov 23 17:15:21 UTC 2019


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 at gmx.de>
---
v4:
	reduce code size by avoiding string constants
v3:
	no change
v2:
	no change
---
 common/usb_kbd.c    | 42 ++++++++++++++++++++++++++++++++++++++++++
 drivers/usb/Kconfig |  6 ++++++
 2 files changed, 48 insertions(+)

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)
diff --git a/drivers/usb/Kconfig b/drivers/usb/Kconfig
index 9af78e8822..bea4a92b61 100644
--- a/drivers/usb/Kconfig
+++ b/drivers/usb/Kconfig
@@ -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
--
2.24.0



More information about the U-Boot mailing list