Input: alps - use the generic process_bitmap function for v5 touchpads
Now that the generic process_bitmap function has been improved to offer accurate coordinates for the first touch we can use it for v5 (dolphin) touchpads too. Besides being a nice code cleanup this also fixes the saw tooth pattern in the coordinates for the second touch the dolphin specific version had. Signed-off-by: Hans de Goede <hdegoede@redhat.com> Signed-off-by: Dmitry Torokhov <dmitry.torokhov@gmail.com>
This commit is contained in:
parent
688ea364b2
commit
dccf1dd845
1 changed files with 12 additions and 62 deletions
|
@ -302,53 +302,6 @@ static void alps_process_packet_v1_v2(struct psmouse *psmouse)
|
||||||
input_sync(dev);
|
input_sync(dev);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
* Process bitmap data for V5 protocols. Return value is null.
|
|
||||||
*
|
|
||||||
* The bitmaps don't have enough data to track fingers, so this function
|
|
||||||
* only generates points representing a bounding box of at most two contacts.
|
|
||||||
* These two points are returned in fields->mt.
|
|
||||||
*/
|
|
||||||
static void alps_process_bitmap_dolphin(struct alps_data *priv,
|
|
||||||
struct alps_fields *fields)
|
|
||||||
{
|
|
||||||
int box_middle_x, box_middle_y;
|
|
||||||
unsigned int x_map, y_map;
|
|
||||||
unsigned char start_bit, end_bit;
|
|
||||||
unsigned char x_msb, x_lsb, y_msb, y_lsb;
|
|
||||||
|
|
||||||
x_map = fields->x_map;
|
|
||||||
y_map = fields->y_map;
|
|
||||||
|
|
||||||
if (!x_map || !y_map)
|
|
||||||
return;
|
|
||||||
|
|
||||||
/* Get Most-significant and Least-significant bit */
|
|
||||||
x_msb = fls(x_map);
|
|
||||||
x_lsb = ffs(x_map);
|
|
||||||
y_msb = fls(y_map);
|
|
||||||
y_lsb = ffs(y_map);
|
|
||||||
|
|
||||||
/* Most-significant bit should never exceed max sensor line number */
|
|
||||||
if (x_msb > priv->x_bits || y_msb > priv->y_bits)
|
|
||||||
return;
|
|
||||||
|
|
||||||
if (fields->fingers > 1) {
|
|
||||||
start_bit = priv->x_bits - x_msb;
|
|
||||||
end_bit = priv->x_bits - x_lsb;
|
|
||||||
box_middle_x = (priv->x_max * (start_bit + end_bit)) /
|
|
||||||
(2 * (priv->x_bits - 1));
|
|
||||||
|
|
||||||
start_bit = y_lsb - 1;
|
|
||||||
end_bit = y_msb - 1;
|
|
||||||
box_middle_y = (priv->y_max * (start_bit + end_bit)) /
|
|
||||||
(2 * (priv->y_bits - 1));
|
|
||||||
fields->mt[0] = fields->st;
|
|
||||||
fields->mt[1].x = 2 * box_middle_x - fields->mt[0].x;
|
|
||||||
fields->mt[1].y = 2 * box_middle_y - fields->mt[0].y;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static void alps_get_bitmap_points(unsigned int map,
|
static void alps_get_bitmap_points(unsigned int map,
|
||||||
struct alps_bitmap_point *low,
|
struct alps_bitmap_point *low,
|
||||||
struct alps_bitmap_point *high,
|
struct alps_bitmap_point *high,
|
||||||
|
@ -376,7 +329,7 @@ static void alps_get_bitmap_points(unsigned int map,
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Process bitmap data from v3 and v4 protocols. Returns the number of
|
* Process bitmap data from semi-mt protocols. Returns the number of
|
||||||
* fingers detected. A return value of 0 means at least one of the
|
* fingers detected. A return value of 0 means at least one of the
|
||||||
* bitmaps was empty.
|
* bitmaps was empty.
|
||||||
*
|
*
|
||||||
|
@ -454,8 +407,15 @@ static int alps_process_bitmap(struct alps_data *priv,
|
||||||
(priv->y_max * (2 * y_high.start_bit + y_high.num_bits - 1)) /
|
(priv->y_max * (2 * y_high.start_bit + y_high.num_bits - 1)) /
|
||||||
(2 * (priv->y_bits - 1));
|
(2 * (priv->y_bits - 1));
|
||||||
|
|
||||||
/* y-bitmap order is reversed, except on rushmore */
|
/* x-bitmap order is reversed on v5 touchpads */
|
||||||
if (priv->proto_version != ALPS_PROTO_V3_RUSHMORE) {
|
if (priv->proto_version == ALPS_PROTO_V5) {
|
||||||
|
for (i = 0; i < 4; i++)
|
||||||
|
corner[i].x = priv->x_max - corner[i].x;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* y-bitmap order is reversed on v3 and v4 touchpads */
|
||||||
|
if (priv->proto_version == ALPS_PROTO_V3 ||
|
||||||
|
priv->proto_version == ALPS_PROTO_V4) {
|
||||||
for (i = 0; i < 4; i++)
|
for (i = 0; i < 4; i++)
|
||||||
corner[i].y = priv->y_max - corner[i].y;
|
corner[i].y = priv->y_max - corner[i].y;
|
||||||
}
|
}
|
||||||
|
@ -742,18 +702,8 @@ static void alps_process_touchpad_packet_v3_v5(struct psmouse *psmouse)
|
||||||
* data, so we need to do decode it first.
|
* data, so we need to do decode it first.
|
||||||
*/
|
*/
|
||||||
priv->decode_fields(f, priv->multi_data, psmouse);
|
priv->decode_fields(f, priv->multi_data, psmouse);
|
||||||
|
if (alps_process_bitmap(priv, f) == 0)
|
||||||
if (priv->proto_version == ALPS_PROTO_V3 ||
|
fingers = 0; /* Use st data */
|
||||||
priv->proto_version == ALPS_PROTO_V3_RUSHMORE) {
|
|
||||||
if (alps_process_bitmap(priv, f) == 0)
|
|
||||||
fingers = 0; /* Use st data */
|
|
||||||
} else {
|
|
||||||
/*
|
|
||||||
* Since Dolphin's finger number is reliable,
|
|
||||||
* there is no need to compare with bmap_fn.
|
|
||||||
*/
|
|
||||||
alps_process_bitmap_dolphin(priv, f);
|
|
||||||
}
|
|
||||||
} else {
|
} else {
|
||||||
priv->multi_packet = 0;
|
priv->multi_packet = 0;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Reference in a new issue