From 9ba74de61a9c6adfe14bf51a3226111e645a6c18 Mon Sep 17 00:00:00 2001 From: Vladimir 'phcoder' Serbinenko Date: Fri, 20 Aug 2010 16:34:34 +0200 Subject: [PATCH] Scan descriptor rather than elying on hardcoded endpoint number --- include/grub/usb.h | 14 ++++++++++++++ term/usb_keyboard.c | 21 +++++++++++++++++++-- 2 files changed, 33 insertions(+), 2 deletions(-) diff --git a/include/grub/usb.h b/include/grub/usb.h index b2dc77ce4..5d0eb2082 100644 --- a/include/grub/usb.h +++ b/include/grub/usb.h @@ -181,6 +181,20 @@ struct grub_usb_device +typedef enum grub_usb_ep_type + { + GRUB_USB_EP_CONTROL, + GRUB_USB_EP_ISOCHRONOUS, + GRUB_USB_EP_BULK, + GRUB_USB_EP_INTERRUPT + } grub_usb_ep_type_t; + +static inline enum grub_usb_ep_type +grub_usb_get_ep_type (struct grub_usb_desc_endp *ep) +{ + return ep->attrib & 3; +} + typedef enum { GRUB_USB_CLASS_NOTHERE, diff --git a/term/usb_keyboard.c b/term/usb_keyboard.c index d318a04ff..5fcb570b7 100644 --- a/term/usb_keyboard.c +++ b/term/usb_keyboard.c @@ -83,6 +83,7 @@ struct grub_usb_keyboard_data grub_usb_device_t usbdev; grub_uint8_t status; int key; + struct grub_usb_desc_endp *endp; }; static struct grub_term_input grub_usb_keyboards[16]; @@ -109,6 +110,8 @@ grub_usb_keyboard_attach (grub_usb_device_t usbdev, int configno, int interfno) { unsigned curnum; struct grub_usb_keyboard_data *data; + struct grub_usb_desc_endp *endp = NULL; + int j; grub_dprintf ("usb_keyboard", "%x %x %x %d %d\n", usbdev->descdev.class, usbdev->descdev.subclass, @@ -131,6 +134,18 @@ grub_usb_keyboard_attach (grub_usb_device_t usbdev, int configno, int interfno) != USB_HID_KBD_PROTOCOL) return 0; + for (j = 0; j < usbdev->config[configno].interf[interfno].descif->endpointcnt; + j++) + { + endp = &usbdev->config[configno].interf[interfno].descendp[j]; + + if ((endp->endp_addr & 128) && grub_usb_get_ep_type(endp) + == GRUB_USB_EP_INTERRUPT) + break; + } + if (j == usbdev->config[configno].interf[interfno].descif->endpointcnt) + return 0; + grub_printf ("HID found!\n"); data = grub_malloc (sizeof (*data)); @@ -141,6 +156,7 @@ grub_usb_keyboard_attach (grub_usb_device_t usbdev, int configno, int interfno) } data->usbdev = usbdev; + data->endp = endp; /* Place the device in boot mode. */ grub_usb_control_msg (usbdev, GRUB_USB_REQTYPE_CLASS_INTERFACE_OUT, @@ -201,8 +217,9 @@ grub_usb_keyboard_checkkey (struct grub_term_input *term) data[2] = 0; /* Poll interrupt pipe. */ - err = grub_usb_bulk_read_extended (termdata->usbdev, 1, sizeof (data), - (char *) data, 1, &actual); + err = grub_usb_bulk_read_extended (termdata->usbdev, + termdata->endp->endp_addr, sizeof (data), + (char *) data, 10, &actual); if (err) return -1;