Location: Home => Projects => XBox 360 Controller => Wired Controller Information

Here is what I’ve found so far:

If you’re buying a 360 controller, or any other relevant items, please consider using my affiliate link:

USB info

Vendor: 0x045e (Microsoft)
Product: 0x028e (UK version?)
Version: 0x0110

Class 255, subclass 255, protocol 255

Interface 0: class 255, subclass 93, protocol 1
2 interrupt endpoints: in, out

Interface 1: class 255, subclass 93, protocol 3
4 interrupt endpoints: in, out, in, out

Interface 2: class 255, subclass 93, protocol 2
1 interrupt endpoint: in

Interface 3: class 255, subclass 253, protocol 19
0 endpoints

I suspect the controller is a standard HID device, but without any of the descriptors required for a class driver to use it. However, I don’t know enough about HID devices (I’ve only briefly experimented with making a HID device using a USB PIC) to say for certain.

I have created a MacOS X userspace USB program to experiment with the controller, and so far have concentrated on interface 0 (based on this page I believe the others may be things like a USB hub). It is simple enough to read the in pipe and receive packets regarding the state of all buttons and axis on the device. Alongside this, the controller will return some information at start up (size is decimal, data in hex):

Got 3 bytes: 01030E
Got 3 bytes: 020300
Got 3 bytes: 030303
Got 3 bytes: 080300

Along with the standard update from the device:

Report format

Reports are type 0x00, and seem to be 20 bytes long:

0014ttttxxyyaaaaaaaabbbbbbbb000000000000

Where x is the left trigger, y is the right trigger, a is the left hat, b is the right hat and t is the buttons:

Table 1. Button bitmask

0x0001

Left shoulder

0x0002

Right shoulder

0x0004

XBox button

0x0008

0x0010

A

0x0020

B

0x0040

X

0x0080

Y

0x0100

D-pad up

0x0200

D-pad down

0x0400

D-pad left

0x0800

D-pad right

0x1000

Start

0x2000

Back

0x4000

Left hat button

0x8000

Right hat button

Report type 08

This report takes the format 0803xx, I believe 03 is the packet size and 08 is the type. xx appears to indicate whether or not a headset is attached - 00 is no headset, 02 is headset connected. This occurs whether or not the chatpad is connected, although attaching the chatpad can cause phantom "headset connected" conditions as the plug is temporarily shorted out.

LED Control

Some control over the LEDs surrounding the XBox button is provided, corresponding to the markings 1, 2, 3 and 4. This is controlled using message type 0x01.

To select a new pattern for the LEDs, send a message of the following form:

0103xx

Where xx is the desired pattern:

Table 2. LED mode

0x00

All off

0x01

All blinking

0x02

1 flashes

0x03

2 flashes

0x04

3 flashes

0x05

4 flashes

0x06

1 on

0x07

2 on

0x08

3 on

0x09

4 on

0x0A

Rotating (e.g. 1-2-4-3)

0x0B

Blinking*

0x0C

Slow blinking*

0x0D

Alternating (e.g. 1+4-2+3)

* The previous setting will be used for these (all blinking, or 1, 2, 3 or 4 on).

At startup, the device seems to report 01030E. I believe this to indicate that there are 14 options (e.g. 0 to D hex) for the LEDs.

Rumble

Rumbling is also similar to on the original controller. Rumble commands take the following form:

000800bbll000000

Where b is the speed to set the motor with the big weight, and l is the speed to set the small weight (0x00 to 0xFF in both cases).

Other interfaces

I believe Interface 1 is audio - from what I’ve seen on Linux it’s as simple as reading data from that pipe to record, and then writing it back to play. At some point I intend to add support for this to the OSX driver.

Interface 3 also reports itself as a security device of some sort. I believe it to be the mechanism by which the XBox 360 detects licensed controllers (without the interface, which you must license from Microsoft to include in your controller, the 360 will reject it).

Copyright © 2006-2023 Colin Munro. All rights reserved.