Current-Users archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
Re: Synaptics touchpad misdetected as clickpad [with patch]
In article <20150304214425.GI20372%falu.nl@localhost>, Rhialto <rhialto%falu.nl@localhost> wrote:
>-=-=-=-=-=-
>
>On Tue 03 Mar 2015 at 02:30:47 +0000, Christos Zoulas wrote:
>> In article <20150303004630.GH6733%falu.nl@localhost>, Rhialto <rhialto%falu.nl@localhost> wrote:
>> >-=-=-=-=-=-
>> >
>> >and no click pad. Which is isn't. It has 2 separate buttons below the
>> >touchpad. Attaching an usb mouse serves as a workaround.
>> >
>> >Any other info I can give?
>>
>> You can turn debugging on and it will print more info...
>
>Ok, I enabled SYNAPTICSDEBUG and booted with -x.
>The kernel messages are now like so:
>
>
>pms0 at pckbc1 (aux slot)
>pms0: Synaptics touchpad version 6.5
>pms0: synaptics_probe: Capabilities 0xa051.
>pms0: pms_synaptics_probe_extended: Extended Buttons: 0.
>pms0: pms_synaptics_probe_extended: Extended Capabilities: 0xa0 0x00 0x00.
>pms0: pms_synaptics_probe_extended: Continued Capabilities 0x0f 0xf1 0x40.
>pms0: Palm detect, One button click pad
>
>Looking at the code which prints this, in
>src/sys/dev/pckbport/synaptics.c, function
>pms_synaptics_probe_extended(),
>
> 191 /* Ask about click pad */
> 192 if (((sc->caps & SYNAPTICS_CAP_EXTNUM) + 0x08) >=
> 193 SYNAPTICS_CONTINUED_CAPABILITIES)
> 194 {
> 195 res = pms_sliced_command(psc->sc_kbctag,
> 196 psc->sc_kbcslot, SYNAPTICS_CONTINUED_CAPABILITIES);
> 197 cmd[0] = PMS_SEND_DEV_STATUS;
> 198 res |= pckbport_poll_cmd(psc->sc_kbctag,
> 199 psc->sc_kbcslot, cmd, 1, 3, resp, 0);
> 200 if (res == 0) {
> 201 u_char clickpad_type = (resp[1] & 0x1);
> 202 clickpad_type |= ((resp[0] >> 4) & 0x1);
> 203
> 204 aprint_debug_dev(psc->sc_dev, "%s: Continued "
> 205 "Capabilities 0x%02x 0x%02x 0x%02x.\n",
>__func_ _,
> 206 resp[0], resp[1], resp[2]);
> 207 switch (clickpad_type) {
> 208 case 1:
> 209 sc->flags |=
>SYN_FLAG_HAS_ONE_BUTTON_CLICKP AD;
> 210 break;
> 211 case 2:
> 212 sc->flags |=
>SYN_FLAG_HAS_TWO_BUTTON_CLICKP AD;
> 213 break;
> 214 default:
> 215 break;
> 216 }
> 217 }
> 218 }
>
>I have to wonder how case 2 can ever be reached, given the
>initialisation of clickpad_type. This smells like there is something
>incorrect here with clickpad_type.
>
>If I look at what Linux does, in
>https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/tree/drivers/input/mouse/synaptics.h?id=refs/tags/v4.0-rc2
>https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/tree/drivers/input/mouse/synaptics.c?id=refs/tags/v4.0-rc2
>
>then
>
>/*
> * 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
> * 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
> * ala multimedia control bar
> * 2 0x04 reduced filtering firmware does less filtering on
> * position data, driver should watch
> * for noise.
> * 2 0x08 image sensor image sensor tracks 5 fingers, but only
> * reports 2.
> * 2 0x01 uniform clickpad whole clickpad moves instead of being
> * hinged at the top.
> * 2 0x20 report min query 0x0f gives min coord reported
> */
>#define SYN_CAP_CLICKPAD(ex0c) ((ex0c) & 0x100000) /* 1-button ClickPad */
>#define SYN_CAP_CLICKPAD2BTN(ex0c) ((ex0c) & 0x000100) /* 2-button ClickPad */
>
>and
>
> if (SYN_EXT_CAP_REQUESTS(priv->capabilities) >= 4) {
> if (synaptics_send_cmd(psmouse, SYN_QUE_EXT_CAPAB_0C, cap)) {
> psmouse_warn(psmouse,
> "device claims to have extended capability 0x0c, but I'm not able
>to read it.\n");
> } else {
> priv->ext_cap_0c = (cap[0] << 16) | (cap[1] << 8) | cap[2];
> }
> }
>
>I tried this patch:
>
>
>Index: synaptics.c
>===================================================================
>RCS file: /cvsroot/src/sys/dev/pckbport/synaptics.c,v
>retrieving revision 1.32
>diff -u -r1.32 synaptics.c
>--- synaptics.c 23 May 2014 01:11:29 -0000 1.32
>+++ synaptics.c 4 Mar 2015 21:36:05 -0000
>@@ -198,7 +198,7 @@
> res |= pckbport_poll_cmd(psc->sc_kbctag,
> psc->sc_kbcslot, cmd, 1, 3, resp, 0);
> if (res == 0) {
>- u_char clickpad_type = (resp[1] & 0x1);
>+ u_char clickpad_type = (resp[1] & 0x1) << 1;
> clickpad_type |= ((resp[0] >> 4) & 0x1);
>
> aprint_debug_dev(psc->sc_dev, "%s: Continued "
>
>which make my touchpad into a working "two button clickpad".
>(It always worked before the clickpad detection, so this doesn't seem
>essential)
>
>Given the above bit assignments, I would even propose to use the simpler
>version
>
> 201 u_char clickpad_type = (resp[1] & 0x01);
> 202 clickpad_type |= (resp[0] & 0x10);
>...
> 207 switch (clickpad_type) {
> 208 case 0x10:
> 209 sc->flags |=
>SYN_FLAG_HAS_ONE_BUTTON_CLICKP AD;
>...
> 211 case 0x01:
> 212 sc->flags |=
>SYN_FLAG_HAS_TWO_BUTTON_CLICKP AD;
>...
Sure why don't you send a full patch that also has the above comment
reproduced...
christos
Home |
Main Index |
Thread Index |
Old Index