On Sat, Aug 29, 2015 at 6:10 PM, Ulf Brosziewski <
ulf.brosziew...@t-online.de> wrote:

> On 08/29/2015 01:13 PM, Alexandr Shadchin wrote:
>
>> On Fri, Aug 28, 2015 at 10:04:51PM +0200, Ulf Brosziewski wrote:
>>
>>>
>>> Some weeks ago a change was made in pms to support Synaptics touchpads
>>> that don't provide W mode. I assume that only fairly old models are
>>> concerned, and that the variant in the patch below is more accurate. It
>>> only fakes W values where necessary.
>>>
>>> The patch contains a second change, a check whether the resolution query
>>> was successful. According to the "Synaptics PS/2 Interfacing Guide", bit
>>> 7 of the second response byte will be set in case of success. It seems
>>> that if it isn't set, the other bytes are garbage or have an unknown
>>> meaning.
>>>
>>> Unfortunately I only have that old model - with firmware 4.1 - for
>>> testing. Could someone confirm that newer models aren't affected by
>>> these changes?
>>>
>>>
>>>
>> Tested on X201 (Synaptics touchpad, firmware 7.4), no regress.
>>
>> See comment below.
>>
>> Index: dev/pckbc/pms.c
>>> ===================================================================
>>> RCS file: /cvs/src/sys/dev/pckbc/pms.c,v
>>> retrieving revision 1.65
>>> diff -u -p -r1.65 pms.c
>>> --- dev/pckbc/pms.c     23 Aug 2015 04:45:23 -0000      1.65
>>> +++ dev/pckbc/pms.c     28 Aug 2015 18:04:45 -0000
>>> @@ -949,8 +949,10 @@ synaptics_get_hwinfo(struct pms_softc *s
>>>                         return (-1);
>>>         }
>>>
>>> -       syn->res_x = SYNAPTICS_RESOLUTION_X(syn->resolution);
>>> -       syn->res_y = SYNAPTICS_RESOLUTION_Y(syn->resolution);
>>> +       if (syn->resolution&  0x8000) {
>>>
>>
>> I think it makes sense to define SYNAPTICS_RESOLUTION_VALID
>> instead of magic numbers.
>>
>> +               syn->res_x = SYNAPTICS_RESOLUTION_X(syn->resolution);
>>> +               syn->res_y = SYNAPTICS_RESOLUTION_Y(syn->resolution);
>>> +       }
>>> [...]
>>>
>>
>
> Thanks a lot. I have added the constant to pmsreg.h, this is the
> updated diff:
>
>
ok shadchin@


> Index: dev/pckbc/pms.c
> ===================================================================
> RCS file: /cvs/src/sys/dev/pckbc/pms.c,v
> retrieving revision 1.65
> diff -u -p -r1.65 pms.c
> --- dev/pckbc/pms.c     23 Aug 2015 04:45:23 -0000      1.65
> +++ dev/pckbc/pms.c     29 Aug 2015 12:33:57 -0000
> @@ -949,8 +949,10 @@ synaptics_get_hwinfo(struct pms_softc *s
>                         return (-1);
>         }
>
> -       syn->res_x = SYNAPTICS_RESOLUTION_X(syn->resolution);
> -       syn->res_y = SYNAPTICS_RESOLUTION_Y(syn->resolution);
> +       if (syn->resolution & SYNAPTICS_RESOLUTION_VALID) {
>
> +               syn->res_x = SYNAPTICS_RESOLUTION_X(syn->resolution);
> +               syn->res_y = SYNAPTICS_RESOLUTION_Y(syn->resolution);
> +       }
>         syn->min_x = SYNAPTICS_XMIN_BEZEL;
>         syn->min_y = SYNAPTICS_YMIN_BEZEL;
>         syn->max_x = (syn->dimension) ?
> @@ -1163,30 +1165,21 @@ pms_proc_synaptics(struct pms_softc *sc)
>
>         w = ((sc->packet[0] & 0x30) >> 2) | ((sc->packet[0] & 0x04) >> 1) |
>             ((sc->packet[3] & 0x04) >> 2);
> +       z = sc->packet[2];
>
> -       /*
> -        * Conform to the encoding understood by
> -        * /usr/xenocara/driver/xf86-input-synaptics/src/wsconscomm.c
> -        */
> -       switch (w) {
> -       case 0:
> -               /* fingerwidth 5, numfingers 2 */
> -               break;
> -       case 1:
> -               /* fingerwidth 5, numfingers 3 */
> -               break;
> -       case 5:
> -               /* fingerwidth 5, numfingers 1 */
> -               break;
> -       case 4:
> -       case 8:
> -               /* fingerwidth 4, numfingers 1 */
> -               w = 4;
> -               break;
> -       default:
> -               break;
> +       if ((syn->capabilities & SYNAPTICS_CAP_EXTENDED) == 0) {
> +               /*
> +                * Emulate W mode for models that don't provide it. Bit 3
> +                * of the w-input signals a touch ("finger"), Bit 2 and
> +                * the "gesture" bits 1-0 can be ignored.
> +                */
> +               if (w & 8)
> +                       w = 4;
> +               else
> +                       z = w = 0;
>         }
>
> +
>         if ((syn->capabilities & SYNAPTICS_CAP_PASSTHROUGH) && w == 3) {
>                 synaptics_sec_proc(sc);
>                 return;
> @@ -1203,7 +1196,6 @@ pms_proc_synaptics(struct pms_softc *sc)
>             sc->packet[4];
>         y = ((sc->packet[3] & 0x20) << 7) | ((sc->packet[1] & 0xf0) << 4) |
>             sc->packet[5];
> -       z = sc->packet[2];
>
>         buttons = ((sc->packet[0] & sc->packet[3]) & 0x01) ?
>             WSMOUSE_BUTTON(1) : 0;
> Index: dev/pckbc/pmsreg.h
> ===================================================================
> RCS file: /cvs/src/sys/dev/pckbc/pmsreg.h,v
> retrieving revision 1.11
> diff -u -p -r1.11 pmsreg.h
> --- dev/pckbc/pmsreg.h  26 Mar 2015 01:30:22 -0000      1.11
> +++ dev/pckbc/pmsreg.h  29 Aug 2015 12:33:57 -0000
> @@ -119,6 +119,7 @@
>  #define SYNAPTICS_MODEL_GEOMETRY(m)            ((m) & 0x0f)
>
>  /* Resolutions */
> +#define SYNAPTICS_RESOLUTION_VALID             (1 << 15)
>  #define SYNAPTICS_RESOLUTION_X(r)              (((r) >> 16) & 0xff)
>  #define SYNAPTICS_RESOLUTION_Y(r)              ((r) & 0xff)
>
>


-- 
Alexandr Shadchin

Reply via email to