diff mbox

[v4,7/7] HID: sony: Add blink support to the Sixaxis and DualShock 4 LEDs

Message ID 5ab597fe6a7cc937a8d41df6df7adc47.squirrel@mungewell.org (mailing list archive)
State New, archived
Delegated to: Jiri Kosina
Headers show

Commit Message

simon@mungewell.org April 9, 2014, 5:51 a.m. UTC
Unfortunately I was unable to find the 'led chaining' code I mentioned. I
guess it has been lost to the sands of time....

>> 3rd Party Intec - Was unable to get any controlled blinking. As
>> previously
>> mentioned all leds flash (automatic, as if first plugged in) whenever
>> all
>> leds are turned off.
>> I can control all leds in a static on/off mode, but can't set any
>> blinking/timer behaviour
>
> It sounds like this controller just doesn't implement all of the
> behavior of the official controller.  I'm not sure how to fix it if it's
> not obeying the instructions in valid output reports and I don't have
> one to test personally.  Do the lights flash properly when the
> controller is used with a PS3?

I was able to patch the code so that I could turn all LEDs off my Intec
controller, see attached. Tested this against the Intec and the SixAxis.

I was not able to make the LEDs flash in a controlled fashion, so you
might be right about the controller not working properly - although my
comments in python script suggests I did have something going.... must be
missing a snippet of info.


I also found that on the SixAxis, when I reported that I had to set 1st
LED off before I could set it on.... this only applies when the controller
was off and then plugged into USB. At this point the LEDs are slow
flashing, and the 'brightness' reports as 1 (driver code only writes to
device if value is changed).

If the device was already on (LEDs flashing) then only the 1st LED is set
on plug in, and I can turn LEDs off/on straight away.

Cheers,
Simon

Comments

Frank Praznik April 9, 2014, 5:41 p.m. UTC | #1
On 4/9/2014 01:51, simon@mungewell.org wrote:
> Unfortunately I was unable to find the 'led chaining' code I mentioned. I
> guess it has been lost to the sands of time....
>
>>> 3rd Party Intec - Was unable to get any controlled blinking. As
>>> previously
>>> mentioned all leds flash (automatic, as if first plugged in) whenever
>>> all
>>> leds are turned off.
>>> I can control all leds in a static on/off mode, but can't set any
>>> blinking/timer behaviour
>> It sounds like this controller just doesn't implement all of the
>> behavior of the official controller.  I'm not sure how to fix it if it's
>> not obeying the instructions in valid output reports and I don't have
>> one to test personally.  Do the lights flash properly when the
>> controller is used with a PS3?
> I was able to patch the code so that I could turn all LEDs off my Intec
> controller, see attached. Tested this against the Intec and the SixAxis.

Thanks for taking care of this.  I'll add it to the v5 series when I 
send it in a couple of days.

>
> I was not able to make the LEDs flash in a controlled fashion, so you
> might be right about the controller not working properly - although my
> comments in python script suggests I did have something going.... must be
> missing a snippet of info.
>
>
> I also found that on the SixAxis, when I reported that I had to set 1st
> LED off before I could set it on.... this only applies when the controller
> was off and then plugged into USB. At this point the LEDs are slow
> flashing, and the 'brightness' reports as 1 (driver code only writes to
> device if value is changed).
>
> If the device was already on (LEDs flashing) then only the 1st LED is set
> on plug in, and I can turn LEDs off/on straight away.

Yeah, the controller overriding user settings and flashing by itself 
until the PS button is pushed is a particularly annoying aspect of the 
Sixaxis on USB and there is no perfect way to handle it.  I wish that I 
could just submit a report from within the driver the first time the PS 
button is pressed to restore the LED state, but that could mess with 
hidraw applications.  The next-best solution would probably be to not 
filter redundant LED state settings for Sixaxis controllers on USB.  
This way, userland can stop the flashing without having to toggle an LED 
on/off or off/on if they are already set to the desired state.  I'll 
make the change for v5.

Thanks again for all of the testing :)
--
To unsubscribe from this list: send the line "unsubscribe linux-input" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
diff mbox

Patch

From a0597309d26ddecb5d4662d9e3bcb4d2689b7ed5 Mon Sep 17 00:00:00 2001
From: Simon Wood <simon@mungewell.org>
Date: Tue, 8 Apr 2014 21:39:59 -0600
Subject: [PATCH] HID: hid-sony - allow 3rd party INTEC controller to turn off
 all leds

Without this patch the 3rd party INTEC (PS3) controller will blink all
leds when user turns them off, it appears to require an extra flag set.

Signed-off-by: Simon Wood <simon@mungewell.org>
---
 drivers/hid/hid-sony.c | 4 ++++
 1 file changed, 4 insertions(+)

diff --git a/drivers/hid/hid-sony.c b/drivers/hid/hid-sony.c
index aa5ece5..45cb8b6 100644
--- a/drivers/hid/hid-sony.c
+++ b/drivers/hid/hid-sony.c
@@ -1423,6 +1423,10 @@  static void sixaxis_state_worker(struct work_struct *work)
 	report.data.leds_bitmap |= sc->led_state[2] << 3;
 	report.data.leds_bitmap |= sc->led_state[3] << 4;
 
+	/* Set flag for all leds off, required for 3rd party INTEC controller */
+	if ((report.data.leds_bitmap & 0x1E) == 0)
+		report.data.leds_bitmap |= 0x20;
+
 	/*
 	 * The LEDs in the report are indexed in reverse order to their
 	 * corresponding light on the controller.
-- 
1.8.1.2