76 #include <linux/kernel.h>
78 #include <linux/slab.h>
79 #include <linux/stat.h>
80 #include <linux/module.h>
84 #define DRIVER_DESC "X-Box pad driver"
86 #define XPAD_PKT_LEN 32
90 #define MAP_DPAD_TO_BUTTONS (1 << 0)
91 #define MAP_TRIGGERS_TO_BUTTONS (1 << 1)
92 #define MAP_STICKS_TO_NULL (1 << 2)
93 #define DANCEPAD_MAP_CONFIG (MAP_DPAD_TO_BUTTONS | \
94 MAP_TRIGGERS_TO_BUTTONS | MAP_STICKS_TO_NULL)
97 #define XTYPE_XBOX360 1
98 #define XTYPE_XBOX360W 2
99 #define XTYPE_UNKNOWN 3
101 static bool dpad_to_buttons;
103 MODULE_PARM_DESC(dpad_to_buttons,
"Map D-PAD to buttons rather than axes for unknown pads");
105 static bool triggers_to_buttons;
107 MODULE_PARM_DESC(triggers_to_buttons,
"Map triggers to buttons rather than axes for unknown pads");
109 static bool sticks_to_null;
111 MODULE_PARM_DESC(sticks_to_null,
"Do not map sticks at all for unknown pads");
113 static const struct xpad_device {
120 { 0x045e, 0x0202,
"Microsoft X-Box pad v1 (US)", 0,
XTYPE_XBOX },
121 { 0x045e, 0x0289,
"Microsoft X-Box pad v2 (US)", 0,
XTYPE_XBOX },
122 { 0x045e, 0x0285,
"Microsoft X-Box pad (Japan)", 0,
XTYPE_XBOX },
123 { 0x045e, 0x0287,
"Microsoft Xbox Controller S", 0,
XTYPE_XBOX },
126 { 0x044f, 0x0f07,
"Thrustmaster, Inc. Controller", 0,
XTYPE_XBOX },
127 { 0x046d, 0xc242,
"Logitech Chillstream Controller", 0,
XTYPE_XBOX360 },
128 { 0x046d, 0xca84,
"Logitech Xbox Cordless Controller", 0,
XTYPE_XBOX },
129 { 0x046d, 0xca88,
"Logitech Compact Controller for Xbox", 0,
XTYPE_XBOX },
130 { 0x05fd, 0x1007,
"Mad Catz Controller (unverified)", 0,
XTYPE_XBOX },
131 { 0x05fd, 0x107a,
"InterAct 'PowerPad Pro' X-Box pad (Germany)", 0,
XTYPE_XBOX },
132 { 0x0738, 0x4516,
"Mad Catz Control Pad", 0,
XTYPE_XBOX },
133 { 0x0738, 0x4522,
"Mad Catz LumiCON", 0,
XTYPE_XBOX },
134 { 0x0738, 0x4526,
"Mad Catz Control Pad Pro", 0,
XTYPE_XBOX },
135 { 0x0738, 0x4536,
"Mad Catz MicroCON", 0,
XTYPE_XBOX },
137 { 0x0738, 0x4556,
"Mad Catz Lynx Wireless Controller", 0,
XTYPE_XBOX },
138 { 0x0738, 0x4716,
"Mad Catz Wired Xbox 360 Controller", 0,
XTYPE_XBOX360 },
141 { 0x0c12, 0x8802,
"Zeroplus Xbox Controller", 0,
XTYPE_XBOX },
142 { 0x0c12, 0x880a,
"Pelican Eclipse PL-2023", 0,
XTYPE_XBOX },
143 { 0x0c12, 0x8810,
"Zeroplus Xbox Controller", 0,
XTYPE_XBOX },
144 { 0x0c12, 0x9902,
"HAMA VibraX - *FAULTY HARDWARE*", 0,
XTYPE_XBOX },
146 { 0x0e4c, 0x1097,
"Radica Gamester Controller", 0,
XTYPE_XBOX },
147 { 0x0e4c, 0x2390,
"Radica Games Jtech Controller", 0,
XTYPE_XBOX },
148 { 0x0e6f, 0x0003,
"Logic3 Freebird wireless Controller", 0,
XTYPE_XBOX },
149 { 0x0e6f, 0x0005,
"Eclipse wireless Controller", 0,
XTYPE_XBOX },
150 { 0x0e6f, 0x0006,
"Edge wireless Controller", 0,
XTYPE_XBOX },
151 { 0x0e6f, 0x0006,
"Pelican 'TSZ' Wired Xbox 360 Controller", 0,
XTYPE_XBOX360 },
152 { 0x0e6f, 0x0201,
"Pelican PL-3601 'TSZ' Wired Xbox 360 Controller", 0,
XTYPE_XBOX360 },
153 { 0x0e8f, 0x0201,
"SmartJoy Frag Xpad/PS2 adaptor", 0,
XTYPE_XBOX },
154 { 0x0f30, 0x0202,
"Joytech Advanced Controller", 0,
XTYPE_XBOX },
155 { 0x0f30, 0x8888,
"BigBen XBMiniPad Controller", 0,
XTYPE_XBOX },
156 { 0x102c, 0xff0c,
"Joytech Wireless Advanced Controller", 0,
XTYPE_XBOX },
160 { 0x1430, 0x4748,
"RedOctane Guitar Hero X-plorer", 0,
XTYPE_XBOX360 },
162 { 0x146b, 0x0601,
"BigBen Interactive XBOX 360 Controller", 0,
XTYPE_XBOX360 },
163 { 0x045e, 0x028e,
"Microsoft X-Box 360 pad", 0,
XTYPE_XBOX360 },
164 { 0x1bad, 0x0002,
"Harmonix Rock Band Guitar", 0,
XTYPE_XBOX360 },
169 { 0xffff, 0xffff,
"Chinese-made Xbox Controller", 0,
XTYPE_XBOX },
174 static const signed short xpad_common_btn[] = {
181 static const signed short xpad_btn[] = {
187 static const signed short xpad_btn_pad[] = {
194 static const signed short xpad_btn_triggers[] = {
200 static const signed short xpad360_btn[] = {
206 static const signed short xpad_abs[] = {
213 static const signed short xpad_abs_pad[] = {
219 static const signed short xpad_abs_triggers[] = {
228 #define XPAD_XBOX360_VENDOR_PROTOCOL(vend,pr) \
229 .match_flags = USB_DEVICE_ID_MATCH_VENDOR | USB_DEVICE_ID_MATCH_INT_INFO, \
230 .idVendor = (vend), \
231 .bInterfaceClass = USB_CLASS_VENDOR_SPEC, \
232 .bInterfaceSubClass = 93, \
233 .bInterfaceProtocol = (pr)
234 #define XPAD_XBOX360_VENDOR(vend) \
235 { XPAD_XBOX360_VENDOR_PROTOCOL(vend,1) }, \
236 { XPAD_XBOX360_VENDOR_PROTOCOL(vend,129) }
239 { USB_INTERFACE_INFO(
'X',
'B', 0) },
243 { USB_DEVICE(0x0738, 0x4540) },
270 #if defined(CONFIG_JOYSTICK_XPAD_FF) || defined(CONFIG_JOYSTICK_XPAD_LEDS)
272 unsigned char *odata;
274 struct mutex odata_mutex;
277 #if defined(CONFIG_JOYSTICK_XPAD_LEDS)
278 struct xpad_led *
led;
299 struct input_dev *
dev = xpad->
dev;
303 input_report_abs(dev,
ABS_X,
305 input_report_abs(dev,
ABS_Y,
309 input_report_abs(dev,
ABS_RX,
311 input_report_abs(dev,
ABS_RY,
317 input_report_key(dev,
BTN_TL2, data[10]);
318 input_report_key(dev,
BTN_TR2, data[11]);
320 input_report_abs(dev,
ABS_Z, data[10]);
321 input_report_abs(dev,
ABS_RZ, data[11]);
333 !!(data[2] & 0x08) - !!(data[2] & 0x04));
335 !!(data[2] & 0x02) - !!(data[2] & 0x01));
339 input_report_key(dev,
BTN_START, data[2] & 0x10);
340 input_report_key(dev,
BTN_SELECT, data[2] & 0x20);
341 input_report_key(dev,
BTN_THUMBL, data[2] & 0x40);
342 input_report_key(dev,
BTN_THUMBR, data[2] & 0x80);
345 input_report_key(dev,
BTN_A, data[4]);
346 input_report_key(dev,
BTN_B, data[5]);
347 input_report_key(dev,
BTN_X, data[6]);
348 input_report_key(dev,
BTN_Y, data[7]);
351 input_report_key(dev,
BTN_C, data[8]);
352 input_report_key(dev,
BTN_Z, data[9]);
367 static void xpad360_process_packet(
struct usb_xpad *xpad,
368 u16 cmd,
unsigned char *data)
370 struct input_dev *dev = xpad->
dev;
381 !!(data[2] & 0x08) - !!(data[2] & 0x04));
383 !!(data[2] & 0x02) - !!(data[2] & 0x01));
387 input_report_key(dev,
BTN_START, data[2] & 0x10);
388 input_report_key(dev,
BTN_SELECT, data[2] & 0x20);
391 input_report_key(dev,
BTN_THUMBL, data[2] & 0x40);
392 input_report_key(dev,
BTN_THUMBR, data[2] & 0x80);
395 input_report_key(dev,
BTN_A, data[3] & 0x10);
396 input_report_key(dev,
BTN_B, data[3] & 0x20);
397 input_report_key(dev,
BTN_X, data[3] & 0x40);
398 input_report_key(dev,
BTN_Y, data[3] & 0x80);
399 input_report_key(dev,
BTN_TL, data[3] & 0x01);
400 input_report_key(dev,
BTN_TR, data[3] & 0x02);
401 input_report_key(dev,
BTN_MODE, data[3] & 0x04);
405 input_report_abs(dev,
ABS_X,
407 input_report_abs(dev,
ABS_Y,
411 input_report_abs(dev,
ABS_RX,
413 input_report_abs(dev,
ABS_RY,
419 input_report_key(dev,
BTN_TL2, data[4]);
420 input_report_key(dev,
BTN_TR2, data[5]);
422 input_report_abs(dev,
ABS_Z, data[4]);
423 input_report_abs(dev,
ABS_RZ, data[5]);
444 static void xpad360w_process_packet(
struct usb_xpad *xpad,
u16 cmd,
unsigned char *data)
447 if (data[0] & 0x08) {
448 if (data[1] & 0x80) {
456 if (!(data[1] & 0x1))
459 xpad360_process_packet(xpad, cmd, &data[4]);
462 static void xpad_irq_in(
struct urb *
urb)
464 struct usb_xpad *xpad = urb->context;
468 status = urb->status;
478 dev_dbg(dev,
"%s - urb shutting down with status: %d\n",
482 dev_dbg(dev,
"%s - nonzero urb status received: %d\n",
487 switch (xpad->
xtype) {
489 xpad360_process_packet(xpad, 0, xpad->
idata);
492 xpad360w_process_packet(xpad, 0, xpad->
idata);
495 xpad_process_packet(xpad, 0, xpad->
idata);
501 dev_err(dev,
"%s - usb_submit_urb failed with result %d\n",
505 static void xpad_bulk_out(
struct urb *urb)
507 struct usb_xpad *xpad = urb->context;
510 switch (urb->status) {
518 dev_dbg(dev,
"%s - urb shutting down with status: %d\n",
519 __func__, urb->status);
522 dev_dbg(dev,
"%s - nonzero urb status received: %d\n",
523 __func__, urb->status);
527 #if defined(CONFIG_JOYSTICK_XPAD_FF) || defined(CONFIG_JOYSTICK_XPAD_LEDS)
528 static void xpad_irq_out(
struct urb *urb)
530 struct usb_xpad *xpad = urb->context;
534 status = urb->status;
545 dev_dbg(dev,
"%s - urb shutting down with status: %d\n",
550 dev_dbg(dev,
"%s - nonzero urb status received: %d\n",
558 dev_err(dev,
"%s - usb_submit_urb failed with result %d\n",
580 if (!xpad->irq_out) {
585 ep_irq_out = &intf->cur_altsetting->endpoint[1].desc;
586 usb_fill_int_urb(xpad->irq_out, xpad->
udev,
589 xpad_irq_out, xpad, ep_irq_out->
bInterval);
590 xpad->irq_out->transfer_dma = xpad->odata_dma;
591 xpad->irq_out->transfer_flags |= URB_NO_TRANSFER_DMA_MAP;
599 static void xpad_stop_output(
struct usb_xpad *xpad)
605 static void xpad_deinit_output(
struct usb_xpad *xpad)
610 xpad->odata, xpad->odata_dma);
615 static void xpad_deinit_output(
struct usb_xpad *xpad) {}
616 static void xpad_stop_output(
struct usb_xpad *xpad) {}
619 #ifdef CONFIG_JOYSTICK_XPAD_FF
620 static int xpad_play_effect(
struct input_dev *dev,
void *data,
struct ff_effect *effect)
622 struct usb_xpad *xpad = input_get_drvdata(dev);
628 switch (xpad->
xtype) {
631 xpad->odata[0] = 0x00;
632 xpad->odata[1] = 0x06;
633 xpad->odata[2] = 0x00;
634 xpad->odata[3] = strong / 256;
635 xpad->odata[4] = 0x00;
636 xpad->odata[5] = weak / 256;
637 xpad->irq_out->transfer_buffer_length = 6;
642 xpad->odata[0] = 0x00;
643 xpad->odata[1] = 0x08;
644 xpad->odata[2] = 0x00;
645 xpad->odata[3] = strong / 256;
646 xpad->odata[4] = weak / 256;
647 xpad->odata[5] = 0x00;
648 xpad->odata[6] = 0x00;
649 xpad->odata[7] = 0x00;
650 xpad->irq_out->transfer_buffer_length = 8;
655 xpad->odata[0] = 0x00;
656 xpad->odata[1] = 0x01;
657 xpad->odata[2] = 0x0F;
658 xpad->odata[3] = 0xC0;
659 xpad->odata[4] = 0x00;
660 xpad->odata[5] = strong / 256;
661 xpad->odata[6] = weak / 256;
662 xpad->odata[7] = 0x00;
663 xpad->odata[8] = 0x00;
664 xpad->odata[9] = 0x00;
665 xpad->odata[10] = 0x00;
666 xpad->odata[11] = 0x00;
667 xpad->irq_out->transfer_buffer_length = 12;
673 "%s - rumble command sent to unsupported xpad type: %d\n",
674 __func__, xpad->
xtype);
682 static int xpad_init_ff(
struct usb_xpad *xpad)
693 static int xpad_init_ff(
struct usb_xpad *xpad) {
return 0; }
696 #if defined(CONFIG_JOYSTICK_XPAD_LEDS)
707 if (command >= 0 && command < 14) {
709 xpad->odata[0] = 0x01;
710 xpad->odata[1] = 0x03;
712 xpad->irq_out->transfer_buffer_length = 3;
722 struct xpad_led, led_cdev);
724 xpad_send_led_command(xpad_led->xpad, value);
727 static int xpad_led_probe(
struct usb_xpad *xpad)
731 struct xpad_led *
led;
738 xpad->led = led = kzalloc(
sizeof(
struct xpad_led),
GFP_KERNEL);
744 snprintf(led->name,
sizeof(led->name),
"xpad%ld", led_no);
747 led_cdev = &led->led_cdev;
748 led_cdev->
name = led->name;
761 xpad_send_led_command(xpad, (led_no % 4) + 2);
766 static void xpad_led_disconnect(
struct usb_xpad *xpad)
768 struct xpad_led *xpad_led = xpad->led;
776 static int xpad_led_probe(
struct usb_xpad *xpad) {
return 0; }
777 static void xpad_led_disconnect(
struct usb_xpad *xpad) { }
781 static int xpad_open(
struct input_dev *dev)
783 struct usb_xpad *xpad = input_get_drvdata(dev);
796 static void xpad_close(
struct input_dev *dev)
798 struct usb_xpad *xpad = input_get_drvdata(dev);
803 xpad_stop_output(xpad);
806 static void xpad_set_up_abs(
struct input_dev *input_dev,
signed short abs)
808 set_bit(abs, input_dev->absbit);
815 input_set_abs_params(input_dev, abs, -32768, 32767, 16, 128);
819 input_set_abs_params(input_dev, abs, 0, 255, 0, 0);
823 input_set_abs_params(input_dev, abs, -1, 1, 0, 0);
830 struct usb_device *
udev = interface_to_usbdev(intf);
832 struct input_dev *input_dev;
836 for (i = 0; xpad_device[
i].idVendor; i++) {
837 if ((
le16_to_cpu(udev->descriptor.idVendor) == xpad_device[i].idVendor) &&
838 (
le16_to_cpu(udev->descriptor.idProduct) == xpad_device[i].idProduct))
843 input_dev = input_allocate_device();
844 if (!xpad || !input_dev) {
864 xpad->
mapping = xpad_device[
i].mapping;
865 xpad->
xtype = xpad_device[
i].xtype;
869 if (intf->cur_altsetting->desc.bInterfaceProtocol == 129)
878 if (triggers_to_buttons)
884 xpad->
dev = input_dev;
885 usb_make_path(udev, xpad->
phys,
sizeof(xpad->
phys));
888 input_dev->name = xpad_device[
i].name;
889 input_dev->phys = xpad->
phys;
890 usb_to_input_id(udev, &input_dev->id);
891 input_dev->dev.parent = &intf->dev;
893 input_set_drvdata(input_dev, xpad);
895 input_dev->open = xpad_open;
896 input_dev->close = xpad_close;
903 for (i = 0; xpad_abs[
i] >= 0; i++)
904 xpad_set_up_abs(input_dev, xpad_abs[i]);
908 for (i = 0; xpad_common_btn[
i] >= 0; i++)
909 __set_bit(xpad_common_btn[i], input_dev->keybit);
913 for (i = 0; xpad360_btn[
i] >= 0; i++)
914 __set_bit(xpad360_btn[i], input_dev->keybit);
916 for (i = 0; xpad_btn[
i] >= 0; i++)
917 __set_bit(xpad_btn[i], input_dev->keybit);
921 for (i = 0; xpad_btn_pad[
i] >= 0; i++)
922 __set_bit(xpad_btn_pad[i], input_dev->keybit);
924 for (i = 0; xpad_abs_pad[
i] >= 0; i++)
925 xpad_set_up_abs(input_dev, xpad_abs_pad[i]);
929 for (i = 0; xpad_btn_triggers[
i] >= 0; i++)
930 __set_bit(xpad_btn_triggers[i], input_dev->keybit);
932 for (i = 0; xpad_abs_triggers[
i] >= 0; i++)
933 xpad_set_up_abs(input_dev, xpad_abs_triggers[i]);
936 error = xpad_init_output(intf, xpad);
940 error = xpad_init_ff(xpad);
944 error = xpad_led_probe(xpad);
948 ep_irq_in = &intf->cur_altsetting->endpoint[0].desc;
949 usb_fill_int_urb(xpad->
irq_in, udev,
954 xpad->
irq_in->transfer_flags |= URB_NO_TRANSFER_DMA_MAP;
956 error = input_register_device(xpad->
dev);
960 usb_set_intfdata(intf, xpad);
979 xpad->
bdata[2] = 0x08;
980 switch (intf->cur_altsetting->desc.bInterfaceNumber) {
982 xpad->
bdata[3] = 0x42;
985 xpad->
bdata[3] = 0x43;
988 xpad->
bdata[3] = 0x44;
991 xpad->
bdata[3] = 0x45;
994 ep_irq_in = &intf->cur_altsetting->endpoint[1].desc;
995 usb_fill_bulk_urb(xpad->
bulk_out, udev,
1016 fail7: input_unregister_device(input_dev);
1018 fail6: xpad_led_disconnect(xpad);
1019 fail5:
if (input_dev)
1020 input_ff_destroy(input_dev);
1021 fail4: xpad_deinit_output(xpad);
1024 fail1: input_free_device(input_dev);
1032 struct usb_xpad *xpad = usb_get_intfdata (intf);
1034 xpad_led_disconnect(xpad);
1035 input_unregister_device(xpad->
dev);
1036 xpad_deinit_output(xpad);
1051 usb_set_intfdata(intf,
NULL);
1054 static struct usb_driver xpad_driver = {
1056 .probe = xpad_probe,
1057 .disconnect = xpad_disconnect,
1058 .id_table = xpad_table,