Re: new psm patch.

From: Philip Paeps <philip+freebsd_at_paeps.cx>
Date: Sun, 4 Jan 2004 17:19:42 +0100
On 2004-01-02 14:00:08 (-0500), David Gilbert <dgilbert_at_dclg.ca> wrote:
> I was applying the psm patch posted here recently.  Not the one that was for
> the Xserver, but the one that was for the moused operation.  It didn't apply
> cleanly.  Included is a patch that applies to current with the same effect.
> I would like to see discussion towards including this in -CURRENT as
> touchpad support is a hot laptop topic.

Very nice :-)

> As a note to the origional author, it seems that 'ipacket' is now referenced
> by 'pb' rather than 'sc' in the driver.  It looks like ipacket was a member
> of the sc structure but now is a sub-member.

Someone recently added some buffering code to psm, I updated my local patch,
but hadn't had time to furture develop it.

> +    { MOUSE_MODEL_SYNAPTICS,		/* Synaptics TouchPad */
> +      0xc0, MOUSE_PS2SYNAP_PACKETSIZE, enable_synaptics, },

This will catch every Synaptics pad on the market, not only the ones with the
'new' absolute packet format, and not all of them support all features :-/  In
fact 'older' (not that old) pads will fail spectacularly on some features.

> +	    /* Sanity check for out of sync packets. */
> +	    if ((pb->ipacket[0] & 0xc8) != 0x80 || (pb->ipacket[3] & 0xc8) != 0xc0)
> +		continue;

There are some other formats of packets that need to be taken into account.  I
did a check for the different bits in my enable_synaptics function, and then
did different sanity checks if different bits were available (following the
'interfacing guide' from Synaptics):

		/* New packet format with 'W'-bit */
		if (sc->flags & PSM_SYN_HAVE_CAPEXT)
		{
			if ((pb->ipacket[0] & 0xc8) != 0x80)
			{
				printf("psmintr: wanted 0x80 got 0x%02x\n",
					(pb->ipacket[0] & 0xc8));
                                continue;
			}

			if ((pb->ipacket[3] & 0xc8) != 0xc0)
			{
				printf("psmintr: wanted 0xc0 got 0x%02x\n",
					(pb->ipacket[3] & 0xc8));
                                continue;
			}
		}

		/* New packet format without 'W'-bit */
		else if (sc->flags & PSM_SYN_HAVE_NEWABS)
		{
			if ((pb->ipacket[0] & 0xc8) != 0x80)
			{
				printf("psmintr: wanted 0x80 got 0x%02x\n",
					(pb->ipacket[0] & 0xc8));
                                continue;
			}

			if ((pb->ipacket[3] & 0xc8) != 0xc0)
			{
				printf("psmintr: wanted 0xc0 got 0x%02x\n",
					(pb->ipacket[3] & 0xc8));
                                continue;
			}

			if ((pb->ipacket[0] & 0x0f) != (pb->ipacket[3] & 0x0f))
			{
				printf("psmintr: wanted 0x%02x got 0x%02x\n",
					(pb->ipacket[0] & 0x0f),
					(pb->ipacket[3] & 0x0f));
                                continue;
			}
		}

		/* Old (<3.2) packet format */
		else
		{
			if ((pb->ipacket[0] & 0xc0) != 0xc0)
			{
				printf("psmintr: wanted 0xc0 got 0x%02x\n",
					(pb->ipacket[0] & 0xc0));
                                continue;
			}

			if ((pb->ipacket[1] & 0x60) != 0x00)
			{
				printf("psmintr: wanted 0x00 got 0x%02x\n",
					(pb->ipacket[1] & 0x60));
                                continue;
			}

			if ((pb->ipacket[3] & 0xc0) != 0x80)
			{
				printf("psmintr: wanted 0x80 got 0x%02x\n",
					(pb->ipacket[3] & 0xc0));
                                continue;
			}

			if ((pb->ipacket[4] & 0x60) != 0x00)
			{
				printf("psmintr: wanted 0x00 got 0x%02x\n",
					(pb->ipacket[4] & 0x60));
                                continue;
			}
		}

Or something along those lines.

> +#define SYN_BIT_ABSOLUTE_MODE	0x80
> +#define SYN_BIT_HIGH_RATE	0x40
> +#define SYN_BIT_SLEEP_MODE	0x08
> +#define SYN_BIT_DISABLE_GESTURE 0x04
> +#define SYN_BIT_W_MODE		0x01

You could use those bits for the check.

I'll go test your patch now, and fiddle with it a bit :-)

Thanks :-)

 - Philip

-- 
Philip Paeps                                          Please don't CC me, I am
                                                       subscribed to the list.

  BOFH Excuse #283:
    Lawn mower blade in your fan need sharpening
Received on Sun Jan 04 2004 - 07:19:47 UTC

This archive was generated by hypermail 2.4.0 : Wed May 19 2021 - 11:37:36 UTC