new psm patch.
Philip Paeps
philip+freebsd at paeps.cx
Sun Jan 4 08:19:47 PST 2004
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
More information about the freebsd-current
mailing list