mutouch

Nach längerer Überlegung, welches Motherboard zusammen mit welchem Massenspeicher und welchem Netzteil nun die optimale Kombination für mein neues Projekt abgeben würde, habe ich mich entschieden, erstmal einen Touchscreen zu kaufen und dann über den Rest nachzudenken.

Da neue Touchscreens eine ziemlich teure Angelegenheit werden können, habe ich mich entschlossen, einen gebrauchten Touchscreen auf eBay zu kaufen. Nachdem ich als eBay-Neuling erstmal ein paar Auktionen verlohren habe, konnte ich doch ein schönes Stück ersteigern.

Mein Touchscreen hat 12", ein externes Netzteil, ist per VGA mit dem Rechner verbunden und sendet die Touchdaten via serieller RS232 Schnittstelle an den Rechner. Er ist von der Firma "MicroTouch" bzw. "3M", seit diese den Hersteller aufgekauft haben.

Um das schmucke Ding unter Linux im Xorg-Server als Mausersatz verwenden zu können, verwendete ich in einer frischen Debian-Etch installation den Treiber "mutouch" aus dem Paket "xserver-xorg-input-mutouch". Nach der Installation

sudo apt-get install xserver-xorg-input-mutouch

editierte ich die Datei /etc/X11/xorg.conf und fügte das folgende ein:

Section "InputDevice"
Identifier "TouchScreen"
Driver "mutouch"
Option "Type" "finger"
Option "Device" "/dev/ttyS0"
Option "ScreenNo" "0"
Option "MinX" "0"
Option "MaxX" "16383"
Option "MinY" "0"
Option "MaxY" "16383"
Option "SendCoreEvents" "yes"
EndSection

Die zu verwendende serielle Schnittstelle für den Parameter "Device" findet man heraus, indem man den folgenden Befehl mit immer größer werdendem x (beginnend bei 0) ausführt, ein wenig toucht und wenn kryptische Zeichen auf dem Bildschirm erscheinen, hat man die Gerätedatei gefunden:

cat /dev/ttySx

Außerdem fügte ich in der Sektion "ServerLayout" in der Xorg-Konfigurationsdatei /etc/X11/xorg.conf noch den folgenden Eintrag hinzu:

Section "ServerLayout"
...
InputDevice "TouchScreen"
...
EndSection

Der Touchscreen funktionierte daraufhin auf Anhieb, war aber noch etwas ungenau. Zur Kalibrierung verwende ich das Programm "touchcal", das sich ziemlich einfach herunterladen, bauen und ausführen lässt:

cd /tmp
apt-get install build-essential libncurses5-dev
wget http://kent.dl.sourceforge.net/sourceforge/touchcal/touchcal-0.31.tar.gz
tar -zxf touchcal-0.31.tar.gz
cd touchcal-0.31
./configure
make

Anschließend muss man sich vergewissern, dass der X-Server beendet ist und kein anderes Programm mehr auf die Serielle Schnittstelle zugreift. Dann führt man "touchcal" aus und folgt den Anweisungen auf dem Bildschirm:

/tmp/touchcal-0.31/touchcal

Die ausgegebenen Werte für MinX, MaxX, MinY und MaxY trägt man dann bei den entsprechenden Konfigurationsparametern in der Datei /etc/X11/xorg.conf ein.

Startet man nun den X-Server wieder, hat man einen relativ gut kalibrierten und verwendbaren Touchscreen.

Mein Glück aber währte nicht lange. Da Debian Etch aufgrund der vorsteinzeitlichen Programmversionen kaum vernünftig einsetzbar ist, habe ich nach kurzer Zeit ein Upgrade auf die nächste stabile Version "Lenny" durchgeführt. Dabei wurde nicht nur die Datei /etc/X11/xorg.conf zerstört, sodass ich sie neu einrichten musste, auch war fortan die Y-Achse invertiert. Klickte ich also oben, landete der Mauszeiger unten.

Weil Optionen wie "SwapY" in der Konfigurationsdatei keine Abhilfe schafften, entschloss ich mich, inden Quellcode des Treibers einzusteigen und die Y-Achse händisch umzudrehen. (Warum es zu diesem seltsamen Fehlverhalten kommt kann ich mir nur damit erklären, dass bei einer Xorg-Änderung der Ursprung des Koordinatensystems verändert wurde, aber das ist reine Spekulation.) Ich verbrachte also eine weitere Stunde mit dem Lesen des mutouch-Xorg-Treibers, konnte aber letztlich das Fehlverhalten mit einer kleinen Änderung beseitigen.

Zuerst benötigt man eine Kopie des mutouch-Treibers, außerdem muss man den alten, im Paket mitgelieferten Treiber entfernen und einige Entwicklerpakete installieren:

cd /root
mkdir mutouch
cd mutouch
apt-get source xserver-xorg-input-mutouch
apt-get install xserver-xorg-dev pkg-config
cd xserver-xorg-input-mutouch*
apt-get remove --purge xserver-xorg-input-mutouch

Anschließend wird der Quellcode testweise gebaut und das Kompilat installiert, um zu sehen, ob alle Pakete da sind und keine generellen Probleme auftreten:

./configure
make
make install

Anschließend bearbeitet man die Datei src/xf86MuTouch.c:

nano src/xf86MuTouch.c

Hier ergänzt man die Zeile 746, die ursprünglich so aussieht:

cur_y = WORD_ASSEMBLY(start_ptr[3], start_ptr[4]);

mit einer kleinen Anweisung zu dem Folgenden:

cur_y = (priv->max_y + priv->min_y) - WORD_ASSEMBLY(start_ptr[3], start_ptr[4]);

Dann verlässt man den Editor wieder, erstellt die Binärdateien neu, installiert sie wieder und setzt noch einige symbolische Links, damit der Xorg-Server die Dateien auch wirklich findet:

make
make install
ln -s /usr/local/lib/xorg/modules/input/mutouch_drv.la /usr/lib/xorg/modules/input/mutouch_drv.la
ln -s /usr/local/lib/xorg/modules/input/mutouch_drv.so /usr/lib/xorg/modules/input/mutouch_drv.so
ldconfig

Was genau der letzte Befehl macht, weiß ich nicht, es scheint aber mit besser zu gehen als ohne (bzw. ohne garnicht zu gehen), deshalb habe ich ihn verwendet.

Nun kann man den X-Server neu starten und, wenn alles gut gelaufen ist, den Touchscreen auch unter neueren Xorg-Versionen ohne invertierte Y-Achse betreiben.

Update

Angeblich ist es auch ohne Treiberänderungen möglich, die Y-Achse zu invertieren, indem man die Werte von MinY und MaxY vertauscht. Vielen Dank an Christian K. für den Hinweis!

Tags: Linux | Touchpanel