xpad.c (404c3bc30cb1361e1b3533643326ab472d24a618) | xpad.c (3ffb62cb9ac2430c2504c6ff9727d0f2476ef0bd) |
---|---|
1/* 2 * X-Box gamepad driver 3 * 4 * Copyright (c) 2002 Marko Friedemann <mfr@bmx-chemnitz.de> 5 * 2004 Oliver Schwartz <Oliver.Schwartz@gmx.de>, 6 * Steven Toth <steve@toth.demon.co.uk>, 7 * Franz Lehner <franz@caos.at>, 8 * Ivan Hawkes <blackhawk@ivanhawkes.com> --- 224 unchanged lines hidden (view full) --- 233 { XPAD_XBOX360_VENDOR_PROTOCOL(vend,1) }, \ 234 { XPAD_XBOX360_VENDOR_PROTOCOL(vend,129) } 235 236static struct usb_device_id xpad_table [] = { 237 { USB_INTERFACE_INFO('X', 'B', 0) }, /* X-Box USB-IF not approved class */ 238 XPAD_XBOX360_VENDOR(0x045e), /* Microsoft X-Box 360 controllers */ 239 XPAD_XBOX360_VENDOR(0x046d), /* Logitech X-Box 360 style controllers */ 240 XPAD_XBOX360_VENDOR(0x0738), /* Mad Catz X-Box 360 controllers */ | 1/* 2 * X-Box gamepad driver 3 * 4 * Copyright (c) 2002 Marko Friedemann <mfr@bmx-chemnitz.de> 5 * 2004 Oliver Schwartz <Oliver.Schwartz@gmx.de>, 6 * Steven Toth <steve@toth.demon.co.uk>, 7 * Franz Lehner <franz@caos.at>, 8 * Ivan Hawkes <blackhawk@ivanhawkes.com> --- 224 unchanged lines hidden (view full) --- 233 { XPAD_XBOX360_VENDOR_PROTOCOL(vend,1) }, \ 234 { XPAD_XBOX360_VENDOR_PROTOCOL(vend,129) } 235 236static struct usb_device_id xpad_table [] = { 237 { USB_INTERFACE_INFO('X', 'B', 0) }, /* X-Box USB-IF not approved class */ 238 XPAD_XBOX360_VENDOR(0x045e), /* Microsoft X-Box 360 controllers */ 239 XPAD_XBOX360_VENDOR(0x046d), /* Logitech X-Box 360 style controllers */ 240 XPAD_XBOX360_VENDOR(0x0738), /* Mad Catz X-Box 360 controllers */ |
241 { USB_DEVICE(0x0738, 0x4540) }, /* Mad Catz Beat Pad */ |
|
241 XPAD_XBOX360_VENDOR(0x0e6f), /* 0x0e6f X-Box 360 controllers */ 242 XPAD_XBOX360_VENDOR(0x12ab), /* X-Box 360 dance pads */ 243 XPAD_XBOX360_VENDOR(0x1430), /* RedOctane X-Box 360 controllers */ 244 XPAD_XBOX360_VENDOR(0x146b), /* BigBen Interactive Controllers */ 245 XPAD_XBOX360_VENDOR(0x1bad), /* Harminix Rock Band Guitar and Drums */ 246 XPAD_XBOX360_VENDOR(0x0f0d), /* Hori Controllers */ 247 { } 248}; 249 250MODULE_DEVICE_TABLE (usb, xpad_table); 251 252struct usb_xpad { 253 struct input_dev *dev; /* input device interface */ 254 struct usb_device *udev; /* usb device */ | 242 XPAD_XBOX360_VENDOR(0x0e6f), /* 0x0e6f X-Box 360 controllers */ 243 XPAD_XBOX360_VENDOR(0x12ab), /* X-Box 360 dance pads */ 244 XPAD_XBOX360_VENDOR(0x1430), /* RedOctane X-Box 360 controllers */ 245 XPAD_XBOX360_VENDOR(0x146b), /* BigBen Interactive Controllers */ 246 XPAD_XBOX360_VENDOR(0x1bad), /* Harminix Rock Band Guitar and Drums */ 247 XPAD_XBOX360_VENDOR(0x0f0d), /* Hori Controllers */ 248 { } 249}; 250 251MODULE_DEVICE_TABLE (usb, xpad_table); 252 253struct usb_xpad { 254 struct input_dev *dev; /* input device interface */ 255 struct usb_device *udev; /* usb device */ |
255 struct usb_interface *intf; /* usb interface */ | |
256 257 int pad_present; 258 259 struct urb *irq_in; /* urb for interrupt in report */ 260 unsigned char *idata; /* input data */ 261 dma_addr_t idata_dma; 262 263 struct urb *bulk_out; --- 189 unchanged lines hidden (view full) --- 453 return; 454 455 xpad360_process_packet(xpad, cmd, &data[4]); 456} 457 458static void xpad_irq_in(struct urb *urb) 459{ 460 struct usb_xpad *xpad = urb->context; | 256 257 int pad_present; 258 259 struct urb *irq_in; /* urb for interrupt in report */ 260 unsigned char *idata; /* input data */ 261 dma_addr_t idata_dma; 262 263 struct urb *bulk_out; --- 189 unchanged lines hidden (view full) --- 453 return; 454 455 xpad360_process_packet(xpad, cmd, &data[4]); 456} 457 458static void xpad_irq_in(struct urb *urb) 459{ 460 struct usb_xpad *xpad = urb->context; |
461 struct device *dev = &xpad->intf->dev; | |
462 int retval, status; 463 464 status = urb->status; 465 466 switch (status) { 467 case 0: 468 /* success */ 469 break; 470 case -ECONNRESET: 471 case -ENOENT: 472 case -ESHUTDOWN: 473 /* this urb is terminated, clean up */ | 461 int retval, status; 462 463 status = urb->status; 464 465 switch (status) { 466 case 0: 467 /* success */ 468 break; 469 case -ECONNRESET: 470 case -ENOENT: 471 case -ESHUTDOWN: 472 /* this urb is terminated, clean up */ |
474 dev_dbg(dev, "%s - urb shutting down with status: %d\n", | 473 dbg("%s - urb shutting down with status: %d", |
475 __func__, status); 476 return; 477 default: | 474 __func__, status); 475 return; 476 default: |
478 dev_dbg(dev, "%s - nonzero urb status received: %d\n", | 477 dbg("%s - nonzero urb status received: %d", |
479 __func__, status); 480 goto exit; 481 } 482 483 switch (xpad->xtype) { 484 case XTYPE_XBOX360: 485 xpad360_process_packet(xpad, 0, xpad->idata); 486 break; 487 case XTYPE_XBOX360W: 488 xpad360w_process_packet(xpad, 0, xpad->idata); 489 break; 490 default: 491 xpad_process_packet(xpad, 0, xpad->idata); 492 } 493 494exit: 495 retval = usb_submit_urb(urb, GFP_ATOMIC); 496 if (retval) | 478 __func__, status); 479 goto exit; 480 } 481 482 switch (xpad->xtype) { 483 case XTYPE_XBOX360: 484 xpad360_process_packet(xpad, 0, xpad->idata); 485 break; 486 case XTYPE_XBOX360W: 487 xpad360w_process_packet(xpad, 0, xpad->idata); 488 break; 489 default: 490 xpad_process_packet(xpad, 0, xpad->idata); 491 } 492 493exit: 494 retval = usb_submit_urb(urb, GFP_ATOMIC); 495 if (retval) |
497 dev_err(dev, "%s - usb_submit_urb failed with result %d\n", 498 __func__, retval); | 496 err ("%s - usb_submit_urb failed with result %d", 497 __func__, retval); |
499} 500 501static void xpad_bulk_out(struct urb *urb) 502{ | 498} 499 500static void xpad_bulk_out(struct urb *urb) 501{ |
503 struct usb_xpad *xpad = urb->context; 504 struct device *dev = &xpad->intf->dev; 505 | |
506 switch (urb->status) { 507 case 0: 508 /* success */ 509 break; 510 case -ECONNRESET: 511 case -ENOENT: 512 case -ESHUTDOWN: 513 /* this urb is terminated, clean up */ | 502 switch (urb->status) { 503 case 0: 504 /* success */ 505 break; 506 case -ECONNRESET: 507 case -ENOENT: 508 case -ESHUTDOWN: 509 /* this urb is terminated, clean up */ |
514 dev_dbg(dev, "%s - urb shutting down with status: %d\n", 515 __func__, urb->status); | 510 dbg("%s - urb shutting down with status: %d", __func__, urb->status); |
516 break; 517 default: | 511 break; 512 default: |
518 dev_dbg(dev, "%s - nonzero urb status received: %d\n", 519 __func__, urb->status); | 513 dbg("%s - nonzero urb status received: %d", __func__, urb->status); |
520 } 521} 522 523#if defined(CONFIG_JOYSTICK_XPAD_FF) || defined(CONFIG_JOYSTICK_XPAD_LEDS) 524static void xpad_irq_out(struct urb *urb) 525{ | 514 } 515} 516 517#if defined(CONFIG_JOYSTICK_XPAD_FF) || defined(CONFIG_JOYSTICK_XPAD_LEDS) 518static void xpad_irq_out(struct urb *urb) 519{ |
526 struct usb_xpad *xpad = urb->context; 527 struct device *dev = &xpad->intf->dev; | |
528 int retval, status; 529 530 status = urb->status; 531 532 switch (status) { 533 case 0: 534 /* success */ 535 return; 536 537 case -ECONNRESET: 538 case -ENOENT: 539 case -ESHUTDOWN: 540 /* this urb is terminated, clean up */ | 520 int retval, status; 521 522 status = urb->status; 523 524 switch (status) { 525 case 0: 526 /* success */ 527 return; 528 529 case -ECONNRESET: 530 case -ENOENT: 531 case -ESHUTDOWN: 532 /* this urb is terminated, clean up */ |
541 dev_dbg(dev, "%s - urb shutting down with status: %d\n", 542 __func__, status); | 533 dbg("%s - urb shutting down with status: %d", __func__, status); |
543 return; 544 545 default: | 534 return; 535 536 default: |
546 dev_dbg(dev, "%s - nonzero urb status received: %d\n", 547 __func__, status); | 537 dbg("%s - nonzero urb status received: %d", __func__, status); |
548 goto exit; 549 } 550 551exit: 552 retval = usb_submit_urb(urb, GFP_ATOMIC); 553 if (retval) | 538 goto exit; 539 } 540 541exit: 542 retval = usb_submit_urb(urb, GFP_ATOMIC); 543 if (retval) |
554 dev_err(dev, "%s - usb_submit_urb failed with result %d\n", 555 __func__, retval); | 544 err("%s - usb_submit_urb failed with result %d", 545 __func__, retval); |
556} 557 558static int xpad_init_output(struct usb_interface *intf, struct usb_xpad *xpad) 559{ 560 struct usb_endpoint_descriptor *ep_irq_out; 561 int error; 562 563 if (xpad->xtype == XTYPE_UNKNOWN) --- 96 unchanged lines hidden (view full) --- 660 xpad->odata[9] = 0x00; 661 xpad->odata[10] = 0x00; 662 xpad->odata[11] = 0x00; 663 xpad->irq_out->transfer_buffer_length = 12; 664 665 return usb_submit_urb(xpad->irq_out, GFP_ATOMIC); 666 667 default: | 546} 547 548static int xpad_init_output(struct usb_interface *intf, struct usb_xpad *xpad) 549{ 550 struct usb_endpoint_descriptor *ep_irq_out; 551 int error; 552 553 if (xpad->xtype == XTYPE_UNKNOWN) --- 96 unchanged lines hidden (view full) --- 650 xpad->odata[9] = 0x00; 651 xpad->odata[10] = 0x00; 652 xpad->odata[11] = 0x00; 653 xpad->irq_out->transfer_buffer_length = 12; 654 655 return usb_submit_urb(xpad->irq_out, GFP_ATOMIC); 656 657 default: |
668 dev_dbg(&xpad->dev->dev, 669 "%s - rumble command sent to unsupported xpad type: %d\n", | 658 dbg("%s - rumble command sent to unsupported xpad type: %d", |
670 __func__, xpad->xtype); 671 return -1; 672 } 673 } 674 675 return 0; 676} 677 --- 173 unchanged lines hidden (view full) --- 851 852 xpad->irq_in = usb_alloc_urb(0, GFP_KERNEL); 853 if (!xpad->irq_in) { 854 error = -ENOMEM; 855 goto fail2; 856 } 857 858 xpad->udev = udev; | 659 __func__, xpad->xtype); 660 return -1; 661 } 662 } 663 664 return 0; 665} 666 --- 173 unchanged lines hidden (view full) --- 840 841 xpad->irq_in = usb_alloc_urb(0, GFP_KERNEL); 842 if (!xpad->irq_in) { 843 error = -ENOMEM; 844 goto fail2; 845 } 846 847 xpad->udev = udev; |
859 xpad->intf = intf; | |
860 xpad->mapping = xpad_device[i].mapping; 861 xpad->xtype = xpad_device[i].xtype; 862 863 if (xpad->xtype == XTYPE_UNKNOWN) { 864 if (intf->cur_altsetting->desc.bInterfaceClass == USB_CLASS_VENDOR_SPEC) { 865 if (intf->cur_altsetting->desc.bInterfaceProtocol == 129) 866 xpad->xtype = XTYPE_XBOX360W; 867 else --- 194 unchanged lines hidden --- | 848 xpad->mapping = xpad_device[i].mapping; 849 xpad->xtype = xpad_device[i].xtype; 850 851 if (xpad->xtype == XTYPE_UNKNOWN) { 852 if (intf->cur_altsetting->desc.bInterfaceClass == USB_CLASS_VENDOR_SPEC) { 853 if (intf->cur_altsetting->desc.bInterfaceProtocol == 129) 854 xpad->xtype = XTYPE_XBOX360W; 855 else --- 194 unchanged lines hidden --- |