The device can be seen under Linux, but doesn’t support any input handlers:
I: Bus=0005 Vendor=054c Product=0306 Version=0100 N: Name="Sony Computer Entertainment Inc BD Remote Control"
When dumping the data from a bluetooth connection, the stream looks like this:
ACL data: handle 43 flags 0x02 dlen 17
L2CAP(d): cid 0x0041 len 13 [psm 0]
A1 01 b1 b2 b3 keycode FF FF FF FF FF dn 05
When multiple buttons are pressed down, the keycode will be FF as if no buttons are pressed, e.g. pressing and holding triangle and circle and releasing them in the same order results in the following stream:
A1 01 00 10 00 5C FF FF FF FF FF 01 05
A1 01 00 30 00 FF FF FF FF FF FF 01 05
A1 01 00 20 00 5D FF FF FF FF FF 01 05
A1 01 00 00 00 FF FF FF FF FF FF 00 05
So, for games / motion, we really want to use the button bit masks and the dn flag that indicates buttons are pressed.
Of note, L3 and R3 mapped to left and right hats, so L3 and R3 is probably their official terminology and and additional button ENTER is provided over and above the standard six axis digital buttons.
Apart from the missing extra 00 byte at the start of the stream, it is very similar to the start of the controller stream.
| Key events | |
|---|---|
| Key | keycode |
| nothing or mutliple | FF |
| EJECT | 16 |
| 1 | 00 |
| 2 | 01 |
| 3 | 02 |
| AUDIO | 64 |
| 4 | 03 |
| 5 | 04 |
| 6 | 05 |
| ANGLE | 65 |
| 7 | 06 |
| 8 | 07 |
| 9 | 08 |
| SUBTITLE | 63 |
| CLEAR | 0F |
| 0 | 09 |
| TIME | 28 |
| RED | 81 |
| GREEN | 82 |
| YELLOW | 83 |
| BLUE | 80 |
| DISPLAY | 70 |
| TOP MENU | 1A |
| POPUP MENU | 40 |
| RETURN | 0E |
| TRIANGLE | 5C (b2⇒10) |
| CIRCLE | 5D (b2⇒20) |
| CROSS | 5E (b2⇒40) |
| SQUARE | 5F (b2⇒80) |
| UP | 54 (b1⇒10) |
| RIGHT | 55 (b1⇒20) |
| DOWN | 56 (b1⇒40) |
| LEFT | 57 (b1⇒80) |
| ENTER | 0B (b3⇒08) |
| L1 | 5A (b2⇒04) |
| L2 | 58 (b2⇒01) |
| L3 | 51 (b1⇒02) |
| R1 | 5B (b2⇒08) |
| R2 | 59 (b2⇒02) |
| R3 | 52 (b1⇒04) |
| PS | 43 (b3⇒01) |
| SELECT | 50 (b1⇒01) |
| START | 53 (b1⇒08) |
| SCAN L | 33 |
| PLAY | 32 |
| SCAN R | 34 |
| PREV | 30 |
| STOP | 38 |
| NEXT | 31 |
| SLOW L | 60 |
| PAUSE | 39 |
| SLOW R | 61 |
The HID report protocol for the remote is very odd:
Global 05 01 usage page (generic desktop) Local 09 05 usage (gamepad) Main a1 01 collection (Application) Global 85 01 report ID (1) Global 15 00 local minimum 0000 Global 26 ff 00 local maximum 00FF Global 75 08 report size 8 Global 95 0b report count 11 Global 06 00 ff usage page (0xFF00) Local 09 01 usage (0x0001) Main 81 00 input (data, array [this is wrong], absolute, no wrap, linear) Global 85 01 report ID (1) Global 95 0b report count 11 Local 09 01 usage (0x0001) Main b1 00 feature (data, array, absolute) Global 85 02 report ID (2) Global 95 0b report count 11 Local 09 01 usage (1) Main b1 00 feature (data, array, abs) Global 85 03 report ID (3) Global 95 0b report count 11 Local 09 01 usage (1) Main b1 00 feature (data, array, abs) Global 85 04 report id (4) Global 95 0b report count 11 Local 09 01 usage (1) Main b1 00 feature (data, array, abs) Global 85 05 report id (5) Global 95 0b report count 11 Local 09 01 usage (1) Main b1 00 feature (data, array, abs) Global 85 06 report id (6) Global 95 0b report count 11 Local 09 01 usage (1) Main b1 00 feature (data, array, abs) Main c0 end collection Main 00
Now, I’m very new to these HID descriptors, but from what I can tell, the input should probably be encoded as 81 01 (read a collection of values) and I’ve no idea what the feature stuff is trying to achieve... it just looks very broken.
Experimental patch supporting ps3 remote for 2.6.22 kernel [ftp://ftp.perex.cz/pub/ps3/ps3.bdremote.patch] (no button bitmask support yet).
Note that with above patch, the event device gets unregistered after some time, but the L2 connection keeps running. Add something like:
ACTION=="remove",KERNEL=="event*",ENV{ID_SERIAL}=="Sony_Bluetooth_Transceiver", PROGRAM="hcitool dc 00:19:aa:bb:cc:dd"
to udev rules to destroy l2 and let register new event device.