On 4/30/07, Jiri Kosina <[EMAIL PROTECTED]> wrote:
> 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.

patch works with the newer ones and the older id is below

the de64 btw is the one with the upper case issue
this de61 model had acted fine I was unable to test this patch with it
to see if it works right or not since the scanner I found was half toast
(showed up on lsusb but didnt power on)

Bus 001 Device 003: ID 04b4:de61 Cypress Semiconductor Corp.


> 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

Reply via email to