* [PATCHv2 1/4] psmouse: Remove hardcoded touchpad size from the focaltech driver.
2015-02-26 23:20 ` [PATCHv2 0/4] FocalTech touchpad fixes Mathias Gottschlag
@ 2015-02-26 23:20 ` Mathias Gottschlag
2015-02-26 23:20 ` [PATCHv2 2/4] psmouse: Ensure that the focaltech driver reports consistent coordinates Mathias Gottschlag
` (2 subsequent siblings)
3 siblings, 0 replies; 6+ messages in thread
From: Mathias Gottschlag @ 2015-02-26 23:20 UTC (permalink / raw)
To: Dmitry Torokhov
Cc: Hans de Goede, linux-input, linux-kernel, Mathias Gottschlag
The size has in most cases already been fetched from the touchpad, the
hardcoded values should have been removed.
Signed-off-by: Mathias Gottschlag <mgottschlag@gmail.com>
---
drivers/input/mouse/focaltech.c | 5 +----
1 file changed, 1 insertion(+), 4 deletions(-)
diff --git a/drivers/input/mouse/focaltech.c b/drivers/input/mouse/focaltech.c
index fca38ba..5d8cf98 100644
--- a/drivers/input/mouse/focaltech.c
+++ b/drivers/input/mouse/focaltech.c
@@ -67,9 +67,6 @@ static void focaltech_reset(struct psmouse *psmouse)
#define FOC_MAX_FINGERS 5
-#define FOC_MAX_X 2431
-#define FOC_MAX_Y 1663
-
/*
* Current state of a single finger on the touchpad.
*/
@@ -131,7 +128,7 @@ static void focaltech_report_state(struct psmouse *psmouse)
if (active) {
input_report_abs(dev, ABS_MT_POSITION_X, finger->x);
input_report_abs(dev, ABS_MT_POSITION_Y,
- FOC_MAX_Y - finger->y);
+ priv->y_max - finger->y);
}
}
input_mt_report_pointer_emulation(dev, true);
--
2.1.0
^ permalink raw reply related [flat|nested] 6+ messages in thread* [PATCHv2 2/4] psmouse: Ensure that the focaltech driver reports consistent coordinates.
2015-02-26 23:20 ` [PATCHv2 0/4] FocalTech touchpad fixes Mathias Gottschlag
2015-02-26 23:20 ` [PATCHv2 1/4] psmouse: Remove hardcoded touchpad size from the focaltech driver Mathias Gottschlag
@ 2015-02-26 23:20 ` Mathias Gottschlag
2015-02-26 23:20 ` [PATCHv2 3/4] psmouse: Disable resolution/rate/scale changes for FocalTech touchpads Mathias Gottschlag
2015-02-26 23:20 ` [PATCHv2 4/4] psmouse: Disable "palm detection" in the focaltech driver Mathias Gottschlag
3 siblings, 0 replies; 6+ messages in thread
From: Mathias Gottschlag @ 2015-02-26 23:20 UTC (permalink / raw)
To: Dmitry Torokhov
Cc: Hans de Goede, linux-input, linux-kernel, Mathias Gottschlag
We don't know whether x_max or y_max really hold the maximum possible
coordinates, and we don't know for sure whether we correctly interpret the
coordinates sent by the touchpad, so we clamp the reported values to
prevent confusion in userspace code.
Signed-off-by: Mathias Gottschlag <mgottschlag@gmail.com>
---
drivers/input/mouse/focaltech.c | 12 ++++++++++--
1 file changed, 10 insertions(+), 2 deletions(-)
diff --git a/drivers/input/mouse/focaltech.c b/drivers/input/mouse/focaltech.c
index 5d8cf98..0cfc646 100644
--- a/drivers/input/mouse/focaltech.c
+++ b/drivers/input/mouse/focaltech.c
@@ -126,9 +126,17 @@ static void focaltech_report_state(struct psmouse *psmouse)
input_mt_slot(dev, i);
input_mt_report_slot_state(dev, MT_TOOL_FINGER, active);
if (active) {
- input_report_abs(dev, ABS_MT_POSITION_X, finger->x);
+ int clamped_x, clamped_y;
+ /*
+ * The touchpad might report invalid data, so we clamp
+ * the resulting values so that we do not confuse
+ * userspace.
+ */
+ clamped_x = clamp((int)finger->x, 0, (int)priv->x_max);
+ clamped_y = clamp((int)finger->y, 0, (int)priv->y_max);
+ input_report_abs(dev, ABS_MT_POSITION_X, clamped_x);
input_report_abs(dev, ABS_MT_POSITION_Y,
- priv->y_max - finger->y);
+ priv->y_max - clamped_y);
}
}
input_mt_report_pointer_emulation(dev, true);
--
2.1.0
^ permalink raw reply related [flat|nested] 6+ messages in thread* [PATCHv2 3/4] psmouse: Disable resolution/rate/scale changes for FocalTech touchpads.
2015-02-26 23:20 ` [PATCHv2 0/4] FocalTech touchpad fixes Mathias Gottschlag
2015-02-26 23:20 ` [PATCHv2 1/4] psmouse: Remove hardcoded touchpad size from the focaltech driver Mathias Gottschlag
2015-02-26 23:20 ` [PATCHv2 2/4] psmouse: Ensure that the focaltech driver reports consistent coordinates Mathias Gottschlag
@ 2015-02-26 23:20 ` Mathias Gottschlag
2015-03-08 4:14 ` Dmitry Torokhov
2015-02-26 23:20 ` [PATCHv2 4/4] psmouse: Disable "palm detection" in the focaltech driver Mathias Gottschlag
3 siblings, 1 reply; 6+ messages in thread
From: Mathias Gottschlag @ 2015-02-26 23:20 UTC (permalink / raw)
To: Dmitry Torokhov
Cc: Hans de Goede, linux-input, linux-kernel, Mathias Gottschlag
These PS/2 commands make some touchpads stop responding, so this commit
adds some dummy functions to replace the generic implementation. Because
scale changes were not encapsulated in a method of struct psmouse yet, this
commit adds a method set_scale to psmouse.
Signed-off-by: Mathias Gottschlag <mgottschlag@gmail.com>
---
drivers/input/mouse/focaltech.c | 24 ++++++++++++++++++++++++
drivers/input/mouse/psmouse-base.c | 18 +++++++++++++++++-
drivers/input/mouse/psmouse.h | 7 +++++++
3 files changed, 48 insertions(+), 1 deletion(-)
diff --git a/drivers/input/mouse/focaltech.c b/drivers/input/mouse/focaltech.c
index 0cfc646..d96a847 100644
--- a/drivers/input/mouse/focaltech.c
+++ b/drivers/input/mouse/focaltech.c
@@ -386,6 +386,23 @@ static int focaltech_read_size(struct psmouse *psmouse)
return 0;
}
+
+void focaltech_set_resolution(struct psmouse *psmouse, unsigned int resolution)
+{
+ /* not supported yet */
+}
+
+static void focaltech_set_rate(struct psmouse *psmouse, unsigned int rate)
+{
+ /* not supported yet */
+}
+
+static void focaltech_set_scale(struct psmouse *psmouse,
+ enum psmouse_scale scale)
+{
+ /* not supported yet */
+}
+
int focaltech_init(struct psmouse *psmouse)
{
struct focaltech_data *priv;
@@ -420,6 +437,13 @@ int focaltech_init(struct psmouse *psmouse)
psmouse->cleanup = focaltech_reset;
/* resync is not supported yet */
psmouse->resync_time = 0;
+ /*
+ * rate/resolution/scale changes are not supported yet, and the generic
+ * implementations of these functions seem to confuse some touchpads
+ */
+ psmouse->set_resolution = focaltech_set_resolution;
+ psmouse->set_rate = focaltech_set_rate;
+ psmouse->set_scale = focaltech_set_scale;
return 0;
diff --git a/drivers/input/mouse/psmouse-base.c b/drivers/input/mouse/psmouse-base.c
index 68469fe..58537eb 100644
--- a/drivers/input/mouse/psmouse-base.c
+++ b/drivers/input/mouse/psmouse-base.c
@@ -454,6 +454,20 @@ static void psmouse_set_rate(struct psmouse *psmouse, unsigned int rate)
}
/*
+ * Here we set the mouse scaling.
+ */
+
+static void psmouse_set_scale(struct psmouse *psmouse, enum psmouse_scale scale)
+{
+ if (scale == PSMOUSE_SCALE21) {
+ ps2_command(&psmouse->ps2dev, NULL, PSMOUSE_CMD_SETSCALE21);
+ } else {
+ ps2_command(&psmouse->ps2dev, NULL, PSMOUSE_CMD_SETSCALE11);
+ }
+ psmouse->scale = scale;
+}
+
+/*
* psmouse_poll() - default poll handler. Everyone except for ALPS uses it.
*/
@@ -689,6 +703,7 @@ static void psmouse_apply_defaults(struct psmouse *psmouse)
psmouse->set_rate = psmouse_set_rate;
psmouse->set_resolution = psmouse_set_resolution;
+ psmouse->set_scale = psmouse_set_scale;
psmouse->poll = psmouse_poll;
psmouse->protocol_handler = psmouse_process_byte;
psmouse->pktsize = 3;
@@ -1160,7 +1175,7 @@ static void psmouse_initialize(struct psmouse *psmouse)
if (psmouse_max_proto != PSMOUSE_PS2) {
psmouse->set_rate(psmouse, psmouse->rate);
psmouse->set_resolution(psmouse, psmouse->resolution);
- ps2_command(&psmouse->ps2dev, NULL, PSMOUSE_CMD_SETSCALE11);
+ psmouse->set_scale(psmouse, PSMOUSE_SCALE11);
}
}
@@ -1492,6 +1507,7 @@ static int psmouse_connect(struct serio *serio, struct serio_driver *drv)
psmouse->rate = psmouse_rate;
psmouse->resolution = psmouse_resolution;
+ psmouse->scale = PSMOUSE_SCALE11;
psmouse->resetafter = psmouse_resetafter;
psmouse->resync_time = parent ? 0 : psmouse_resync_time;
psmouse->smartscroll = psmouse_smartscroll;
diff --git a/drivers/input/mouse/psmouse.h b/drivers/input/mouse/psmouse.h
index c2ff137..80fc62c 100644
--- a/drivers/input/mouse/psmouse.h
+++ b/drivers/input/mouse/psmouse.h
@@ -36,6 +36,11 @@ typedef enum {
PSMOUSE_FULL_PACKET
} psmouse_ret_t;
+enum psmouse_scale {
+ PSMOUSE_SCALE11,
+ PSMOUSE_SCALE21
+};
+
struct psmouse {
void *private;
struct input_dev *dev;
@@ -60,6 +65,7 @@ struct psmouse {
unsigned int rate;
unsigned int resolution;
+ enum psmouse_scale scale;
unsigned int resetafter;
unsigned int resync_time;
bool smartscroll; /* Logitech only */
@@ -67,6 +73,7 @@ struct psmouse {
psmouse_ret_t (*protocol_handler)(struct psmouse *psmouse);
void (*set_rate)(struct psmouse *psmouse, unsigned int rate);
void (*set_resolution)(struct psmouse *psmouse, unsigned int resolution);
+ void (*set_scale)(struct psmouse *psmouse, enum psmouse_scale scale);
int (*reconnect)(struct psmouse *psmouse);
void (*disconnect)(struct psmouse *psmouse);
--
2.1.0
^ permalink raw reply related [flat|nested] 6+ messages in thread* Re: [PATCHv2 3/4] psmouse: Disable resolution/rate/scale changes for FocalTech touchpads.
2015-02-26 23:20 ` [PATCHv2 3/4] psmouse: Disable resolution/rate/scale changes for FocalTech touchpads Mathias Gottschlag
@ 2015-03-08 4:14 ` Dmitry Torokhov
0 siblings, 0 replies; 6+ messages in thread
From: Dmitry Torokhov @ 2015-03-08 4:14 UTC (permalink / raw)
To: Mathias Gottschlag; +Cc: Hans de Goede, linux-input, linux-kernel
Hi Mathias,
On Fri, Feb 27, 2015 at 12:20:07AM +0100, Mathias Gottschlag wrote:
> These PS/2 commands make some touchpads stop responding, so this commit
> adds some dummy functions to replace the generic implementation. Because
> @@ -60,6 +65,7 @@ struct psmouse {
>
> unsigned int rate;
> unsigned int resolution;
> + enum psmouse_scale scale;
> unsigned int resetafter;
> unsigned int resync_time;
> bool smartscroll; /* Logitech only */
I do not believe we need to store the scaling factor so I dropped these
chunks, otherwise applied all 4.
Thanks.
--
Dmitry
^ permalink raw reply [flat|nested] 6+ messages in thread
* [PATCHv2 4/4] psmouse: Disable "palm detection" in the focaltech driver.
2015-02-26 23:20 ` [PATCHv2 0/4] FocalTech touchpad fixes Mathias Gottschlag
` (2 preceding siblings ...)
2015-02-26 23:20 ` [PATCHv2 3/4] psmouse: Disable resolution/rate/scale changes for FocalTech touchpads Mathias Gottschlag
@ 2015-02-26 23:20 ` Mathias Gottschlag
3 siblings, 0 replies; 6+ messages in thread
From: Mathias Gottschlag @ 2015-02-26 23:20 UTC (permalink / raw)
To: Dmitry Torokhov
Cc: Hans de Goede, linux-input, linux-kernel, Mathias Gottschlag
Apparently, the threshold for large contact area seems to be rather low on
some devices, causing the touchpad to frequently freeze during normal
usage. Because we do now know how we are supposed to use the value in
question, this commit just drops the related code completely.
Signed-off-by: Mathias Gottschlag <mgottschlag@gmail.com>
---
drivers/input/mouse/focaltech.c | 10 ----------
1 file changed, 10 deletions(-)
diff --git a/drivers/input/mouse/focaltech.c b/drivers/input/mouse/focaltech.c
index d96a847..e1d084a 100644
--- a/drivers/input/mouse/focaltech.c
+++ b/drivers/input/mouse/focaltech.c
@@ -185,16 +185,6 @@ static void focaltech_process_abs_packet(struct psmouse *psmouse,
state->pressed = (packet[0] >> 4) & 1;
- /*
- * packet[5] contains some kind of tool size in the most
- * significant nibble. 0xff is a special value (latching) that
- * signals a large contact area.
- */
- if (packet[5] == 0xff) {
- state->fingers[finger].valid = false;
- return;
- }
-
state->fingers[finger].x = ((packet[1] & 0xf) << 8) | packet[2];
state->fingers[finger].y = (packet[3] << 8) | packet[4];
state->fingers[finger].valid = true;
--
2.1.0
^ permalink raw reply related [flat|nested] 6+ messages in thread