diff mbox

hid-lg2ff handling of zero/low magnitude rumble effects

Message ID CADbOyBQkSGkDYcfpRUZR-h=gz-3S-NGLg4meuFYAP4zZQ7d2fQ@mail.gmail.com (mailing list archive)
State New, archived
Delegated to: Jiri Kosina
Headers show

Commit Message

Elias Vanderstuyft April 4, 2014, 8:10 p.m. UTC
Hi guys,


I'm about to release a patch (see attachment
"0001-HID-lg2ff-add-rumble-magnitude-clamping-quirk.patch") for the
lg2ff driver to account for some weird quirks concerning the magnitude
of a rumble effect.
You can read the description in that patch too get more details on it.

The reason I sent this to you, is because I only own and tested this
on a Logitech Vibration Feedback wheel, and not on a Rumblepad (2). I
saw that Hendrik might have a Wingman Rumblepad, and Edgar a Rumblepad
2 device. But if other people have such lg2ff-compatible device as
well, feel free to cooperate.
May I ask you to perform some simple tests (see next paragraph) to
verify that these quirks are also valid on those devices?

To test sending some USB commands, I attached "USBCommander.zip" which
contains a program made with Qt4 by Michal (Cc'd; thanks Michal!) To
build it, you will need to run 'qmake-qt4' and 'make' in the top-level
directory.
It's simple to use USBCommander: enter the Vendor ID ("046d") and
Product ID ("c20a" for Rumblepad, or "c218" for Rumblepad 2), then
press 'Open', enter the to-be-tested command in the 'Command:' field,
and finally press 'Send command'.
After testing, press 'Release' and then quit the application.
You will need to run 'USBCommander' as root to send the USB commands.

Commands to test:
==============

    Send the following commands (without parentheses):
    "51 00 xx 00 yy 00 00"
    with yy (strong rumble) = "02" and:
        xx = "00"    => You should feel an irregular weak rumble
        xx = "01"    => You should feel an irregular weak rumble
        xx = "02"    => You should feel (almost) no rumble
        xx = "03"    => You should feel (almost) no rumble
        xx = "FC"    => You should feel much weak rumble
        xx = "FD"    => You should feel much weak rumble
        xx = "FE"    => You should feel much irregular weak rumble,
but less than with xx = FD
        xx = "FF"    => You should feel much irregular weak rumble,
but less than with xx = FD

    Test the same for the other rumble motor type (swap xx with yy).

    To stop the rumble, send the following command:
    "F3 00 00 00 00 00 00"

If you discover that the results do not match my assumptions, please
tell what happens in that case.


Thank you very much,

Elias

On Thu, Mar 27, 2014 at 11:13 PM, Elias Vanderstuyft
<elias.vds@gmail.com> wrote:
> Hi,
>
>
> I noticed that my rumble wheel (Logitech Formula Vibration Feedback)
> reacts in a strange way when sending low rumble magnitudes to the
> device:
>
> Assume the following USB command to be send to emit rumble:
>     report->field[0]->value[0] = 0x51;
>     report->field[0]->value[2] = weak;
>     report->field[0]->value[4] = strong;
> When 'weak' or 'strong' is lower than 0x02 (i.e. 0x01 or 0x00), then
> the corresponding rumble motor begins to rumble intermittently, this
> resembles a bit to forcing a 2-state light-switch to be in the middle
> position.
>
> Now my question is whether all other devices (e.g. "Logitech
> RumblePad", "Rumblepad 2") experience this behaviour?
> (If you own such a device, please verify this.)
>
>
> Best regards,
>
> Elias

Comments

Hendrik Iben April 4, 2014, 11:02 p.m. UTC | #1
Hi Elias,

First of all - thanks for caring about compatibility with old devices.
It would be really annoying if something that worked once stopped
working on an update.

I just dug out my old Wingman Rumblepad (VID 046d PID c20a) and did the
test cases (thanks for the tool by the way - might come in handy for
other things). The first motor for this device controls a weak/smooth
rumble effect and the second one a strong/coarse one. For both motors,
values from 00 to 03 have no effect on the haptic side. You can hear the
motors spinning a bit higher if you hold the pad to your ear... :-) -
but it sounds like a  linear increase. It similar for the high values.
FC-FF produce the same high amount of rumble. There might be a small
increase but not really any difference.
From these observations I would say that clamping is fine for the
Rumblepad although not needed. But a special case handling would have no
positive effect.

Best regards,
Hendrik

Am 04.04.2014 22:10, schrieb Elias Vanderstuyft:
> Hi guys,
> 
> 
> I'm about to release a patch (see attachment
> "0001-HID-lg2ff-add-rumble-magnitude-clamping-quirk.patch") for the
> lg2ff driver to account for some weird quirks concerning the magnitude
> of a rumble effect.
> You can read the description in that patch too get more details on it.
> 
> The reason I sent this to you, is because I only own and tested this
> on a Logitech Vibration Feedback wheel, and not on a Rumblepad (2). I
> saw that Hendrik might have a Wingman Rumblepad, and Edgar a Rumblepad
> 2 device. But if other people have such lg2ff-compatible device as
> well, feel free to cooperate.
> May I ask you to perform some simple tests (see next paragraph) to
> verify that these quirks are also valid on those devices?
> 
> To test sending some USB commands, I attached "USBCommander.zip" which
> contains a program made with Qt4 by Michal (Cc'd; thanks Michal!) To
> build it, you will need to run 'qmake-qt4' and 'make' in the top-level
> directory.
> It's simple to use USBCommander: enter the Vendor ID ("046d") and
> Product ID ("c20a" for Rumblepad, or "c218" for Rumblepad 2), then
> press 'Open', enter the to-be-tested command in the 'Command:' field,
> and finally press 'Send command'.
> After testing, press 'Release' and then quit the application.
> You will need to run 'USBCommander' as root to send the USB commands.
> 
> Commands to test:
> ==============
> 
>     Send the following commands (without parentheses):
>     "51 00 xx 00 yy 00 00"
>     with yy (strong rumble) = "02" and:
>         xx = "00"    => You should feel an irregular weak rumble
>         xx = "01"    => You should feel an irregular weak rumble
>         xx = "02"    => You should feel (almost) no rumble
>         xx = "03"    => You should feel (almost) no rumble
>         xx = "FC"    => You should feel much weak rumble
>         xx = "FD"    => You should feel much weak rumble
>         xx = "FE"    => You should feel much irregular weak rumble,
> but less than with xx = FD
>         xx = "FF"    => You should feel much irregular weak rumble,
> but less than with xx = FD
> 
>     Test the same for the other rumble motor type (swap xx with yy).
> 
>     To stop the rumble, send the following command:
>     "F3 00 00 00 00 00 00"
> 
> If you discover that the results do not match my assumptions, please
> tell what happens in that case.
> 
> 
> Thank you very much,
> 
> Elias
> 
> On Thu, Mar 27, 2014 at 11:13 PM, Elias Vanderstuyft
> <elias.vds@gmail.com> wrote:
>> Hi,
>>
>>
>> I noticed that my rumble wheel (Logitech Formula Vibration Feedback)
>> reacts in a strange way when sending low rumble magnitudes to the
>> device:
>>
>> Assume the following USB command to be send to emit rumble:
>>     report->field[0]->value[0] = 0x51;
>>     report->field[0]->value[2] = weak;
>>     report->field[0]->value[4] = strong;
>> When 'weak' or 'strong' is lower than 0x02 (i.e. 0x01 or 0x00), then
>> the corresponding rumble motor begins to rumble intermittently, this
>> resembles a bit to forcing a 2-state light-switch to be in the middle
>> position.
>>
>> Now my question is whether all other devices (e.g. "Logitech
>> RumblePad", "Rumblepad 2") experience this behaviour?
>> (If you own such a device, please verify this.)
>>
>>
>> Best regards,
>>
>> Elias
--
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
Elias Vanderstuyft April 5, 2014, 7:31 a.m. UTC | #2
On Sat, Apr 5, 2014 at 1:02 AM, Hendrik Iben <Hendrik_Iben@web.de> wrote:
> Hi Elias,
>
> First of all - thanks for caring about compatibility with old devices.
> It would be really annoying if something that worked once stopped
> working on an update.
>
> I just dug out my old Wingman Rumblepad (VID 046d PID c20a) and did the
> test cases (thanks for the tool by the way - might come in handy for
> other things). The first motor for this device controls a weak/smooth
> rumble effect and the second one a strong/coarse one. For both motors,
> values from 00 to 03 have no effect on the haptic side. You can hear the
> motors spinning a bit higher if you hold the pad to your ear... :-) -
> but it sounds like a  linear increase. It similar for the high values.
> FC-FF produce the same high amount of rumble. There might be a small
> increase but not really any difference.
> From these observations I would say that clamping is fine for the
> Rumblepad although not needed. But a special case handling would have no
> positive effect.

OK, thanks for testing! I agree that a special case handling would
have no positive effect.
I tried to contact Edgar earlier past month, but until now I can't
seem to get in touch with him.
If there is no reply in a reasonable amount of time, I'll release the
patch, it won't hurt anyone ;)

Again thanks,
Elias
--
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 528b4c7e78429672538a65287160ad5498aafd05 Mon Sep 17 00:00:00 2001
From: Elias Vanderstuyft <elias.vds@gmail.com>
Date: Thu, 3 Apr 2014 19:25:58 +0200
Subject: [PATCH] HID: lg2ff: add rumble magnitude clamping quirk

If a magnitude in the output report is lower than 2, i.e. 1 or 0,
the corresponding rumble motor shakes irregularly,
instead of being turned (almost) off like when magnitude 2 is used.
On the other hand, if a magnitude is higher than 0xfd, i.e 0xfe or 0xff,
the corresponding rumble motor shakes irregularly with a rotation speed
lower than when magnitude 0xfd is used.
From 0x02 to 0xfd, the device behaves well:
a monotonic increase of rotation speed.
This applies to both weak and strong rumble motor types.

This patch fixes this issue by clamping magnitudes from 0x02 to 0xfd.

Note: The same thing appears to happen in the Windows Logitech driver,
      except the max clamping bound is not 0xfd, but 0xfe.
      Experimentally, I proved this to be wrong.

Signed-off-by: Elias Vanderstuyft <elias.vds@gmail.com>
Cc: linux-input@vger.kernel.org
Cc: linux-kernel@vger.kernel.org
---
 drivers/hid/hid-lg2ff.c | 5 +++++
 1 file changed, 5 insertions(+)

diff --git a/drivers/hid/hid-lg2ff.c b/drivers/hid/hid-lg2ff.c
index 0e3fb1a..e180e1e 100644
--- a/drivers/hid/hid-lg2ff.c
+++ b/drivers/hid/hid-lg2ff.c
@@ -38,12 +38,17 @@  static int play_effect(struct input_dev *dev, void *data,
 	struct lg2ff_device *lg2ff = data;
 	int weak, strong;
 
+#define CLAMP_QUIRK(x) do { if (x < 2) x = 2; else if (x > 0xfd) x = 0xfd; } \
+			while (0)
+
 	strong = effect->u.rumble.strong_magnitude;
 	weak = effect->u.rumble.weak_magnitude;
 
 	if (weak || strong) {
 		weak = weak * 0xff / 0xffff;
 		strong = strong * 0xff / 0xffff;
+		CLAMP_QUIRK(weak);
+		CLAMP_QUIRK(strong);
 
 		lg2ff->report->field[0]->value[0] = 0x51;
 		lg2ff->report->field[0]->value[2] = weak;
-- 
1.8.3.1