On Sun, 29 Apr 2007, Bret Towe wrote: > > There might be various reasons for this, most probably the report > > descriptor of the device is broken. It might then be easy to fix the > > report descriptor on the fly before it gets parsed, we are doing this > > for various broken hardware already. > so this is a rather common issue then?
Hi Bret, well not that common, but there are a few devices out there which have broken report descriptors and we are fixing them before they enter the parser. (some logitech keyboards, certain cymotion keyboard, etc.) > > What product ID and vendor ID does your device have please? (you can > > find out from the output of lsusb command). > Bus 005 Device 002: ID 04b4:de64 Cypress Semiconductor Corp. > this is one of the new ones that have the broken upper case bit I'll dig > around see if I can find a working old one to see if its id changed > since old and new were both broken with hid Please try the patch below (against 2.6.21), it could solve your problem. If it does, I would be interested in all other product IDs you are able to reproduce this bug with, so that I can prepare proper patch, handling all cypress hardware which is broken in the same way. diff --git a/drivers/usb/input/hid-core.c b/drivers/usb/input/hid-core.c index 827a75a..7cfee8d 100644 --- a/drivers/usb/input/hid-core.c +++ b/drivers/usb/input/hid-core.c @@ -1053,6 +1053,30 @@ static void hid_fixup_s510_descriptor(un } } +#define rdesc_swap(n1,n2) tmp = rdesc[n2]; \ + rdesc[n2] = rdesc[n1]; \ + rdesc[n1] = tmp; +static void hid_fixup_cypress_descriptor(unsigned char *rdesc, int rsize) +{ + char tmp; + + if (rdesc[10] == 0x29 && rdesc[12] == 0x19 && + rdesc[36] == 0x29 && rdesc[38] == 0x19 && + rdesc[59] == 0x29 && rdesc[61] == 0x19 && + rdesc[74] == 0x29 && rdesc[76] == 0x19 && + rdesc[86] == 0x29 && rdesc[88] == 0x19) { + info("Fixing up Cypress report descriptor\n"); + rdesc[10] = rdesc[36] = rdesc[59] = rdesc[74] = rdesc[86] = 0x19; + rdesc[12] = rdesc[38] = rdesc[61] = rdesc[76] = rdesc[88] = 0x29; + rdesc_swap(11, 13); + rdesc_swap(37, 39); + rdesc_swap(60, 62); + rdesc_swap(75, 77); + rdesc_swap(87, 89); + } else + info("Not fixing Cypress report descriptor"); +} + static struct hid_device *usb_hid_configure(struct usb_interface *intf) { struct usb_host_interface *interface = intf->cur_altsetting; @@ -1129,6 +1153,10 @@ static struct hid_device *usb_hid_config if (quirks & HID_QUIRK_LOGITECH_S510_DESCRIPTOR) hid_fixup_s510_descriptor(rdesc, rsize); + if (le16_to_cpu(dev->descriptor.idVendor) == 0x04b4 && + le16_to_cpu(dev->descriptor.idProduct == 0xde64)) + hid_fixup_cypress_descriptor(rdesc, rsize); + #ifdef CONFIG_HID_DEBUG printk(KERN_DEBUG __FILE__ ": report descriptor (size %u, read %d) = ", rsize, n); for (n = 0; n < rsize; n++) ------------------------------------------------------------------------- This SF.net email is sponsored by DB2 Express Download DB2 Express C - the FREE version of DB2 express and take control of your XML. No limits. Just data. Click to get it now. http://sourceforge.net/powerbar/db2/ _______________________________________________ linux-usb-devel@lists.sourceforge.net To unsubscribe, use the last form field at: https://lists.sourceforge.net/lists/listinfo/linux-usb-devel