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;
...
> christos
-Olaf.
--
___ Olaf 'Rhialto' Seibert -- The Doctor: No, 'eureka' is Greek for
\X/ rhialto/at/xs4all.nl -- 'this bath is too hot.'
Attachment:
pgposZaA24zcm.pgp
Description: PGP signature