Re: [PATCH 2/2] elantech: Report multitouch with proper ABS_MT messages

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hi Eric,

On Wed, May 05, 2010 at 02:20:46PM +0200, Éric Piel wrote:
> 
> Multitouch info was reported only via a old protocol used by the
> proprietary X driver from elantech. Let's report the multitouch info
> also following the official MT protocol.
> 
> This was done following the multi-touch-protocol.txt documentation, and
> inspired by the bcm5974 implementation. Testing was light as there is
> not many applications using this protocol yet, but the X synaptics
> driver didn't complain and the X multitouch driver behaved correctly.
> 
> Signed-off-by: Éric Piel <eric.piel@xxxxxxxxxxxxxxxx>
> ---
>  drivers/input/mouse/elantech.c |   15 ++++++++++++++-
>  1 files changed, 14 insertions(+), 1 deletions(-)
> 
> diff --git a/drivers/input/mouse/elantech.c b/drivers/input/mouse/elantech.c
> index 6a99b30..22978a9 100644
> --- a/drivers/input/mouse/elantech.c
> +++ b/drivers/input/mouse/elantech.c
> @@ -253,7 +253,6 @@ static void elantech_report_absolute_v2(struct psmouse *psmouse)
>  
>  	/* byte 0: n1  n0   .   .   .   .   R   L */
>  	fingers = (packet[0] & 0xc0) >> 6;
> -	input_report_key(dev, BTN_TOUCH, fingers != 0);

Mousedev works a tad better if BTN_TOUCH is reported first. Otherwise
looks good.

Henrik, should we report "tool width" as ABS_MT_WIDTH_MAJOR?

Eric, we don't have the "width" for the 2nd point of contact, do we?

Where is the proprietary driver BTW? Do we even care? I'd probably get
rid of HAT abuse if our standard tools provide good user experience.

>  
>  	switch (fingers) {
>  	case 1:
> @@ -268,6 +267,10 @@ static void elantech_report_absolute_v2(struct psmouse *psmouse)
>  		 * byte 5: y7  y6  y5  y4  y3  y2  y1  y0
>  		 */
>  		y1 = ETP_YMAX_V2 - (((packet[4] & 0x03) << 8) | packet[5]);
> +		input_report_abs(dev, ABS_MT_POSITION_X, x1);
> +		input_report_abs(dev, ABS_MT_POSITION_Y, y1);
> +		input_mt_sync(dev);
> +
>  		input_report_abs(dev, ABS_TOOL_WIDTH, width);
>  		input_report_abs(dev, ABS_X, x1);
>  		input_report_abs(dev, ABS_Y, y1);
> @@ -290,6 +293,13 @@ static void elantech_report_absolute_v2(struct psmouse *psmouse)
>  		x2 = ((packet[3] & 0x10) << 4) | packet[4];
>  		/* byte 5: by7 by6 by5 by4 by3 by2 by1 by0 */
>  		y2 = ETP_2FT_YMAX - (((packet[3] & 0x20) << 3) | packet[5]);
> +		/* Multitouch */
> +		input_report_abs(dev, ABS_MT_POSITION_X, x1 << 2);
> +		input_report_abs(dev, ABS_MT_POSITION_Y, y1 << 2);
> +		input_mt_sync(dev);
> +		input_report_abs(dev, ABS_MT_POSITION_X, x2 << 2);
> +		input_report_abs(dev, ABS_MT_POSITION_Y, y2 << 2);
> +		input_mt_sync(dev);
>  		/*
>  		 * For compatibility with the X Synaptics driver scale up
>  		 * one coordinate and report as ordinary mouse movent
> @@ -307,6 +317,7 @@ static void elantech_report_absolute_v2(struct psmouse *psmouse)
>  		break;
>  	}
>  
> +	input_report_key(dev, BTN_TOUCH, fingers != 0);
>  	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);
> @@ -472,6 +483,8 @@ static void elantech_set_input_params(struct psmouse *psmouse)
>  		input_set_abs_params(dev, ABS_TOOL_WIDTH, ETP_WMIN_V2, ETP_WMAX_V2, 0, 0);
>  		input_set_abs_params(dev, ABS_X, ETP_XMIN_V2, ETP_XMAX_V2, 0, 0);
>  		input_set_abs_params(dev, ABS_Y, ETP_YMIN_V2, ETP_YMAX_V2, 0, 0);
> +		input_set_abs_params(dev, ABS_MT_POSITION_X, ETP_XMIN_V2, ETP_XMAX_V2, 0, 0);
> +		input_set_abs_params(dev, ABS_MT_POSITION_Y, ETP_YMIN_V2, ETP_YMAX_V2, 0, 0);
>  		input_set_abs_params(dev, ABS_HAT0X, ETP_2FT_XMIN, ETP_2FT_XMAX, 0, 0);
>  		input_set_abs_params(dev, ABS_HAT0Y, ETP_2FT_YMIN, ETP_2FT_YMAX, 0, 0);
>  		input_set_abs_params(dev, ABS_HAT1X, ETP_2FT_XMIN, ETP_2FT_XMAX, 0, 0);


-- 
Dmitry
--
To unsubscribe from this list: send the line "unsubscribe linux-input" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html

[Index of Archives]     [Linux Media Devel]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]     [Linux Wireless Networking]     [Linux Omap]

  Powered by Linux