For those who haven't seen it the Cherry CyMotion Linux keyboard is a decent
quality keyboard with the Windows specific keys replaced with Linux keys. It's
got a nice little picture of Tux on it too. The supplied patches aren't suitable
for current kernels so I've bashed their patches into a suitable form.
The special case in hid_get_class_descriptor() (which necessitated moving that
function after the #defines for vendor and device ID) is lifted directly from
the
code Cherry supply. I'm not certain that's the best place for it but I don't
know
the USB HID architecture well enough to know what else to do with it.
Suggestions
welcome.
--- linux/drivers/usb/input/hid-core.c.orig 2005-04-18 11:58:43.000000000
+0100
+++ linux/drivers/usb/input/hid-core.c 2005-04-18 13:34:59.000000000 +0100
@@ -1291,22 +1291,6 @@
return 0;
}
-static int hid_get_class_descriptor(struct usb_device *dev, int ifnum,
- unsigned char type, void *buf, int size)
-{
- int result, retries = 4;
-
- memset(buf,0,size); // Make sure we parse really received data
-
- do {
- result = usb_control_msg(dev, usb_rcvctrlpipe(dev, 0),
- USB_REQ_GET_DESCRIPTOR, USB_RECIP_INTERFACE |
USB_DIR_IN,
- (type << 8), ifnum, buf, size, HZ *
USB_CTRL_GET_TIMEOUT);
- retries--;
- } while (result < size && retries);
- return result;
-}
-
int hid_open(struct hid_device *hid)
{
if (hid->open++)
@@ -1494,6 +1478,9 @@
#define USB_VENDOR_ID_DELORME 0x1163
#define USB_DEVICE_ID_DELORME_EARTHMATE 0x0100
+#define USB_VENDOR_ID_CHERRY 0x046a
+#define USB_DEVICE_ID_CHERRY_CYMOTION 0x0023
+
static struct hid_blacklist {
__u16 idVendor;
__u16 idProduct;
@@ -1589,6 +1576,37 @@
{ 0, 0 }
};
+static int hid_get_class_descriptor(struct usb_device *dev, int ifnum,
+ unsigned char type, void *buf, int size)
+{
+ int result, retries = 4;
+ char *p = (char*)buf;
+
+ memset(buf,0,size); // Make sure we parse really received data
+
+ do {
+ result = usb_control_msg(dev, usb_rcvctrlpipe(dev, 0),
+ USB_REQ_GET_DESCRIPTOR, USB_RECIP_INTERFACE |
USB_DIR_IN,
+ (type << 8), ifnum, buf, size, HZ *
USB_CTRL_GET_TIMEOUT);
+ retries--;
+ } while (result < size && retries);
+
+ // wn_hack: patch wrong descriptor for this device
+ // hardware sends wrong descriptor
+ // AA, 20050418: should this test be skipped altogether if result <
size?
+ if (dev->descriptor.idVendor == USB_VENDOR_ID_CHERRY
+ && dev->descriptor.idProduct == USB_DEVICE_ID_CHERRY_CYMOTION
+ && result > 12
+ && p[11] == 0x3c
+ && p[12] == 0x02) {
+ printk(KERN_DEBUG __FILE__ " : modifying descriptor for Cherry CyMotion
keyboard \n");
+ p[11] = p[16] = 0xff;
+ p[12] = p[17] = 0x03;
+ }
+
+ return result;
+}
+
static int hid_alloc_buffers(struct usb_device *dev, struct hid_device *hid)
{
if (!(hid->inbuf = usb_buffer_alloc(dev, HID_BUFFER_SIZE, SLAB_ATOMIC,
&hid->inbuf_dma)))
Signed-off-by: Andy Armstrong <[EMAIL PROTECTED]>
-------------------------------------------------------
This SF.Net email is sponsored by: New Crystal Reports XI.
Version 11 adds new functionality designed to reduce time involved in
creating, integrating, and deploying reporting solutions. Free runtime info,
new features, or free trial, at: http://www.businessobjects.com/devxi/728
_______________________________________________
[email protected]
To unsubscribe, use the last form field at:
https://lists.sourceforge.net/lists/listinfo/linux-usb-devel