From patchwork Fri Apr 4 20:10:06 2014 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Elias Vanderstuyft X-Patchwork-Id: 3940771 X-Patchwork-Delegate: jikos@jikos.cz Return-Path: X-Original-To: patchwork-linux-input@patchwork.kernel.org Delivered-To: patchwork-parsemail@patchwork1.web.kernel.org Received: from mail.kernel.org (mail.kernel.org [198.145.19.201]) by patchwork1.web.kernel.org (Postfix) with ESMTP id E4DDF9F1EE for ; Fri, 4 Apr 2014 20:10:25 +0000 (UTC) Received: from mail.kernel.org (localhost [127.0.0.1]) by mail.kernel.org (Postfix) with ESMTP id 0C51120383 for ; Fri, 4 Apr 2014 20:10:25 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 19D9920395 for ; Fri, 4 Apr 2014 20:10:24 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753546AbaDDUKL (ORCPT ); Fri, 4 Apr 2014 16:10:11 -0400 Received: from mail-vc0-f170.google.com ([209.85.220.170]:49668 "EHLO mail-vc0-f170.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1753075AbaDDUKH (ORCPT ); Fri, 4 Apr 2014 16:10:07 -0400 Received: by mail-vc0-f170.google.com with SMTP id hu19so3580640vcb.29 for ; Fri, 04 Apr 2014 13:10:06 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:in-reply-to:references:date:message-id:subject:from:to :cc:content-type; bh=SAD7PDkdzQ3/gENo3LvbzhwtQY7BrZEZy6kXgz0sGEE=; b=b6HeWcvNCwb+UqELP34A0axP8xnntFoup45rgIWuLeKbDlm8PMJ6HHz2kJLmDtNOzG CoODZsEUSCbaz5luB4KNkRmhEEDOHfubNcneVCRSVDfRJPyDg0jkH7u6UnfswfdbuID8 E+lJMKrtcx2fyK7q/7NMDTb02uvetl7wvCFoceEGeyaBsRrEq77BOX3AqrDo9NE9SflU LJOLFoSOxV20l6FC70+SYBcHsNu7cXwXJJKeUEiLj/Kmmg0lEhjvDMjLGjsrSxJe2aP/ 00ubRGj33CH3UEoV3JPWDOBye5CxWS59rASer/w+OlkiabzKwOT6/qS8w0LtcUwYewAk wYWA== MIME-Version: 1.0 X-Received: by 10.58.112.98 with SMTP id ip2mr1551376veb.35.1396642206471; Fri, 04 Apr 2014 13:10:06 -0700 (PDT) Received: by 10.220.163.4 with HTTP; Fri, 4 Apr 2014 13:10:06 -0700 (PDT) In-Reply-To: References: Date: Fri, 4 Apr 2014 22:10:06 +0200 Message-ID: Subject: Re: hid-lg2ff handling of zero/low magnitude rumble effects From: Elias Vanderstuyft To: Hendrik_Iben@web.de, Edgar Simo-Serra , Anssi Hannula Cc: linux-input@vger.kernel.org, Simon Wood , =?ISO-8859-1?Q?Michal_Mal=FD?= Sender: linux-input-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-input@vger.kernel.org X-Spam-Status: No, score=-7.4 required=5.0 tests=BAYES_00, DKIM_ADSP_CUSTOM_MED, DKIM_SIGNED, FREEMAIL_FROM, RCVD_IN_DNSWL_HI, RP_MATCHES_RCVD, T_DKIM_INVALID, T_TVD_MIME_EPI,UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on mail.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP 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 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 From 528b4c7e78429672538a65287160ad5498aafd05 Mon Sep 17 00:00:00 2001 From: Elias Vanderstuyft 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 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