Wacom Tablet UD-1212-R mit Linux (OpenSuse 13.1)

Page content

Durch einen Zufall kam ich an ein altes Wacom Tablet, Typenbezeichnung UD-1212-R. Dieses Tablet hat eine Zeichenfläche von 12x12 Zoll. Es ist auch als “Digitizer II” bekannt.

Das Funktionsprinzip beruht auf der Analyse elektrischer Felder. Ein solches Feld wird an der Tabletoberfläche erzeugt. Ein spezieller Stift, in dem ein Schaltkreis eingebaut ist, “stört” das erzeugte Feld. Die Lokation der Störung wird vom Tablet sehr genau festgestellt. Der Schaltkreis im Stift kommt ohne Batterien aus, er bezieht seine Energie aus dem elektrischen Feld über dem Tablet.

Das UD-1212-R ist uralte Hardware, die Datecodes auf der Controllerplatine weisen bei mein em Exemplar auf das Baujahr 1994 hin.

Das Tablet kam ohne Stift und Kabel zu mir.

Das Tablet sollte also 20 Jahre nach seiner Herstellung wieder angeschlossen werden…

Anschluss der Hardware

Stift: Den Stift (PL900 bzw. UD817e) kann man heute noch bei Wacom kaufen.

Kabel und elektrischer Anschluss: Das Tablet hat einen seriellen Anschluss. Entweder man schließt es an einen PC mit seriellem Anschluss an oder man nimmt ein Adapter-Kabel Seriell<->USB. Ich habe noch serielle Anschlüsse, daher habe ich das Tablet direkt via RS232 angeschlossen.

Das Kabel ist speziell. Es führt sowohl die RS232 Steuersignale als auch die Betriebsspannung (9-12V DC). Ich habe mir das Kabel wie folgt selbst gelötet, Informationen zum Kabel kann man sich aus diversen Foren im Internet zusammensuchen.

DB9 Konnektor (9 Pins). N.C. heißt “Not Connected”.

Pin Tablet UD-1212-R “Digitizer II” Funktion Pin PC Kommentar
1 N.C. 1 N.C.
2 TxD 2 RxD
3 RxD 3 TxD
4 RTS 8 CTS
5 CTS 7 RTS
6 DSR 4 DTR
7 GND 5 GND
8 + VCC 9-12V 100mA
9 DTR 6 DSR

An Pin 7/8 ist also die Versorgungsspannung anzuschließen. Ab 6,5 V leuchtet bei mir die Betriebs-LED des Tablets.

Softwaremäßige Einbindung in Linux

Im Internet gibt es viel Information zu diesem Thema, allerdings wenig klärendes. Ich habe mir in zwei Tagen alle Informationen zusammengesucht.

Theorie of Operation Das meiste hierzu war mir neu und stellt sicher nur einen winzigen Ausschnitt aller Möglichkeiten dar. Eventuell ist was ich schreibe auch nicht ganz richtig.

Ein heute nicht mehr (?) verfolgter Ansatz war es, Geräte innerhalb des X Servers anzubinden, indem der X Server eigene Treiber für diese Geräte enthielt.

Heute verwendet der X Server Eingabegeräte, die im /dev/input/-Baum eingehängt sind. Vermutlich gibt es dort eine einheitliche Schnittstelle für alle Eingabegeräte, was den X Server von Besonderheiten deutlich entlasten würde.

Das Einhängen von Geräten in den /dev/input-Baum erfolgt entweder über udev, das zum Gerät passende Kernel-Module nachlädt oder “manuell”.

Man braucht also zum Anbinden eines Geräts zwei Dinge:

  • Ein Kernel-Modul, welches das Gerät unterstützt
  • Einen Mechanismus, der das Kernel-Modul bei Bedarf einbindet

Kernel-Modul: Von Wacom gab und gibt es zahlreiche Tablets, die neueren alle mit USB Anschluss. In meinem OpenSuse 13.1 ist standardmäßig schon ein Kernel Modul enthalten, allerdings unterstützt dieses nur neuere (USB-?)Geräte. Das vorhandene Modul wacom_w8001 nutzt also nichts.

Ein Kernel Modul für ältere, seriell angeschlossene Tablets gibt es hier: http://www.cipht.net/2011/07/02/wacom_serial-initial-release.html

Das dortige tar-File, welches die Sourcen des Treibers enthält, lässt sich ganz einfach mittels gcc übersetzen.

Einbindung des Kernel-Moduls mit inputattach: inputattach ist ein Programm, dass das passende Kernel-Modul an eine physikalische Schnittstelle anbindet und die Schnittstelle des Geräts in den /dev/input-Baum einbindet.

Mein Gerät hängt an /dev/ttyS0. Der Aufruf für inputattach ist daher:

./inputattach --wacom_iv /dev/ttyS0 &

wacom_iv ist hierbei der Gerätetyp. Diesen nimmt inputattach her, um eine Informationsstruktur für das angehängte Gerät anzulegen, die von udev (?) benutzt wird, um das passende Kernel-Modul zu laden.

inputattach ist Teil des “linuxconsole” Projekts. Dieses muss heruntergeladen und von Source installiert werden. Dabei entsteht inputattach im Unterverzeichnis “utils”. Allerdings muss hier vorher noch etwas getan werden. Der Support für die älteren Tablets (einige wenige Zeilen Code) fehlt in inputattach.c. Es gibt zwar zwei patch-Dateien (eine für inputattach.c und eine für serio-ids.h) die sind aber nicht ganz korrekt. Ich habe daher per Hand folgendes gemacht:

inputattach.c: In der Struktur input_types input_types folgende Zeilen eingefügt:

{ "--wacom_iv", "-wacom_iv", "Wacom protocol 4 tablet", B9600, CS8, SERIO_WACOM_IV, 0x00, 0x00, 0, NULL },

serio-ids.h: folgende Zeilen eingefügt:

#ifndef SERIO_WACOM_IV # define SERIO_WACOM_IV 0x3f #endif

Es muss darauf geachtet werden, dass der Wert für SERIO_WACOM_IV eindeutig ist. Am besten den höchsten Wert+1 aus der serio-ids.h nehmen. Auch gegen /usr/include/linux/serio.h checken, auch dort darf keine Überdeckung vorliegen ( Hinweis: der Original-Patch definiert für SERIO_WACOM_IV 0x3d. Dies kollidiert aber mit dem Define SERIO_TSC40 in /usr/include/linux/serio.h. Daher wird bei sturer Übernahm des Patchs der falsche Treiber (nämlich für TSC40 Tablets) geladen. In dmesg steht das falsche Tablet drin, und funktionieren tut gar nichts).

Wenn man nun ein passendes inputattach und ein Kernel-Modul hat, kann man sehen ob die Anbindung klappt:

insmod ./wacom_serial.ko

./inputattach --wacom_iv /dev/ttyS0 &

Mit dmesg sieht man wenn alles gut geht in etwa so was:

[ 3161.508413] serio: Serial port ttyS0 [ 3161.540516] input (null): Wacom tablet: Digitizer II, version 1.2

[ 3161.540520] input (null): Max pressure: 127. [ 3161.578164] input (null): Configuration string: ~RE203C800,000,00,1270,1270 [ 3161.600884] input: Wacom protocol 4 serial tablet as /devices/pnp0/00:0a/tty/ttyS0/serio8/input/input17

xsetwacom listet dann das Gerät auch aus:

xsetwacom --list devices Wacom protocol 4 serial tablet id: 12 type: STYLUS

Die Einbindung in den /dev/input-Baum sieht man auch hier:

cat /proc/bus/input/devices 
.... 
I: Bus=0013 Vendor=003f Product=0000 Version=5544 
N: Name="Wacom protocol 4 serial tablet" 
P: Phys=ttyS0/serio0/input0 
S: Sysfs=/devices/pnp0/00:0a/tty/ttyS0/serio9/input/input17 
U: Uniq= 
H: Handlers=mouse1 event14 
B: PROP=0 B: EV=b B: KEY=c43 0 0 0 0 0 B: ABS=1000003

Schließlich kennt nun auch X sebst das Gerät:

xinput list 
...
Virtual core pointer id=2 [master pointer (3)]
Virtual core XTEST pointer id=4 [slave pointer (2)]
Logitech USB-PS/2 Optical Mouse id=10 [slave pointer (2)]
Wacom protocol 4 serial tablet id=12 [slave pointer (2)]
Virtual core keyboard id=3 [master keyboard (2)]
Virtual core XTEST keyboard id=5 [slave keyboard (3)]
Power Button id=6 [slave keyboard (3)]
Power Button id=7 [slave keyboard (3)]
Logitech USB Keyboard id=8 [slave keyboard (3)]
Logitech USB Keyboard id=9 [slave keyboard (3)]
Eee PC WMI hotkeys id=11 [slave keyboard (3)]

Wenn man soweit ist, muss man nur noch dem X Server sagen, dass er das Gerät auch verwenden soll. In /etc/X11/xorg.conf.d/ muss eine passende Datei abgelegt werden. Bei OpenSuse ist eine solche Datei (50-wacom.conf) schon da und muss nur noch angepasst werden:

Section "InputClass" 
        Identifier "Wacom serial class" 
        MatchProduct "Wacom protocol 4 serial tablet"
        MatchDevicePath "/dev/input/event\*" 
        Driver "wacom" 
        Option "Type" "stylus" 
        Option "DebugLevel" "12"
EndSection

andere, nicht benötigte Klassen kann man löschen. Wichtig ist, dass der Wert des Attributs MatchProduct übereinstimmt mit dem, was xinput list als Namen ausgibt. Über diesen Text matcht X das Gerät zu dieser InputClass. Nach einem Neustart des Servers kann man nun den Cursor mit der Maus (wie vorher) und zusätzlich mit dem Tabletstift bewegen.

Ich habe auch folgende Datei nach /etc/udev/rules.d gespielt, weiss nicht ob man die braucht:

cat /etc/udev/rules.d/70-serial-wacom.rules ACTION=="add|change", SUBSYSTEM=="pnp", ENV{PRODUCT}=='13/3f/\*', ENV{NAME}=="Wacom protocol IV serial tablet",SYMLINK+="input/wacom",ENV{ID_INPUT}="1",ENV{ID_INPUT_TABLET}="1"

Aspect Ratio einstellen: Mein Tablet hat ein Aspect Ratio von 1:1 (15240 x 15240 Pixel). Meine beiden Bildschirme sind unter X mit 3200x1200 Pixeln verfügbar. Wenn man nun einen sauberen Kreis auf dem Tablet zeichnet, kommt eine platte Ellipse auf dem Bildschirm heraus. Man muss das Seitenverhältnis passend umrechnen. X erlaubt dies auf unterschiedliche Weise.

Erst Infos sammeln:

dennis@dennis-pc:~> xsetwacom get "Wacom protocol 4 serial tablet" 
all Option "Area" "0 0 15240 15240" 'Button' requires exactly 1 value(s). 
Option "ToolDebugLevel" "12" Option "TabletDebugLevel" "0" Option "Suppress" "2" Option "RawSample" "4" Option "PressureCurve" "0 0 100 100" Option "Mode" "Absolute" Option "TabletPCButton" "off" Option "Touch" "off" Option "Gesture" "off" Option "ZoomDistance" "0" Option "ScrollDistance" "0" Option "TapTime" "250" Property 'Wacom Proximity Threshold' does not exist on device. Option "Rotate" "none" Property 'Wacom Wheel Buttons' does not exist on device. Property 'Wacom Wheel Buttons' does not exist on device. Property 'Wacom Wheel Buttons' does not exist on device. Property 'Wacom Wheel Buttons' does not exist on device. Property 'Wacom Wheel Buttons' does not exist on device. Property 'Wacom Wheel Buttons' does not exist on device. Property 'Wacom Strip Buttons' does not exist on device. Property 'Wacom Strip Buttons' does not exist on device. Property 'Wacom Strip Buttons' does not exist on device. Property 'Wacom Strip Buttons' does not exist on device. Option "Threshold" "27" Option "ToolType" "426" Option "ToolSerial" "1" Option "ToolID" "0" Option "ToolSerialPrevious" "0" Option "BindToSerial" "0" Option "TabletID" "0"

xinput listet eine “Coordinate Transformation Matrix” aus. Genau das was ich suche :-)

dennis@dennis-pc:~> xinput list-props "Wacom protocol 4 serial tablet" Device 'Wacom protocol 4 serial tablet': Device Enabled (141): 1 Coordinate Transformation Matrix (143): 0.400000, 0.000000, 0.000000, 0.000000, 1.000000, 0.000000, 0.000000, 0.000000, 1.000000

Device Accel Profile (266): 0 Device Accel Constant Deceleration (267): 1.000000 Device Accel Adaptive Deceleration (268): 1.000000 Device Accel Velocity Scaling (269): 10.000000 Device Node (262): "/dev/input/event14" Wacom Tablet Area (600): 0, 0, 15240, 15240 Wacom Rotation (601): 0 Wacom Pressurecurve (602): 0, 0, 100, 100 Wacom Serial IDs (603): 0, 0, 2, 1, 0 Wacom Serial ID binding (604): 0 Wacom Pressure Threshold (605): 27 Wacom Sample and Suppress (606): 2, 4 Wacom Enable Touch (607): 0 Wacom Hover Click (608): 1 Wacom Enable Touch Gesture (609): 0 Wacom Touch Gesture Parameters (610): 0, 0, 250 Wacom Tool Type (611): "STYLUS" (426) Wacom Button Actions (612): "Wacom button action 0" (613), "Wacom button action 1" (614), "Wacom button action 2" (615), "None" (0), "None" (0), "None" (0), "None" (0), "Wacom button action 3" (616), "Wacom button action 4" (617) Wacom button action 0 (613): 1572865 Wacom button action 1 (614): 1572866 Wacom button action 2 (615): 1572867 Wacom button action 3 (616): 1572872 Wacom button action 4 (617): 1572873 Device Product ID (261): 63, 0 Wacom Debug Levels (618): 12, 0

Infos zum Screen:

dennis@dennis-pc:~> xrandr Screen 0: minimum 8 x 8, current 3200 x 1200, maximum 16384 x 16384 DVI-I-0 disconnected (normal left inverted right x axis y axis) VGA-0 connected 1600x1200+1600+0 (normal left inverted right x axis y axis) 408mm x 306mm 1600x1200 60.0\*+ 1280x1024 75.0 60.0 1280x960 60.0 1152x864 75.0 1024x768 75.0 70.1 60.0 800x600 75.0 72.2 60.3 56.2 640x480 75.0 72.8 59.9 DVI-I-1 connected primary 1600x1200+0+0 (normal left inverted right x axis y axis) 518mm x 324mm 1600x1200 60.0\*+ 1280x1024 70.0 60.0 1024x768 85.0 75.0 60.0 800x600 85.1 75.0 60.3 640x480 85.0 75.0 60.0 59.9

Setzen einer Matrix, die den Tabletbereich auf den Monitor-Bereich 1200x1200 am linken Bildschirm setzt:

xinput set-prop "Wacom protocol 4 serial tablet" --type=float "Coordinate Transformation Matrix" 0.375 0 0 0 1 0 0 0 1

Erklärung: 1 0 0 0 1 0 0 0 1 ist die Matrix 100 010 001 . Dies ist die Identitätsmatrix. Damit wird der Tablet-Bereich auf den Gesamtbildschirm umgerechnet. Dies bringt eine starke Zerrung in horizontaler Richtung mit sich.

Ich möchte keinerlei Verzerrung beim Zeichnen. Dann darf der Tablet-Bereich nur auf einen Bereich gemappt werden, dessen Aspect Ratio auch 1:1 ist. Die maximale Ausdehung in Y-Richtung ist bedingt durch die Monitore 1200. Ich kann also einen Bereich 1200x1200 innerhalb meiner 3200x1200 definieren, in den das Tablet verzerrungsfrei gemappt wird. Der Skalierfaktor in X-Richtung ist 1200/3200 = 0.375. Somit ergibt sich “meine” Matrix zu: 0.375 0 0 0 1 0 0 0 1 .

und xinput wird so aufgerufen:

xinput set-prop "Wacom protocol 4 serial tablet" --type=float "Coordinate Transformation Matrix" 0.375 0 0 0 1 0 0 0 1

Wenn man wieder das volle Mapping haben will (mit Verzerrung):

xinput set-prop "Wacom protocol 4 serial tablet" --type=float "Coordinate Transformation Matrix" 1 0 0 0 1 0 0 0 1

Details und Diskussion siehe hier: http://ubuntuforums.org/archive/index.php/t-1656089.html

Nutzung mit Gimp

In Gimp kann man via Einstellungen weitere Eingabegeräte aktivieren. Als ich das für mein Tablet gemacht habe, konnte ich sofort zeichnen, auch mit unterschiedlicher Aufdruckstärke. Die Bedienung ist aber erstmal gewöhnungsbedürftig und vermutlich müssen zusätzliche InputClass-Optionen eingestellt werden, ich habe z.B-. zwei Bildschirme mit zusammen 3200x1200 Pixeln und ich kam mit dem Tablet zwar auf beide Bildschirme, aber nicht ganz bis in die rechte Ecke. Außerdem behinderten sich beide vorhandenen Cursoren gegenseitig, z.B. bei angedockten Dialogen.

Hier mein allererstes Bild, ca, 5 Minuten nachdem das Tablet erstmal lief hingezaubert :-)))

(Etwas infantil, ich gebs zu. Dem gingen allerdings drei Stunden Kernel-Modul Basteleien voran…)

Das Innenleben des Tablets

Chips on Board: W3007F, W5000F, W6001F

Riesige Abschirmung

Der Controller

Chips on Board: W3007F, W5000F, W6001F. Oben das EPROM 27C512 mit der Firmware. Neuester Datecode 29. Woche 1994.