usb: kbd: simplify coding for arrow keys
[oweals/u-boot.git] / common / usb_kbd.c
index e4711eb6555afcd650996a2694d5eeef271a0a38..d177b97d67ed2fdc01a73238412de9f2583ed355 100644 (file)
@@ -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)