From: "Éric Piel" <E.A.B.Piel@tudelft.nl>
To: JJ Ding <jj_ding@emc.com.tw>
Cc: linux-input@vger.kernel.org, linux-kernel@vger.kernel.org,
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>, 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 15:03:04 +0200 [thread overview]
Message-ID: <4E4E5F08.1030803@tudelft.nl> (raw)
In-Reply-To: <1313632629-23603-7-git-send-email-jj_ding@emc.com.tw>
Op 18-08-11 03:57, JJ Ding schreef:
> v3 hardware's packet format is almost identical to v2 (one/three finger touch),
> except when sensing two finger touch, the hardware sends 12 bytes of data.
>
> Signed-off-by: JJ Ding<jj_ding@emc.com.tw>
Hi,
A couple of comments, in line.
:
:
> diff --git a/drivers/input/mouse/elantech.c b/drivers/input/mouse/elantech.c
> index ddd40eb..e13a719 100644
> --- a/drivers/input/mouse/elantech.c
> +++ b/drivers/input/mouse/elantech.c
:
> +/*
> + * 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;
> + }
You actually have three times the same formula, so you could simplify it:
if (fingers !=0 ) {
/*
* 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 = ((packet[4]& 0x0f)<< 8) | packet[5];
}
if ((fingers == 3) && debounce(x1, y1))
return;
if (fingers == 2) {
if (packet_type == PACKET_V3_HEAD)) {
/* wait for next packet */
etd->prev_x = x1;
etd->prev_y = etd->y_max - y1;
return;
} else {
/* packet_type == PACKET_V3_TAIL */
x2 = etd->prev_x;
y2 = etd->prev_y;
}
}
> +
> + pres = (packet[1]& 0xf0) | ((packet[4]& 0xf0)>> 4);
> + width = ((packet[0]& 0x30)>> 2) | ((packet[3]& 0x30)>> 4);
What about the case of two fingers? Are pressure and width correct for
both fingers? In that case, maybe it should also be saved from
PACKET_V3_HEAD.
> +
> + input_report_key(dev, BTN_TOUCH, fingers != 0);
> + input_report_abs(dev, ABS_X, x1);
> + input_report_abs(dev, ABS_Y, y1);
> + elantech_report_semi_mt_data(dev, fingers, x1, y1, x2, y2);
> + input_report_key(dev, BTN_TOOL_FINGER, fingers == 1);
> + input_report_key(dev, BTN_TOOL_DOUBLETAP, fingers == 2);
> + input_report_key(dev, BTN_TOOL_TRIPLETAP, fingers == 3);
> + input_report_key(dev, BTN_LEFT, packet[0]& 0x01);
> + input_report_key(dev, BTN_RIGHT, packet[0]& 0x02);
> + input_report_abs(dev, ABS_PRESSURE, pres);
> + input_report_abs(dev, ABS_TOOL_WIDTH, width);
> +
> + input_sync(dev);
> +}
> +
:
>
> /*
> * Set the appropriate event bits for the input subsystem
> */
> -static void elantech_set_input_params(struct psmouse *psmouse)
> +static int elantech_set_input_params(struct psmouse *psmouse)
> {
> struct input_dev *dev = psmouse->dev;
> struct elantech_data *etd = psmouse->private;
> unsigned int x_min = 0, y_min = 0, x_max = 0, y_max = 0, y_2ft_max = 0;
>
> - set_range(psmouse,&x_min,&y_min,&x_max,&y_max,&y_2ft_max);
> + if (set_range(psmouse,&x_min,&y_min,&x_max,&y_max,&y_2ft_max))
> + return -1;
>
> __set_bit(EV_KEY, dev->evbit);
> __set_bit(EV_ABS, dev->evbit);
> @@ -582,10 +739,26 @@ static void elantech_set_input_params(struct psmouse *psmouse)
> input_set_abs_params(dev, ABS_MT_POSITION_X, x_min, x_max, 0, 0);
> input_set_abs_params(dev, ABS_MT_POSITION_Y, y_min, y_max, 0, 0);
> break;
> +
> + case 3:
> + input_set_abs_params(dev, ABS_X, x_min, x_max, 0, 0);
> + input_set_abs_params(dev, ABS_Y, y_min, y_max, 0, 0);
> + /* range of pressure and width is the same as v2 */
> + input_set_abs_params(dev, ABS_PRESSURE, ETP_PMIN_V2,
> + ETP_PMAX_V2, 0, 0);
> + input_set_abs_params(dev, ABS_TOOL_WIDTH, ETP_WMIN_V2,
> + ETP_WMAX_V2, 0, 0);
> + __set_bit(INPUT_PROP_SEMI_MT, dev->propbit);
Does v3 have the same limitation in MT about only reporting the edges of
the bounding box? Or are the two fingers always reported independently?
If that is so, you can drop this line :-)
> + input_mt_init_slots(dev, 2);
> + input_set_abs_params(dev, ABS_MT_POSITION_X, x_min, x_max, 0, 0);
> + input_set_abs_params(dev, ABS_MT_POSITION_Y, y_min, y_max, 0, 0);
> + break;
> }
>
Cheers,
Éric
next prev parent reply other threads:[~2011-08-19 13:03 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
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 [this message]
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=4E4E5F08.1030803@tudelft.nl \
--to=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=jj_ding@emc.com.tw \
--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