Re: [PATCH] Synaptics TouchPad driver for 2.5.70

Peter Osterlund
2003-06-15T12:05:35Z

Vojtech Pavlik <vojtech@suse.cz> writes:

> On Wed, Jun 11, 2003 at 07:05:31AM +0200, Peter Osterlund wrote:
>
> > [ I'm resending this because the previous message never showed up on
> > the list. Maybe it was too big. ]
> >
> > Hi!
> >
> > Here is a driver for the Synaptics TouchPad for 2.5.70. It is largely
> > based on the XFree86 driver. This driver operates the touchpad in
> > absolute mode and emulates a three button mouse with two scroll
> > wheels. Features include:
> >
> > * Multi finger tapping.
> > * Vertical and horizontal scrolling.
> > * Edge scrolling during drag operations.
> > * Palm detection.
> > * Corner tapping.
>
> ... you may want to put these nice features into the mousedev.c driver
> for now, so that the touchpad works with standard XFree without the
> event based driver.

No need. There is now a working XFree86 driver here:

http://w1.894.telia.com/~u89404340/touchpad/index.html

It needs the following incremental kernel patch though.

diff -u -r -N --exclude='.*' --exclude='*.o' --exclude='*.ko' --exclude='*~' ../../linus/main/linux/drivers/input/mouse/Kconfig linux/drivers/input/mouse/Kconfig
--- ../../linus/main/linux/drivers/input/mouse/Kconfig Sun Jun 15 14:10:15 2003
+++ linux/drivers/input/mouse/Kconfig Sun Jun 15 13:53:38 2003
@@ -37,7 +37,7 @@
This touchpad is found on many modern laptop computers.
Note that you also need a user space driver to interpret the data
generated by the kernel. A compatible driver for XFree86 is available
- from http://...
+ from http://w1.894.telia.com/~u89404340/touchpad/index.html

If unsure, say Y.

diff -u -r -N --exclude='.*' --exclude='*.o' --exclude='*.ko' --exclude='*~' ../../linus/main/linux/drivers/input/mouse/synaptics.c linux/drivers/input/mouse/synaptics.c
--- ../../linus/main/linux/drivers/input/mouse/synaptics.c Sun Jun 15 14:10:15 2003
+++ linux/drivers/input/mouse/synaptics.c Sun Jun 15 11:39:46 2003
@@ -179,9 +179,9 @@
static int query_hardware(struct psmouse *psmouse)
{
struct synaptics_data *priv = psmouse->private;
- int retries = 3;
+ int retries = 0;

- while ((retries++ <= 3) && synaptics_reset(psmouse))
+ while ((retries++ < 3) && synaptics_reset(psmouse))
printk(KERN_ERR "synaptics reset failed\n");

if (synaptics_identify(psmouse, &priv->identity))
@@ -274,8 +274,7 @@
* Functions to interpret the absolute mode packets
****************************************************************************/

-static void synaptics_parse_hw_state(struct synaptics_data *priv,
- struct synaptics_hw_state *hw)
+static void synaptics_parse_hw_state(struct synaptics_data *priv, struct synaptics_hw_state *hw)
{
unsigned char *buf = priv->proto_buf;

@@ -347,10 +346,12 @@
input_report_abs(dev, ABS_Y, hw.y);
input_report_abs(dev, ABS_PRESSURE, hw.z);

- if (hw.w != priv->old_w) {
- input_event(dev, EV_MSC, MSC_GESTURE, hw.w);
- priv->old_w = hw.w;
- }
+ /*
+ * This will generate an event even if w is unchanged, but that is
+ * exactly what we want, because user space drivers may depend on
+ * this for gesture decoding.
+ */
+ input_event(dev, EV_MSC, MSC_GESTURE, hw.w);

input_report_key(dev, BTN_LEFT, hw.left);
input_report_key(dev, BTN_RIGHT, hw.right);
diff -u -r -N --exclude='.*' --exclude='*.o' --exclude='*.ko' --exclude='*~' ../../linus/main/linux/drivers/input/mouse/synaptics.h linux/drivers/input/mouse/synaptics.h
--- ../../linus/main/linux/drivers/input/mouse/synaptics.h Sun Jun 15 14:10:15 2003
+++ linux/drivers/input/mouse/synaptics.h Sun Jun 15 11:40:14 2003
@@ -83,8 +83,6 @@
unsigned char last_byte; /* last received byte */
int inSync; /* Packets in sync */
int proto_buf_tail;
-
- int old_w; /* Previous w value */
};

#endif /* _SYNAPTICS_H */

--
Peter Osterlund - petero2@telia.com