2007-10-07 18:40:35

by Aristeu Rozanski

[permalink] [raw]
Subject: [Bluez-devel] [RFC][PATCH 4/4] add support to ps3 remote controller

And finally, adding support to PS3 remote controller.

--- input.orig/fake_hid.c 2007-10-07 12:12:21.000000000 -0400
+++ input/fake_hid.c 2007-10-07 14:10:52.000000000 -0400
@@ -1,8 +1,12 @@
#include <stdio.h>
#include <stdlib.h>
+#include <fcntl.h>
+#include <unistd.h>
#include <errno.h>
#include <sys/types.h>
#include <glib.h>
+#include <linux/input.h>
+#include <linux/uinput.h>
#include <dbus/dbus.h>
#include <bluetooth/bluetooth.h>
#include <bluetooth/hidp.h>
@@ -22,6 +26,202 @@
.setup_uinput = s, \
}

+/* ps3 remote support */
+static unsigned int ps3remote_keymap[] = {
+ [0x16] = KEY_EJECTCD,
+ [0x64] = KEY_AUDIO,
+ [0x65] = KEY_ANGLE,
+ [0x63] = KEY_SUBTITLE,
+ [0x0f] = KEY_CLEAR,
+ [0x28] = KEY_TIME,
+ [0x00] = KEY_1,
+ [0x01] = KEY_2,
+ [0x02] = KEY_3,
+ [0x03] = KEY_4,
+ [0x04] = KEY_5,
+ [0x05] = KEY_6,
+ [0x06] = KEY_7,
+ [0x07] = KEY_8,
+ [0x08] = KEY_9,
+ [0x09] = KEY_0,
+ [0x81] = KEY_RED,
+ [0x82] = KEY_GREEN,
+ [0x80] = KEY_BLUE,
+ [0x83] = KEY_YELLOW,
+ [0x70] = KEY_DISPLAYTOGGLE, /* display */
+ [0x1a] = BTN_TOP, /* top menu */
+ [0x40] = KEY_MENU, /* pop up/menu */
+ [0x0e] = KEY_ESC, /* return */
+ [0x5c] = KEY_OPTION, /* options/triangle */
+ [0x5d] = KEY_BACK, /* back/circle */
+ [0x5f] = KEY_SCREEN, /* view/square */
+ [0x5e] = KEY_ENTER, /* cross */
+ [0x54] = KEY_UP,
+ [0x56] = KEY_DOWN,
+ [0x57] = KEY_LEFT,
+ [0x55] = KEY_RIGHT,
+ [0x0b] = KEY_ENTER,
+ [0x5a] = BTN_1, /* L1 */
+ [0x58] = BTN_2, /* L2 */
+ [0x51] = BTN_3, /* L3 */
+ [0x5b] = BTN_4, /* R1 */
+ [0x59] = BTN_5, /* R2 */
+ [0x52] = BTN_6, /* R3 */
+ [0x43] = KEY_VENDOR, /* PS button */
+ [0x50] = BTN_SELECT,
+ [0x53] = BTN_START,
+ [0x33] = KEY_BACK, /* scan back */
+ [0x32] = KEY_PLAY,
+ [0x34] = KEY_FORWARD, /* scan forward */
+ [0x30] = KEY_PREVIOUS,
+ [0x38] = KEY_STOP,
+ [0x31] = KEY_NEXT,
+ [0x60] = KEY_PREVIOUSSONG, /* slow/step back */
+ [0x39] = KEY_PAUSE,
+ [0x61] = KEY_NEXTSONG, /* slow/step forward */
+ [0xff] = KEY_MAX,
+};
+
+static int ps3remote_decode(char *buff, int size, unsigned int *value)
+{
+ static unsigned int lastkey = KEY_RESERVED;
+ int retval, ps3;
+
+ if (size < 12) {
+ error("Got a shorter packet! (size %i)\n", size);
+ return KEY_RESERVED;
+ }
+
+ *value = buff[11];
+
+ if (*value == 0)
+ return lastkey;
+
+ ps3 = buff[5];
+ lastkey = retval = ps3remote_keymap[ps3];
+
+ if (retval == KEY_RESERVED)
+ error("ps3remote: unrecognized key [%#x] value [%#x]",
+ buff[5], buff[11]);
+
+ return retval;
+}
+
+static gboolean ps3remote_event(GIOChannel *chan, GIOCondition cond,
+ gpointer data)
+{
+ struct fake_input *fake = data;
+ struct input_event event;
+ unsigned int size, key, value;
+ char buff[50];
+
+ if (cond & G_IO_NVAL)
+ return FALSE;
+
+ if (cond & (G_IO_HUP | G_IO_ERR)) {
+ error("Hangup or error on rfcomm server socket");
+ goto failed;
+ }
+
+ memset(buff, 0, sizeof(buff));
+
+ if (g_io_channel_read(chan, buff, sizeof(buff), &size) !=
+ G_IO_ERROR_NONE) {
+ error("IO Channel read error");
+ goto failed;
+ }
+
+ key = ps3remote_decode(buff, size, &value);
+ if (key == KEY_RESERVED) {
+ error("Got invalid key from decode");
+ return TRUE;
+ }
+
+ memset(&event, 0, sizeof(event));
+ gettimeofday(&event.time, NULL);
+ event.type = EV_KEY;
+ event.code = key;
+ event.value = value;
+ if (write(fake->uinput, &event, sizeof(event)) != sizeof(event)) {
+ error("Error writing to uinput device");
+ goto failed;
+ }
+
+ memset(&event, 0, sizeof(event));
+ gettimeofday(&event.time, NULL);
+ event.type = EV_SYN;
+ event.code = SYN_REPORT;
+ if (write(fake->uinput, &event, sizeof(event)) != sizeof(event)) {
+ error("Error writing to uinput device");
+ goto failed;
+ }
+
+ return TRUE;
+failed:
+ ioctl(fake->uinput, UI_DEV_DESTROY);
+ close(fake->uinput);
+ fake->uinput = -1;
+ g_io_channel_unref(fake->io);
+
+ return FALSE;
+}
+
+static int ps3remote_setup_uinput(struct device *idev,
+ struct fake_hid *fake_hid)
+{
+ struct fake_input *fake = idev->fake;
+ struct uinput_user_dev dev;
+ int i;
+
+ fake->uinput = open("/dev/input/uinput", O_RDWR);
+ if (fake->uinput < 0) {
+ fake->uinput = open("/dev/uinput", O_RDWR);
+ if (fake->uinput < 0)
+ fake->uinput = open("/dev/misc/uinput", O_RDWR);
+ }
+ if (fake->uinput < 0) {
+ error("Error opening uinput device file. Is uinput loaded?");
+ return 1;
+ }
+
+ memset(&dev, 0, sizeof(dev));
+ snprintf(&dev.name, sizeof(dev.name), "%s", "PS3 Remote Controller");
+ dev.id.bustype = BUS_BLUETOOTH;
+ dev.id.vendor = idev->vendor;
+ dev.id.product = idev->product;
+
+ if (write(fake->uinput, &dev, sizeof(dev)) != sizeof(dev)) {
+ error("Error creating uinput device");
+ goto err;
+ }
+
+ /* enabling key events */
+ if (ioctl(fake->uinput, UI_SET_EVBIT, EV_KEY) < 0) {
+ error("Error enabling uinput device key events");
+ goto err;
+ }
+
+ /* enabling keys */
+ for (i = 0; i < 256; i++)
+ if (ps3remote_keymap[i] != KEY_RESERVED)
+ if (ioctl(fake->uinput, UI_SET_KEYBIT,
+ ps3remote_keymap[i]) < 0) {
+ error("Error enabling uinput key %i", ps3remote_keymap[i]);
+ goto err;
+ }
+
+ /* creating the device */
+ if (ioctl(fake->uinput, UI_DEV_CREATE) < 0) {
+ error("Error creating uinput device");
+ goto err;
+ }
+
+ return 0;
+err:
+ close(fake->uinput);
+ return 1;
+}
+
static gboolean fake_hid_common_connect(struct device *idev)
{
return TRUE;
@@ -38,6 +238,11 @@
}

static struct fake_hid fake_hid_table[] = {
+ FAKE_HID_ENTRY(SONY, PS3REMOTE, fake_hid_common_connect,
+ fake_hid_common_disconnect,
+ fake_hid_common_is_connected,
+ ps3remote_event,
+ ps3remote_setup_uinput),
{ },
};

--- input.orig/bluetooth_ids.h 2007-10-07 12:12:06.000000000 -0400
+++ input/bluetooth_ids.h 2007-10-07 12:12:24.000000000 -0400
@@ -3,6 +3,7 @@

#define BLUETOOTH_VENDOR_ID_SONY 0x054c
#define BLUETOOTH_DEVICE_ID_PS3CONTROLLER 0x0268
+#define BLUETOOTH_DEVICE_ID_PS3REMOTE 0x0306

#endif /* BLUETOOTH_IDS_H */


-------------------------------------------------------------------------
This SF.net email is sponsored by: Splunk Inc.
Still grepping through log files to find problems? Stop.
Now Search log events and configuration files using AJAX and a browser.
Download your FREE copy of Splunk now >> http://get.splunk.com/
_______________________________________________
Bluez-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/bluez-devel


2007-10-25 13:48:55

by Aristeu Rozanski

[permalink] [raw]
Subject: Re: [Bluez-devel] [RFC][PATCH 4/4] add support to ps3 remote controller

Here's the updated version of the table with some comments:

+static unsigned int ps3remote_keymap[] = {
+ [0x16] = KEY_EJECTCD,
+ [0x64] = KEY_AUDIO,
+ [0x65] = KEY_ANGLE,
+ [0x63] = KEY_SUBTITLE,
+ [0x0f] = KEY_CLEAR,
+ [0x28] = KEY_TIME,
+ [0x00] = KEY_1,
+ [0x01] = KEY_2,
+ [0x02] = KEY_3,
+ [0x03] = KEY_4,
+ [0x04] = KEY_5,
+ [0x05] = KEY_6,
+ [0x06] = KEY_7,
+ [0x07] = KEY_8,
+ [0x08] = KEY_9,
+ [0x09] = KEY_0,
these I really have no idea. KEY_REMOTE{1,2,3...}? having KEY_1, KEY_KP1
and KEY_something_else is really confusing. perhaps create a device
which always has numlock on?

+ [0x81] = KEY_RED,
+ [0x82] = KEY_GREEN,
+ [0x80] = KEY_BLUE,
+ [0x83] = KEY_YELLOW,
+ [0x70] = KEY_INFO, /* display */
+ [0x1a] = KEY_MENU, /* top menu */
+ [0x40] = KEY_CONTEXT_MENU, /* pop up/menu */
+ [0x0e] = KEY_ESC, /* return */
+ [0x5c] = KEY_OPTION, /* options/triangle */
+ [0x5d] = KEY_BACK, /* back/circle */
+ [0x5f] = KEY_SCREEN, /* view/square */
+ [0x5e] = KEY_ENTER, /* cross */
+ [0x54] = KEY_UP,
+ [0x56] = KEY_DOWN,
+ [0x57] = KEY_LEFT,
+ [0x55] = KEY_RIGHT,
+ [0x0b] = KEY_ENTER,
+ [0x5a] = BTN_TL, /* L1 */
+ [0x58] = BTN_TL2, /* L2 */
+ [0x51] = BTN_THUMBL, /* L3 */
+ [0x5b] = BTN_TR, /* R1 */
+ [0x59] = BTN_TR2, /* R2 */
+ [0x52] = BTN_THUMBR, /* R3 */
I think we should keep these as BTN, they're joystick buttons anyway.
the remote is a mix of remote with joystick.

+ [0x43] = KEY_HOMEPAGE, /* PS button */
+ [0x50] = KEY_SELECT,
+ [0x53] = BTN_START,
same here, perhaps go back to BTN_SELECT too?

+ [0x33] = KEY_REWIND, /* scan back */
+ [0x32] = KEY_PLAY,
+ [0x34] = KEY_FORWARD, /* scan forward */
+ [0x30] = KEY_PREVIOUS,
+ [0x38] = KEY_STOP,
+ [0x31] = KEY_NEXT,
+ [0x60] = KEY_FRAMEBACK, /* slow/step back */
+ [0x39] = KEY_PAUSE,
+ [0x61] = KEY_FRAMEFORWARD, /* slow/step forward */
created these, input.h patch attached

+ [0xff] = KEY_MAX,
+};

What you think Dmitry?

---
include/linux/input.h | 2 ++
1 file changed, 2 insertions(+)

--- linus-2.6.orig/include/linux/input.h 2007-10-25 09:22:03.000000000 -0400
+++ linus-2.6/include/linux/input.h 2007-10-25 09:23:39.000000000 -0400
@@ -526,6 +526,8 @@ struct input_absinfo {
#define KEY_DISPLAYTOGGLE 0x1af /* Turn display (LCD) on and off */
#define KEY_SPELLCHECK 0x1b0 /* AL Spell Check */
#define KEY_LOGOFF 0x1b1 /* AL Logoff */
+#define KEY_FRAMEBACK 0x1b2
+#define KEY_FRAMEFORWARD 0x1b3

#define KEY_DEL_EOL 0x1c0
#define KEY_DEL_EOS 0x1c1

-------------------------------------------------------------------------
This SF.net email is sponsored by: Splunk Inc.
Still grepping through log files to find problems? Stop.
Now Search log events and configuration files using AJAX and a browser.
Download your FREE copy of Splunk now >> http://get.splunk.com/
_______________________________________________
Bluez-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/bluez-devel

2007-10-09 14:06:29

by Bastien Nocera

[permalink] [raw]
Subject: Re: [Bluez-devel] [RFC][PATCH 4/4] add support to ps3 remote controller

On Tue, 2007-10-09 at 09:51 -0400, Dmitry Torokhov wrote:
> Hi Aristeu,
>
> On 10/7/07, Aristeu Sergio Rozanski Filho <[email protected]> wrote:
> > Hi Bastien,
> >
> > > Some comments about your selection of keycodes, CC:'ing Dmitry for
> > > comments.
> > thanks for you comments
> >
> > > > + [0x70] = KEY_DISPLAYTOGGLE, /* display */
> > >
> > > This is wrong. Display toggle is to change the LCD/CRT output on
> > > laptops. KEY_INFO sounds like a better option.
> > indeed
> >
> > > > + [0x5a] = BTN_1, /* L1 */
> > > > + [0x58] = BTN_2, /* L2 */
> > > > + [0x51] = BTN_3, /* L3 */
> > > > + [0x5b] = BTN_4, /* R1 */
> > > > + [0x59] = BTN_5, /* R2 */
> > > > + [0x52] = BTN_6, /* R3 */
> > > Use BTN_TL, BTN_TL2, BTN_TR and BTN_TR2. ("that's trigger left, trigger
> > > left 2"). BTN_THUMBL and BTN_THUMBR are L3 and R3 respectively (thumb
> > > left, thumb right).
> > cool, will do it
> >
>
> I'd rather you not used BTN_* for remotes. BTN_T* are used mostly by
> joysticks and I am afraid we might confuse userspace... Might need to
> extend KEY_PROG*.

It's a Playstation 3 remote, and those buttons are supposed to do the
same as those buttons on the joypads.

> > > > + [0x43] = KEY_VENDOR, /* PS button */
> > > KEY_HOMEPAGE sounds better (Sony calls it the Home button).
> > oh, ok
> >
> > > > + [0x33] = KEY_BACK, /* scan back */
> > > KEY_REWIND
> > duh, didn't found this one
> >
> > > > + [0x60] = KEY_PREVIOUSSONG, /* slow/step back */
> > > This one...
> > >
> > > > + [0x61] = KEY_NEXTSONG, /* slow/step forward */
> > > ...and this one could probably do with additional keys being defined in
> > > input.h
> > >
> > > Slow/step forward could be KEY_SLOW, don't know about slow/step back.
> > KEY_SLOWREWIND/KEY_SLOWFORWARD?
> > I'm attaching the input.h change and the updated patch.
> > What you think Dmitry?
> >
>
> I think HUT defines Frame Forward and Frame Back keys, we shoudl use
> similar names.

Nod.

> > +static unsigned int ps3remote_keymap[] = {
> > + [0x16] = KEY_EJECTCD,
> > + [0x64] = KEY_AUDIO,
> > + [0x65] = KEY_ANGLE,
> > + [0x63] = KEY_SUBTITLE,
> > + [0x0f] = KEY_CLEAR,
> > + [0x28] = KEY_TIME,
> > + [0x00] = KEY_1,
> > + [0x01] = KEY_2,
> > + [0x02] = KEY_3,
> > + [0x03] = KEY_4,
> > + [0x04] = KEY_5,
> > + [0x05] = KEY_6,
> > + [0x06] = KEY_7,
> > + [0x07] = KEY_8,
> > + [0x08] = KEY_9,
> > + [0x09] = KEY_0,
>
> I know we are using KEY_0 in lots of remotes but this does not quite
> work for users whose keymaps have digits in upper register (such as
> Czech or French). In the past Vojtech recommended using KEY_KP* but
> that will only work if NumLock is active... Should we define another
> set of constants for remote and other keypads.

This sounds good.
<snip>
> > + [0x43] = KEY_HOMEPAGE, /* PS button */
> > + [0x50] = BTN_SELECT,
>
> KEY_SELECT
>
> > + [0x53] = BTN_START,
>
> Don't like using BTN_*, what does the button actually do?

It's the same as the START button on the joypad.

--
Bastien Nocera <[email protected]>


-------------------------------------------------------------------------
This SF.net email is sponsored by: Splunk Inc.
Still grepping through log files to find problems? Stop.
Now Search log events and configuration files using AJAX and a browser.
Download your FREE copy of Splunk now >> http://get.splunk.com/
_______________________________________________
Bluez-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/bluez-devel

2007-10-09 14:07:02

by Aristeu Rozanski

[permalink] [raw]
Subject: Re: [Bluez-devel] [RFC][PATCH 4/4] add support to ps3 remote controller

> I'd rather you not used BTN_* for remotes. BTN_T* are used mostly by
> joysticks and I am afraid we might confuse userspace... Might need to
> extend KEY_PROG*.
well, this remote has everything but the analog axis that a standard
playstation gamepad has, but has more buttons to serve as remote.
I never tried, but I think it's even possible to play a game using it.

> > + [0x50] = BTN_SELECT,
> KEY_SELECT
> > + [0x53] = BTN_START,
> Don't like using BTN_*, what does the button actually do?
see above, they're the select/start buttons you have in a game controller.

Thanks for the comments Dmitry, I'll work on the changes you've requested.

--
Aristeu


-------------------------------------------------------------------------
This SF.net email is sponsored by: Splunk Inc.
Still grepping through log files to find problems? Stop.
Now Search log events and configuration files using AJAX and a browser.
Download your FREE copy of Splunk now >> http://get.splunk.com/
_______________________________________________
Bluez-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/bluez-devel

2007-10-09 13:51:32

by Dmitry Torokhov

[permalink] [raw]
Subject: Re: [Bluez-devel] [RFC][PATCH 4/4] add support to ps3 remote controller

Hi Aristeu,

On 10/7/07, Aristeu Sergio Rozanski Filho <[email protected]> wrote:
> Hi Bastien,
>
> > Some comments about your selection of keycodes, CC:'ing Dmitry for
> > comments.
> thanks for you comments
>
> > > + [0x70] = KEY_DISPLAYTOGGLE, /* display */
> >
> > This is wrong. Display toggle is to change the LCD/CRT output on
> > laptops. KEY_INFO sounds like a better option.
> indeed
>
> > > + [0x5a] = BTN_1, /* L1 */
> > > + [0x58] = BTN_2, /* L2 */
> > > + [0x51] = BTN_3, /* L3 */
> > > + [0x5b] = BTN_4, /* R1 */
> > > + [0x59] = BTN_5, /* R2 */
> > > + [0x52] = BTN_6, /* R3 */
> > Use BTN_TL, BTN_TL2, BTN_TR and BTN_TR2. ("that's trigger left, trigger
> > left 2"). BTN_THUMBL and BTN_THUMBR are L3 and R3 respectively (thumb
> > left, thumb right).
> cool, will do it
>

I'd rather you not used BTN_* for remotes. BTN_T* are used mostly by
joysticks and I am afraid we might confuse userspace... Might need to
extend KEY_PROG*.

> > > + [0x43] = KEY_VENDOR, /* PS button */
> > KEY_HOMEPAGE sounds better (Sony calls it the Home button).
> oh, ok
>
> > > + [0x33] = KEY_BACK, /* scan back */
> > KEY_REWIND
> duh, didn't found this one
>
> > > + [0x60] = KEY_PREVIOUSSONG, /* slow/step back */
> > This one...
> >
> > > + [0x61] = KEY_NEXTSONG, /* slow/step forward */
> > ...and this one could probably do with additional keys being defined in
> > input.h
> >
> > Slow/step forward could be KEY_SLOW, don't know about slow/step back.
> KEY_SLOWREWIND/KEY_SLOWFORWARD?
> I'm attaching the input.h change and the updated patch.
> What you think Dmitry?
>

I think HUT defines Frame Forward and Frame Back keys, we shoudl use
similar names.


> +static unsigned int ps3remote_keymap[] = {
> + [0x16] = KEY_EJECTCD,
> + [0x64] = KEY_AUDIO,
> + [0x65] = KEY_ANGLE,
> + [0x63] = KEY_SUBTITLE,
> + [0x0f] = KEY_CLEAR,
> + [0x28] = KEY_TIME,
> + [0x00] = KEY_1,
> + [0x01] = KEY_2,
> + [0x02] = KEY_3,
> + [0x03] = KEY_4,
> + [0x04] = KEY_5,
> + [0x05] = KEY_6,
> + [0x06] = KEY_7,
> + [0x07] = KEY_8,
> + [0x08] = KEY_9,
> + [0x09] = KEY_0,

I know we are using KEY_0 in lots of remotes but this does not quite
work for users whose keymaps have digits in upper register (such as
Czech or French). In the past Vojtech recommended using KEY_KP* but
that will only work if NumLock is active... Should we define another
set of constants for remote and other keypads.

> + [0x81] = KEY_RED,
> + [0x82] = KEY_GREEN,
> + [0x80] = KEY_BLUE,
> + [0x83] = KEY_YELLOW,
> + [0x70] = KEY_INFO, /* display */
> + [0x1a] = BTN_TOP, /* top menu */

I think this should be KEY_MENU


> + [0x40] = KEY_MENU, /* pop up/menu */

and this one should be a new key KEY_CONTEXT_MENU (HUT GenDesc 0x84)

> + [0x0e] = KEY_ESC, /* return */
> + [0x5c] = KEY_OPTION, /* options/triangle */
> + [0x5d] = KEY_BACK, /* back/circle */
> + [0x5f] = KEY_SCREEN, /* view/square */
> + [0x5e] = KEY_ENTER, /* cross */
> + [0x54] = KEY_UP,
> + [0x56] = KEY_DOWN,
> + [0x57] = KEY_LEFT,
> + [0x55] = KEY_RIGHT,
> + [0x0b] = KEY_ENTER,
> + [0x5a] = BTN_TL, /* L1 */
> + [0x58] = BTN_TL2, /* L2 */
> + [0x51] = BTN_THUMBL, /* L3 */
> + [0x5b] = BTN_TR, /* R1 */
> + [0x59] = BTN_TR2, /* R2 */
> + [0x52] = BTN_THUMBR, /* R3 */
> + [0x43] = KEY_HOMEPAGE, /* PS button */
> + [0x50] = BTN_SELECT,

KEY_SELECT

> + [0x53] = BTN_START,

Don't like using BTN_*, what does the button actually do?

--
Dmitry

-------------------------------------------------------------------------
This SF.net email is sponsored by: Splunk Inc.
Still grepping through log files to find problems? Stop.
Now Search log events and configuration files using AJAX and a browser.
Download your FREE copy of Splunk now >> http://get.splunk.com/
_______________________________________________
Bluez-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/bluez-devel

2007-10-07 23:42:11

by Aristeu Rozanski

[permalink] [raw]
Subject: Re: [Bluez-devel] [RFC][PATCH 4/4] add support to ps3 remote controller

Hi Bastien,

> Some comments about your selection of keycodes, CC:'ing Dmitry for
> comments.
thanks for you comments

> > + [0x70] = KEY_DISPLAYTOGGLE, /* display */
>
> This is wrong. Display toggle is to change the LCD/CRT output on
> laptops. KEY_INFO sounds like a better option.
indeed

> > + [0x5a] = BTN_1, /* L1 */
> > + [0x58] = BTN_2, /* L2 */
> > + [0x51] = BTN_3, /* L3 */
> > + [0x5b] = BTN_4, /* R1 */
> > + [0x59] = BTN_5, /* R2 */
> > + [0x52] = BTN_6, /* R3 */
> Use BTN_TL, BTN_TL2, BTN_TR and BTN_TR2. ("that's trigger left, trigger
> left 2"). BTN_THUMBL and BTN_THUMBR are L3 and R3 respectively (thumb
> left, thumb right).
cool, will do it

> > + [0x43] = KEY_VENDOR, /* PS button */
> KEY_HOMEPAGE sounds better (Sony calls it the Home button).
oh, ok

> > + [0x33] = KEY_BACK, /* scan back */
> KEY_REWIND
duh, didn't found this one

> > + [0x60] = KEY_PREVIOUSSONG, /* slow/step back */
> This one...
>
> > + [0x61] = KEY_NEXTSONG, /* slow/step forward */
> ...and this one could probably do with additional keys being defined in
> input.h
>
> Slow/step forward could be KEY_SLOW, don't know about slow/step back.
KEY_SLOWREWIND/KEY_SLOWFORWARD?
I'm attaching the input.h change and the updated patch.
What you think Dmitry?

--- linus-2.6.orig/include/linux/input.h 2007-10-07 19:30:35.000000000 -0400
+++ linus-2.6/include/linux/input.h 2007-10-07 19:31:57.000000000 -0400
@@ -522,6 +522,8 @@
#define KEY_ADDRESSBOOK 0x1ad /* AL Contacts/Address Book */
#define KEY_MESSENGER 0x1ae /* AL Instant Messaging */
#define KEY_DISPLAYTOGGLE 0x1af /* Turn display (LCD) on and off */
+#define KEY_SLOWREWIND 0x1b0 /* Slow motion rewind */
+#define KEY_SLOWFORWARD 0x1b1 /* Slow motion forward */

#define KEY_DEL_EOL 0x1c0
#define KEY_DEL_EOS 0x1c1

--- input.orig/fake_hid.c 2007-10-07 19:25:24.000000000 -0400
+++ input/fake_hid.c 2007-10-07 19:32:58.000000000 -0400
@@ -1,8 +1,12 @@
#include <stdio.h>
#include <stdlib.h>
+#include <fcntl.h>
+#include <unistd.h>
#include <errno.h>
#include <sys/types.h>
#include <glib.h>
+#include <linux/input.h>
+#include <linux/uinput.h>
#include <dbus/dbus.h>
#include <bluetooth/bluetooth.h>
#include <bluetooth/hidp.h>
@@ -22,6 +26,206 @@
.setup_uinput = s, \
}

+/* ps3 remote support */
+#ifndef KEY_SLOWREWIND
+#define KEY_SLOWREWIND 0x1b0 /* Slow motion rewind */
+#define KEY_SLOWFORWARD 0x1b1 /* Slow motion forward */
+#endif
+static unsigned int ps3remote_keymap[] = {
+ [0x16] = KEY_EJECTCD,
+ [0x64] = KEY_AUDIO,
+ [0x65] = KEY_ANGLE,
+ [0x63] = KEY_SUBTITLE,
+ [0x0f] = KEY_CLEAR,
+ [0x28] = KEY_TIME,
+ [0x00] = KEY_1,
+ [0x01] = KEY_2,
+ [0x02] = KEY_3,
+ [0x03] = KEY_4,
+ [0x04] = KEY_5,
+ [0x05] = KEY_6,
+ [0x06] = KEY_7,
+ [0x07] = KEY_8,
+ [0x08] = KEY_9,
+ [0x09] = KEY_0,
+ [0x81] = KEY_RED,
+ [0x82] = KEY_GREEN,
+ [0x80] = KEY_BLUE,
+ [0x83] = KEY_YELLOW,
+ [0x70] = KEY_INFO, /* display */
+ [0x1a] = BTN_TOP, /* top menu */
+ [0x40] = KEY_MENU, /* pop up/menu */
+ [0x0e] = KEY_ESC, /* return */
+ [0x5c] = KEY_OPTION, /* options/triangle */
+ [0x5d] = KEY_BACK, /* back/circle */
+ [0x5f] = KEY_SCREEN, /* view/square */
+ [0x5e] = KEY_ENTER, /* cross */
+ [0x54] = KEY_UP,
+ [0x56] = KEY_DOWN,
+ [0x57] = KEY_LEFT,
+ [0x55] = KEY_RIGHT,
+ [0x0b] = KEY_ENTER,
+ [0x5a] = BTN_TL, /* L1 */
+ [0x58] = BTN_TL2, /* L2 */
+ [0x51] = BTN_THUMBL, /* L3 */
+ [0x5b] = BTN_TR, /* R1 */
+ [0x59] = BTN_TR2, /* R2 */
+ [0x52] = BTN_THUMBR, /* R3 */
+ [0x43] = KEY_HOMEPAGE, /* PS button */
+ [0x50] = BTN_SELECT,
+ [0x53] = BTN_START,
+ [0x33] = KEY_REWIND, /* scan back */
+ [0x32] = KEY_PLAY,
+ [0x34] = KEY_FORWARD, /* scan forward */
+ [0x30] = KEY_PREVIOUS,
+ [0x38] = KEY_STOP,
+ [0x31] = KEY_NEXT,
+ [0x60] = KEY_SLOWREWIND, /* slow/step back */
+ [0x39] = KEY_PAUSE,
+ [0x61] = KEY_SLOWFORWARD, /* slow/step forward */
+ [0xff] = KEY_MAX,
+};
+
+static int ps3remote_decode(char *buff, int size, unsigned int *value)
+{
+ static unsigned int lastkey = KEY_RESERVED;
+ int retval, ps3;
+
+ if (size < 12) {
+ error("Got a shorter packet! (size %i)\n", size);
+ return KEY_RESERVED;
+ }
+
+ *value = buff[11];
+
+ if (*value == 0)
+ return lastkey;
+
+ ps3 = buff[5];
+ lastkey = retval = ps3remote_keymap[ps3];
+
+ if (retval == KEY_RESERVED)
+ error("ps3remote: unrecognized key [%#x] value [%#x]",
+ buff[5], buff[11]);
+
+ return retval;
+}
+
+static gboolean ps3remote_event(GIOChannel *chan, GIOCondition cond,
+ gpointer data)
+{
+ struct fake_input *fake = data;
+ struct input_event event;
+ unsigned int size, key, value;
+ char buff[50];
+
+ if (cond & G_IO_NVAL)
+ return FALSE;
+
+ if (cond & (G_IO_HUP | G_IO_ERR)) {
+ error("Hangup or error on rfcomm server socket");
+ goto failed;
+ }
+
+ memset(buff, 0, sizeof(buff));
+
+ if (g_io_channel_read(chan, buff, sizeof(buff), &size) !=
+ G_IO_ERROR_NONE) {
+ error("IO Channel read error");
+ goto failed;
+ }
+
+ key = ps3remote_decode(buff, size, &value);
+ if (key == KEY_RESERVED) {
+ error("Got invalid key from decode");
+ return TRUE;
+ }
+
+ memset(&event, 0, sizeof(event));
+ gettimeofday(&event.time, NULL);
+ event.type = EV_KEY;
+ event.code = key;
+ event.value = value;
+ if (write(fake->uinput, &event, sizeof(event)) != sizeof(event)) {
+ error("Error writing to uinput device");
+ goto failed;
+ }
+
+ memset(&event, 0, sizeof(event));
+ gettimeofday(&event.time, NULL);
+ event.type = EV_SYN;
+ event.code = SYN_REPORT;
+ if (write(fake->uinput, &event, sizeof(event)) != sizeof(event)) {
+ error("Error writing to uinput device");
+ goto failed;
+ }
+
+ return TRUE;
+failed:
+ ioctl(fake->uinput, UI_DEV_DESTROY);
+ close(fake->uinput);
+ fake->uinput = -1;
+ g_io_channel_unref(fake->io);
+
+ return FALSE;
+}
+
+static int ps3remote_setup_uinput(struct device *idev,
+ struct fake_hid *fake_hid)
+{
+ struct fake_input *fake = idev->fake;
+ struct uinput_user_dev dev;
+ int i;
+
+ fake->uinput = open("/dev/input/uinput", O_RDWR);
+ if (fake->uinput < 0) {
+ fake->uinput = open("/dev/uinput", O_RDWR);
+ if (fake->uinput < 0)
+ fake->uinput = open("/dev/misc/uinput", O_RDWR);
+ }
+ if (fake->uinput < 0) {
+ error("Error opening uinput device file. Is uinput loaded?");
+ return 1;
+ }
+
+ memset(&dev, 0, sizeof(dev));
+ snprintf(&dev.name, sizeof(dev.name), "%s", "PS3 Remote Controller");
+ dev.id.bustype = BUS_BLUETOOTH;
+ dev.id.vendor = idev->vendor;
+ dev.id.product = idev->product;
+
+ if (write(fake->uinput, &dev, sizeof(dev)) != sizeof(dev)) {
+ error("Error creating uinput device");
+ goto err;
+ }
+
+ /* enabling key events */
+ if (ioctl(fake->uinput, UI_SET_EVBIT, EV_KEY) < 0) {
+ error("Error enabling uinput device key events");
+ goto err;
+ }
+
+ /* enabling keys */
+ for (i = 0; i < 256; i++)
+ if (ps3remote_keymap[i] != KEY_RESERVED)
+ if (ioctl(fake->uinput, UI_SET_KEYBIT,
+ ps3remote_keymap[i]) < 0) {
+ error("Error enabling uinput key %i", ps3remote_keymap[i]);
+ goto err;
+ }
+
+ /* creating the device */
+ if (ioctl(fake->uinput, UI_DEV_CREATE) < 0) {
+ error("Error creating uinput device");
+ goto err;
+ }
+
+ return 0;
+err:
+ close(fake->uinput);
+ return 1;
+}
+
static gboolean fake_hid_common_connect(struct device *idev)
{
return TRUE;
@@ -38,6 +242,11 @@
}

static struct fake_hid fake_hid_table[] = {
+ FAKE_HID_ENTRY(SONY, PS3REMOTE, fake_hid_common_connect,
+ fake_hid_common_disconnect,
+ fake_hid_common_is_connected,
+ ps3remote_event,
+ ps3remote_setup_uinput),
{ },
};

--- input.orig/bluetooth_ids.h 2007-10-07 19:25:24.000000000 -0400
+++ input/bluetooth_ids.h 2007-10-07 19:25:24.000000000 -0400
@@ -3,6 +3,7 @@

#define BLUETOOTH_VENDOR_ID_SONY 0x054c
#define BLUETOOTH_DEVICE_ID_PS3CONTROLLER 0x0268
+#define BLUETOOTH_DEVICE_ID_PS3REMOTE 0x0306

#endif /* BLUETOOTH_IDS_H */


-------------------------------------------------------------------------
This SF.net email is sponsored by: Splunk Inc.
Still grepping through log files to find problems? Stop.
Now Search log events and configuration files using AJAX and a browser.
Download your FREE copy of Splunk now >> http://get.splunk.com/
_______________________________________________
Bluez-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/bluez-devel

2007-10-07 19:23:36

by Bastien Nocera

[permalink] [raw]
Subject: Re: [Bluez-devel] [RFC][PATCH 4/4] add support to ps3 remote controller

Hey Aristeu,

Some comments about your selection of keycodes, CC:'ing Dmitry for
comments.

For reference, here's a picture of the remote in question:
http://files.playstatic.com/playstation-3-hardware/bd-remote-2-playstation-3.jpg

On Sun, 2007-10-07 at 14:40 -0400, Aristeu Sergio Rozanski Filho wrote:
> And finally, adding support to PS3 remote controller.
>
<snip>
> +/* ps3 remote support */
> +static unsigned int ps3remote_keymap[] = {
> + [0x16] = KEY_EJECTCD,
> + [0x64] = KEY_AUDIO,
> + [0x65] = KEY_ANGLE,
> + [0x63] = KEY_SUBTITLE,
> + [0x0f] = KEY_CLEAR,
> + [0x28] = KEY_TIME,
> + [0x00] = KEY_1,
> + [0x01] = KEY_2,
> + [0x02] = KEY_3,
> + [0x03] = KEY_4,
> + [0x04] = KEY_5,
> + [0x05] = KEY_6,
> + [0x06] = KEY_7,
> + [0x07] = KEY_8,
> + [0x08] = KEY_9,
> + [0x09] = KEY_0,
> + [0x81] = KEY_RED,
> + [0x82] = KEY_GREEN,
> + [0x80] = KEY_BLUE,
> + [0x83] = KEY_YELLOW,
> + [0x70] = KEY_DISPLAYTOGGLE, /* display */

This is wrong. Display toggle is to change the LCD/CRT output on
laptops. KEY_INFO sounds like a better option.

> + [0x1a] = BTN_TOP, /* top menu */
> + [0x40] = KEY_MENU, /* pop up/menu */
> + [0x0e] = KEY_ESC, /* return */
> + [0x5c] = KEY_OPTION, /* options/triangle */
> + [0x5d] = KEY_BACK, /* back/circle */
> + [0x5f] = KEY_SCREEN, /* view/square */
> + [0x5e] = KEY_ENTER, /* cross */
> + [0x54] = KEY_UP,
> + [0x56] = KEY_DOWN,
> + [0x57] = KEY_LEFT,
> + [0x55] = KEY_RIGHT,
> + [0x0b] = KEY_ENTER,
> + [0x5a] = BTN_1, /* L1 */
> + [0x58] = BTN_2, /* L2 */
> + [0x51] = BTN_3, /* L3 */
> + [0x5b] = BTN_4, /* R1 */
> + [0x59] = BTN_5, /* R2 */
> + [0x52] = BTN_6, /* R3 */

Use BTN_TL, BTN_TL2, BTN_TR and BTN_TR2. ("that's trigger left, trigger
left 2"). BTN_THUMBL and BTN_THUMBR are L3 and R3 respectively (thumb
left, thumb right).

> + [0x43] = KEY_VENDOR, /* PS button */

KEY_HOMEPAGE sounds better (Sony calls it the Home button).

> + [0x50] = BTN_SELECT,
> + [0x53] = BTN_START,
> + [0x33] = KEY_BACK, /* scan back */

KEY_REWIND

> + [0x32] = KEY_PLAY,
> + [0x34] = KEY_FORWARD, /* scan forward */
> + [0x30] = KEY_PREVIOUS,
> + [0x38] = KEY_STOP,
> + [0x31] = KEY_NEXT,
> + [0x60] = KEY_PREVIOUSSONG, /* slow/step back */

This one...

> + [0x39] = KEY_PAUSE,
> + [0x61] = KEY_NEXTSONG, /* slow/step forward */

...and this one could probably do with additional keys being defined in
input.h

Slow/step forward could be KEY_SLOW, don't know about slow/step back.

--
Bastien Nocera <[email protected]>


-------------------------------------------------------------------------
This SF.net email is sponsored by: Splunk Inc.
Still grepping through log files to find problems? Stop.
Now Search log events and configuration files using AJAX and a browser.
Download your FREE copy of Splunk now >> http://get.splunk.com/
_______________________________________________
Bluez-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/bluez-devel