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@xxxxxxxxx> 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: USBCommander.zip>>
From 528b4c7e78429672538a65287160ad5498aafd05 Mon Sep 17 00:00:00 2001 From: Elias Vanderstuyft <elias.vds@xxxxxxxxx> 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@xxxxxxxxx> Cc: linux-input@xxxxxxxxxxxxxxx Cc: linux-kernel@xxxxxxxxxxxxxxx --- 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