All of lore.kernel.org
 help / color / mirror / Atom feed
From: Elias Vanderstuyft <elias.vds@gmail.com>
To: Hendrik_Iben@web.de, Edgar Simo-Serra <bobbens@gmail.com>,
	Anssi Hannula <anssi.hannula@iki.fi>
Cc: linux-input@vger.kernel.org, "Simon Wood" <simon@mungewell.org>,
	"Michal Malý" <madcatxster@prifuk.cz>
Subject: Re: hid-lg2ff handling of zero/low magnitude rumble effects
Date: Fri, 4 Apr 2014 22:10:06 +0200	[thread overview]
Message-ID: <CADbOyBQkSGkDYcfpRUZR-h=gz-3S-NGLg4meuFYAP4zZQ7d2fQ@mail.gmail.com> (raw)
In-Reply-To: <CADbOyBRGha3+X8RSjvOU=ftTGuDGYAyuFW_b7==0HeF1uBLV-g@mail.gmail.com>

[-- 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


  reply	other threads:[~2014-04-04 20:10 UTC|newest]

Thread overview: 4+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2014-03-27 22:13 hid-lg2ff handling of zero/low magnitude rumble effects Elias Vanderstuyft
2014-04-04 20:10 ` Elias Vanderstuyft [this message]
2014-04-04 23:02   ` Hendrik Iben
2014-04-05  7:31     ` Elias Vanderstuyft

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to='CADbOyBQkSGkDYcfpRUZR-h=gz-3S-NGLg4meuFYAP4zZQ7d2fQ@mail.gmail.com' \
    --to=elias.vds@gmail.com \
    --cc=Hendrik_Iben@web.de \
    --cc=anssi.hannula@iki.fi \
    --cc=bobbens@gmail.com \
    --cc=linux-input@vger.kernel.org \
    --cc=madcatxster@prifuk.cz \
    --cc=simon@mungewell.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.