From patchwork Mon Jan 5 19:24:30 2015 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Benjamin Tissoires X-Patchwork-Id: 5570261 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.29.136]) by patchwork1.web.kernel.org (Postfix) with ESMTP id 3E7149F4DC for ; Mon, 5 Jan 2015 19:24:35 +0000 (UTC) Received: from mail.kernel.org (localhost [127.0.0.1]) by mail.kernel.org (Postfix) with ESMTP id 2E0C2201E4 for ; Mon, 5 Jan 2015 19:24:34 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 1CD31201C8 for ; Mon, 5 Jan 2015 19:24:33 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1754366AbbAETYc (ORCPT ); Mon, 5 Jan 2015 14:24:32 -0500 Received: from mail-qc0-f172.google.com ([209.85.216.172]:42742 "EHLO mail-qc0-f172.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1754363AbbAETYb (ORCPT ); Mon, 5 Jan 2015 14:24:31 -0500 Received: by mail-qc0-f172.google.com with SMTP id m20so16125839qcx.3; Mon, 05 Jan 2015 11:24:30 -0800 (PST) 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=+1De2MyiJG4lgKjPG5L3VwWQjSiotUpPIHOZjXwrm7I=; b=GbJFhigCM9/a+xhmTzvAyRMMzG8cGzcQVqOYG0Cfx5naB7z5CccJjrM2xZwg9ds4jn uHMQXjDxKdfAC9Bc5OwCjdrQZknbDa3SLLwB8Mliy7Gm3cOWRdNr3R0A196ewknLm0Uj t7W+pms8G7hrCN0pmlmkU6vj2WVgzgscqGJW25GWYBjezjdPQy09R0sK+9+ENDGeX436 SL3EGsy/oONyLFJwy0srXspfBrci3EHcPL94fAiQuEj9U8Kh8LBKUcbuSyFQK/L4DVeM TUZUcJrohYKIbrJaz5WaVTsJbI0o+mgxOgiE2ddIIjxpKyo/hpbBh68LJaYMiKt44lLE KX3A== MIME-Version: 1.0 X-Received: by 10.224.37.200 with SMTP id y8mr574549qad.73.1420485870272; Mon, 05 Jan 2015 11:24:30 -0800 (PST) Received: by 10.140.167.6 with HTTP; Mon, 5 Jan 2015 11:24:30 -0800 (PST) In-Reply-To: <1419679889-6582-2-git-send-email-gabriele.mzt@gmail.com> References: <1419679889-6582-1-git-send-email-gabriele.mzt@gmail.com> <1419679889-6582-2-git-send-email-gabriele.mzt@gmail.com> Date: Mon, 5 Jan 2015 14:24:30 -0500 Message-ID: Subject: Re: [PATCH 1/2] input: synaptics - make image sensors report ABS_MT_TOUCH_MAJOR From: Benjamin Tissoires To: Gabriele Mazzotta , Peter Hutterer , Hans de Goede Cc: Dmitry Torokhov , Henrik Rydberg , linux-input , "linux-kernel@vger.kernel.org" , Maxwell Anselm Sender: linux-input-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-input@vger.kernel.org X-Spam-Status: No, score=-6.8 required=5.0 tests=BAYES_00, DKIM_ADSP_CUSTOM_MED, DKIM_SIGNED, FREEMAIL_FROM, RCVD_IN_DNSWL_HI, T_DKIM_INVALID, T_RP_MATCHES_RCVD, 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 Gabriele, [Adding Peter and Hans as this change will impact both xf86-input-synaptics and libinput] On Sat, Dec 27, 2014 at 6:31 AM, Gabriele Mazzotta wrote: > Despite claiming to be able to report ABS_TOOL_WIDTH, image sensors > were not doing it. Make them report widths and use ABS_MT_TOUCH_MAJOR > instead ABS_TOOL_WIDTH. It looks like the current xorg-synaptics code already handles ABS_MT_TOUCH_MAJOR as finger_width. So I think we should be good in replacing the ABS_TOOL_WIDTH event. However, I'd prefer having Peter confirm this because xorg-synaptics still relies a lot on the single touch emulation. > > Since the 'w' slot is used to report the finger count when two or more > fingers are on the touchpad, make sure that only meaningful values are > emitted, i.e. values greater than or equal to 4, and assign the correct > range to ABS_MT_TOUCH_MAJOR. > > Link: https://bugzilla.kernel.org/show_bug.cgi?id=77161 > Signed-off-by: Gabriele Mazzotta > --- > drivers/input/mouse/synaptics.c | 11 +++++++++-- > 1 file changed, 9 insertions(+), 2 deletions(-) > > diff --git a/drivers/input/mouse/synaptics.c b/drivers/input/mouse/synaptics.c > index f947292..ea0563e 100644 > --- a/drivers/input/mouse/synaptics.c > +++ b/drivers/input/mouse/synaptics.c > @@ -814,6 +814,8 @@ static void synaptics_report_slot(struct input_dev *dev, int slot, Just FYI, this does not apply anymore on top of Dmitry's tree. synaptics_report_slot() has been removed, and you should now report the slot state in synaptics_report_mt_data(). > input_report_abs(dev, ABS_MT_POSITION_X, hw->x); > input_report_abs(dev, ABS_MT_POSITION_Y, synaptics_invert_y(hw->y)); > input_report_abs(dev, ABS_MT_PRESSURE, hw->z); > + if (hw->w >= 4) That I don't like. IMO, at this point, .w should only contain the finger width, unconditionally. Also, with 2/2, .w is computed accurately for the second finger, but not for the first. I tried to figure out a way to properly extract the actual width information from the sgm packet when the w is 0 or 1, and the only way I found was to do the fix in synaptics_image_sensor_process(). I would have preferred dealing with that in synaptics_parse_hw_state() directly, but I think the final code would be more and more ugly. Dealing with the true finger width in synaptics_image_sensor_process() is not a problem for cr48 sensors, because they will not have the ABS_MT_TOUCH_MAJOR event exported. Anyway, something like that "should" work (sorry for the tab/space, gmail in use), of course, this is untested when I send the mail :) : } > + input_report_abs(dev, ABS_MT_TOUCH_MAJOR, hw->w); > } > > static void synaptics_report_mt_data(struct psmouse *psmouse, > @@ -1462,8 +1464,13 @@ static void set_input_params(struct psmouse *psmouse, > INPUT_MT_TRACK : INPUT_MT_SEMI_MT)); > } > > - if (SYN_CAP_PALMDETECT(priv->capabilities)) > - input_set_abs_params(dev, ABS_TOOL_WIDTH, 0, 15, 0, 0); > + if (SYN_CAP_PALMDETECT(priv->capabilities)) { > + if (SYN_CAP_IMAGE_SENSOR(priv->ext_cap_0c)) > + input_set_abs_params(dev, > + ABS_MT_TOUCH_MAJOR, 4, 15, 0, 0); > + else > + input_set_abs_params(dev, ABS_TOOL_WIDTH, 0, 15, 0, 0); > + } Again, I'd prefer having Peter's point of view here. If we really need both, we will need to change input-mt to also emulate ABS_TOOL_WIDTH from ABS_MT_TOUCH_MAJOR like we do between ABS_MT_POSITION_X|Y and ABS_X|Y. Cheers, Benjamin > > __set_bit(BTN_TOUCH, dev->keybit); > __set_bit(BTN_TOOL_FINGER, dev->keybit); > -- > 2.1.4 > > -- > 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 --- 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 --git a/drivers/input/mouse/synaptics.c b/drivers/input/mouse/synaptics.c index 95c15451..caf7ccd 100644 --- a/drivers/input/mouse/synaptics.c +++ b/drivers/input/mouse/synaptics.c @@ -852,6 +852,17 @@ static void synaptics_image_sensor_process(struct psmouse *psmouse, else num_fingers = 4; + /* When multiple fingers are on the TouchPad, the width is encoded in + * X, Y and Z */ + if (sgm->w == 0 || sgm->w == 1) { + sgm->w = ((sgm->x & BIT(1)) >> 1) | + (sgm->y & BIT(1)) | + ((sgm->z & BIT(0)) << 1); + sgm->x &= ~BIT(1); + sgm->y &= ~BIT(1); + sgm->z &= ~BIT(0); + } + /* Send resulting input events to user space */ synaptics_report_mt_data(psmouse, sgm, num_fingers);