[U-Boot] [PATCH v4 3/7] usb: kbd: simplify coding for arrow keys

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


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 at gmx.de>
---
v4:
	Reduce code size by avoiding strings.
v3:
	no change
v2:
	no change
---
 common/usb_kbd.c | 47 ++++++++++++-----------------------------------
 1 file changed, 12 insertions(+), 35 deletions(-)

diff --git a/common/usb_kbd.c b/common/usb_kbd.c
index e4711eb655..d177b97d67 100644
--- a/common/usb_kbd.c
+++ b/common/usb_kbd.c
@@ -75,13 +75,8 @@ static const unsigned char usb_kbd_num_keypad[] = {
 	'.', 0, 0, 0, '='
 };

-/*
- * map arrow keys to ^F/^B ^N/^P, can't really use the proper
- * 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
+static const u8 usb_special_keys[] = {
+	'C', 'D', 'B', 'A'
 };

 /*
@@ -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;
 }

-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
  * 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];
 	}

-	/* Arrow keys */
-	if ((scancode >= 0x4f) && (scancode <= 0x52))
-		keycode = usb_kbd_arrow[scancode - 0x4f];
-
 	/* Numeric keypad */
 	if ((scancode >= 0x54) && (scancode <= 0x67))
 		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 */
-	if (keycode)
+	if (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);
-		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)
--
2.24.0



More information about the U-Boot mailing list