Re: Unitech USB barcode scanner issues

Jiri Kosina <[email protected]>
Newsgroups gmane.linux.usb.devel
Message-ID <[email protected]>
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/
_______________________________________________
[email protected]
To unsubscribe, use the last form field at:
https://lists.sourceforge.net/lists/listinfo/linux-usb-devel
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.