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

Durch einen Zufall kam ich an ein altes Wacom Tablet, Typenbezeichnung UD-1212-R. Dieses Tablet hat eine Zeichenfläche von 12×12 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 meinem 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 seriellen 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“
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 it 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 ich mn 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 3200×1200 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 daas 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 1600×1200+1600+0 (normal left inverted right x axis y axis) 408mm x 306mm
1600×1200      60.0*+
1280×1024      75.0     60.0
1280×960       60.0
1152×864       75.0
1024×768       75.0     70.1     60.0
800×600        75.0     72.2     60.3     56.2
640×480        75.0     72.8     59.9
DVI-I-1 connected primary 1600×1200+0+0 (normal left inverted right x axis y axis) 518mm x 324mm
1600×1200      60.0*+
1280×1024      70.0     60.0
1024×768       85.0     75.0     60.0
800×600        85.1     75.0     60.3
640×480        85.0     75.0     60.0     59.9

Setzen einer Matrix, die den Tabletbereich auf  den Monitor-bereich 1200×1200 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 1200×1200 innerhalb meiner 3200×1200 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 3200×1200 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.

 

 

 

Schreibe einen Kommentar