'.', 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'
};
/*
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
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];
}
/* 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)