Hi,

This patch makes a  "Saitek X6-34U" gamepad useful with Linux.
It seems that the device reports itself with device class == 0.
Forcing hid.c to accept it fixes the problem.

The patch is against linux-2.2.19

vendor URL: http://www.mega-world.com/mx-634.htm

logs:

May  1 19:42:49 maxine kernel: usb.c: USB new device connect, assigned
device nu
mber 2
May  1 19:42:49 maxine kernel: Manufacturer: Mega World
May  1 19:42:49 maxine kernel: Product: USB Game Pad    
May  1 19:42:49 maxine kernel: usb.c: USB device 2 (prod/vend
0x7b5/0x9902) is n
ot claimed by any active driver.
May  1 19:42:49 maxine kernel:   Length              = 18
May  1 19:42:49 maxine kernel:   DescriptorType      = 01
May  1 19:42:49 maxine kernel:   USB version         = 1.00
May  1 19:42:49 maxine kernel:   Vendor:Product      = 07b5:9902
May  1 19:42:49 maxine kernel:   MaxPacketSize0      = 8
May  1 19:42:49 maxine kernel:   NumConfigurations   = 1
May  1 19:42:49 maxine kernel:   Device version      = 1.00
May  1 19:42:49 maxine kernel:   Device Class:SubClass:Protocol =
00:00:00

Please CC me, I'm not on the list.

Thanks /

magnus
--- linux-2.2.19-original/drivers/usb/hid.c     Sun Mar 25 18:37:37 2001
+++ linux-2.2.19/drivers/usb/hid.c      Tue May  1 22:36:38 2001
@@ -1370,6 +1370,17 @@
        { 0, 0 }
 };
 
+#define USB_VENDOR_ID_MEGAWORLD 0x07b5
+#define USB_DEVICE_ID_MEGAWORLD_USB_GAMEPAD 0x9902
+
+struct hid_forcelist {
+       __u16 idVendor;
+       __u16 idProduct;
+} hid_forcelist[] = {
+       { USB_VENDOR_ID_MEGAWORLD, USB_DEVICE_ID_MEGAWORLD_USB_GAMEPAD },
+       { 0, 0 }
+};
+
 static struct hid_device *usb_hid_configure(struct usb_device *dev, int ifnum, char 
*name)
 {
        struct usb_interface_descriptor *interface = 
dev->actconfig->interface[ifnum].altsetting + 0;
@@ -1382,7 +1393,11 @@
                if ((hid_blacklist[n].idVendor == dev->descriptor.idVendor) &&
                        (hid_blacklist[n].idProduct == dev->descriptor.idProduct)) 
return NULL;
 
-       if (interface->bInterfaceClass != USB_INTERFACE_CLASS_HID)
+       for (n = 0; hid_forcelist[n].idVendor; n++)
+               if ((hid_forcelist[n].idVendor == dev->descriptor.idVendor) &&
+                   (hid_forcelist[n].idProduct == dev->descriptor.idProduct)) break;
+
+       if (!hid_forcelist[n].idVendor && interface->bInterfaceClass != 
+USB_INTERFACE_CLASS_HID)
                return NULL;
 
        if (usb_get_extra_descriptor(interface, USB_DT_HID, &hdesc)

Reply via email to