These changes are the raw update to qemu-2.6.
[kvmfornfv.git] / qemu / roms / SLOF / lib / libusb / usb-hid.c
index f0cab8a..ac6616a 100644 (file)
 #define HID_REQ_SET_IDLE                0x0A
 #define HID_REQ_SET_PROTOCOL            0x0B
 
+//key position for latin letters
+#define KEYP_LATIN_A 4
+#define KEYP_LATIN_Z 29
+
 //#define KEY_DEBUG
 
 /* HID SPEC - 7.2.6 Set_Protocol Request */
@@ -83,6 +87,8 @@ uint8_t set_leds;
 const uint8_t *key_std       = NULL;
 const uint8_t *key_std_shift = NULL;
 
+uint8_t ctrl; /* modifiers */
+
 /**
  * read character from Keyboard-Buffer
  *
@@ -110,6 +116,16 @@ static void write_key(uint8_t key)
                keybuf[w_ptr++] = key;
 }
 
+/**
+ * Checks if keypos is a latin key
+ * @param  keypos
+ * @return -
+ */
+static bool is_latin(uint8_t keypos)
+{
+       return keypos >= KEYP_LATIN_A && keypos <= KEYP_LATIN_Z;
+}
+
 /**
  * Convert keyboard usage-ID to ANSI-Code
  *
@@ -120,22 +136,24 @@ static void write_key(uint8_t key)
 static void get_char(uint8_t ctrl, uint8_t keypos)
 {
        uint8_t ch;
+       bool caps = false;
 
 #ifdef KEY_DEBUG
        printf("pos %02X\n", keypos);
 #endif
 
        if (set_leds & LED_CAPS_LOCK)                   /* is CAPS Lock set ? */
-               ctrl |= MODIFIER_SHIFT;                     /* simulate shift */
+               caps = true;
 
-       if (ctrl == 0) {
+       /* caps is a shift only for latin chars */
+       if ((!caps && ctrl == 0) || (caps && !is_latin(keypos))) {
                ch = key_std[keypos];
                if (ch != 0)
                        write_key(ch);
                return;
        }
 
-       if (ctrl & MODIFIER_SHIFT) {
+       if ((ctrl & MODIFIER_SHIFT) || caps) {
                ch = key_std_shift[keypos];
                if (ch != 0)
                        write_key(ch);
@@ -187,36 +205,38 @@ static void check_key_code(uint8_t *buf)
                                        set_leds ^= LED_CAPS_LOCK;
                                        break;
 
+                               case 0x36:                              /*Shift pressed*/
+                                       ctrl |= MODIFIER_SHIFT;
+                                       break;
+                               case 0xb6:                              /*Shift unpressed*/
+                                       ctrl &= ~MODIFIER_SHIFT;
+                                       break;
                                case 0x3a:                              /* F1 */
                                        write_key(0x1b);
                                        write_key(0x5b);
-                                       write_key(0x31);
-                                       write_key(0x31);
-                                       write_key(0x7e);
+                                       write_key(0x4f);
+                                       write_key(0x50);
                                        break;
 
                                case 0x3b:                              /* F2 */
                                        write_key(0x1b);
                                        write_key(0x5b);
-                                       write_key(0x31);
-                                       write_key(0x32);
-                                       write_key(0x7e);
+                                       write_key(0x4f);
+                                       write_key(0x51);
                                        break;
 
                                case 0x3c:
                                        write_key(0x1b);               /* F3 */
                                        write_key(0x5b);
-                                       write_key(0x31);
-                                       write_key(0x33);
-                                       write_key(0x7e);
+                                       write_key(0x4f);
+                                       write_key(0x52);
                                        break;
 
                                case 0x3d:
                                        write_key(0x1b);                /* F4 */
                                        write_key(0x5b);
-                                       write_key(0x31);
-                                       write_key(0x34);
-                                       write_key(0x7e);
+                                       write_key(0x4f);
+                                       write_key(0x53);
                                        break;
 
                                case 0x3e:
@@ -254,7 +274,7 @@ static void check_key_code(uint8_t *buf)
                                case 0x42:
                                        write_key(0x1b);                /* F9 */
                                        write_key(0x5b);
-                                       write_key(0x31);
+                                       write_key(0x32);
                                        write_key(0x30);
                                        write_key(0x7e);
                                        break;
@@ -262,7 +282,7 @@ static void check_key_code(uint8_t *buf)
                                case 0x43:
                                        write_key(0x1b);               /* F10 */
                                        write_key(0x5b);
-                                       write_key(0x31);
+                                       write_key(0x32);
                                        write_key(0x31);
                                        write_key(0x7e);
                                        break;
@@ -270,7 +290,7 @@ static void check_key_code(uint8_t *buf)
                                case 0x44:
                                        write_key(0x1b);               /* F11 */
                                        write_key(0x5b);
-                                       write_key(0x31);
+                                       write_key(0x32);
                                        write_key(0x33);
                                        write_key(0x7e);
                                        break;
@@ -278,7 +298,7 @@ static void check_key_code(uint8_t *buf)
                                case 0x45:
                                        write_key(0x1b);               /* F12 */
                                        write_key(0x5b);
-                                       write_key(0x31);
+                                       write_key(0x32);
                                        write_key(0x34);
                                        write_key(0x7e);
                                        break;
@@ -290,36 +310,34 @@ static void check_key_code(uint8_t *buf)
                                case 0x49:
                                        write_key(0x1b);               /* INS */
                                        write_key(0x5b);
-                                       write_key(0x31);
+                                       write_key(0x32);
                                        write_key(0x7e);
                                        break;
 
                                case 0x4a:
                                        write_key(0x1b);              /* HOME */
-                                       write_key(0x5b);
-                                       write_key(0x32);
-                                       write_key(0x7e);
+                                       write_key(0x4f);
+                                       write_key(0x48);
                                        break;
 
                                case 0x4b:
                                        write_key(0x1b);              /* PgUp */
                                        write_key(0x5b);
-                                       write_key(0x33);
+                                       write_key(0x35);
                                        write_key(0x7e);
                                        break;
 
                                case 0x4c:
                                        write_key(0x1b);               /* DEL */
                                        write_key(0x5b);
-                                       write_key(0x34);
+                                       write_key(0x33);
                                        write_key(0x7e);
                                        break;
 
                                case 0x4d:
                                        write_key(0x1b);               /* END */
-                                       write_key(0x5b);
-                                       write_key(0x35);
-                                       write_key(0x7e);
+                                       write_key(0x4f);
+                                       write_key(0x46);
                                        break;
 
                                case 0x4e:
@@ -443,11 +461,8 @@ unsigned char usb_key_available(void *dev)
 
 unsigned char usb_read_keyb(void *vdev)
 {
-       if (!vdev)
-               return false;
-
-       while (usb_poll_key(vdev)) {
-               /* loop for all pending keys */
-       }
-       return read_key();
+       if (usb_key_available(vdev))
+               return read_key();
+       else
+               return 0;
 }