On Tue, 1 May 2007, Jiri Kosina wrote:

> Thanks for the report - it clearly shows that Cypress produces different 
> hardware with different report descriptors, all broken in a very similar 
> way (improper order of usage minimum and maximum items), but not 
> identical. This would require more general handling and care ... I will 
> send you updated patch for test.

Bret,

please try the patch below and let me know. It should work with both the 
broken cypress barcode readers, 0xde61 and 0xde64. If you are aware of any 
other product ids which would require similar fixup, please let me know.

diff --git a/drivers/hid/hid-core.c b/drivers/hid/hid-core.c
diff --git a/drivers/usb/input/hid-core.c b/drivers/usb/input/hid-core.c
index 827a75a..f5ef2e4 100644
--- a/drivers/usb/input/hid-core.c
+++ b/drivers/usb/input/hid-core.c
@@ -650,6 +650,8 @@ void usbhid_init_reports(struct hid_devi
 #define USB_DEVICE_ID_CYPRESS_MOUSE    0x0001
 #define USB_DEVICE_ID_CYPRESS_HIDCOM   0x5500
 #define USB_DEVICE_ID_CYPRESS_ULTRAMOUSE       0x7417
+#define USB_DEVICE_ID_CYPRESS_BARCODE_1        0xde61
+#define USB_DEVICE_ID_CYPRESS_BARCODE_2        0xde64
 
 #define USB_VENDOR_ID_BERKSHIRE                0x0c98
 #define USB_DEVICE_ID_BERKSHIRE_PCWD   0x1140
@@ -945,6 +947,9 @@ static const struct hid_blacklist {
 
        { USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_PS3_CONTROLLER, 
HID_QUIRK_SONY_PS3_CONTROLLER },
 
+       { USB_VENDOR_ID_CYPRESS, USB_DEVICE_ID_CYPRESS_BARCODE_1, 
HID_QUIRK_SWAPPED_MIN_MAX },
+       { USB_VENDOR_ID_CYPRESS, USB_DEVICE_ID_CYPRESS_BARCODE_2, 
HID_QUIRK_SWAPPED_MIN_MAX },
+
        { USB_VENDOR_ID_CIDC, 0x0103, HID_QUIRK_IGNORE },
 
        { 0, 0 }
@@ -1053,6 +1058,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;
+       short fixed = 0;
+       int i;
+
+       for (i = 0; i < rsize - 4; i++) {
+               if (rdesc[i] == 0x29 && rdesc [i+2] == 0x19) {
+                       fixed = 1;
+                       rdesc[i] = 0x19; 
+                       rdesc[i+2] = 0x29;
+                       rdesc_swap(i+1, i+3);
+               }
+       }
+
+       if (fixed)
+               info("Fixing up Cypress report descriptor");
+       else
+               info("Cypress report descriptor didn't require fixup");
+}
+
 static struct hid_device *usb_hid_configure(struct usb_interface *intf)
 {
        struct usb_host_interface *interface = intf->cur_altsetting;
@@ -1129,6 +1158,9 @@ static struct hid_device *usb_hid_config
        if (quirks & HID_QUIRK_LOGITECH_S510_DESCRIPTOR)
                hid_fixup_s510_descriptor(rdesc, rsize);
 
+       if (quirks & HID_QUIRK_SWAPPED_MIN_MAX)
+               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++)
diff --git a/include/linux/hid.h b/include/linux/hid.h
index 8c97d4d..0542c24 100644
--- a/include/linux/hid.h
+++ b/include/linux/hid.h
@@ -269,6 +269,7 @@ struct hid_item {
 #define HID_QUIRK_SONY_PS3_CONTROLLER          0x00080000
 #define HID_QUIRK_LOGITECH_S510_DESCRIPTOR     0x00100000
 #define HID_QUIRK_DUPLICATE_USAGES             0x00200000
+#define HID_QUIRK_SWAPPED_MIN_MAX              0x00400000
 
 /*
  * This is the global environment of the parser. This information is

-------------------------------------------------------------------------
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