From patchwork Tue Sep 6 23:56:46 2011 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: chris@cnpbagwell.com X-Patchwork-Id: 1127062 Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by demeter1.kernel.org (8.14.4/8.14.4) with ESMTP id p86NuvEC023480 for ; Tue, 6 Sep 2011 23:57:02 GMT Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1755408Ab1IFX45 (ORCPT ); Tue, 6 Sep 2011 19:56:57 -0400 Received: from mail-yi0-f46.google.com ([209.85.218.46]:64009 "EHLO mail-yi0-f46.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1755414Ab1IFX44 (ORCPT ); Tue, 6 Sep 2011 19:56:56 -0400 Received: by yie30 with SMTP id 30so4467154yie.19 for ; Tue, 06 Sep 2011 16:56:56 -0700 (PDT) Received: by 10.236.186.36 with SMTP id v24mr27783422yhm.46.1315353416231; Tue, 06 Sep 2011 16:56:56 -0700 (PDT) Received: from localhost.localdomain (adsl-69-149-35-146.dsl.rcsntx.swbell.net [69.149.35.146]) by mx.google.com with ESMTPS id p73sm1555095yhe.19.2011.09.06.16.56.55 (version=TLSv1/SSLv3 cipher=OTHER); Tue, 06 Sep 2011 16:56:55 -0700 (PDT) From: chris@cnpbagwell.com To: linux-input@vger.kernel.org, pinglinux@gmail.com, rydberg@euromail.se Cc: Chris Bagwell Subject: [PATCH v2] Input: wacom - fix touch on newer Bamboo's Date: Tue, 6 Sep 2011 18:56:46 -0500 Message-Id: <1315353406-8564-1-git-send-email-chris@cnpbagwell.com> X-Mailer: git-send-email 1.7.6 Sender: linux-input-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-input@vger.kernel.org X-Greylist: IP, sender and recipient auto-whitelisted, not delayed by milter-greylist-4.2.6 (demeter1.kernel.org [140.211.167.41]); Tue, 06 Sep 2011 23:57:02 +0000 (UTC) From: Chris Bagwell Bamboo's with Product ID's > 0xD4 return values unrelated to pressure in touch 1 pressure field. They also report touch 2's X/Y values shifted down 1 byte (where pressure was). This results in jumpy 1 finger touch and totally invalid 2nd finger data. For touch detection, switch to a Touch Present single bit that all versions of Bamboo support. For touch 2 offset, calculate offset based on a bit that is set different between the two packet layouts. Since touch pressure reports were removed from driver, there was no need to be reading pressure any more. Signed-off-by: Chris Bagwell Reviewed-by: Ping Cheng --- New in v2: Converted stylus_in_proximity from if() back to an && operation to match original flow; as suggested by Ping. drivers/input/tablet/wacom_wac.c | 14 ++++++++------ 1 files changed, 8 insertions(+), 6 deletions(-) diff --git a/drivers/input/tablet/wacom_wac.c b/drivers/input/tablet/wacom_wac.c index 2d88316..6f3bd61 100644 --- a/drivers/input/tablet/wacom_wac.c +++ b/drivers/input/tablet/wacom_wac.c @@ -800,20 +800,22 @@ static int wacom_bpt_touch(struct wacom_wac *wacom) int i; for (i = 0; i < 2; i++) { - int p = data[9 * i + 2]; - bool touch = p && !wacom->shared->stylus_in_proximity; + int offset = (data[1] & 0x80) ? (8 * i) : (9 * i); + bool touch = data[offset + 3] & 0x80; - input_mt_slot(input, i); - input_mt_report_slot_state(input, MT_TOOL_FINGER, touch); /* * Touch events need to be disabled while stylus is * in proximity because user's hand is resting on touchpad * and sending unwanted events. User expects tablet buttons * to continue working though. */ + touch = touch && wacom->shared->stylus_in_proximity; + + input_mt_slot(input, i); + input_mt_report_slot_state(input, MT_TOOL_FINGER, touch); if (touch) { - int x = get_unaligned_be16(&data[9 * i + 3]) & 0x7ff; - int y = get_unaligned_be16(&data[9 * i + 5]) & 0x7ff; + int x = get_unaligned_be16(&data[offset + 3]) & 0x7ff; + int y = get_unaligned_be16(&data[offset + 5]) & 0x7ff; if (features->quirks & WACOM_QUIRK_BBTOUCH_LOWRES) { x <<= 5; y <<= 5;