Skip to contentSkip to conversation

Fun with sony motion controllers: navigation controller

PATCH New Pavel Machek 3 participants 16 messages Mar 14, 2015 – Apr 24, 2015 HID

lore
Share & tools
lore
#0 lore raw

Hi!

After oopsing kernel with ps/3 peripherals, I decided to play some more.

First "sony motion controller" (part of ps/3 move without the led). Good news is that it no longer oopses. After pressing the PS button, it seems to work, but it produces endless stream of events in evtest:

Event: time 1426360519.967818, type 3 (EV_ABS), code 0 (ABS_X), value 131
Event: time 1426360519.967818, type 3 (EV_ABS), code 1 (ABS_Y), value 129
Event: time 1426360519.967818, type 3 (EV_ABS), code 59 (ABS_MT_DISTANCE), value 513
Event: time 1426360519.967818, type 3 (EV_ABS), code 60 (ABS_MT_TOOL_X), value 513

Should it really produce multitouch events?

Force feedback does not seem to work:

root@amd:~# fftest /dev/input/event7
Force feedback test program.
HOLD FIRMLY YOUR WHEEL OR JOYSTICK TO PREVENT DAMAGES

Device /dev/input/event7 opened
Features:
* Absolute axes: X, Y, Z, RZ, Misc ,

      [27 00 00 00 00 FF FF 7F ]
  * Relative axes:
	    [00 00 ]
  * Force feedback effects types:
   Force feedback periodic effects:
     [00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ]

* Number of simultaneous effects: 0

Uploading effect #0 (Periodic sinusoidal) ... Error:: Function not implemented Uploading effect #1 (Constant) ... Error: Function not implemented Uploading effect #2 (Spring) ... Error: Function not implemented
Uploading effect #3 (Damper) ... Error: Function not implemented
Uploading effect #4 (Strong rumble, with heavy motor) ... Error: Function not implemented Uploading effect #5 (Weak rumble, with light motor) ... Error: Function not implemented Enter effect number, -1 to exit

Battery status reporting seems to work. Unfortunately, desktop (Mate on Debian 8) seems to think it is system battery, and acts funny.

Pavel

Signature · 2 lines
(english) http://www.livejournal.com/~pavelmachek
(cesky, pictures) http://atrey.karlin.mff.cuni.cz/~pavel/picture/horses/blog.html
#1 lore raw

Re: Fun with sony motion controllers: motion controller

Hi!

Second "sony motion controller" (part of ps/3 move with the big LED). The LED is something I'd really like to work.

It is detected:

[  741.363723] input: Sony Computer Entertainment Motion Controller as
/devices/pci0000:00/0000:00:1d.0/usb2/2-1/2-1:1.0/0003:054C:03D5.000A/input/input19
[  741.421269] hid-generic 0003:054C:03D5.000A: input,hiddev0,hidraw0:

USB HID v1.10 Gamepad [Sony Computer Entertainment Motion Controller] on usb-0000:00:1d.0-1/input0

root@amd:~# evtest /dev/input/event7
Input driver version is 1.0.1
Input device ID: bus 0x3 vendor 0x54c product 0x3d5 version 0x110
Input device name: "Sony Computer Entertainment Motion Controller"
Supported events:
  Event type 0 (EV_SYN)
    Event type 1 (EV_KEY)
...
Properties:
Testing ... (interrupt to exit)

But no matter what I do, I don't get any events in evtest, or any changes in jstest.

/sys/class/power_supply does not appear and /sys/class/leds does not change.

Is this controller supported at all? What interface should be used for talking to the RGB LED?

Yes, I'd really like the LED to work. The rest would be nice bonus.

Pavel

Signature · 2 lines
(english) http://www.livejournal.com/~pavelmachek
(cesky, pictures) http://atrey.karlin.mff.cuni.cz/~pavel/picture/horses/blog.html
#2 lore raw

Re: Fun with sony motion controllers: motion controller

Hi!

Quoted 25 lines

Second "sony motion controller" (part of ps/3 move with the big LED). The LED is something I'd really like to work.

It is detected:

[  741.363723] input: Sony Computer Entertainment Motion Controller as
/devices/pci0000:00/0000:00:1d.0/usb2/2-1/2-1:1.0/0003:054C:03D5.000A/input/input19
[  741.421269] hid-generic 0003:054C:03D5.000A: input,hiddev0,hidraw0:

USB HID v1.10 Gamepad [Sony Computer Entertainment Motion Controller] on usb-0000:00:1d.0-1/input0

root@amd:~# evtest /dev/input/event7
Input driver version is 1.0.1
Input device ID: bus 0x3 vendor 0x54c product 0x3d5 version 0x110
Input device name: "Sony Computer Entertainment Motion Controller"
Supported events:
  Event type 0 (EV_SYN)
    Event type 1 (EV_KEY)
...
Properties:
Testing ... (interrupt to exit)

But no matter what I do, I don't get any events in evtest, or any changes in jstest.

Quoted 7 lines

/sys/class/power_supply does not appear and /sys/class/leds does not change.

Is this controller supported at all? What interface should be used for talking to the RGB LED?

Yes, I'd really like the LED to work. The rest would be nice bonus.

I tried adding USB id's to hid-sony.c, but no luck. But this is strange:

pavel@amd:/data/l/linux/samples/hidraw$ sudo ./hid-example
/dev/hidraw3
Report Descriptor Size: 178
Report Descriptor:
5 1 9 5 a1 1 85 1 5 9 19 1 29 18 15 0 25 1 35 0 45 1 75 1 95 18 81 2 6
0 ff 9 24 75 8 95 3 81 2 5 1 9 30 9 31 9 32 9 35 15 0 26 ff 0 95 4 81
2 6 0 ff 9 20 95 26 81 2 85 2 9 21 95 30 91 2 85 6 9 27 95 8 91 2 85 3
9 23 95 8 b1 2 85 10 9 22 95 30 b1 2 85 e0 9 25 95 30 b1 2 85 11 9 26
95 30 b1 2 c0 6 2 ff 9 20 a1 1 9 21 85 4 15 0 26 ff 0 75 8 95 f b1 2 9
22 85 5 95 16 b1 2 c0 6 3 ff 9 20 a1 1 9 21 85 a0 15 0 26 ff 0 75 8 95
22 b1 2 9 22 85 a1 95 16 b1 2 c0

Raw Name: Sony Computer Entertainment Motion Controller Raw Phys: usb-0000:00:1d.0-1/input0
Raw Info:
bustype: 3 (USB)
vendor: 0x054c
product: 0x03d5
HIDIOCSFEATURE: Broken pipe
HIDIOCGFEATURE: Broken pipe write() wrote 2 bytes
read: Resource temporarily unavailable pavel@amd:/data/l/linux/samples/hidraw$

Pavel

Signature · 2 lines
(english) http://www.livejournal.com/~pavelmachek
(cesky, pictures) http://atrey.karlin.mff.cuni.cz/~pavel/picture/horses/blog.html
#3 lore raw

Re: Fun with sony motion controllers: dualshock

In reply to Pavel Machek

Hi!

After oopsing kernel with ps/3 peripherals, I decided to play some more.

Third, regular controller. The one you don't have to dance with.

/sys/class/power_supply/*/capacity works.

again, evtest reports funny-looking multitouch events:

Event: time 1426361100.640824, -------------- EV_SYN ------------
Event: time 1426361100.650827, type 3 (EV_ABS), code 59 (ABS_MT_DISTANCE), value 506
Event: time 1426361100.650827, -------------- EV_SYN ------------
Event: time 1426361100.660827, type 3 (EV_ABS), code 5 (ABS_RZ), value 127
Event: time 1426361100.660827, -------------- EV_SYN ------------

...but seems to work. I even have 4 new leds that work. Unfortunately they are small and not colorful.

Aha, force feedback needs CONFIG_SONY_FF. Setting it now. Did not have it for previous mails.

Best regards,
Pavel

Signature · 2 lines
(english) http://www.livejournal.com/~pavelmachek
(cesky, pictures) http://atrey.karlin.mff.cuni.cz/~pavel/picture/horses/blog.html
#4 lore raw
In reply to Pavel Machek

Hi!

Quoted 4 lines

After oopsing kernel with ps/3 peripherals, I decided to play some more.

First "sony motion controller" (part of ps/3 move without the

I meant "navigation controller".

I enabled CONFIG_HID_SONY_FF, and fftest now works with the other controller, but not work this one:

Setting master gain to 75% ... OK
Uploading effect #0 (Periodic sinusoidal) ... OK (id 0) Uploading effect #1 (Constant) ... Error: Invalid argument Uploading effect #2 (Spring) ... Error: Invalid argument Uploading effect #3 (Damper) ... Error: Invalid argument Uploading effect #4 (Strong rumble, with heavy motor) ... OK (id 1) Uploading effect #5 (Weak rumble, with light motor) ... OK (id 2) Enter effect number, -1 to exit
5

I can enter the effect numbers, but nothing happens.

Thanks,
Pavel

Signature · 2 lines
(english) http://www.livejournal.com/~pavelmachek
(cesky, pictures) http://atrey.karlin.mff.cuni.cz/~pavel/picture/horses/blog.html
#5 lore raw

PATCH 1/1 hid-sony: underscores are unneccessary for u8, u16

In reply to Pavel Machek

Usage of __uX types is unneccessary in the kernel, replace it with uX.

drivers/hid/hid-sony.c +55 -55
index 1896c01..f65e334 100644
@@ -57,7 +57,7 @@
 
 #define MAX_LEDS 4
 
-static __u8 sixaxis_rdesc[] = {
+static u8 sixaxis_rdesc[] = {
 	0x05, 0x01,         /*  Usage Page (Desktop),               */
 	0x09, 0x04,         /*  Usage (Joystik),                    */
 	0xA1, 0x01,         /*  Collection (Application),           */
@@ -605,7 +605,7 @@ static u8 dualshock4_bt_rdesc[] = {
 	0xC0                /*  End Collection                      */
 };
 
-static __u8 ps3remote_rdesc[] = {
+static u8 ps3remote_rdesc[] = {
 	0x05, 0x01,          /* GUsagePage Generic Desktop */
 	0x09, 0x05,          /* LUsage 0x05 [Game Pad] */
 	0xA1, 0x01,          /* MCollection Application (mouse, keyboard) */
@@ -769,33 +769,33 @@ static enum power_supply_property sony_battery_props[] = {
 };
 
 struct sixaxis_led {
-	__u8 time_enabled; /* the total time the led is active (0xff means forever) */
-	__u8 duty_length;  /* how long a cycle is in deciseconds (0 means "really fast") */
-	__u8 enabled;
-	__u8 duty_off; /* % of duty_length the led is off (0xff means 100%) */
-	__u8 duty_on;  /* % of duty_length the led is on (0xff mean 100%) */
+	u8 time_enabled; /* the total time the led is active (0xff means forever) */
+	u8 duty_length;  /* how long a cycle is in deciseconds (0 means "really fast") */
+	u8 enabled;
+	u8 duty_off; /* % of duty_length the led is off (0xff means 100%) */
+	u8 duty_on;  /* % of duty_length the led is on (0xff mean 100%) */
 } __packed;
 
 struct sixaxis_rumble {
-	__u8 padding;
-	__u8 right_duration; /* Right motor duration (0xff means forever) */
-	__u8 right_motor_on; /* Right (small) motor on/off, only supports values of 0 or 1 (off/on) */
-	__u8 left_duration;    /* Left motor duration (0xff means forever) */
-	__u8 left_motor_force; /* left (large) motor, supports force values from 0 to 255 */
+	u8 padding;
+	u8 right_duration; /* Right motor duration (0xff means forever) */
+	u8 right_motor_on; /* Right (small) motor on/off, only supports values of 0 or 1 (off/on) */
+	u8 left_duration;    /* Left motor duration (0xff means forever) */
+	u8 left_motor_force; /* left (large) motor, supports force values from 0 to 255 */
 } __packed;
 
 struct sixaxis_output_report {
-	__u8 report_id;
+	u8 report_id;
 	struct sixaxis_rumble rumble;
-	__u8 padding[4];
-	__u8 leds_bitmap; /* bitmap of enabled LEDs: LED_1 = 0x02, LED_2 = 0x04, ... */
+	u8 padding[4];
+	u8 leds_bitmap; /* bitmap of enabled LEDs: LED_1 = 0x02, LED_2 = 0x04, ... */
 	struct sixaxis_led led[4];    /* LEDx at (4 - x) */
 	struct sixaxis_led _reserved; /* LED5, not actually soldered */
 } __packed;
 
 union sixaxis_output_report_01 {
 	struct sixaxis_output_report data;
-	__u8 buf[36];
+	u8 buf[36];
 };
 
 #define DS4_REPORT_0x02_SIZE 37
@@ -817,32 +817,32 @@ struct sony_sc {
 	struct work_struct state_worker;
 	struct power_supply battery;
 	int device_id;
-	__u8 *output_report_dmabuf;
+	u8 *output_report_dmabuf;
 
 #ifdef CONFIG_SONY_FF
-	__u8 left;
-	__u8 right;
+	u8 left;
+	u8 right;
 #endif
 
-	__u8 mac_address[6];
-	__u8 worker_initialized;
-	__u8 cable_state;
-	__u8 battery_charging;
-	__u8 battery_capacity;
-	__u8 led_state[MAX_LEDS];
-	__u8 led_delay_on[MAX_LEDS];
-	__u8 led_delay_off[MAX_LEDS];
-	__u8 led_count;
+	u8 mac_address[6];
+	u8 worker_initialized;
+	u8 cable_state;
+	u8 battery_charging;
+	u8 battery_capacity;
+	u8 led_state[MAX_LEDS];
+	u8 led_delay_on[MAX_LEDS];
+	u8 led_delay_off[MAX_LEDS];
+	u8 led_count;
 };
 
-static __u8 *sixaxis_fixup(struct hid_device *hdev, __u8 *rdesc,
+static u8 *sixaxis_fixup(struct hid_device *hdev, u8 *rdesc,
 			     unsigned int *rsize)
 {
 	*rsize = sizeof(sixaxis_rdesc);
 	return sixaxis_rdesc;
 }
 
-static __u8 *ps3remote_fixup(struct hid_device *hdev, __u8 *rdesc,
+static u8 *ps3remote_fixup(struct hid_device *hdev, u8 *rdesc,
 			     unsigned int *rsize)
 {
 	*rsize = sizeof(ps3remote_rdesc);
@@ -883,7 +883,7 @@ static int ps3remote_mapping(struct hid_device *hdev, struct hid_input *hi,
 	return 1;
 }
 
-static __u8 *sony_report_fixup(struct hid_device *hdev, __u8 *rdesc,
+static u8 *sony_report_fixup(struct hid_device *hdev, u8 *rdesc,
 		unsigned int *rsize)
 {
 	struct sony_sc *sc = hid_get_drvdata(hdev);
@@ -928,11 +928,11 @@ static __u8 *sony_report_fixup(struct hid_device *hdev, __u8 *rdesc,
 	return rdesc;
 }
 
-static void sixaxis_parse_report(struct sony_sc *sc, __u8 *rd, int size)
+static void sixaxis_parse_report(struct sony_sc *sc, u8 *rd, int size)
 {
-	static const __u8 sixaxis_battery_capacity[] = { 0, 1, 25, 50, 75, 100 };
+	static const u8 sixaxis_battery_capacity[] = { 0, 1, 25, 50, 75, 100 };
 	unsigned long flags;
-	__u8 cable_state, battery_capacity, battery_charging;
+	u8 cable_state, battery_capacity, battery_charging;
 
 	/*
 	 * The sixaxis is charging if the battery value is 0xee
@@ -945,7 +945,7 @@ static void sixaxis_parse_report(struct sony_sc *sc, __u8 *rd, int size)
 		battery_charging = !(rd[30] & 0x01);
 		cable_state = 1;
 	} else {
-		__u8 index = rd[30] <= 5 ? rd[30] : 5;
+		u8 index = rd[30] <= 5 ? rd[30] : 5;
 		battery_capacity = sixaxis_battery_capacity[index];
 		battery_charging = 0;
 		cable_state = 0;
@@ -958,14 +958,14 @@ static void sixaxis_parse_report(struct sony_sc *sc, __u8 *rd, int size)
 	spin_unlock_irqrestore(&sc->lock, flags);
 }
 
-static void dualshock4_parse_report(struct sony_sc *sc, __u8 *rd, int size)
+static void dualshock4_parse_report(struct sony_sc *sc, u8 *rd, int size)
 {
 	struct hid_input *hidinput = list_entry(sc->hdev->inputs.next,
 						struct hid_input, list);
 	struct input_dev *input_dev = hidinput->input;
 	unsigned long flags;
 	int n, offset;
-	__u8 cable_state, battery_capacity, battery_charging;
+	u8 cable_state, battery_capacity, battery_charging;
 
 	/*
 	 * Battery and touchpad data starts at byte 30 in the USB report and
@@ -1015,7 +1015,7 @@ static void dualshock4_parse_report(struct sony_sc *sc, __u8 *rd, int size)
 	 * follows the data for the first.
 	 */
 	for (n = 0; n < 2; n++) {
-		__u16 x, y;
+		u16 x, y;
 
 		x = rd[offset+1] | ((rd[offset+2] & 0xF) << 8);
 		y = ((rd[offset+2] & 0xF0) >> 4) | (rd[offset+3] << 4);
@@ -1031,7 +1031,7 @@ static void dualshock4_parse_report(struct sony_sc *sc, __u8 *rd, int size)
 }
 
 static int sony_raw_event(struct hid_device *hdev, struct hid_report *report,
-		__u8 *rd, int size)
+		u8 *rd, int size)
 {
 	struct sony_sc *sc = hid_get_drvdata(hdev);
 
@@ -1149,8 +1149,8 @@ static int sixaxis_set_operational_usb(struct hid_device *hdev)
 
 static int sixaxis_set_operational_bt(struct hid_device *hdev)
 {
-	static const __u8 report[] = { 0xf4, 0x42, 0x03, 0x00, 0x00 };
-	__u8 *buf;
+	static const u8 report[] = { 0xf4, 0x42, 0x03, 0x00, 0x00 };
+	u8 *buf;
 	int ret;
 
 	buf = kmemdup(report, sizeof(report), GFP_KERNEL);
@@ -1171,7 +1171,7 @@ static int sixaxis_set_operational_bt(struct hid_device *hdev)
  */
 static int dualshock4_set_operational_bt(struct hid_device *hdev)
 {
-	__u8 *buf;
+	u8 *buf;
 	int ret;
 
 	buf = kmalloc(DS4_REPORT_0x02_SIZE, GFP_KERNEL);
@@ -1186,9 +1186,9 @@ static int dualshock4_set_operational_bt(struct hid_device *hdev)
 	return ret;
 }
 
-static void sixaxis_set_leds_from_id(int id, __u8 values[MAX_LEDS])
+static void sixaxis_set_leds_from_id(int id, u8 values[MAX_LEDS])
 {
-	static const __u8 sixaxis_leds[10][4] = {
+	static const u8 sixaxis_leds[10][4] = {
 				{ 0x01, 0x00, 0x00, 0x00 },
 				{ 0x00, 0x01, 0x00, 0x00 },
 				{ 0x00, 0x00, 0x01, 0x00 },
@@ -1210,10 +1210,10 @@ static void sixaxis_set_leds_from_id(int id, __u8 values[MAX_LEDS])
 	memcpy(values, sixaxis_leds[id], sizeof(sixaxis_leds[id]));
 }
 
-static void dualshock4_set_leds_from_id(int id, __u8 values[MAX_LEDS])
+static void dualshock4_set_leds_from_id(int id, u8 values[MAX_LEDS])
 {
 	/* The first 4 color/index entries match what the PS4 assigns */
-	static const __u8 color_code[7][3] = {
+	static const u8 color_code[7][3] = {
 			/* Blue   */	{ 0x00, 0x00, 0x01 },
 			/* Red	  */	{ 0x01, 0x00, 0x00 },
 			/* Green  */	{ 0x00, 0x01, 0x00 },
@@ -1232,7 +1232,7 @@ static void dualshock4_set_leds_from_id(int id, __u8 values[MAX_LEDS])
 	memcpy(values, color_code[id], sizeof(color_code[id]));
 }
 
-static void buzz_set_leds(struct hid_device *hdev, const __u8 *leds)
+static void buzz_set_leds(struct hid_device *hdev, const u8 *leds)
 {
 	struct list_head *report_list =
 		&hdev->report_enum[HID_OUTPUT_REPORT].report_list;
@@ -1250,7 +1250,7 @@ static void buzz_set_leds(struct hid_device *hdev, const __u8 *leds)
 	hid_hw_request(hdev, report, HID_REQ_SET_REPORT);
 }
 
-static void sony_set_leds(struct sony_sc *sc, const __u8 *leds, int count)
+static void sony_set_leds(struct sony_sc *sc, const u8 *leds, int count)
 {
 	int n;
 
@@ -1338,7 +1338,7 @@ static int sony_led_blink_set(struct led_classdev *led, unsigned long *delay_on,
 	struct hid_device *hdev = container_of(dev, struct hid_device, dev);
 	struct sony_sc *drv_data = hid_get_drvdata(hdev);
 	int n;
-	__u8 new_on, new_off;
+	u8 new_on, new_off;
 
 	if (!drv_data) {
 		hid_err(hdev, "No device data\n");
@@ -1409,9 +1409,9 @@ static int sony_leds_init(struct sony_sc *sc)
 	const char *name_fmt;
 	static const char * const ds4_name_str[] = { "red", "green", "blue",
 						  "global" };
-	__u8 initial_values[MAX_LEDS] = { 0 };
-	__u8 max_brightness[MAX_LEDS] = { [0 ... (MAX_LEDS - 1)] = 1 };
-	__u8 use_hw_blink[MAX_LEDS] = { 0 };
+	u8 initial_values[MAX_LEDS] = { 0 };
+	u8 max_brightness[MAX_LEDS] = { [0 ... (MAX_LEDS - 1)] = 1 };
+	u8 use_hw_blink[MAX_LEDS] = { 0 };
 
 	BUG_ON(!(sc->quirks & SONY_LED_SUPPORT));
 
@@ -1548,7 +1548,7 @@ static void sixaxis_state_worker(struct work_struct *work)
 		}
 	}
 
-	hid_hw_raw_request(sc->hdev, report->report_id, (__u8 *)report,
+	hid_hw_raw_request(sc->hdev, report->report_id, (u8 *)report,
 			sizeof(struct sixaxis_output_report),
 			HID_OUTPUT_REPORT, HID_REQ_SET_REPORT);
 }
@@ -1557,7 +1557,7 @@ static void dualshock4_state_worker(struct work_struct *work)
 {
 	struct sony_sc *sc = container_of(work, struct sony_sc, state_worker);
 	struct hid_device *hdev = sc->hdev;
-	__u8 *buf = sc->output_report_dmabuf;
+	u8 *buf = sc->output_report_dmabuf;
 	int offset;
 
 	if (sc->quirks & DUALSHOCK4_CONTROLLER_USB) {
@@ -1809,7 +1809,7 @@ static int sony_get_bt_devaddr(struct sony_sc *sc)
 
 static int sony_check_add(struct sony_sc *sc)
 {
-	__u8 *buf = NULL;
+	u8 *buf = NULL;
 	int n, ret;
 
 	if ((sc->quirks & DUALSHOCK4_CONTROLLER_BT) ||
Signature · 2 lines
(english) http://www.livejournal.com/~pavelmachek
(cesky, pictures) http://atrey.karlin.mff.cuni.cz/~pavel/picture/horses/blog.html
#6 lore raw
In reply to Pavel Machek
Quoted 10 lines · Pavel Machek

Hi!

After oopsing kernel with ps/3 peripherals, I decided to play some more.

First "sony motion controller" (part of ps/3 move without the led). Good news is that it no longer oopses. After pressing the PS button, it seems to work, but it produces endless stream of events in evtest:

Quoted 6 lines

Event: time 1426360519.967818, type 3 (EV_ABS), code 0 (ABS_X), value 131
Event: time 1426360519.967818, type 3 (EV_ABS), code 1 (ABS_Y), value 129
Event: time 1426360519.967818, type 3 (EV_ABS), code 59 (ABS_MT_DISTANCE), value 513
Event: time 1426360519.967818, type 3 (EV_ABS), code 60 (ABS_MT_TOOL_X), value 513

Should it really produce multitouch events?

Some sony devices are producing multitouch events. You unfortunately didn't send us the VID/PID of the device you are playing with.

Frank, I guess you'll handle this report once Pavel provides the necessary data? Thanks.

Signature · 2 lines
Jiri Kosina
SUSE Labs
#7 lore raw
Quoted 17 lines · Jiri Kosina
Quoted 15 lines · Pavel Machek

Hi!

After oopsing kernel with ps/3 peripherals, I decided to play some more.

First "sony motion controller" (part of ps/3 move without the led). Good news is that it no longer oopses. After pressing the PS button, it seems to work, but it produces endless stream of events in evtest:

Event: time 1426360519.967818, type 3 (EV_ABS), code 0 (ABS_X), value 131
Event: time 1426360519.967818, type 3 (EV_ABS), code 1 (ABS_Y), value 129
Event: time 1426360519.967818, type 3 (EV_ABS), code 59 (ABS_MT_DISTANCE), value 513
Event: time 1426360519.967818, type 3 (EV_ABS), code 60 (ABS_MT_TOOL_X), value 513

Quoted 4 lines
Quoted 1 line

Should it really produce multitouch events?

Some sony devices are producing multitouch events. You unfortunately didn't send us the VID/PID of the device you are playing with.

Umm. I thought multitouch events are for touchscreen. This is joystick with accelerometer...?

Device is:

[10920.396060] usb 2-1: new full-speed USB device number 2 using
uhci_hcd
[10920.676076] usb 2-1: New USB device found, idVendor=054c,
idProduct=042f
[10920.676082] usb 2-1: New USB device strings: Mfr=1, Product=2,
SerialNumber=0
[10920.676085] usb 2-1: Product: Navigation Controller
[10920.676088] usb 2-1: Manufacturer: Sony
Quoted 2 lines

Frank, I guess you'll handle this report once Pavel provides the necessary data? Thanks.

Thanks,
Pavel

Signature · 2 lines
(english) http://www.livejournal.com/~pavelmachek
(cesky, pictures) http://atrey.karlin.mff.cuni.cz/~pavel/picture/horses/blog.html
#8 lore raw
Quoted 18 lines · Pavel Machek
Quoted 17 lines · Jiri Kosina
Quoted 15 lines · Pavel Machek

Hi!

After oopsing kernel with ps/3 peripherals, I decided to play some more.

First "sony motion controller" (part of ps/3 move without the led). Good news is that it no longer oopses. After pressing the PS button, it seems to work, but it produces endless stream of events in evtest:

Event: time 1426360519.967818, type 3 (EV_ABS), code 0 (ABS_X), value 131
Event: time 1426360519.967818, type 3 (EV_ABS), code 1 (ABS_Y), value 129
Event: time 1426360519.967818, type 3 (EV_ABS), code 59 (ABS_MT_DISTANCE), value 513
Event: time 1426360519.967818, type 3 (EV_ABS), code 60 (ABS_MT_TOOL_X), value 513

Quoted 7 lines
Quoted 4 lines
Quoted 1 line

Should it really produce multitouch events?

Some sony devices are producing multitouch events. You unfortunately didn't send us the VID/PID of the device you are playing with.

Umm. I thought multitouch events are for touchscreen. This is joystick with accelerometer...?

Ok, that's USB_DEVICE_ID_SONY_NAVIGATION_CONTROLLER, which should get SIXAXIS_CONTROLLER_USB. That one shouldn't really be producing multitouch events.

Could you please add printk()s to hid-sony.c to see how it's possible that it's generating those?

I am sure Frank will comment on this as well.

Signature · 2 lines
Jiri Kosina
SUSE Labs
#9 lore raw
Quoted 25 lines · Jiri Kosina
Quoted 18 lines · Pavel Machek
Quoted 17 lines · Jiri Kosina
Quoted 15 lines · Pavel Machek

Hi!

After oopsing kernel with ps/3 peripherals, I decided to play some more.

First "sony motion controller" (part of ps/3 move without the led). Good news is that it no longer oopses. After pressing the PS button, it seems to work, but it produces endless stream of events in evtest:

Event: time 1426360519.967818, type 3 (EV_ABS), code 0 (ABS_X), value 131
Event: time 1426360519.967818, type 3 (EV_ABS), code 1 (ABS_Y), value 129
Event: time 1426360519.967818, type 3 (EV_ABS), code 59 (ABS_MT_DISTANCE), value 513
Event: time 1426360519.967818, type 3 (EV_ABS), code 60 (ABS_MT_TOOL_X), value 513

Quoted 5 lines
Quoted 3 lines
Quoted 1 line

Should it really produce multitouch events?

Some sony devices are producing multitouch events. You unfortunately didn't send us the VID/PID of the device you are playing with.

Umm. I thought multitouch events are for touchscreen. This is joystick with accelerometer...?

Quoted 9 lines

Ok, that's USB_DEVICE_ID_SONY_NAVIGATION_CONTROLLER, which should get SIXAXIS_CONTROLLER_USB. That one shouldn't really be producing multitouch events.

Could you please add printk()s to hid-sony.c to see how it's possible that it's generating those?

I am sure Frank will comment on this as well.

The Dualshock 3 is a special case in that every button except for start, select and the PS button are both digital and analog. As such, the controller reports 27 axes that end up spilling over into the ABS_MT values. This mapping comes from the default HID descriptor from the device, so it's been this way from day 1. If the navigation controller is basically the same as a DS3 then it will have the same issues.

To note, the DS3 only has 20 actual, physical axes meaning that 7 of the reported axes don't even do anything and I'm not sure why they are there. The HID descriptor could be rewritten to map everything in a more correct manner, but that would break the mapping that has been there for 8 or 9 years at this point and probably break some user-space applications in the process.

#10 lore raw

Hi!

Quoted 9 lines
Quoted 1 line

I am sure Frank will comment on this as well.

The Dualshock 3 is a special case in that every button except for start, select and the PS button are both digital and analog. As such, the controller reports 27 axes that end up spilling over into the ABS_MT values. This mapping comes from the default HID descriptor from the device, so it's been this way from day 1. If the navigation controller is basically the same as a DS3 then it will have the same issues.

Quoted 6 lines

To note, the DS3 only has 20 actual, physical axes meaning that 7 of the reported axes don't even do anything and I'm not sure why they are there. The HID descriptor could be rewritten to map everything in a more correct manner, but that would break the mapping that has been there for 8 or 9 years at this point and probably break some user-space applications in the process.

Ok, makes sense, but could this go to the beggining of hid-sony.c file as a comment, so that it is easy to find?

And BTW to you know anything about the other move controller? I have code to light the LED (which I really wanted), but can't get other data. In particular, I'd like temperature ;-).

[18788.740182] usb 2-2: new full-speed USB device number 2 using uhci_hcd
[18788.906163] usb 2-2: New USB device found, idVendor=054c, idProduct=03d5
[18788.906173] usb 2-2: New USB device strings: Mfr=1, Product=2, SerialNumber=0
[18788.906179] usb 2-2: Product: Motion Controller
[18788.906184] usb 2-2: Manufacturer: Sony Computer Entertainment
[18788.924254] input: Sony Computer Entertainment Motion Controller as
/devices/pci0000:00/0000:00:1d.0/usb2/2-2/2-2:1.0/0003:054C:03D5.0002/input/input12
[18788.981391] sony 0003:054C:03D5.0002: input,hidraw0: USB HID v1.10

Joystick [Sony Computer Entertainment Motion Controller] on usb-0000:00:1d.0-2/input0

Thanks,
Pavel

Signature · 2 lines
(english) http://www.livejournal.com/~pavelmachek
(cesky, pictures) http://atrey.karlin.mff.cuni.cz/~pavel/picture/horses/blog.html
#11 lore raw

Turn Sony motion controller into RGB led

In reply to Pavel Machek

Hi!

I did not yet figure out how to get sensor data from the controller, but it works rather well as a RGB led.

And yes, this probably would need some more cleanup, but I'm out of time now. Perhaps someone else can help...

BTW what happened to the __u8->u8 conversion patch? That should go in AFAICT.

drivers/hid/hid-core.c +1 -0
index 56ce8c2..a1c8b63 100644
@@ -1941,6 +1941,7 @@ static const struct hid_device_id hid_have_special_driver[] = {
 	{ HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_PS3_BDREMOTE) },
 	{ HID_USB_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_PS3_CONTROLLER) },
 	{ HID_USB_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_NAVIGATION_CONTROLLER) },
+	{ HID_USB_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_MOTION_CONTROLLER) },	
 	{ HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_PS3_CONTROLLER) },
 	{ HID_USB_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_PS4_CONTROLLER) },
 	{ HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_PS4_CONTROLLER) },
drivers/hid/hid-ids.h +1 -0
index 9c47867..d94d2c3 100644
@@ -843,6 +843,7 @@
 #define USB_DEVICE_ID_SONY_PS3_CONTROLLER	0x0268
 #define USB_DEVICE_ID_SONY_PS4_CONTROLLER	0x05c4
 #define USB_DEVICE_ID_SONY_NAVIGATION_CONTROLLER	0x042f
+#define USB_DEVICE_ID_SONY_MOTION_CONTROLLER	0x03d5
 #define USB_DEVICE_ID_SONY_BUZZ_CONTROLLER		0x0002
 #define USB_DEVICE_ID_SONY_WIRELESS_BUZZ_CONTROLLER	0x1000
 
drivers/hid/hid-sony.c +216 -62

531 lines not on this page · raw message

drivers/hid/hidraw.c +16 -0
index 9c2d7c2..1342b71 100644
@@ -151,7 +151,14 @@ static ssize_t hidraw_send_report(struct file *file, const char __user *buffer,
 
 	if ((report_type == HID_OUTPUT_REPORT) &&
 	    !(dev->quirks & HID_QUIRK_NO_OUTPUT_REPORTS_ON_INTR_EP)) {
+		printk("hid_hw_output_report(dev, buf, %d_REPORT);\n", count);
 		ret = hid_hw_output_report(dev, buf, count);
+		{
+			int i;
+			for (i=0; i<count; i++)
+				printk("%02x ", buf[i]);
+			printk("\n");
+		}
 		/*
 		 * compatibility with old implementation of USB-HID and I2C-HID:
 		 * if the device does not support receiving output reports,
@@ -161,6 +168,15 @@ static ssize_t hidraw_send_report(struct file *file, const char __user *buffer,
 			goto out_free;
 	}
 
+	printk("hid_hw_raw_request(dev, %02x, buf, %d, %d, HID_REQ_SET_REPORT);\n",
+	       buf[0], count, report_type);
+	{
+		int i;
+		for (i=0; i<count; i++)
+			printk("%02x ", buf[i]);
+		printk("\n");
+	}
+
 	ret = hid_hw_raw_request(dev, buf[0], buf, count, report_type,
 				HID_REQ_SET_REPORT);
 
Signature · 2 lines
(english) http://www.livejournal.com/~pavelmachek
(cesky, pictures) http://atrey.karlin.mff.cuni.cz/~pavel/picture/horses/blog.html
#12 lore raw

Re: Turn Sony motion controller into RGB led

Quoted 2 lines · Pavel Machek

I did not yet figure out how to get sensor data from the controller, but it works rather well as a RGB led.

Thanks for the patch, Pavel.

Quoted 2 lines

And yes, this probably would need some more cleanup, but I'm out of time now. Perhaps someone else can help...

Yeah, this definitely can't be applied as-is. A few of the most outstanding issues pointed out below.

Quoted 1 line

BTW what happened to the __u8->u8 conversion patch? That should go in AFAICT.

It hasn't been lost, still in my queue, but as it is of a very low priority, it hasn't been processed yet. Please make this one independent on it (i.e. do not intermix the type conversion with the actual RGB led patch).

drivers/hid/hid-core.c static const struct hid_device_id hid_have_special_driver[] = { · line 1944

Quoted 11 lines
drivers/hid/hid-core.c +1 -0
index 56ce8c2..a1c8b63 100644
@@ -1941,6 +1941,7 @@ static const struct hid_device_id hid_have_special_driver[] = {
 	{ HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_PS3_BDREMOTE) },
 	{ HID_USB_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_PS3_CONTROLLER) },
 	{ HID_USB_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_NAVIGATION_CONTROLLER) },
+	{ HID_USB_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_MOTION_CONTROLLER) },	

Minor nit -- we generally try to keep this list alphabetically sorted, although even before your change USB_DEVICE_ID_SONY_NAVIGATION_CONTROLLER is misplaced. Would be nice to have it fixed while you are at it.

[ ... snip ... ]

drivers/hid/hid-core.c static const struct hid_device_id hid_have_special_driver[] = {

Quoted 5 lines
drivers/hid/hid-core.c +4 -1
-static __u8 *ps3remote_fixup(struct hid_device *hdev, __u8 *rdesc,
+static int motion_set_leds(struct hid_device *hdev, u8 r, u8 g, u8 b)
+{
+	int ret;
+	struct motion_leds *buf = kzalloc(sizeof(struct motion_leds), GFP_KERNEL);

kzalloc() failure handling missing.

drivers/hid/hid-core.c

Quoted 2 lines
drivers/hid/hid-core.c +2 -0
+
+	if (sizeof(struct motion_leds) != 7) {

What is this trying to achieve? What error is it protecting against?

drivers/hid/hid-core.c

Quoted 1 line
drivers/hid/hid-core.c +1 -0
+		printk("Struct has bad size\n");

This needs to be prefixed by the driver / device identification (pr_/dev_ macros).

drivers/hid/hid-core.c

Quoted 3 lines
drivers/hid/hid-core.c +3 -0
+	}
+
+#define SET_LEDS 0x02

Please put this outside of the function scope.

drivers/hid/hid-core.c

Quoted 7 lines
drivers/hid/hid-core.c +7 -0
+	buf->type = SET_LEDS;
+	buf->r = r;
+	buf->g = g;
+	buf->b = b;	
+	
+	ret = hid_hw_output_report(hdev, buf, sizeof(struct motion_leds));
+	printk("motion: set leds %d\n", ret);

Again, please make this (and most of the other printk()s added by the patch) driver/device specific (and dependent on a debug option).

[ ... snip ... ]

drivers/hid/hid-core.c

Quoted 8 lines
drivers/hid/hid-core.c +8 -0
+static void motion_state_worker(struct work_struct *work)
+{
+	struct sony_sc *sc = container_of(work, struct sony_sc, state_worker);
+	struct hid_device *hdev = sc->hdev;
+
+	motion_set_leds(hdev, sc->led_state[0], sc->led_state[1], sc->led_state[2]);
+
+//	schedule_delayed_work(&sc->state_worker, HZ*3);

The work gets scheduled whenever sony_set_leds() is called, so this can be just removed, right?

[ ... snip ... ]

Quoted 16 lines
drivers/hid/hidraw.c +7 -0
index 9c2d7c2..1342b71 100644
@@ -151,7 +151,14 @@ static ssize_t hidraw_send_report(struct file *file, const char __user *buffer,
 
 	if ((report_type == HID_OUTPUT_REPORT) &&
 	    !(dev->quirks & HID_QUIRK_NO_OUTPUT_REPORTS_ON_INTR_EP)) {
+		printk("hid_hw_output_report(dev, buf, %d_REPORT);\n", count);
 		ret = hid_hw_output_report(dev, buf, count);
+		{
+			int i;
+			for (i=0; i<count; i++)
+				printk("%02x ", buf[i]);
+			printk("\n");
+		}

[ ... snip ... ]

drivers/hid/hidraw.c static ssize_t hidraw_send_report(struct file *file, const char __user *buffer, · line 179

Quoted 9 lines
drivers/hid/hidraw.c +9 -0
+	printk("hid_hw_raw_request(dev, %02x, buf, %d, %d, HID_REQ_SET_REPORT);\n",
+	       buf[0], count, report_type);
+	{
+		int i;
+		for (i=0; i<count; i++)
+			printk("%02x ", buf[i]);
+		printk("\n");
+	}
+

Both these need to go.

Maybe Frank or someone else would be willing to work on improving this patch. I am not applying it in this form.

Thanks,

Signature · 2 lines
Jiri Kosina
SUSE Labs
#13 lore raw

Re: Turn Sony motion controller into RGB led

In reply to Pavel Machek
Quoted 4 lines · Pavel Machek

Hi!

I did not yet figure out how to get sensor data from the controller, but it works rather well as a RGB led.

Hi Pavel,

From what I've read, the motion controller only sends sensor data when connected via bluetooth. Otherwise it should be in report 1 with the buttons and other data.

drivers/hid/hid-sony.c struct sony_sc { · line 936

Quoted 6 lines · so just a couple of comments on top of what he already
drivers/hid/hid-sony.c +4 -1
-static __u8 *ps3remote_fixup(struct hid_device *hdev, __u8 *rdesc,
+static int motion_set_leds(struct hid_device *hdev, u8 r, u8 g, u8 b)
+{
+	int ret;
+	struct motion_leds *buf = kzalloc(sizeof(struct motion_leds), GFP_KERNEL);

The other devices allocate this buffer up front and store it in output_report_dmabuf in the sony_sc struct to avoid hitting the allocator every time an output report is sent. No reason why the motion controller can't do the same. Add an entry in sony_allocate_output_report() and it will be automatically freed when the device is removed.

drivers/hid/hid-sony.c struct sony_sc { · line 941

Quoted 5 lines
drivers/hid/hid-sony.c +5 -0
+
+	if (sizeof(struct motion_leds) != 7) {
+		printk("Struct has bad size\n");
+	}
+

On the printk usage in general: the rest of the driver uses hid_info/hid_err to automatically format the output string with the driver/device information when printing log messages. Use these instead of printk for consistency. A lot of them should be removed anyways since they look like debugging leftovers.

If you can send a version without all of the unrelated underscore changes I'll help clean it up. I don't own one of these controllers though, so I can't help test the functionality.

#14 lore raw

Re: Turn Sony motion controller into RGB led

Hi!

Quoted 8 lines
Quoted 2 lines

I did not yet figure out how to get sensor data from the controller, but it works rather well as a RGB led.

Hi Pavel,

From what I've read, the motion controller only sends sensor data when connected via bluetooth.
Otherwise it should be in report 1 with the buttons and other data.

Aha, that would explain a lot.

Quoted 3 lines

If you can send a version without all of the unrelated underscore changes I'll help clean it up. I don't own one of these controllers though, so I can't help test the functionality.

Ok, if the offer is still valid, lets do that.

Best regards,
Pavel

Signature · 2 lines
(english) http://www.livejournal.com/~pavelmachek
(cesky, pictures) http://atrey.karlin.mff.cuni.cz/~pavel/picture/horses/blog.html
#15 lore raw

Re: Turn Sony motion controller into RGB led

In reply to Frank Praznik

Hi!

Quoted 3 lines

If you can send a version without all of the unrelated underscore changes I'll help clean it up. I don't own one of these controllers though, so I can't help test the functionality.

I cleaned some of the (easy) comments, and tested that it still works. Here's the updated version. Thanks,

Pavel

drivers/hid/hid-core.c +3 -2
index 722a925..1c5b515 100644
@@ -1958,15 +1958,16 @@ static const struct hid_device_id hid_have_special_driver[] = {
 	{ HID_USB_DEVICE(USB_VENDOR_ID_SKYCABLE, USB_DEVICE_ID_SKYCABLE_WIRELESS_PRESENTER) },
 	{ HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_SMK, USB_DEVICE_ID_SMK_PS3_BDREMOTE) },
 	{ HID_USB_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_BUZZ_CONTROLLER) },
-	{ HID_USB_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_WIRELESS_BUZZ_CONTROLLER) },
+	{ HID_USB_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_NAVIGATION_CONTROLLER) },
+	{ HID_USB_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_MOTION_CONTROLLER) },
 	{ HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_PS3_BDREMOTE) },
 	{ HID_USB_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_PS3_CONTROLLER) },
-	{ HID_USB_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_NAVIGATION_CONTROLLER) },
 	{ HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_PS3_CONTROLLER) },
 	{ HID_USB_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_PS4_CONTROLLER) },
 	{ HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_PS4_CONTROLLER) },
 	{ HID_USB_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_VAIO_VGX_MOUSE) },
 	{ HID_USB_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_VAIO_VGP_MOUSE) },
+	{ HID_USB_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_WIRELESS_BUZZ_CONTROLLER) },
 	{ HID_USB_DEVICE(USB_VENDOR_ID_STEELSERIES, USB_DEVICE_ID_STEELSERIES_SRWS1) },
 	{ HID_USB_DEVICE(USB_VENDOR_ID_SUNPLUS, USB_DEVICE_ID_SUNPLUS_WDESKTOP) },
 	{ HID_USB_DEVICE(USB_VENDOR_ID_THINGM, USB_DEVICE_ID_BLINK1) },
drivers/hid/hid-ids.h +1 -0
index 41f167e..d74243d 100644
@@ -852,6 +852,7 @@
 #define USB_DEVICE_ID_SONY_PS3_CONTROLLER	0x0268
 #define USB_DEVICE_ID_SONY_PS4_CONTROLLER	0x05c4
 #define USB_DEVICE_ID_SONY_NAVIGATION_CONTROLLER	0x042f
+#define USB_DEVICE_ID_SONY_MOTION_CONTROLLER	0x03d5
 #define USB_DEVICE_ID_SONY_BUZZ_CONTROLLER		0x0002
 #define USB_DEVICE_ID_SONY_WIRELESS_BUZZ_CONTROLLER	0x1000
 
drivers/hid/hid-sony.c +147 -8

252 lines not on this page · raw message

drivers/hid/hidraw.c +16 -0
index 9c2d7c2..1342b71 100644
@@ -151,7 +151,14 @@ static ssize_t hidraw_send_report(struct file *file, const char __user *buffer,
 
 	if ((report_type == HID_OUTPUT_REPORT) &&
 	    !(dev->quirks & HID_QUIRK_NO_OUTPUT_REPORTS_ON_INTR_EP)) {
+		printk("hid_hw_output_report(dev, buf, %d_REPORT);\n", count);
 		ret = hid_hw_output_report(dev, buf, count);
+		{
+			int i;
+			for (i=0; i<count; i++)
+				printk("%02x ", buf[i]);
+			printk("\n");
+		}
 		/*
 		 * compatibility with old implementation of USB-HID and I2C-HID:
 		 * if the device does not support receiving output reports,
@@ -161,6 +168,15 @@ static ssize_t hidraw_send_report(struct file *file, const char __user *buffer,
 			goto out_free;
 	}
 
+	printk("hid_hw_raw_request(dev, %02x, buf, %d, %d, HID_REQ_SET_REPORT);\n",
+	       buf[0], count, report_type);
+	{
+		int i;
+		for (i=0; i<count; i++)
+			printk("%02x ", buf[i]);
+		printk("\n");
+	}
+
 	ret = hid_hw_raw_request(dev, buf[0], buf, count, report_type,
 				HID_REQ_SET_REPORT);
 
Signature · 2 lines
(english) http://www.livejournal.com/~pavelmachek
(cesky, pictures) http://atrey.karlin.mff.cuni.cz/~pavel/picture/horses/blog.html