Thanks to Saund098's post, I found a way to use it with Gimx.
This HowTo should work with any other non-genuine xbox 360 gamepad.
I) Tools
You need wxGTK, bluez, glib, libxml2, libxi and libusb to compile Gimx software.
You need avr-gcc and avr-libc to compile the firmware for the Gimx_usb adapter.
II) Getting the sources
You need the sources of gimx software. In a terminal, do
You also need the firmware sources for the Gimx_usb adapter.$ svn checkout http://diyps3controller.googlecode.com/svn/trunk/GIMX
III) The gamepad$ svn checkout http://diyps3controller.googlecode.com/svn/trunk/EMU360
We must now get some informations about our gamepad. Connect it to your computer and do
So our gamepad vendor ID is "1bad" and its product ID is "f016". Now we want more verbosity about it. We are looking for the bcdDevice version number and for four strings of numbers corresponding to the unrecognized interfaces descriptors that depend on the bcdDevice version. Actually, only the first three ones should vary as the last one stands for the microsoft xbox gamepad security checking.$ lsusb
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 002 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 003 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 004 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 005 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 005 Device 008: ID 1bad:f016 Harmonix Music # ok, this is my gamepad # with ID's 1bad:f016
Code: Select all
$ lsusb -v -d 1bad:f016
Bus 005 Device 008: ID 1bad:f016 Harmonix Music
Device Descriptor:
bLength 18
bDescriptorType 1
bcdUSB 2.00
bDeviceClass 255 Vendor Specific Class
bDeviceSubClass 255 Vendor Specific Subclass
bDeviceProtocol 255 Vendor Specific Protocol
bMaxPacketSize0 8
idVendor 0x1bad Harmonix Music # We already know
idProduct 0xf016 # these ID's
bcdDevice 4.90 # This is the version number of bcdDevice
# we will need it
iManufacturer 1 Mad Catz, Inc.
iProduct 2 MadCatz GamePad
iSerial 3 026B03EC
bNumConfigurations 1
Configuration Descriptor:
bLength 9
bDescriptorType 2
wTotalLength 153
bNumInterfaces 4
bConfigurationValue 1
iConfiguration 0
bmAttributes 0xa0
(Bus Powered)
Remote Wakeup
MaxPower 500mA
Interface Descriptor: # first interface
bLength 9
bDescriptorType 4
bInterfaceNumber 0
bAlternateSetting 0
bNumEndpoints 2
bInterfaceClass 255 Vendor Specific Class
bInterfaceSubClass 93
bInterfaceProtocol 1
iInterface 0
** UNRECOGNIZED: 11 21 10 01 01 25 81 14 03 03 03 04 13 02 08 03 03 # first # unknown # descriptor
Endpoint Descriptor:
bLength 7
bDescriptorType 5
bEndpointAddress 0x81 EP 1 IN
bmAttributes 3
Transfer Type Interrupt
Synch Type None
Usage Type Data
wMaxPacketSize 0x0020 1x 32 bytes
bInterval 4
Endpoint Descriptor:
bLength 7
bDescriptorType 5
bEndpointAddress 0x02 EP 2 OUT
bmAttributes 3
Transfer Type Interrupt
Synch Type None
Usage Type Data
wMaxPacketSize 0x0020 1x 32 bytes
bInterval 8
Interface Descriptor:
bLength 9
bDescriptorType 4
bInterfaceNumber 1
bAlternateSetting 0
bNumEndpoints 4
bInterfaceClass 255 Vendor Specific Class
bInterfaceSubClass 93
bInterfaceProtocol 3
iInterface 0
** UNRECOGNIZED: 1b 21 10 01 01 01 83 40 01 04 20 16 85 00 00 00 00 00 00 16 05 00 00 00 00 00 00 # second unknown
# descriptor
Endpoint Descriptor:
bLength 7
bDescriptorType 5
bEndpointAddress 0x83 EP 3 IN
bmAttributes 3
Transfer Type Interrupt
Synch Type None
Usage Type Data
wMaxPacketSize 0x0020 1x 32 bytes
bInterval 2
Endpoint Descriptor:
bLength 7
bDescriptorType 5
bEndpointAddress 0x04 EP 4 OUT
bmAttributes 3
Transfer Type Interrupt
Synch Type None
Usage Type Data
wMaxPacketSize 0x0020 1x 32 bytes
bInterval 4
Endpoint Descriptor:
bLength 7
bDescriptorType 5
bEndpointAddress 0x85 EP 5 IN
bmAttributes 3
Transfer Type Interrupt
Synch Type None
Usage Type Data
wMaxPacketSize 0x0020 1x 32 bytes
bInterval 64
Endpoint Descriptor:
bLength 7
bDescriptorType 5
bEndpointAddress 0x05 EP 5 OUT
bmAttributes 3
Transfer Type Interrupt
Synch Type None
Usage Type Data
wMaxPacketSize 0x0020 1x 32 bytes
bInterval 16
Interface Descriptor:
bLength 9
bDescriptorType 4
bInterfaceNumber 2
bAlternateSetting 0
bNumEndpoints 1
bInterfaceClass 255 Vendor Specific Class
bInterfaceSubClass 93
bInterfaceProtocol 2
iInterface 0
** UNRECOGNIZED: 09 21 10 01 01 22 86 07 00 # third unknown # descriptor
Endpoint Descriptor:
bLength 7
bDescriptorType 5
bEndpointAddress 0x86 EP 6 IN
bmAttributes 3
Transfer Type Interrupt
Synch Type None
Usage Type Data
wMaxPacketSize 0x0020 1x 32 bytes
bInterval 16
Interface Descriptor:
bLength 9
bDescriptorType 4
bInterfaceNumber 3
bAlternateSetting 0
bNumEndpoints 0
bInterfaceClass 255 Vendor Specific Class
bInterfaceSubClass 253
bInterfaceProtocol 19
iInterface 4 Xbox Security Method 3, Version 1.00, � 2005 Microsoft Corporation. All rights reserved.
** UNRECOGNIZED: 06 41 00 01 01 03 # last one which is always the same for # every xbox compatible gamepad
Device Status: 0x0000
(Bus Powered)
Vendor ID is : 1bad
Product ID is : f016
bcdDevice version is : 490
1° unknown descriptor is : 11 21 10 01 01 25 81 14 03 03 03 04 13 02 08 03 03
2° unknown descriptor is : 1b 21 10 01 01 01 83 40 01 04 20 16 85 00 00 00 00 00 00 16 05 00 00 00 00 00 00
3° unknown descriptor is : 09 21 10 01 01 22 86 07 00
4° unknown descriptor is : 06 41 00 01 01 03
IV) Modifying source code
A) gimx-serial
In a text editor, open the file ~/GIMX/core/utils/usbspoof.c
Line 33, change
to your gamepad ID's, in my exemple#define VENDOR 0x045e
#define PRODUCT 0x028e
To get debug info automatically, line 56 you may also change#define VENDOR 0x1bad
#define PRODUCT 0xf016
tostatic int spoof = 0;
static int debug = 0;
static int verbose = 0;
static int libusb_debug = 0;
Save and compile as explained here.static int spoof = 0;
static int debug = 1;
static int verbose = 1;
static int libusb_debug = 0;
B) GIMX_usb firmware
In a text editor, open ~/EMU360/Descriptors.c
Around line 55, change
to.VendorID = 0x045e,
.ProductID = 0x028e,
.ReleaseNumber = 0x0110,
Then, around line 155, change.VendorID = 0x1bad,
.ProductID = 0xf016,
.ReleaseNumber = 0x0490,
Code: Select all
.UnkownDescriptor1 =
{
0x11, 0x21, 0x10, 0x01, 0x01, 0x25, 0x81, 0x14, 0x03, 0x03, 0x03, 0x04, 0x13, 0x02, 0x08, 0x03, 0x03
},
.UnkownDescriptor2 =
{
0x1b, 0x21, 0x00, 0x01, 0x01, 0x01, 0x83, 0x40, 0x01, 0x04, 0x20, 0x16, 0x85, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x16, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
},
.UnkownDescriptor3 =
{
0x09, 0x21, 0x00, 0x01, 0x01, 0x22, 0x86, 0x07, 0x00
},
.UnkownDescriptor4 =
{
0x06, 0x41, 0x00, 0x01, 0x01, 0x03
},
Code: Select all
.UnkownDescriptor1 =
{
0x11, 0x21, 0x10, 0x01, 0x01, 0x25, 0x81, 0x14, 0x03, 0x03, 0x03, 0x04, 0x13, 0x02, 0x08, 0x03, 0x03
},
.UnkownDescriptor2 =
{
0x1b, 0x21, 0x10, 0x01, 0x01, 0x01, 0x83, 0x40, 0x01, 0x04, 0x20, 0x16, 0x85, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x16, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
},
.UnkownDescriptor3 =
{
0x09, 0x21, 0x10, 0x01, 0x01, 0x22, 0x86, 0x07, 0x00
},
.UnkownDescriptor4 =
{
0x06, 0x41, 0x00, 0x01, 0x01, 0x03
},
Your new firmware is now in the ~/EMU360/firmwares folder. You can load it on your Teensy board.$ cd /way/to/.../EMU360
$ ./genall
Enjoy...