Thread (12 messages) 12 messages, 5 authors, 2018-02-04

ALPS touchpad ot correctly recognized: GlidePoint vs DualPoint

From: Juanito <hidden>
Date: 2017-09-07 07:05:17
Subsystem: alps ps/2 touchpad driver, input (keyboard, mouse, joystick, touchscreen) drivers, the rest · Maintainers: Dmitry Torokhov, Linus Torvalds

Dear Kernel Hackers,

I hope this is the correct place to post this. If not, please forgive me
and feel free to forward it to someplace else. Thank you very much!

I have a ThinkPad with a touchpad that looks exactly like this:
https://www.camerongray.me/wp-content/uploads/2015/02/SCotlGg.jpg

The three pyhsical buttons on top do not work on my debian stretch
(4.9). I think it isn't being recognized correctly. I see a "Rejected
trackstick packet from non DualPoint device" in my syslog whenever I
click on one of them. On the other hand on a Ubuntu 16.04 (4.4 - patched
by Ubuntu y guess) the buttons *do* work. Interestingly enough, it
doesn't work on 17.04 (4.10).

I have noticed that the touchpad gets assigned different names on both
distros. On debian it is recognized as a GlidePoint and on Ubuntu as a
DualPoint. In an upstream kernel 4.13 which I just built, it's also
recognized as a GlidePoint. Unfortunately it doesn't work either.

I am not sure if the device is actually a DualPoint or not (I don't
really understand the terminology here), but the thing is that the
buttons work when the kernel believes it to be one.

This is the info I have managed to find about the device while running
on the non-working debian:

dmesg:
[    2.914806] input: AlpsPS/2 ALPS GlidePoint as
/devices/platform/i8042/serio1/input/input2

lsinput:
/dev/input/event11
   bustype : BUS_I8042
   vendor  : 0x2
   product : 0x8
   version : 1792
   name    : "AlpsPS/2 ALPS GlidePoint"
   phys    : "isa0060/serio1/input0"
   bits ev : (null) (null) (null)

I have played around with the drivers/input/mouse/alps.c file and found
out the following:

e7 and ec are important (although I don't know what these are exactly)
and have the following values:

e7: 73 03 0a
ec: 88 b0 13

This combination is recognized as an ALPS touchpad, but isn't assigned
the ALPS_DUALPOINT flag. As far as I can see, it is actually being
*removed* at this point:

if (alps_probe_trackstick_v3_v7(psmouse, ALPS_REG_BASE_V7) < 0)
            priv->flags &= ~ALPS_DUALPOINT;

The bit that says it has a trackpoint (I don't know what this is) is
apparently saying my device doesn't have one and is removing the
ALPS_DUALPOINT flag.

This flag makes the buttons work. I am not sure if it breaks other stuff.

I have written a pretty dummy patch which actually adds the flag again
making the buttons work. Again, I am not sure if it breaks other stuff
but my system isn't whining. Here is the patch:
diff --git a/drivers/input/mouse/alps.c b/drivers/input/mouse/alps.c
index 850b00e3ad8e..17aba42e846f 100644
--- a/drivers/input/mouse/alps.c
+++ b/drivers/input/mouse/alps.c
@@ -2804,6 +2804,9 @@ static int alps_set_protocol(struct psmouse *psmouse,
                if (alps_probe_trackstick_v3_v7(psmouse,
ALPS_REG_BASE_V7) < 0)
                        priv->flags &= ~ALPS_DUALPOINT;

+               if (priv->fw_ver[1] == 0xb0)
+                       priv->flags |= ALPS_DUALPOINT;
+
                break;

        case ALPS_PROTO_V8:

After applying this patch dmesg and lsinput say this:

[    8.226543] input: AlpsPS/2 ALPS DualPoint Stick as
/devices/platform/i8042/serio1/input/input13
[    8.247595] input: AlpsPS/2 ALPS DualPoint TouchPad as
/devices/platform/i8042/serio1/input/input2

/dev/input/event11
   bustype : BUS_I8042
   vendor  : 0x2
   product : 0x8
   version : 1792
   name    : "AlpsPS/2 ALPS DualPoint Stick"
   phys    : "isa0060/serio1/input1"
   bits ev : (null) (null) (null)

/dev/input/event12
   bustype : BUS_I8042
   vendor  : 0x2
   product : 0x8
   version : 1792
   name    : "AlpsPS/2 ALPS DualPoint TouchPad"
   phys    : "isa0060/serio1/input0"
   bits ev : (null) (null) (null)

I am a total newbie to kernels and drivers so it would be great if
somebody who actually had some idea could take a look at this and
probably create a patch in a better place. I'll be glad to post more
info if necessary.

Thank you very much!

Cheers,
Juanito
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help