2005-04-17 06:20:36 +08:00
|
|
|
/*
|
|
|
|
* Synaptics TouchPad PS/2 mouse driver
|
|
|
|
*
|
|
|
|
* This program is free software; you can redistribute it and/or modify it
|
|
|
|
* under the terms of the GNU General Public License version 2 as published by
|
|
|
|
* the Free Software Foundation.
|
|
|
|
*/
|
|
|
|
|
|
|
|
#ifndef _SYNAPTICS_H
|
|
|
|
#define _SYNAPTICS_H
|
|
|
|
|
|
|
|
/* synaptics queries */
|
|
|
|
#define SYN_QUE_IDENTIFY 0x00
|
|
|
|
#define SYN_QUE_MODES 0x01
|
|
|
|
#define SYN_QUE_CAPABILITIES 0x02
|
|
|
|
#define SYN_QUE_MODEL 0x03
|
|
|
|
#define SYN_QUE_SERIAL_NUMBER_PREFIX 0x06
|
|
|
|
#define SYN_QUE_SERIAL_NUMBER_SUFFIX 0x07
|
|
|
|
#define SYN_QUE_RESOLUTION 0x08
|
|
|
|
#define SYN_QUE_EXT_CAPAB 0x09
|
2012-07-08 09:08:51 +08:00
|
|
|
#define SYN_QUE_FIRMWARE_ID 0x0a
|
2010-04-20 01:37:21 +08:00
|
|
|
#define SYN_QUE_EXT_CAPAB_0C 0x0c
|
2011-07-10 03:32:56 +08:00
|
|
|
#define SYN_QUE_EXT_MAX_COORDS 0x0d
|
|
|
|
#define SYN_QUE_EXT_MIN_COORDS 0x0f
|
2005-04-17 06:20:36 +08:00
|
|
|
|
|
|
|
/* synatics modes */
|
|
|
|
#define SYN_BIT_ABSOLUTE_MODE (1 << 7)
|
|
|
|
#define SYN_BIT_HIGH_RATE (1 << 6)
|
|
|
|
#define SYN_BIT_SLEEP_MODE (1 << 3)
|
|
|
|
#define SYN_BIT_DISABLE_GESTURE (1 << 2)
|
|
|
|
#define SYN_BIT_FOUR_BYTE_CLIENT (1 << 1)
|
|
|
|
#define SYN_BIT_W_MODE (1 << 0)
|
|
|
|
|
|
|
|
/* synaptics model ID bits */
|
|
|
|
#define SYN_MODEL_ROT180(m) ((m) & (1 << 23))
|
|
|
|
#define SYN_MODEL_PORTRAIT(m) ((m) & (1 << 22))
|
|
|
|
#define SYN_MODEL_SENSOR(m) (((m) >> 16) & 0x3f)
|
|
|
|
#define SYN_MODEL_HARDWARE(m) (((m) >> 9) & 0x7f)
|
|
|
|
#define SYN_MODEL_NEWABS(m) ((m) & (1 << 7))
|
|
|
|
#define SYN_MODEL_PEN(m) ((m) & (1 << 6))
|
|
|
|
#define SYN_MODEL_SIMPLIC(m) ((m) & (1 << 5))
|
|
|
|
#define SYN_MODEL_GEOMETRY(m) ((m) & 0x0f)
|
|
|
|
|
|
|
|
/* synaptics capability bits */
|
|
|
|
#define SYN_CAP_EXTENDED(c) ((c) & (1 << 23))
|
|
|
|
#define SYN_CAP_MIDDLE_BUTTON(c) ((c) & (1 << 18))
|
|
|
|
#define SYN_CAP_PASS_THROUGH(c) ((c) & (1 << 7))
|
|
|
|
#define SYN_CAP_SLEEP(c) ((c) & (1 << 4))
|
|
|
|
#define SYN_CAP_FOUR_BUTTON(c) ((c) & (1 << 3))
|
|
|
|
#define SYN_CAP_MULTIFINGER(c) ((c) & (1 << 1))
|
|
|
|
#define SYN_CAP_PALMDETECT(c) ((c) & (1 << 0))
|
2010-07-21 15:01:19 +08:00
|
|
|
#define SYN_CAP_SUBMODEL_ID(c) (((c) & 0x00ff00) >> 8)
|
2005-04-17 06:20:36 +08:00
|
|
|
#define SYN_EXT_CAP_REQUESTS(c) (((c) & 0x700000) >> 20)
|
|
|
|
#define SYN_CAP_MULTI_BUTTON_NO(ec) (((ec) & 0x00f000) >> 12)
|
2010-04-20 01:37:21 +08:00
|
|
|
#define SYN_CAP_PRODUCT_ID(ec) (((ec) & 0xff0000) >> 16)
|
2011-02-23 12:15:07 +08:00
|
|
|
|
|
|
|
/*
|
|
|
|
* The following describes response for the 0x0c query.
|
|
|
|
*
|
|
|
|
* byte mask name meaning
|
|
|
|
* ---- ---- ------- ------------
|
|
|
|
* 1 0x01 adjustable threshold capacitive button sensitivity
|
|
|
|
* can be adjusted
|
|
|
|
* 1 0x02 report max query 0x0d gives max coord reported
|
|
|
|
* 1 0x04 clearpad sensor is ClearPad product
|
|
|
|
* 1 0x08 advanced gesture not particularly meaningful
|
|
|
|
* 1 0x10 clickpad bit 0 1-button ClickPad
|
|
|
|
* 1 0x60 multifinger mode identifies firmware finger counting
|
|
|
|
* (not reporting!) algorithm.
|
|
|
|
* Not particularly meaningful
|
2011-07-07 13:39:14 +08:00
|
|
|
* 1 0x80 covered pad W clipped to 14, 15 == pad mostly covered
|
|
|
|
* 2 0x01 clickpad bit 1 2-button ClickPad
|
|
|
|
* 2 0x02 deluxe LED controls touchpad support LED commands
|
2011-02-23 12:15:07 +08:00
|
|
|
* ala multimedia control bar
|
|
|
|
* 2 0x04 reduced filtering firmware does less filtering on
|
|
|
|
* position data, driver should watch
|
|
|
|
* for noise.
|
Input: synaptics - add image sensor support
Synaptics makes (at least) two kinds of touchpad sensors:
* Older pads use a profile sensor that could only infer the location
of individual fingers based on the projection of their profiles
onto row and column sensors.
* Newer pads use an image sensor that can track true finger position
using a two-dimensional sensor grid.
Both sensor types support an "Advanced Gesture Mode":
When multiple fingers are detected, the touchpad sends alternating
"Advanced Gesture Mode" (AGM) and "Simple Gesture Mode" (SGM)
packets.
The AGM packets have w=2, and contain reduced resolution finger data
The SGM packets have w={0,1} and contain full resolution finger data
Profile sensors try to report the "upper" (larger y value) finger in
the SGM packet, and the lower (smaller y value) in the AGM packet.
However, due to the nature of the profile sensor, they easily get
confused when fingers cross, and can start reporting the x-coordinate
of one with the y-coordinate of the other. Thus, for profile
sensors, "semi-mt" was created, which reports a "bounding box"
created by pairing min and max coordinates of the two pairs of
reported fingers.
Image sensors can report the actual coordinates of two of the fingers
present. This patch detects if the touchpad is an image sensor and
reports finger data using the MT-B protocol.
NOTE: This patch only adds partial support for 2-finger gestures.
The proper interpretation of the slot contents when more than
two fingers are present is left to later patches. Also,
handling of 'number of fingers' transitions is incomplete.
Signed-off-by: Daniel Kurtz <djkurtz@chromium.org>
Acked-by: Chase Douglas <chase.douglas@canonical.com>
Acked-by: Henrik Rydberg <rydberg@euromail.se>
Signed-off-by: Dmitry Torokhov <dtor@mail.ru>
2011-08-24 14:02:25 +08:00
|
|
|
* 2 0x08 image sensor image sensor tracks 5 fingers, but only
|
|
|
|
* reports 2.
|
2011-07-10 03:32:56 +08:00
|
|
|
* 2 0x20 report min query 0x0f gives min coord reported
|
2011-02-23 12:15:07 +08:00
|
|
|
*/
|
2010-12-01 15:51:03 +08:00
|
|
|
#define SYN_CAP_CLICKPAD(ex0c) ((ex0c) & 0x100000) /* 1-button ClickPad */
|
|
|
|
#define SYN_CAP_CLICKPAD2BTN(ex0c) ((ex0c) & 0x000100) /* 2-button ClickPad */
|
2010-05-11 14:06:52 +08:00
|
|
|
#define SYN_CAP_MAX_DIMENSIONS(ex0c) ((ex0c) & 0x020000)
|
2011-07-25 16:36:46 +08:00
|
|
|
#define SYN_CAP_MIN_DIMENSIONS(ex0c) ((ex0c) & 0x002000)
|
2010-12-22 01:11:25 +08:00
|
|
|
#define SYN_CAP_ADV_GESTURE(ex0c) ((ex0c) & 0x080000)
|
2011-07-07 13:39:14 +08:00
|
|
|
#define SYN_CAP_REDUCED_FILTERING(ex0c) ((ex0c) & 0x000400)
|
Input: synaptics - add image sensor support
Synaptics makes (at least) two kinds of touchpad sensors:
* Older pads use a profile sensor that could only infer the location
of individual fingers based on the projection of their profiles
onto row and column sensors.
* Newer pads use an image sensor that can track true finger position
using a two-dimensional sensor grid.
Both sensor types support an "Advanced Gesture Mode":
When multiple fingers are detected, the touchpad sends alternating
"Advanced Gesture Mode" (AGM) and "Simple Gesture Mode" (SGM)
packets.
The AGM packets have w=2, and contain reduced resolution finger data
The SGM packets have w={0,1} and contain full resolution finger data
Profile sensors try to report the "upper" (larger y value) finger in
the SGM packet, and the lower (smaller y value) in the AGM packet.
However, due to the nature of the profile sensor, they easily get
confused when fingers cross, and can start reporting the x-coordinate
of one with the y-coordinate of the other. Thus, for profile
sensors, "semi-mt" was created, which reports a "bounding box"
created by pairing min and max coordinates of the two pairs of
reported fingers.
Image sensors can report the actual coordinates of two of the fingers
present. This patch detects if the touchpad is an image sensor and
reports finger data using the MT-B protocol.
NOTE: This patch only adds partial support for 2-finger gestures.
The proper interpretation of the slot contents when more than
two fingers are present is left to later patches. Also,
handling of 'number of fingers' transitions is incomplete.
Signed-off-by: Daniel Kurtz <djkurtz@chromium.org>
Acked-by: Chase Douglas <chase.douglas@canonical.com>
Acked-by: Henrik Rydberg <rydberg@euromail.se>
Signed-off-by: Dmitry Torokhov <dtor@mail.ru>
2011-08-24 14:02:25 +08:00
|
|
|
#define SYN_CAP_IMAGE_SENSOR(ex0c) ((ex0c) & 0x000800)
|
2005-04-17 06:20:36 +08:00
|
|
|
|
|
|
|
/* synaptics modes query bits */
|
|
|
|
#define SYN_MODE_ABSOLUTE(m) ((m) & (1 << 7))
|
|
|
|
#define SYN_MODE_RATE(m) ((m) & (1 << 6))
|
|
|
|
#define SYN_MODE_BAUD_SLEEP(m) ((m) & (1 << 3))
|
|
|
|
#define SYN_MODE_DISABLE_GESTURE(m) ((m) & (1 << 2))
|
|
|
|
#define SYN_MODE_PACKSIZE(m) ((m) & (1 << 1))
|
|
|
|
#define SYN_MODE_WMODE(m) ((m) & (1 << 0))
|
|
|
|
|
|
|
|
/* synaptics identify query bits */
|
2007-03-10 14:39:54 +08:00
|
|
|
#define SYN_ID_MODEL(i) (((i) >> 4) & 0x0f)
|
|
|
|
#define SYN_ID_MAJOR(i) ((i) & 0x0f)
|
|
|
|
#define SYN_ID_MINOR(i) (((i) >> 16) & 0xff)
|
2010-07-21 15:01:19 +08:00
|
|
|
#define SYN_ID_FULL(i) ((SYN_ID_MAJOR(i) << 8) | SYN_ID_MINOR(i))
|
2005-04-17 06:20:36 +08:00
|
|
|
#define SYN_ID_IS_SYNAPTICS(i) ((((i) >> 8) & 0xff) == 0x47)
|
Input: synaptics - add support for Relative mode
Currently, the synaptics driver puts the device into Absolute mode.
As explained in the synaptics documentation section 3.2, in this mode,
the device sends a continuous stream of packets at the maximum rate
to the host when the user's fingers are near or on the pad or
pressing buttons, and continues streaming for 1 second afterwards.
These packets are even sent when there is no new information to report,
even when they are duplicates of the previous packet.
For embedded systems this is a bit much - it results in a huge
and uninterrupted stream of interrupts at high rate.
This patch adds support for Relative mode, which can be selected as
a new psmouse protocol. In this mode, the device does not send duplicate
packets and acts like a standard PS/2 mouse. However, synaptics-specific
functionality is still available, such as the ability to set the packet
rate, and rather than disabling gestures and taps at the hardware level
unconditionally, a 'synaptics_disable_gesture' sysfs attribute has
been added to allow control of this functionality.
This solves a long standing OLPC issue: synaptics hardware enables
tap to click by default (even in the default relative mode), but we
have found this to be inappropriate for young children and first
time computer users. Enabling the synaptics driver disables tap-to-click,
but we have previously been unable to use this because it also enables
Absolute mode, which is too "spammy" for our desires and actually
overloads our EC with its continuous stream of packets. Now we can enable
the synaptics driver, disabling tap to click while retaining the less
noisy Relative mode.
Signed-off-by: Daniel Drake <dsd@laptop.org>
Signed-off-by: Dmitry Torokhov <dtor@mail.ru>
2011-11-08 16:00:35 +08:00
|
|
|
#define SYN_ID_DISGEST_SUPPORTED(i) (SYN_ID_MAJOR(i) >= 4)
|
2005-04-17 06:20:36 +08:00
|
|
|
|
|
|
|
/* synaptics special commands */
|
|
|
|
#define SYN_PS_SET_MODE2 0x14
|
|
|
|
#define SYN_PS_CLIENT_CMD 0x28
|
|
|
|
|
|
|
|
/* synaptics packet types */
|
|
|
|
#define SYN_NEWABS 0
|
|
|
|
#define SYN_NEWABS_STRICT 1
|
|
|
|
#define SYN_NEWABS_RELAXED 2
|
|
|
|
#define SYN_OLDABS 3
|
|
|
|
|
2011-07-07 13:39:14 +08:00
|
|
|
/* amount to fuzz position data when touchpad reports reduced filtering */
|
|
|
|
#define SYN_REDUCED_FILTER_FUZZ 8
|
|
|
|
|
2005-04-17 06:20:36 +08:00
|
|
|
/*
|
Input: synaptics - decode AGM packet types
A Synaptics image sensor tracks 5 fingers, but can only report 2.
The algorithm for choosing which 2 fingers to report and in which packet:
Touchpad maintains 5 slots, numbered 0 to 4
Initially all slots are empty
As new fingers are detected, assign them to the lowest available slots
The touchpad always reports:
SGM: lowest numbered non-empty slot
AGM: highest numbered non-empty slot, if there is one
In addition, these touchpads have a special AGM packet type which reports
the number of fingers currently being tracked, and which finger is in
each of the two slots. Unfortunately, these "TYPE=2" packets are only used
when more than 3 fingers are being tracked. When less than 4 fingers
are present, the 'w' value must be used to track how many fingers are
present, and knowing which fingers are being reported is much more
difficult, if not impossible.
Signed-off-by: Daniel Kurtz <djkurtz@chromium.org>
Acked-by: Chase Douglas <chase.douglas@canonical.com>
Acked-by: Henrik Rydberg <rydberg@euromail.se>
Signed-off-by: Dmitry Torokhov <dtor@mail.ru>
2011-08-24 14:02:31 +08:00
|
|
|
* A structure to describe which internal touchpad finger slots are being
|
|
|
|
* reported in raw packets.
|
2005-04-17 06:20:36 +08:00
|
|
|
*/
|
Input: synaptics - decode AGM packet types
A Synaptics image sensor tracks 5 fingers, but can only report 2.
The algorithm for choosing which 2 fingers to report and in which packet:
Touchpad maintains 5 slots, numbered 0 to 4
Initially all slots are empty
As new fingers are detected, assign them to the lowest available slots
The touchpad always reports:
SGM: lowest numbered non-empty slot
AGM: highest numbered non-empty slot, if there is one
In addition, these touchpads have a special AGM packet type which reports
the number of fingers currently being tracked, and which finger is in
each of the two slots. Unfortunately, these "TYPE=2" packets are only used
when more than 3 fingers are being tracked. When less than 4 fingers
are present, the 'w' value must be used to track how many fingers are
present, and knowing which fingers are being reported is much more
difficult, if not impossible.
Signed-off-by: Daniel Kurtz <djkurtz@chromium.org>
Acked-by: Chase Douglas <chase.douglas@canonical.com>
Acked-by: Henrik Rydberg <rydberg@euromail.se>
Signed-off-by: Dmitry Torokhov <dtor@mail.ru>
2011-08-24 14:02:31 +08:00
|
|
|
struct synaptics_mt_state {
|
|
|
|
int count; /* num fingers being tracked */
|
|
|
|
int sgm; /* which slot is reported by sgm pkt */
|
|
|
|
int agm; /* which slot is reported by agm pkt*/
|
|
|
|
};
|
2005-04-17 06:20:36 +08:00
|
|
|
|
Input: synaptics - decode AGM packet types
A Synaptics image sensor tracks 5 fingers, but can only report 2.
The algorithm for choosing which 2 fingers to report and in which packet:
Touchpad maintains 5 slots, numbered 0 to 4
Initially all slots are empty
As new fingers are detected, assign them to the lowest available slots
The touchpad always reports:
SGM: lowest numbered non-empty slot
AGM: highest numbered non-empty slot, if there is one
In addition, these touchpads have a special AGM packet type which reports
the number of fingers currently being tracked, and which finger is in
each of the two slots. Unfortunately, these "TYPE=2" packets are only used
when more than 3 fingers are being tracked. When less than 4 fingers
are present, the 'w' value must be used to track how many fingers are
present, and knowing which fingers are being reported is much more
difficult, if not impossible.
Signed-off-by: Daniel Kurtz <djkurtz@chromium.org>
Acked-by: Chase Douglas <chase.douglas@canonical.com>
Acked-by: Henrik Rydberg <rydberg@euromail.se>
Signed-off-by: Dmitry Torokhov <dtor@mail.ru>
2011-08-24 14:02:31 +08:00
|
|
|
/*
|
|
|
|
* A structure to describe the state of the touchpad hardware (buttons and pad)
|
|
|
|
*/
|
2005-04-17 06:20:36 +08:00
|
|
|
struct synaptics_hw_state {
|
|
|
|
int x;
|
|
|
|
int y;
|
|
|
|
int z;
|
|
|
|
int w;
|
|
|
|
unsigned int left:1;
|
|
|
|
unsigned int right:1;
|
|
|
|
unsigned int middle:1;
|
|
|
|
unsigned int up:1;
|
|
|
|
unsigned int down:1;
|
|
|
|
unsigned char ext_buttons;
|
|
|
|
signed char scroll;
|
Input: synaptics - decode AGM packet types
A Synaptics image sensor tracks 5 fingers, but can only report 2.
The algorithm for choosing which 2 fingers to report and in which packet:
Touchpad maintains 5 slots, numbered 0 to 4
Initially all slots are empty
As new fingers are detected, assign them to the lowest available slots
The touchpad always reports:
SGM: lowest numbered non-empty slot
AGM: highest numbered non-empty slot, if there is one
In addition, these touchpads have a special AGM packet type which reports
the number of fingers currently being tracked, and which finger is in
each of the two slots. Unfortunately, these "TYPE=2" packets are only used
when more than 3 fingers are being tracked. When less than 4 fingers
are present, the 'w' value must be used to track how many fingers are
present, and knowing which fingers are being reported is much more
difficult, if not impossible.
Signed-off-by: Daniel Kurtz <djkurtz@chromium.org>
Acked-by: Chase Douglas <chase.douglas@canonical.com>
Acked-by: Henrik Rydberg <rydberg@euromail.se>
Signed-off-by: Dmitry Torokhov <dtor@mail.ru>
2011-08-24 14:02:31 +08:00
|
|
|
|
|
|
|
/* As reported in last AGM-CONTACT packets */
|
|
|
|
struct synaptics_mt_state mt_state;
|
2005-04-17 06:20:36 +08:00
|
|
|
};
|
|
|
|
|
|
|
|
struct synaptics_data {
|
|
|
|
/* Data read from the touchpad */
|
|
|
|
unsigned long int model_id; /* Model-ID */
|
2012-07-08 09:08:51 +08:00
|
|
|
unsigned long int firmware_id; /* Firmware-ID */
|
|
|
|
unsigned long int board_id; /* Board-ID */
|
2007-03-10 14:39:54 +08:00
|
|
|
unsigned long int capabilities; /* Capabilities */
|
|
|
|
unsigned long int ext_cap; /* Extended Capabilities */
|
2010-04-20 01:37:21 +08:00
|
|
|
unsigned long int ext_cap_0c; /* Ext Caps from 0x0c query */
|
2005-04-17 06:20:36 +08:00
|
|
|
unsigned long int identity; /* Identification */
|
2010-05-11 14:06:52 +08:00
|
|
|
unsigned int x_res, y_res; /* X/Y resolution in units/mm */
|
2011-07-10 03:32:56 +08:00
|
|
|
unsigned int x_max, y_max; /* Max coordinates (from FW) */
|
|
|
|
unsigned int x_min, y_min; /* Min coordinates (from FW) */
|
2005-04-17 06:20:36 +08:00
|
|
|
|
|
|
|
unsigned char pkt_type; /* packet type - old, new, etc */
|
|
|
|
unsigned char mode; /* current mode byte */
|
|
|
|
int scroll;
|
2010-10-05 12:46:10 +08:00
|
|
|
|
Input: synaptics - add support for Relative mode
Currently, the synaptics driver puts the device into Absolute mode.
As explained in the synaptics documentation section 3.2, in this mode,
the device sends a continuous stream of packets at the maximum rate
to the host when the user's fingers are near or on the pad or
pressing buttons, and continues streaming for 1 second afterwards.
These packets are even sent when there is no new information to report,
even when they are duplicates of the previous packet.
For embedded systems this is a bit much - it results in a huge
and uninterrupted stream of interrupts at high rate.
This patch adds support for Relative mode, which can be selected as
a new psmouse protocol. In this mode, the device does not send duplicate
packets and acts like a standard PS/2 mouse. However, synaptics-specific
functionality is still available, such as the ability to set the packet
rate, and rather than disabling gestures and taps at the hardware level
unconditionally, a 'synaptics_disable_gesture' sysfs attribute has
been added to allow control of this functionality.
This solves a long standing OLPC issue: synaptics hardware enables
tap to click by default (even in the default relative mode), but we
have found this to be inappropriate for young children and first
time computer users. Enabling the synaptics driver disables tap-to-click,
but we have previously been unable to use this because it also enables
Absolute mode, which is too "spammy" for our desires and actually
overloads our EC with its continuous stream of packets. Now we can enable
the synaptics driver, disabling tap to click while retaining the less
noisy Relative mode.
Signed-off-by: Daniel Drake <dsd@laptop.org>
Signed-off-by: Dmitry Torokhov <dtor@mail.ru>
2011-11-08 16:00:35 +08:00
|
|
|
bool absolute_mode; /* run in Absolute mode */
|
|
|
|
bool disable_gesture; /* disable gestures */
|
|
|
|
|
2010-10-05 12:46:10 +08:00
|
|
|
struct serio *pt_port; /* Pass-through serio port */
|
2010-12-22 01:11:25 +08:00
|
|
|
|
Input: synaptics - process finger (<=3) transitions
Synaptics image sensor touchpads track 5 fingers, but only report 2.
This patch attempts to deal with some idiosyncrasies of these touchpads:
* When there are 3 or more fingers, only two are reported.
* The touchpad tracks the 5 fingers in slot[0] through slot[4].
* It always reports the lowest and highest valid slots in SGM and AGM
packets, respectively.
* The number of fingers is only reported in the SGM packet. However,
the number of fingers can change either before or after an AGM
packet.
* Thus, if an SGM reports a different number of fingers than the last
SGM, it is impossible to tell whether the intervening AGM corresponds
to the old number of fingers or the new number of fingers.
* For example, when going from 2->3 fingers, it is not possible to tell
whether tell AGM contains slot[1] (old 2nd finger) or slot[2] (new
3rd finger).
* When fingers are added one at at time, from 1->2->3, it is possible to
track which slots are contained in the SGM and AGM packets:
1 finger: SGM = slot[0], no AGM
2 fingers: SGM = slot[0], AGM = slot[1]
3 fingers: SGM = slot[0], AGM = slot[2]
* It is also possible to track which slot is contained in the SGM when 1
of 2 fingers is removed. This is because the touchpad sends a special
(0,0,0) AGM packet whenever all fingers are removed except slot[0]:
Last AGM == (0,0,0): SGM contains slot[1]
Else: SGM contains slot[0]
* However, once there are 3 fingers, if exactly 1 finger is removed, it
is impossible to tell which 2 slots are contained in SGM and AGM.
The (SGM,AGM) could be (0,1), (0,2), or (1,2). There is no way to know.
* Similarly, if two fingers are simultaneously removed (3->1), then it
is only possible to know if SGM still contains slot[0].
* Since it is not possible to reliably track which slot is being
reported, we invalidate the tracking_id every time the number of
fingers changes until this ambiguity is resolved when:
a) All fingers are removed.
b) 4 or 5 fingers are touched, generates an AGM-CONTACT packet.
c) All fingers are removed except slot[0]. In this special case, the
ambiguity is resolved since by the (0,0,0) AGM packet.
Behavior of the driver:
When 2 or more fingers are present on the touchpad, the kernel reports
up to two MT-B slots containing the position data for two of the fingers
reported by the touchpad. If the identity of a finger cannot be tracked
when the number-of-fingers changes, the corresponding MT-B slot will be
invalidated (track_id set to -1), and a new track_id will be assigned in
a subsequent input event report.
The driver always reports the total number of fingers using one of the
EV_KEY/BTN_TOOL_*TAP events. This could differ from the number of valid
MT-B slots for two reasons:
a) There are more than 2 fingers on the pad.
b) During ambiguous number-of-fingers transitions, the correct track_id
for one or both of the slots cannot be determined, so the slots are
invalidated.
Thus, this is a hybrid singletouch/MT-B scheme. Userspace can detect
this behavior by noting that the driver supports more EV_KEY/BTN_TOOL_*TAP
events than its maximum EV_ABS/ABS_MT_SLOT.
Signed-off-by: Daniel Kurtz <djkurtz@chromium.org>
Acked-by: Chase Douglas <chase.douglas@canonical.com>
Acked-by: Henrik Rydberg <rydberg@euromail.se>
Signed-off-by: Dmitry Torokhov <dtor@mail.ru>
2011-08-24 14:02:40 +08:00
|
|
|
struct synaptics_mt_state mt_state; /* Current mt finger state */
|
|
|
|
bool mt_state_lost; /* mt_state may be incorrect */
|
|
|
|
|
2011-08-24 14:00:33 +08:00
|
|
|
/*
|
|
|
|
* Last received Advanced Gesture Mode (AGM) packet. An AGM packet
|
|
|
|
* contains position data for a second contact, at half resolution.
|
|
|
|
*/
|
|
|
|
struct synaptics_hw_state agm;
|
Input: synaptics - process finger (<=3) transitions
Synaptics image sensor touchpads track 5 fingers, but only report 2.
This patch attempts to deal with some idiosyncrasies of these touchpads:
* When there are 3 or more fingers, only two are reported.
* The touchpad tracks the 5 fingers in slot[0] through slot[4].
* It always reports the lowest and highest valid slots in SGM and AGM
packets, respectively.
* The number of fingers is only reported in the SGM packet. However,
the number of fingers can change either before or after an AGM
packet.
* Thus, if an SGM reports a different number of fingers than the last
SGM, it is impossible to tell whether the intervening AGM corresponds
to the old number of fingers or the new number of fingers.
* For example, when going from 2->3 fingers, it is not possible to tell
whether tell AGM contains slot[1] (old 2nd finger) or slot[2] (new
3rd finger).
* When fingers are added one at at time, from 1->2->3, it is possible to
track which slots are contained in the SGM and AGM packets:
1 finger: SGM = slot[0], no AGM
2 fingers: SGM = slot[0], AGM = slot[1]
3 fingers: SGM = slot[0], AGM = slot[2]
* It is also possible to track which slot is contained in the SGM when 1
of 2 fingers is removed. This is because the touchpad sends a special
(0,0,0) AGM packet whenever all fingers are removed except slot[0]:
Last AGM == (0,0,0): SGM contains slot[1]
Else: SGM contains slot[0]
* However, once there are 3 fingers, if exactly 1 finger is removed, it
is impossible to tell which 2 slots are contained in SGM and AGM.
The (SGM,AGM) could be (0,1), (0,2), or (1,2). There is no way to know.
* Similarly, if two fingers are simultaneously removed (3->1), then it
is only possible to know if SGM still contains slot[0].
* Since it is not possible to reliably track which slot is being
reported, we invalidate the tracking_id every time the number of
fingers changes until this ambiguity is resolved when:
a) All fingers are removed.
b) 4 or 5 fingers are touched, generates an AGM-CONTACT packet.
c) All fingers are removed except slot[0]. In this special case, the
ambiguity is resolved since by the (0,0,0) AGM packet.
Behavior of the driver:
When 2 or more fingers are present on the touchpad, the kernel reports
up to two MT-B slots containing the position data for two of the fingers
reported by the touchpad. If the identity of a finger cannot be tracked
when the number-of-fingers changes, the corresponding MT-B slot will be
invalidated (track_id set to -1), and a new track_id will be assigned in
a subsequent input event report.
The driver always reports the total number of fingers using one of the
EV_KEY/BTN_TOOL_*TAP events. This could differ from the number of valid
MT-B slots for two reasons:
a) There are more than 2 fingers on the pad.
b) During ambiguous number-of-fingers transitions, the correct track_id
for one or both of the slots cannot be determined, so the slots are
invalidated.
Thus, this is a hybrid singletouch/MT-B scheme. Userspace can detect
this behavior by noting that the driver supports more EV_KEY/BTN_TOOL_*TAP
events than its maximum EV_ABS/ABS_MT_SLOT.
Signed-off-by: Daniel Kurtz <djkurtz@chromium.org>
Acked-by: Chase Douglas <chase.douglas@canonical.com>
Acked-by: Henrik Rydberg <rydberg@euromail.se>
Signed-off-by: Dmitry Torokhov <dtor@mail.ru>
2011-08-24 14:02:40 +08:00
|
|
|
bool agm_pending; /* new AGM packet received */
|
2005-04-17 06:20:36 +08:00
|
|
|
};
|
|
|
|
|
2009-12-04 15:21:14 +08:00
|
|
|
void synaptics_module_init(void);
|
2009-09-10 10:13:20 +08:00
|
|
|
int synaptics_detect(struct psmouse *psmouse, bool set_properties);
|
2007-03-10 14:39:54 +08:00
|
|
|
int synaptics_init(struct psmouse *psmouse);
|
Input: synaptics - add support for Relative mode
Currently, the synaptics driver puts the device into Absolute mode.
As explained in the synaptics documentation section 3.2, in this mode,
the device sends a continuous stream of packets at the maximum rate
to the host when the user's fingers are near or on the pad or
pressing buttons, and continues streaming for 1 second afterwards.
These packets are even sent when there is no new information to report,
even when they are duplicates of the previous packet.
For embedded systems this is a bit much - it results in a huge
and uninterrupted stream of interrupts at high rate.
This patch adds support for Relative mode, which can be selected as
a new psmouse protocol. In this mode, the device does not send duplicate
packets and acts like a standard PS/2 mouse. However, synaptics-specific
functionality is still available, such as the ability to set the packet
rate, and rather than disabling gestures and taps at the hardware level
unconditionally, a 'synaptics_disable_gesture' sysfs attribute has
been added to allow control of this functionality.
This solves a long standing OLPC issue: synaptics hardware enables
tap to click by default (even in the default relative mode), but we
have found this to be inappropriate for young children and first
time computer users. Enabling the synaptics driver disables tap-to-click,
but we have previously been unable to use this because it also enables
Absolute mode, which is too "spammy" for our desires and actually
overloads our EC with its continuous stream of packets. Now we can enable
the synaptics driver, disabling tap to click while retaining the less
noisy Relative mode.
Signed-off-by: Daniel Drake <dsd@laptop.org>
Signed-off-by: Dmitry Torokhov <dtor@mail.ru>
2011-11-08 16:00:35 +08:00
|
|
|
int synaptics_init_relative(struct psmouse *psmouse);
|
2007-03-10 14:39:54 +08:00
|
|
|
void synaptics_reset(struct psmouse *psmouse);
|
2010-01-07 17:52:39 +08:00
|
|
|
bool synaptics_supported(void);
|
2007-03-10 14:39:54 +08:00
|
|
|
|
2005-04-17 06:20:36 +08:00
|
|
|
#endif /* _SYNAPTICS_H */
|