public inbox for linux-kernel@vger.kernel.org
 help / color / mirror / Atom feed
From: JJ Ding <jj_ding@emc.com.tw>
To: Seth Forshee <seth.forshee@canonical.com>
Cc: linux-input@vger.kernel.org, linux-kernel@vger.kernel.org,
	Dmitry Torokhov <dmitry.torokhov@gmail.com>,
	Aaron Huang <aaron_huang@emc.com.tw>,
	Tom Lin <tom_lin@emc.com.tw>, Eric 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>
Subject: Re: [PATCH 6/6] Input: elantech - add v3 hardware support
Date: Fri, 19 Aug 2011 16:29:57 +0800	[thread overview]
Message-ID: <87hb5ddcsa.fsf@emc.com.tw> (raw)
In-Reply-To: <20110818173959.GE28313@thinkpad-t410>

Hi Seth,

On Thu, 18 Aug 2011 12:39:59 -0500, Seth Forshee <seth.forshee@canonical.com> wrote:
> On Thu, Aug 18, 2011 at 09:57:09AM +0800, JJ Ding wrote:
> > @@ -352,6 +374,94 @@ static void elantech_report_absolute_v2(struct psmouse *psmouse)
> >  	input_sync(dev);
> >  }
> >  
> > +/*
> > + * firmware tells us there's noise.
> > + */
> > +static inline int debounce(unsigned int x, unsigned int y)
> > +{
> > +	return (x == 0xfff) && (y == 0xfff);
> > +}
> 
> This is problematic in my testing, in two ways.
> 
> First, it never actually triggers, because the y values passed to it are
> not the raw data from the packets and as such are not 0xfff anymore in
> the cases you're trying to detect.
> 
> Second, I get these packets with 1 and 2 finger touches on the Samsung
> NF310, but you only check it in the 3 finger case.
> 
> As a result, I'm getting some reports with negative values for the y
> position.
Thank you for reporting this bug.
As for now, the following should fix this issue.
I will correct this in v2.
---
diff --git a/drivers/input/mouse/elantech.c b/drivers/input/mouse/elantech.c
index e13a719..fa842f7 100644
--- a/drivers/input/mouse/elantech.c
+++ b/drivers/input/mouse/elantech.c
@@ -410,11 +410,12 @@ static void elantech_report_absolute_v3(struct psmouse *psmouse,
                 * byte 4:  .   .   .   .  y11 y10 y9  y8
                 * byte 5: y7  y6  y5  y4  y3  y2  y1  y0
                 */
-               y1 = etd->y_max - (((packet[4] & 0x0f) << 8) | packet[5]);
+               y1 = ((packet[4] & 0x0f) << 8) | packet[5];
 
                if (fingers == 3 && debounce(x1, y1))
                        return;
 
+               y1 = etd->y_max - y1;
                break;
 
        case 2:
---
> > +
> > +/*
> > + * Interpret complete data packets and report absolute mode input events for
> > + * hardware version 3. (12 byte packets for two fingers)
> > + */
> > +static void elantech_report_absolute_v3(struct psmouse *psmouse,
> > +					int packet_type)
> > +{
> > +	struct input_dev *dev = psmouse->dev;
> > +	struct elantech_data *etd = psmouse->private;
> > +	unsigned char *packet = psmouse->packet;
> > +	unsigned int fingers = 0, x1 = 0, y1 = 0, x2 = 0, y2 = 0;
> > +	unsigned int width = 0, pres = 0;
> > +
> > +	/* byte 0: n1  n0   .   .   .   .   R   L */
> > +	fingers = (packet[0] & 0xc0) >> 6;
> > +
> > +	switch (fingers) {
> > +	case 3:
> > +	case 1:
> > +		/*
> > +		 * byte 1:  .   .   .   .  x11 x10 x9  x8
> > +		 * byte 2: x7  x6  x5  x4  x4  x2  x1  x0
> > +		 */
> > +		x1 = ((packet[1] & 0x0f) << 8) | packet[2];
> > +		/*
> > +		 * byte 4:  .   .   .   .  y11 y10 y9  y8
> > +		 * byte 5: y7  y6  y5  y4  y3  y2  y1  y0
> > +		 */
> > +		y1 = etd->y_max - (((packet[4] & 0x0f) << 8) | packet[5]);
> > +
> > +		if (fingers == 3 && debounce(x1, y1))
> > +			return;
> > +
> > +		break;
> > +
> > +	case 2:
> > +		if (packet_type == PACKET_V3_HEAD) {
> > +			/*
> > +			 * byte 1:   .    .    .    .  ax11 ax10 ax9  ax8
> > +			 * byte 2: ax7  ax6  ax5  ax4  ax3  ax2  ax1  ax0
> > +			 */
> > +			etd->prev_x = ((packet[1] & 0x0f) << 8) | packet[2];
> > +			/*
> > +			 * byte 4:   .    .    .    .  ay11 ay10 ay9  ay8
> > +			 * byte 5: ay7  ay6  ay5  ay4  ay3  ay2  ay1  ay0
> > +			 */
> > +			etd->prev_y = etd->y_max -
> > +				(((packet[4] & 0x0f) << 8) | packet[5]);
> > +			/*
> > +			 * wait for next packet
> > +			 */
> > +			return;
> > +		}
> > +
> > +		/* packet_type == PACKET_V3_TAIL */
> > +		x1 = etd->prev_x;
> > +		y1 = etd->prev_y;
> > +		x2 = ((packet[1] & 0x0f) << 8) | packet[2];
> > +		y2 = etd->y_max - (((packet[4] & 0x0f) << 8) | packet[5]);
> > +		break;
> > +	}
> > +
> > +	pres = (packet[1] & 0xf0) | ((packet[4] & 0xf0) >> 4);
> > +	width = ((packet[0] & 0x30) >> 2) | ((packet[3] & 0x30) >> 4);
> > +
> > +	input_report_key(dev, BTN_TOUCH, fingers != 0);
> > +	input_report_abs(dev, ABS_X, x1);
> > +	input_report_abs(dev, ABS_Y, y1);
> 
> You should only report the ABS_[XY] coordinates when fingers != 0. The
> xorg synaptics module sees the values reported in that case as
> legitimate. This is causing me to see strange behaviors when scrolling
> with two-finger drags.
AFAIK, though v2 and v3 differ in packet format, they really report the
same data to the userspace. In this version of v3 support, I even try to
make v2 and v3 report all the data in the same sequnce. If you're seeing
this issue, maybe we should do the same with v2?

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

Thread overview: 74+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2011-08-18  1:57 [PATCH 0/6] elantech: add support for newer generation hardware JJ Ding
2011-08-18  1:57 ` [PATCH 1/6] Input: elantech - correct x, y value range for v2 hardware JJ Ding
2011-08-19 12:20   ` Éric Piel
2011-08-18  1:57 ` [PATCH 2/6] Input: elantech - use firmware provided x, y ranges JJ Ding
2011-08-18  2:44   ` Daniel Kurtz
2011-08-18  7:47   ` Dmitry Torokhov
2011-08-19  9:47     ` JJ Ding
2011-08-19 12:19       ` Éric Piel
2011-09-01 18:26     ` Chase Douglas
2011-09-05  3:22       ` JJ Ding
2011-09-06 17:03         ` Chase Douglas
2011-09-06 17:36           ` Dmitry Torokhov
2011-09-06 18:05             ` Chase Douglas
2011-09-06 18:20               ` Dmitry Torokhov
2011-09-06 19:29                 ` Chase Douglas
2011-09-07  2:33                   ` Daniel Kurtz
2011-09-06 18:47               ` Henrik Rydberg
2011-09-06 18:58                 ` Chase Douglas
2011-08-18  1:57 ` [PATCH 3/6] Input: elantech - packet checking for v2 hardware JJ Ding
2011-08-18  2:49   ` Daniel Kurtz
2011-08-18  6:38   ` Dmitry Torokhov
2011-08-18  7:31     ` JJ Ding
2011-08-18  7:52       ` Dmitry Torokhov
2011-08-18  8:06         ` JJ Ding
2011-08-19 12:22   ` Éric Piel
2011-08-18  1:57 ` [PATCH 4/6] Input: elantech - work around EC buffer JJ Ding
2011-08-18  2:50   ` Daniel Kurtz
2011-08-18  3:07   ` Wanlong Gao
2011-08-18  6:48     ` JJ Ding
2011-08-18  6:54       ` Wanlong Gao
2011-08-18  6:39   ` Dmitry Torokhov
2011-08-18  6:54     ` JJ Ding
2011-08-18  1:57 ` [PATCH 5/6] Input: elantech - clean up elantech_init JJ Ding
2011-08-18  3:04   ` Daniel Kurtz
2011-08-18  3:08     ` Wanlong Gao
2011-08-18  5:35       ` JJ Ding
2011-08-18  5:38         ` Wanlong Gao
2011-08-18  6:00         ` Dmitry Torokhov
2011-08-18  7:44           ` JJ Ding
2011-08-18  6:34   ` Wanlong Gao
2011-08-19 12:29   ` Éric Piel
2011-08-18  1:57 ` [PATCH 6/6] Input: elantech - add v3 hardware support JJ Ding
2011-08-18  2:57   ` Daniel Kurtz
2011-08-18  3:04     ` Wanlong Gao
2011-08-18  3:09       ` Daniel Kurtz
2011-08-18  3:22         ` Wanlong Gao
2011-08-18  5:39     ` JJ Ding
2011-08-18  3:01   ` Wanlong Gao
2011-08-18  5:26     ` JJ Ding
2011-08-18  5:31       ` Wanlong Gao
2011-08-18  5:34         ` Daniel Kurtz
2011-08-18  5:44           ` Wanlong Gao
2011-08-18  6:01             ` Daniel Kurtz
2011-08-18  6:06               ` Wanlong Gao
2011-08-18  7:49                 ` Tom _Lin
2011-08-18  3:30   ` Wanlong Gao
2011-08-18  3:47     ` Li Zefan
2011-08-18  4:15       ` Wanlong Gao
2011-08-18  6:02         ` Dmitry Torokhov
2011-08-18  6:08           ` Wanlong Gao
2011-08-18 13:58   ` Seth Forshee
2011-08-18 14:25     ` Seth Forshee
2011-08-19  0:15       ` Wanlong Gao
2011-08-19  2:23       ` JJ Ding
2011-08-18 17:39   ` Seth Forshee
2011-08-19  8:29     ` JJ Ding [this message]
2011-08-19 12:13       ` Seth Forshee
2011-08-19 12:41         ` Éric Piel
2011-08-19 12:50           ` Seth Forshee
2011-08-19 13:39             ` Éric Piel
2011-08-22  0:55         ` JJ Ding
2011-08-19 13:03   ` Éric Piel
2011-08-22  6:05     ` JJ Ding
2011-08-22  7:20       ` Tom _Lin

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=87hb5ddcsa.fsf@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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox