ACK: [PATCH][Precise] Input: synaptics - Adjust threshold for treating position values as negative

Tim Gardner tim.gardner at canonical.com
Mon Sep 10 17:16:42 UTC 2012


On 09/10/2012 10:58 AM, Seth Forshee wrote:
> Commit c039450 (Input: synaptics - handle out of bounds values from the
> hardware) caused any hardware reported values over 7167 to be treated as
> a wrapped-around negative value. It turns out that some firmware uses
> the value 8176 to indicate a finger near the edge of the touchpad whose
> actual position cannot be determined. This value now gets treated as
> negative, which can cause pointer jumps and broken edge scrolling on
> these machines.
> 
> I only know of one touchpad which reports negative values, and this
> hardware never reports any value lower than -8 (i.e. 8184). Moving the
> threshold for treating a value as negative up to 8176 should work fine
> then for any hardware we currently know about, and since we're dealing
> with unspecified behavior it's probably the best we can do. The special
> 8176 value is also likely to result in sudden jumps in position, so
> let's also clamp this to the maximum speicified value for the axis.
> 
> BugLink: http://bugs.launchpad.net/bugs/1046512
> Cc: stable at vger.kernel.org
> Signed-off-by: Seth Forshee <seth.forshee at canonical.com>
> ---
>  drivers/input/mouse/synaptics.c |   31 +++++++++++++++++++++++--------
>  1 file changed, 23 insertions(+), 8 deletions(-)
> 
> diff --git a/drivers/input/mouse/synaptics.c b/drivers/input/mouse/synaptics.c
> index 35e5551..2451771 100644
> --- a/drivers/input/mouse/synaptics.c
> +++ b/drivers/input/mouse/synaptics.c
> @@ -53,14 +53,19 @@
>  #define ABS_POS_BITS 13
>  
>  /*
> - * Any position values from the hardware above the following limits are
> - * treated as "wrapped around negative" values that have been truncated to
> - * the 13-bit reporting range of the hardware. These are just reasonable
> - * guesses and can be adjusted if hardware is found that operates outside
> - * of these parameters.
> + * These values should represent the absolute maximum value that will
> + * be reported for a positive position value. Some Synaptics firmware
> + * uses this value to indicate a finger near the edge of the touchpad
> + * whose precise position cannot be determined.
> + *
> + * At least one touchpad is known to report positions in excess of this
> + * value which are actually negative values truncated to the 13-bit
> + * reporting range. These values have never been observed to be lower
> + * than 8184 (i.e. -8), so we treat all values greater than 8176 as
> + * negative and any other value as positive.
>   */
> -#define X_MAX_POSITIVE (((1 << ABS_POS_BITS) + XMAX) / 2)
> -#define Y_MAX_POSITIVE (((1 << ABS_POS_BITS) + YMAX) / 2)
> +#define X_MAX_POSITIVE 8176
> +#define Y_MAX_POSITIVE 8176
>  
>  /*
>   * Synaptics touchpads report the y coordinate from bottom to top, which is
> @@ -561,11 +566,21 @@ static int synaptics_parse_hw_state(const unsigned char buf[],
>  		hw->right = (buf[0] & 0x02) ? 1 : 0;
>  	}
>  
> -	/* Convert wrap-around values to negative */
> +	/*
> +	 * Convert wrap-around values to negative. (X|Y)_MAX_POSITIVE
> +	 * is used by some firmware to indicate a finger at the edge of
> +	 * the touchpad whose precise position cannot be determined, so
> +	 * convert these values to the maximum axis value.
> +	 */
>  	if (hw->x > X_MAX_POSITIVE)
>  		hw->x -= 1 << ABS_POS_BITS;
> +	else if (hw->x == X_MAX_POSITIVE)
> +		hw->x = XMAX;
> +
>  	if (hw->y > Y_MAX_POSITIVE)
>  		hw->y -= 1 << ABS_POS_BITS;
> +	else if (hw->y == Y_MAX_POSITIVE)
> +		hw->y = YMAX;
>  
>  	return 0;
>  }
> 

blech!
-- 
Tim Gardner tim.gardner at canonical.com




More information about the kernel-team mailing list