The HID descriptor

The HID descriptor defines:
– 4 axis (x, y, z, rz)
– 1 hat switch
– 12 buttons

There are 13 buttons on a ps3 controller.
PS3 button is not very useful, omitting it allows avoiding padding.

/* Usage Page (Generic Desktop)*/ 0x05, 0x01,
/*Usage (Joystick)*/ 0x09, 0x04,
/*Collection (Application)*/ 0xA1, 0x01,
/*Collection (Logical)*/ 0xA1, 0x02,
/*Logical Minimum (0)*/ 0x15, 0x00,
/*Logical Maximum (255)*/ 0x26, 0xFF, 0x00,
/*Physical Minimum (0)*/ 0x35, 0x00,
/*Physical Maximum (255)*/ 0x46, 0xFF, 0x00,
/*Report Size (8)*/ 0x75, 0x08,
/*Report Count (4)*/ 0x95, 0x04,
/*Usage (X)*/ 0x09, 0x30,
/*Usage (Y)*/ 0x09, 0x31,
/*Usage (Z)*/ 0x09, 0x32,
/*Usage (Rz)*/ 0x09, 0x35,
/*Input (Data,Var,Abs,NWrp,Lin,Pref,NNul,Bit)*/ 0x81, 0x02,
/*Logical Maximum (7)*/ 0x25, 0x07,
/*Physical Maximum (315)*/ 0x46, 0x3B, 0x01,
/*Report Size (4)*/ 0x75, 0x04,
/*Report Count (1)*/ 0x95, 0x01,
/*Unit (Eng Rot: Degree)*/ 0x65, 0x14,
/*Usage (Hat Switch)*/ 0x09, 0x39,
/*Input (Data,Var,Abs,NWrp,Lin,Pref,Null,Bit)*/ 0x81, 0x42,
/*Unit (None)*/ 0x65, 0x00,
/*Logical Maximum (1)*/ 0x25, 0x01,
/*Physical Maximum (1)*/ 0x45, 0x01,
/*Report Size (1)*/ 0x75, 0x01,
/*Report Count (12)*/ 0x95, 0x0C,
/*Usage Page (Button)*/ 0x05, 0x09,
/*Usage Minimum (Button 1)*/ 0x19, 0x01,
/*Usage Maximum (Button 12)*/ 0x29, 0x0C,
/*Input (Data,Var,Abs,NWrp,Lin,Pref,NNul,Bit)*/ 0x81, 0x02,
/*End Collection*/ 0xC0,
/*End Collection*/ 0xC0

Mouse-Keyboard to PS3 Joystick adapter
Above screenshot shows the result of this hid device with jstest-gtk as joystick calibration program (axis 4-5 are not relevant).

Coming soon…

The first diy project I want to share is a mouse and keyboard to ps3 converter.

The hardware part is made of a usb development board called “Teensy++”:
Teensy++ 2.0
It is available at:

The mouse and the keyboard are directly wired on pins of the Teensy++ (both are ps/2 devices).

The Teensy++ is connected to the ps3 and acts as a standard ps3 usb hid controller.

The software part is mostly code written by Rick for its XBOX360 controller:

Conception steps:
1/ I modified the usb hid keyboard example available at so as to make a usb hid joystick recognized by the ps3.
2/ I transplanted it into Rick’s code.
3/ I wrapped mouse and keyboard buttons to joystick buttons.
4/ I wrapped x and y mouse movements to joystick z and rz axis.
5/ I made some calibration tests to adapt mouse movements to thumbstick movements.

Step 5 is not yet finished, I’m working on improvements.

I will share all hardware and software details as soon as possible. As my controller is working, I currently spend a lot of my free time playing farcry with it 😉