- 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:
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:
Damit das permanent wird, packt man die Zeile entweder in ein Startskript, oder man erzeugt eine udev-Regel die so aussieht:
Das wars. Kein vermaledeites Driften mehr! Und es funktioniert wirklich gut!
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: