linux-input.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* hid-lg2ff handling of zero/low magnitude rumble effects
@ 2014-03-27 22:13 Elias Vanderstuyft
  2014-04-04 20:10 ` Elias Vanderstuyft
  0 siblings, 1 reply; 4+ messages in thread
From: Elias Vanderstuyft @ 2014-03-27 22:13 UTC (permalink / raw)
  To: Simon Wood, Anssi Hannula; +Cc: linux-input

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

^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: hid-lg2ff handling of zero/low magnitude rumble effects
  2014-03-27 22:13 hid-lg2ff handling of zero/low magnitude rumble effects Elias Vanderstuyft
@ 2014-04-04 20:10 ` Elias Vanderstuyft
  2014-04-04 23:02   ` Hendrik Iben
  0 siblings, 1 reply; 4+ messages in thread
From: Elias Vanderstuyft @ 2014-04-04 20:10 UTC (permalink / raw)
  To: Hendrik_Iben, Edgar Simo-Serra, Anssi Hannula
  Cc: linux-input, Simon Wood, Michal Malý

[-- Attachment #1: Type: text/plain, Size: 3160 bytes --]

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

[-- Attachment #2: USBCommander.zip --]
[-- Type: application/zip, Size: 9947 bytes --]

[-- Attachment #3: 0001-HID-lg2ff-add-rumble-magnitude-clamping-quirk.patch --]
[-- Type: text/x-patch, Size: 1897 bytes --]

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


^ permalink raw reply related	[flat|nested] 4+ messages in thread

* Re: hid-lg2ff handling of zero/low magnitude rumble effects
  2014-04-04 20:10 ` Elias Vanderstuyft
@ 2014-04-04 23:02   ` Hendrik Iben
  2014-04-05  7:31     ` Elias Vanderstuyft
  0 siblings, 1 reply; 4+ messages in thread
From: Hendrik Iben @ 2014-04-04 23:02 UTC (permalink / raw)
  To: Elias Vanderstuyft, Edgar Simo-Serra, Anssi Hannula
  Cc: linux-input, Simon Wood, Michal Malý

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

^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: hid-lg2ff handling of zero/low magnitude rumble effects
  2014-04-04 23:02   ` Hendrik Iben
@ 2014-04-05  7:31     ` Elias Vanderstuyft
  0 siblings, 0 replies; 4+ messages in thread
From: Elias Vanderstuyft @ 2014-04-05  7:31 UTC (permalink / raw)
  To: Hendrik Iben
  Cc: Edgar Simo-Serra, Anssi Hannula, linux-input, Simon Wood,
	Michal Malý

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

^ permalink raw reply	[flat|nested] 4+ messages in thread

end of thread, other threads:[~2014-04-05  7:31 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2014-03-27 22:13 hid-lg2ff handling of zero/low magnitude rumble effects Elias Vanderstuyft
2014-04-04 20:10 ` Elias Vanderstuyft
2014-04-04 23:02   ` Hendrik Iben
2014-04-05  7:31     ` Elias Vanderstuyft

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).