NetBSD-Bugs archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
kern/42111: Old Compaq Presario: Synaptics touchpad doesn't work
>Number: 42111
>Category: kern
>Synopsis: Old Compaq Presario: Synaptics touchpad doesn't work
>Confidential: no
>Severity: serious
>Priority: medium
>Responsible: kern-bug-people
>State: open
>Class: sw-bug
>Submitter-Id: net
>Arrival-Date: Tue Sep 22 17:20:00 +0000 2009
>Originator: Dave J. Barnes
>Release: NetBSD 5.0.1
>Organization:
Eng Consultant
>Environment:
NetBSD djb-cp 5.0.1 NetBSD 5.0.1 (GENERIC) #0: Thu Jul 30 01:39:11 UTC 2009
builds%b8.netbsd.org@localhost:/home/builds/ab/netbsd-5-0-1-RELEASE/i386/200907292356Z-obj/home/builds/ab/netbsd-5-0-1-RELEASE/src/sys/arch/i386/compile/GENERIC
i386
>Description:
Compaq Presario 1692 (and possibly others) - Synaptics touchpad doesn't work.
Debugging showed that byte 0 and byte 3 were incorrect. Aditional testing
shopwed that the keyboard controller was tampering with bit 3 and bit 6 of byte
0 and byte 3. The "Synaptics Touchpad Interfacing Guide", second edition, page
45, warns that the keyboard controller may tamper with bit 3. It appears that
the keyboard controller in the Compaq Presario 1692 (and probably others as
well) tampers with bit 6 too.
The following tests on the data packet in dev/pckbport/synaptics.c are affected:
if ((data & 0xc8) != 0x80) {
if ((data & 8) == 8) {
if ((psc->packet[0] & 0xfc) == 0x84 &&
(psc->packet[3] & 0xcc) == 0xc4) {
>How-To-Repeat:
GENERIC kernel doesn't work.
>Fix:
Fix the tests to ignore bit 3 and bit 6. Side effect would be that the
test for syncing up with the touchpad protocol are not as robust.
-----------------------------
--- dev/pckbport/synaptics.c.orig 2009-09-22 11:44:42.000000000 -0500
+++ dev/pckbport/synaptics.c 2009-09-22 11:55:19.000000000 -0500
@@ -771,7 +771,8 @@
switch (psc->inputstate) {
case 0:
- if ((data & 0xc8) != 0x80) {
+/* Can't depend on the state of bit 3 in message. Bit 6 should be 0 here. */
+ if ((data & 0xc0) != 0x80) {
#ifdef SYNAPTICSDEBUG
aprint_normal_dev(psc->sc_dev,
"pms_input: 0x%02x out of sync\n", data);
@@ -781,7 +782,11 @@
/*FALLTHROUGH*/
case 3:
- if ((data & 8) == 8) {
+/*
+ * Can't depend on the state of bit 3. While bit 6 should be 1 here some
keyboard controllers edit
+ * bit 6 to 0.
+ */
+ if ((data & 0x80) != 0x80) {
#ifdef SYNAPTICSDEBUG
aprint_normal_dev(psc->sc_dev,
"pms_input: 0x%02x dropped in relative mode,
reset\n", data);
@@ -801,8 +806,9 @@
*/
psc->inputstate = 0;
- if ((psc->packet[0] & 0xfc) == 0x84 &&
- (psc->packet[3] & 0xcc) == 0xc4) {
+/* Can't depend on the state of bit 3 or bit 6 here either. */
+ if ((psc->packet[0] & 0xb4) == 0x84 &&
+ (psc->packet[3] & 0x44) == 0x44) {
/* PS/2 passthrough */
pms_synaptics_passthrough(psc);
} else {
Home |
Main Index |
Thread Index |
Old Index