]> git.ipfire.org Git - thirdparty/grub.git/commitdiff
correctly pass interfno and don't use GetReport
authorVladimir 'phcoder' Serbinenko <phcoder@gmail.com>
Sat, 21 Aug 2010 11:56:55 +0000 (13:56 +0200)
committerVladimir 'phcoder' Serbinenko <phcoder@gmail.com>
Sat, 21 Aug 2010 11:56:55 +0000 (13:56 +0200)
term/usb_keyboard.c

index d875ac00a5ebd0a05029ba5b7a959722868a0e2e..adb84fa9477c45a860da8e2eb5a3d6bf74272743 100644 (file)
@@ -167,11 +167,11 @@ grub_usb_keyboard_attach (grub_usb_device_t usbdev, int configno, int interfno)
 
   /* Place the device in boot mode.  */
   grub_usb_control_msg (usbdev, GRUB_USB_REQTYPE_CLASS_INTERFACE_OUT,
-                       USB_HID_SET_PROTOCOL, 0, 0, 0, 0);
+                       USB_HID_SET_PROTOCOL, 0, interfno, 0, 0);
 
   /* Reports every time an event occurs and not more often than that.  */
   grub_usb_control_msg (usbdev, GRUB_USB_REQTYPE_CLASS_INTERFACE_OUT,
-                       USB_HID_SET_IDLE, 0<<8, 0, 0, 0);
+                       USB_HID_SET_IDLE, 0<<8, interfno, 0, 0);
 
   grub_memcpy (&grub_usb_keyboards[curnum], &grub_usb_keyboard_term,
               sizeof (grub_usb_keyboards[curnum]));
@@ -185,12 +185,18 @@ grub_usb_keyboard_attach (grub_usb_device_t usbdev, int configno, int interfno)
       return 0;
     }
 
+  /* Test showed that getting report may make the keyboard go nuts.
+     Moreover since we're reattaching keyboard it usually sends
+     an initial message on interrupt pipe and so we retrieve
+     the same keystatus.
+   */
+#if 0
   {
     grub_uint8_t report[8];
     grub_usb_err_t err;
     grub_memset (report, 0, sizeof (report));
     err = grub_usb_control_msg (usbdev, GRUB_USB_REQTYPE_CLASS_INTERFACE_IN,
-                               USB_HID_GET_REPORT, 0x0000, interfno,
+                               USB_HID_GET_REPORT, 0x0100, interfno,
                                sizeof (report), (char *) report);
     if (err)
       {
@@ -203,6 +209,10 @@ grub_usb_keyboard_attach (grub_usb_device_t usbdev, int configno, int interfno)
        data->key = report[2] ? : -1;
       }
   }
+#else
+  data->status = 0;
+  data->key = -1;
+#endif
 
   grub_term_register_input_active ("usb_keyboard", &grub_usb_keyboards[curnum]);
 
@@ -279,6 +289,8 @@ grub_usb_keyboard_getkeystatus (struct grub_term_input *term)
   struct grub_usb_keyboard_data *termdata = term->data;
   int mods = 0;
 
+  grub_usb_keyboard_checkkey (term);
+
   /* Check Shift, Control, and Alt status.  */
   if (termdata->status & 0x02 || termdata->status & 0x20)
     mods |= GRUB_TERM_STATUS_SHIFT;