All of lore.kernel.org
 help / color / mirror / Atom feed
From: JJ Ding <jj_ding@emc.com.tw>
To: linux-input@vger.kernel.org, linux-kernel@vger.kernel.org
Cc: "Seth Forshee" <seth.forshee@canonical.com>,
	"Dmitry Torokhov" <dmitry.torokhov@gmail.com>,
	"Aaron Huang" <aaron_huang@emc.com.tw>,
	"Tom Lin" <tom_lin@emc.com.tw>,
	"Éric Piel" <E.A.B.Piel@tudelft.nl>,
	"Daniel Kurtz" <djkurtz@chromium.org>,
	"Chase Douglas" <chase.douglas@canonical.com>,
	"Henrik Rydberg" <rydberg@euromail.se>,
	"Alessandro Rubini" <rubini@cvml.unipv.it>,
	"JJ Ding" <jj_ding@emc.com.tw>
Subject: [PATCH v4 5/8] Input: elantech - packet checking for v2 hardware
Date: Mon, 29 Aug 2011 16:28:56 +0800	[thread overview]
Message-ID: <1314606539-24722-6-git-send-email-jj_ding@emc.com.tw> (raw)
In-Reply-To: <1314606539-24722-1-git-send-email-jj_ding@emc.com.tw>

For v2 hardware, there is no real parity check, but we can still check
some constant bits for data integrity.

Also rename elantech_check_parity_v1 to elantech_packet_check_v1 to make
these packet checking function names consistent.

Signed-off-by: JJ Ding <jj_ding@emc.com.tw>
Acked-by: Daniel Kurtz <djkurtz@chromium.org>
---
 drivers/input/mouse/elantech.c |   39 ++++++++++++++++++++++++++++++++++-----
 1 files changed, 34 insertions(+), 5 deletions(-)

diff --git a/drivers/input/mouse/elantech.c b/drivers/input/mouse/elantech.c
index 282b8b6..008e8c2 100644
--- a/drivers/input/mouse/elantech.c
+++ b/drivers/input/mouse/elantech.c
@@ -350,7 +350,7 @@ static void elantech_report_absolute_v2(struct psmouse *psmouse)
 	input_sync(dev);
 }
 
-static int elantech_check_parity_v1(struct psmouse *psmouse)
+static int elantech_packet_check_v1(struct psmouse *psmouse)
 {
 	struct elantech_data *etd = psmouse->private;
 	unsigned char *packet = psmouse->packet;
@@ -374,6 +374,34 @@ static int elantech_check_parity_v1(struct psmouse *psmouse)
 	       etd->parity[packet[3]] == p3;
 }
 
+static int elantech_packet_check_v2(struct psmouse *psmouse)
+{
+	struct elantech_data *etd = psmouse->private;
+	unsigned char *packet = psmouse->packet;
+
+	/*
+	 * V2 hardware has two flavors. Older ones that do not report pressure,
+	 * and newer ones that reports pressure and width. With newer ones, all
+	 * packets (1, 2, 3 finger touch) have the same constant bits. With
+	 * older ones, 1/3 finger touch packets and 2 finger touch packets
+	 * have different constant bits.
+	 * With all three cases, if the constant bits are not exactly what I
+	 * expected, I consider them invalid.
+	 */
+	if (etd->reports_pressure)
+		return (packet[0] & 0x0c) == 0x04 &&
+		       (packet[3] & 0x0f) == 0x02;
+
+	if ((packet[0] & 0xc0) == 0x80)
+		return (packet[0] & 0x0c) == 0x0c &&
+		       (packet[3] & 0x0e) == 0x08;
+
+	return (packet[0] & 0x3c) == 0x3c &&
+	       (packet[1] & 0xf0) == 0x00 &&
+	       (packet[3] & 0x3e) == 0x38 &&
+	       (packet[4] & 0xf0) == 0x00;
+}
+
 /*
  * Process byte stream from mouse and handle complete packets
  */
@@ -389,14 +417,16 @@ static psmouse_ret_t elantech_process_byte(struct psmouse *psmouse)
 
 	switch (etd->hw_version) {
 	case 1:
-		if (etd->paritycheck && !elantech_check_parity_v1(psmouse))
+		if (etd->paritycheck && !elantech_packet_check_v1(psmouse))
 			return PSMOUSE_BAD_DATA;
 
 		elantech_report_absolute_v1(psmouse);
 		break;
 
 	case 2:
-		/* We don't know how to check parity in protocol v2 */
+		if (etd->paritycheck && !elantech_packet_check_v2(psmouse))
+			return PSMOUSE_BAD_DATA;
+
 		elantech_report_absolute_v2(psmouse);
 		break;
 	}
@@ -795,8 +825,7 @@ int elantech_init(struct psmouse *psmouse)
 		etd->hw_version = 2;
 		/* For now show extra debug information */
 		etd->debug = 1;
-		/* Don't know how to do parity checking for version 2 */
-		etd->paritycheck = 0;
+		etd->paritycheck = 1;
 
 		if (etd->fw_version >= 0x020800)
 			etd->reports_pressure = true;
-- 
1.7.4.1


  parent reply	other threads:[~2011-08-29  8:27 UTC|newest]

Thread overview: 23+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2011-08-29  8:28 [PATCH v4 0/8] Input: elantech: add support for newer hardware JJ Ding
2011-08-29  8:28 ` JJ Ding
2011-08-29  8:28 ` [PATCH v4 1/8] Input: elantech - correct x, y value range for v2 hardware JJ Ding
2011-08-29  8:28 ` [PATCH v4 2/8] Input: elantech - get rid of ETP_2FT_* in elantech.h JJ Ding
2011-08-29  8:28 ` [PATCH v4 3/8] Input: elantech - use firmware provided x, y ranges JJ Ding
2011-08-29  8:28 ` [PATCH v4 4/8] Input: elantech - remove ETP_EDGE_FUZZ_V2 JJ Ding
2011-08-29  8:28   ` JJ Ding
2011-08-29  8:28 ` JJ Ding [this message]
2011-08-29  8:28 ` [PATCH v4 6/8] Input: elantech - clean up elantech_init JJ Ding
2011-08-29  8:28 ` [PATCH v4 7/8] Input: elantech - add v3 hardware support JJ Ding
2011-08-29  8:28 ` [PATCH v4 8/8] Input: elantech - add v4 " JJ Ding
2011-08-30 13:50   ` Tom _Lin
2011-08-31 12:50   ` Éric Piel
2011-08-31 12:50     ` Éric Piel
2011-09-01  1:31     ` JJ Ding
2011-09-01  1:31       ` JJ Ding
2011-08-31  9:43 ` [PATCH v4 0/8] Input: elantech: add support for newer hardware JJ Ding
2011-08-31 21:10   ` Dmitry Torokhov
2011-09-01  1:38     ` JJ Ding
2011-08-31 12:54 ` Éric Piel
2011-08-31 12:54   ` Éric Piel
2011-09-01  1:39   ` JJ Ding
2011-09-01  1:39     ` JJ Ding

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=1314606539-24722-6-git-send-email-jj_ding@emc.com.tw \
    --to=jj_ding@emc.com.tw \
    --cc=E.A.B.Piel@tudelft.nl \
    --cc=aaron_huang@emc.com.tw \
    --cc=chase.douglas@canonical.com \
    --cc=djkurtz@chromium.org \
    --cc=dmitry.torokhov@gmail.com \
    --cc=linux-input@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=rubini@cvml.unipv.it \
    --cc=rydberg@euromail.se \
    --cc=seth.forshee@canonical.com \
    --cc=tom_lin@emc.com.tw \
    /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.