Howto: Trackpoint Driftkorrektur ausbessern

haarp

Member
Registriert
5 Aug. 2013
Beiträge
618
Hallo,

Der Trackpoint unserer Thinkpads hat eine automatische Driftkorrektur. Das nervt. Die Idee ist gut, die Implementierung aber mangelhaft.

Die Sensoren des Trackpoints unterliegen Temperaturschwankungen, wodurch es theoretisch vorkommen könnte, dass die Kalibrierung flöten geht und der Cursor anfängt, sich ohne Betätigung zu bewegen -> Drift. Um das zu Kompensieren, rekalibriert der Trackpoint regelmäßig die Ruhelage, wenn er gerade nicht bewegt wird. Näheres im Kapitel 2.2.3 der IBM Trackpoint Engineering Specifications.

Das Problem ist die Erkennung der Ruhelage. Wird etwa eine halbe Sekunde lang keine Änderung der Stellung beobachtet, nimmt die Firmware das als Ruhelage an und setzt den Nullpunkt darauf. Hat nun jemand einen ruhigen Finger und hält den Trackpoint eine halbe Sekunde konstant in einer Stellung, kann es passieren, dass dies als neue Ruhelage erkannt wird. Fatal!

Das macht sich bemerkbar wenn man den Zeiger bewegt und dieser auf einmal stehen bleibt. Lässt man den Trackpoint nun los, bewegt der Zeiger sich eine Weile in die entgegengesetzte Richtung, bevor er erneut stehen bleibt. Nervig. Niemand will darauf warten, dass der dämliche Zeiger sich endlich neu kalibriert hat!



Verbessern könnte man das, indem man den 0.5 Sekunden Timer heraufsetzt, auf sagen wir mal 5 Sekunden. Niemand wird den Trackpoint ganze 5 Sekunden so ruhig halten können, dass das als Ruhelage erkannt wird.

Laut den Specifications gibt es ein entsprechendes Konfigurationsregister, aber kein Betriebssystem erlaubt den Zugriff darauf. Ätsch sag ich da, Linux ist Open Source. Also habe ich den Treiber mal modifiziert um dieses herauszuführen.

Dazu muss der Kernel Quellcode mit meinem Patch modifiziert und dann neu kompiliert werden (das psmouse Modul reicht). Ich gehe auf diesen Vorgang nicht genauer ein - dazu gibts im Netz genug Infos und jede Distro dreht eh ihr eigenes Ding. Der Patch:

Code:
--- a/drivers/input/mouse/trackpoint.h	2014-12-06 13:12:34.167917741 +0100
+++ b/drivers/input/mouse/trackpoint.h	2014-12-06 16:07:10.814619783 +0100
@@ -70,6 +70,9 @@
 #define TP_UP_THRESH		0x5A	/* Used to generate a 'click' on Z-axis */
 #define TP_Z_TIME		0x5E	/* How sharp of a press */
 #define TP_JENKS_CURV		0x5D	/* Minimum curvature for double click */
+#define TP_DRIFT_TIME		0x5F	/* How long a 'hands off' condition */
+					/* must last for drift correction to */
+					/* recalibrate to zero (x*107ms) */
 
 /*
  * Toggling Flag bits
@@ -120,6 +123,7 @@
 #define TP_DEF_UP_THRESH	0xFF
 #define TP_DEF_Z_TIME		0x26
 #define TP_DEF_JENKS_CURV	0x87
+#define TP_DEF_DRIFT_TIME	0x05
 
 /* Toggles */
 #define TP_DEF_MB		0x00
@@ -137,6 +141,7 @@
 	unsigned char draghys, mindrag;
 	unsigned char thresh, upthresh;
 	unsigned char ztime, jenks;
+	unsigned char drift_time;
 
 	/* toggles */
 	unsigned char press_to_select;
--- a/drivers/input/mouse/trackpoint.h	2014-12-06 13:12:34.167917741 +0100
+++ b/drivers/input/mouse/trackpoint.c	2014-12-06 16:03:09.587952302 +0100
@@ -227,6 +227,7 @@
 TRACKPOINT_INT_ATTR(upthresh, TP_UP_THRESH, TP_DEF_UP_THRESH);
 TRACKPOINT_INT_ATTR(ztime, TP_Z_TIME, TP_DEF_Z_TIME);
 TRACKPOINT_INT_ATTR(jenks, TP_JENKS_CURV, TP_DEF_JENKS_CURV);
+TRACKPOINT_INT_ATTR(drift_time, TP_DRIFT_TIME, TP_DEF_DRIFT_TIME);
 
 TRACKPOINT_BIT_ATTR(press_to_select, TP_TOGGLE_PTSON, TP_MASK_PTSON, 0,
 		    TP_DEF_PTSON);
@@ -249,6 +250,7 @@
 	&psmouse_attr_press_to_select.dattr.attr,
 	&psmouse_attr_skipback.dattr.attr,
 	&psmouse_attr_ext_dev.dattr.attr,
+	&psmouse_attr_drift_time.dattr.attr,
 	NULL
 };
 
@@ -312,6 +314,7 @@
 	TRACKPOINT_UPDATE(in_power_on_state, psmouse, tp, upthresh);
 	TRACKPOINT_UPDATE(in_power_on_state, psmouse, tp, ztime);
 	TRACKPOINT_UPDATE(in_power_on_state, psmouse, tp, jenks);
+	TRACKPOINT_UPDATE(in_power_on_state, psmouse, tp, drift_time);
 
 	/* toggles */
 	TRACKPOINT_UPDATE(in_power_on_state, psmouse, tp, press_to_select);
@@ -333,6 +336,7 @@
 	TRACKPOINT_SET_POWER_ON_DEFAULT(tp, ztime);
 	TRACKPOINT_SET_POWER_ON_DEFAULT(tp, jenks);
 	TRACKPOINT_SET_POWER_ON_DEFAULT(tp, inertia);
+	TRACKPOINT_SET_POWER_ON_DEFAULT(tp, drift_time);
 
 	/* toggles */
 	TRACKPOINT_SET_POWER_ON_DEFAULT(tp, press_to_select);


Danach ist das neue psmouse Modul zu installieren. Nun lädt man es neu (oder rebootet), damit der modifizierte Treiber aktiv wird. Sodann hat man unter /sys/devices/platform/i8042/serio1/serioX/drift_time eine neue Datei. Standardmäßig steht in ihr der Wert 5, welcher ca. 0.5 Sekunden entspricht. Schreibt man 50 rein, hat man ca. 5 Sekunden, was wesentlich sinnvoller ist - mit root-Rechten:

Code:
echo 50 >/sys/devices/platform/i8042/serio1/serio*/drift_time

Damit das permanent wird, packt man die Zeile entweder in ein Startskript, oder man erzeugt eine udev-Regel die so aussieht:

Code:
ACTION=="add", SUBSYSTEM=="serio", DRIVERS=="psmouse", ATTR{description}=="Synaptics pass-through", ATTR{drift_time}="50"

Das wars. Kein vermaledeites Driften mehr! Und es funktioniert wirklich gut!
 
Zuletzt bearbeitet:
Sehr schön! Hast du den Patch schon upstream eingereicht oder wartest du erst noch auf Feedback? Würde ich lieber gleich machen - zurückziehen kann man ihn dann notfalls immer noch. Aber es dauert halt einige Zeit und gerade bei diesem simplen Patch kann man nicht viel kaputt machen (Dank des Defaults).
 
Was linrunner sagt. Ich find das sehr fein, dass Du Dir darüber Gedanken gemacht hast, denn das Problem stört auf jeden Fall ab und an. Allerdings nicht so sehr, dass ich jetzt mein System zerlegen und den Patch selbst einbauen werde. Daher wäre es sehr schön, wenn es irgendwann auch mal fest den Weg in's System finden würde. Den Standardwert kann man ja weiterhin bei 0,5 lassen.


Grüße
Thomas
 
Alles klar, der Patch ist upstream und wird wohl in Kernel 3.19 einfließen :thumbsup:
 
Super. Das nervt zwar nur ganz selten, aber ich freu mich dennoch wenn der Fehler Geschichte ist.
 
So, seit heute ist 3.19 in Arch [core] verfügbar und ich habe es natürlich gleich getestet. Funktioniert wunderbar. Man sollte aber auch folgendes bedenken: Wenn man doch mal so lange still gehalten hat, dann dauert es beim Loslassen auch die gleiche Zeit, bis der Cursor wieder stehen bleibt.
 
Ich verwende inzwischen 25 für den Wert (Standard: 5). Das klappt bei mir am besten. Es stimmt allerdings, dass der Cursor, wenn er einmal driftet, eine Zeit braucht um wieder stehen zu bleiben. Passiert mir aber nur ca. alle 2 Tage einmal.
 
Zuletzt bearbeitet:
  • ok1.de
  • ok2.de
  • thinkstore24.de
  • Preiswerte-IT - Gebrauchte Lenovo Notebooks kaufen

Werbung

Zurück
Oben