/* * Make the Saitek X6-38V rumble. * * (c) 2005 Simon Budig * 2005-02-01 * * compile with * gcc -o saitek-rumble -lusb saitek-rumble.c */ #define VENDOR_ID 0x07b5 #define DEVICE_ID 0x0312 #include #include int main(int argc, char *argv[]) { struct usb_bus *bus; struct usb_bus *rumble_bus; struct usb_device *dev; struct usb_device *rumble_pad = NULL; usb_dev_handle *handle = NULL; int ret; char data[4] = { 0, 0, 0, 0 }; if (argc > 1 && (!strcmp (argv[1], "-h") || !strcmp (argv[1], "--help"))) fprintf (stderr, "usage: %s [ []]\n" " where both parameters are in 0-255\n", argv[0]); usb_set_debug (0); usb_init(); usb_find_busses(); usb_find_devices(); /* first parameter: Strong rumble motor, second: weak rumble motor */ if (argc > 1) data[2] = data[3] = atoi (argv[1]); if (argc > 2) data[3] = atoi (argv[2]); /* fprintf(stderr, "bus/device idVendor/idProduct\n"); */ for (bus = usb_busses; bus; bus = bus->next) { for (dev = bus->devices; dev; dev = dev->next) { /* fprintf(stderr, "%s/%s %04X/%04X\n", * bus->dirname, dev->filename, * dev->descriptor.idVendor, dev->descriptor.idProduct); */ if (dev->descriptor.idVendor == VENDOR_ID && dev->descriptor.idProduct == DEVICE_ID) { rumble_pad = dev; rumble_bus = bus; } } } if (rumble_pad) { char driver_name[256] = { 0, }; /* fprintf (stderr, "found pad\n"); */ handle = usb_open (rumble_pad); usb_get_driver_np (handle, 0, driver_name, 255); if (strlen (driver_name)) { if (usb_detach_kernel_driver_np (handle, 0)) { fprintf (stderr, "USB-interface claimed by driver '%s'\n " " - could not detach it", driver_name); } } if (usb_claim_interface (handle, 0) != 0) { fprintf (stderr, "%s\n", usb_strerror()); fprintf (stderr, "check permissions for /proc/bus/usb/%s/%s\n", rumble_bus->dirname, rumble_pad->filename); exit (1); } ret = usb_control_msg (handle, USB_TYPE_CLASS | USB_RECIP_INTERFACE, USB_REQ_SET_CONFIGURATION, 0x0200, /* value */ 0, /* index */ data, /* bytes */ 4, /* size */ 1000000 /* timeout */ ); /* fprintf (stderr, "ret: %d\n", ret); */ } else { fprintf (stderr, "USB-Device %04x:%04x not found.\n", VENDOR_ID, DEVICE_ID); } return 0; }