On Sun, Dec 15, 2019 at 6:26 PM Kevin O'Connor <ke...@koconnor.net> wrote: > > On Sat, Dec 14, 2019 at 11:26:17AM -0600, Matt DeVillier wrote: > > Some USB keyboards report 9 or 10-byte max packet sizes, instead > > of the 8-byte max specified by the USB HID spec. Handle this by > > increasing the size of the keyevent struct to 10 bytes, and using the key > > array size of the usbkeyinfo struct as loop bounds rather than that of the > > keyevent struct (since the former will always be smaller, and within spec). > > > > Test: built/boot on Google Pixel Slate, observe keyboard functional > > Thanks. I think it would be good if the relationship between the test > and the struct sizes was more clear. What about the below (totally > untested)? > > -Kevin
your version produces a working keyboard on the Pixel Slate (when used in conjunction with my other patch), but unsure how to test the mouse TBH. thanks, Matt > > --- a/src/hw/usb-hid.c > +++ b/src/hw/usb-hid.c > @@ -49,6 +49,15 @@ set_idle(struct usb_pipe *pipe, int ms) > #define KEYREPEATWAITMS 500 > #define KEYREPEATMS 33 > > +// Format of USB keyboard event data > +struct keyevent { > + u8 modifiers; > + u8 reserved; > + u8 keys[6]; > +}; > + > +#define MAX_KBD_EVENT 10 > + > static int > usb_kbd_setup(struct usbdevice_s *usbdev > , struct usb_endpoint_descriptor *epdesc) > @@ -59,8 +68,12 @@ usb_kbd_setup(struct usbdevice_s *usbdev > // XXX - this enables the first found keyboard (could be random) > return -1; > > - if (epdesc->wMaxPacketSize != 8) > + if (epdesc->wMaxPacketSize < sizeof(struct keyevent) > + || epdesc->wMaxPacketSize > MAX_KBD_EVENT) { > + dprintf(1, "USB keyboard wMaxPacketSize=%d; aborting\n" > + , epdesc->wMaxPacketSize); > return -1; > + } > > // Enable "boot" protocol. > int ret = set_protocol(usbdev->defpipe, 0); > @@ -79,6 +92,14 @@ usb_kbd_setup(struct usbdevice_s *usbdev > return 0; > } > > +// Format of USB mouse event data > +struct mouseevent { > + u8 buttons; > + u8 x, y; > +}; > + > +#define MAX_MOUSE_EVENT 8 > + > static int > usb_mouse_setup(struct usbdevice_s *usbdev > , struct usb_endpoint_descriptor *epdesc) > @@ -89,8 +110,12 @@ usb_mouse_setup(struct usbdevice_s *usbdev > // XXX - this enables the first found mouse (could be random) > return -1; > > - if (epdesc->wMaxPacketSize < 3 || epdesc->wMaxPacketSize > 8) > + if (epdesc->wMaxPacketSize < sizeof(struct mouseevent) > + || epdesc->wMaxPacketSize > MAX_MOUSE_EVENT) { > + dprintf(1, "USB mouse wMaxPacketSize=%d; aborting\n" > + , epdesc->wMaxPacketSize); > return -1; > + } > > // Enable "boot" protocol. > int ret = set_protocol(usbdev->defpipe, 0); > @@ -163,13 +188,6 @@ static u16 ModifierToScanCode[] VAR16 = { > > #define RELEASEBIT 0x80 > > -// Format of USB keyboard event data > -struct keyevent { > - u8 modifiers; > - u8 reserved; > - u8 keys[6]; > -}; > - > // Translate data from KeyToScanCode[] to calls to process_key(). > static void > prockeys(u16 scancode, u8 key_release, u8 mods) > @@ -309,11 +327,11 @@ usb_check_key(void) > return; > > for (;;) { > - struct keyevent data; > - int ret = usb_poll_intr(pipe, &data); > + u8 data[MAX_KBD_EVENT]; > + int ret = usb_poll_intr(pipe, data); > if (ret) > break; > - handle_key(&data); > + handle_key((void*)data); > } > } > > @@ -349,13 +367,6 @@ usb_kbd_command(int command, u8 *param) > * Mouse events > ****************************************************************/ > > -// Format of USB mouse event data > -struct mouseevent { > - u8 buttons; > - u8 x, y; > - u8 reserved[5]; > -}; > - > // Process USB mouse data. > static void > handle_mouse(struct mouseevent *data) > @@ -381,11 +392,11 @@ usb_check_mouse(void) > return; > > for (;;) { > - struct mouseevent data; > - int ret = usb_poll_intr(pipe, &data); > + u8 data[MAX_MOUSE_EVENT]; > + int ret = usb_poll_intr(pipe, data); > if (ret) > break; > - handle_mouse(&data); > + handle_mouse((void*)data); > } > } > _______________________________________________ SeaBIOS mailing list -- seabios@seabios.org To unsubscribe send an email to seabios-le...@seabios.org