どうしても Linux でタブレットが使いたくなった。 ところが手持ちのタブレットは USB 接続なので、 USB タブレットを使う方法を調べた。
まず基礎情報から。持っているタブレットは Wacom の FAVO F510 というやつ。型番は ET-0507-U (描画領域 B6 サイズ、シルバー) である。 あとで正確に調べたところによると ET-0507-UV2.01 というらしい。 V2.01 の部分はハードウェアのリビジョンだ。
とりあえず「Linux USB タブレット Wacom FAVO」で Google すると 次のページが見付かった。
家のソフトウェア的な条件はと言うと、
で、まず問題ないであろう部類に入る。
問題ないであろう部類なのだが事情により X の Wacom ドライバがない。 /usr/include/linux にまだ Linux 2.2 のヘッダファイルがあるため、 Wacom ドライバは make できなかったのだ。 そのときは Makefile を書き換えて wacom ドライバをスキップすることで make を通してしまったので、どうにかしなければならない。
そこで、とりあえず /usr/include/{asm,linux} を一瞬だけ Linux 2.4 のものに差し替えて Wacom ドライバだけコンパイルしてみることにする。 それでいいのどうかは知らない。 libc から何から全部リコンパイルするなんて面倒だからしかたがない (?)。
やってみたらコンパイルは通った。できた wacom_drv.o を /usr/X11R6/lib/modules/input にコピーしておく。
まずデバイスドライバをロードする。
# modprobe wacom
dmesg などを見てエラーが起きていないか確認。
次にデバイスファイルを確認して、なければ作る。
# mkdir /dev/usb # mknod /dev/usb/ttyUSB0 c 188 0 # mknod /dev/usb/ttyUSB1 c 188 1 # mknod /dev/usb/ttyUSB2 c 188 2 # mknod /dev/usb/ttyUSB3 c 188 3 # mkdir /dev/input # mknod /dev/input/event0 c 13 64 # mknod /dev/input/event1 c 13 65 # mknod /dev/input/event2 c 13 66 # mknod /dev/input/event3 c 13 67 # mknod /dev/input/mice c 13 63 # mknod /dev/input/mouse0 c 13 32
うちには /dev/usb/* はあったが /dev/input/* がなかった。
さらに詳しく USB の動作を確認するには、 カーネルの「USB verbose なんたら」ってオプションをオンにして
# modprobe usbdevfs # mount -t usbdevfs none /proc/bus/usb
を実行し、cat /proc/bus/usb/devises してみる。 USB デバイスの情報がどかどか出てくるから、その中に目的のデバイスがあるか見る。
次に X を設定する。/etc/X11/XF86Config に InputDevice セクションを増やして、ServerLayout にそのデバイスを追加する。
# Wacom tablet FAVO2 Section "InputDevice" Identifier "FavoStylus" Driver "wacom" Option "Device" "/dev/input/event0" Option "Type" "stylus" Option "Mode" "Absolute" Option "USB" "on" EndSection Section "InputDevice" Identifier "FavoEraser" Driver "wacom" Option "Device" "/dev/input/event0" Option "Type" "eraser" Option "Mode" "Absolute" Option "AlwaysCore" Option "USB" "on" EndSection Section "InputDevice" Identifier "FavoMouse" Driver "wacom" Option "Device" "/dev/input/event0" Option "Type" "cursor" Option "Mode" "Relative" Option "AlwaysCore" Option "USB" "on" EndSection Section "ServerLayout" Identifier "Main Layout" Screen "MainScreen" InputDevice "MainKeyboard" "CoreKeyboard" InputDevice "MainMouse" "CorePointer" # ここの三行を追加した InputDevice "FavoStylus" "AlwaysCore" InputDevice "FavoEraser" "AlwaysCore" InputDevice "FavoMouse" "AlwaysCore" EndSection
X は起動中にタブレットが増えても認識してくれないので、 USB タブレットをつないだあと X を再起動しなければならない。ださい。
再起動する。だめだ。タブレットが全然動作してない。
状態は以下の通り。
さらに Google してみると、 タブレットが rev1.2 だとカーネルドライバにパッチが必要らしいことがわかった。 ハードウェアのリビジョンは前述の /proc/bus/usb/devices で調べられる。 メッセージはいろいろ出るけど FAVO に関係するのは次の部分だけのようだ。
T: Bus=03 Lev=01 Prnt=01 Port=00 Cnt=01 Dev#= 3 Spd=1.5 MxCh= 0 D: Ver= 1.01 Cls=00(>ifc ) Sub=00 Prot=00 MxPS= 8 #Cfgs= 1 P: Vendor=056a ProdID=0012 Rev= 2.03 S: Manufacturer=WACOM S: Product=ET-0507-UV2.0-3 C:* #Ifs= 1 Cfg#= 1 Atr=80 MxPwr= 40mA I: If#= 0 Alt= 0 #EPs= 1 Cls=03(HID ) Sub=01 Prot=02 Driver=wacom E: Ad=81(I) Atr=03(Int.) MxPS= 8 Ivl=10ms
Rev 2.03 だとお?! うわあ、1.2 でもだめらしいのに、 さらにメジャーバージョンアップしてやがる。これはまずいな。
しかしそれでもまだめげない。 まず X の Wacom ドライバ開発元の人のところから最新のソースコードを持ってきてみる。
ファイルのリビジョンは Linux 2.4.22 とも XFree 4.3 とも同じだ。 しかし diff してみると微妙にネットにあるやつのほうが新しいような気がする。 とりあえずこれでいこう。
~/src/xfree86-4.3.0/programs/Xserver/hw/drivers/input/wacom % cp ~/xf86Wacom.c . ~/src/xfree86-4.3.0/programs/Xserver/hw/drivers/input/wacom % make ~/src/xfree86-4.3.0/programs/Xserver/hw/drivers/input/wacom % sudo cp wacom_drv.o /usr/X11R6/lib/modules/input
さらにもう一度 X を再起動。Windows かよ。
まだだめだ。状況変わらず。
次は別の X ドライバ (graphireUSB) を使ってみる。 graphire とは、あちらの国での FAVO の商品名らしい。
ドライバを make。ファイルを xf86Wacom.c に上書きして make すればいい。
~/src/xfree86-4.3.0/programs/Xserver/hw/xfree86/input/wacom % cp ~/graphireUSB.c xf86Wacom.c ~/src/xfree86-4.3.0/programs/Xserver/hw/xfree86/input/wacom % make ~/src/xfree86-4.3.0/programs/Xserver/hw/xfree86/input/wacom % sudo cp wacom_drv.o /usr/X11R6/lib/modules/input/graphireUSB_drv.o
そして XF86Config を次のように直す。
Section "InputDevice" Identifier "FavoStylus" Driver "graphireUSB" Option "Device" "/dev/input/event0" Option "Type" "gstylus" Option "Mode" "Absolute" Option "USB" "on" EndSection Section "InputDevice" Identifier "FavoEraser" Driver "graphireUSB" Option "Device" "/dev/input/event0" Option "Type" "geraser" Option "Mode" "Absolute" Option "AlwaysCore" Option "USB" "on" EndSection Section "InputDevice" Identifier "FavoMouse" Driver "graphireUSB" Option "Device" "/dev/input/event0" Option "Type" "gmouse" Option "Mode" "Relative" Option "AlwaysCore" Option "USB" "on" EndSection
Driver と Type が変わってる。 そしたら X を再起動。
よし! カーソル動いたー!
と思ったらまだ問題があった。 タブレットのペン領域が狭く認識されているらしく、 右と下の 1/3 くらいにペンを置くと画面からはみだしてしまう。 いくらなんでもこれはだめだ。
しかし今回はそのためのドライバオプションがある (っぽい)。 /etc/X11/XF86Config の Section InputDevice で以下のように MaxX, MaxY オプションを追加する。
Section "InputDevice" Identifier "FavoStylus" Driver "graphireUSB" Option "Device" "/dev/input/event0" Option "Type" "gstylus" Option "Mode" "Absolute" Option "USB" "on" Option "MaxX" "14175" Option "MaxY" "10106" EndSection
ちなみにここの MaxX と MaxY は物理的にものさしで計測した数値から計算している。 ドライバが MaxX=10206, MaxY=7422 と認識していたので、 「実際の長さ(175mm) / 認識している長さ(126mm) * 10206」てな感じで弾き出した。
これでもう一度 X を再起動。本当に Windows ぽいな。
……だめだ、まだ直らないよパトラッシュ……
くそう、俺に逆らうとはいい度胸だな。 パラメータをハードコーディングしてやる!
~/src/xfree86-4.3.0/programs/Xserver/hw/xfree86/input/wacom % diff xf86Wacom.c.graphireusb{.org,} --- xf86Wacom.c.graphireusb.org 2003-10-22 01:34:44.000000000 +0900 +++ xf86Wacom.c.graphireusb 2003-10-22 01:49:42.000000000 +0900 @@ -1566,6 +1566,12 @@ xf86GraphireUSBOpen(LocalDevicePtr local common->graphireUSBMaxZ = 511; /* FIXME: 31 for mice */ common->graphireUSBResolX = 1270; /* default value */ common->graphireUSBResolY = 1270; /* default value */ +#if 1 /* aamine */ + common->graphireUSBMaxX = 14050; + common->graphireUSBMaxY = 10140; + common->graphireUSBResolX = 1270; + common->graphireUSBResolY = 1270; +#endif DBG(2, ErrorF("setup is max X=%d max Y=%d resol X=%d resol Y=%d\n", common->graphireUSBMaxX, common->graphireUSBMaxY, common->graphireUSBResolX, ~/src/xfree86-4.3.0/programs/Xserver/hw/xfree86/input/wacom % ln -sf xf86Wacom.c.graphireUSB xf86Wacom.c ~/src/xfree86-4.3.0/programs/Xserver/hw/xfree86/input/wacom % make ~/src/xfree86-4.3.0/programs/Xserver/hw/xfree86/input/wacom % sudo cp wacom_drv.o /usr/X11R6/lib/modules/input/graphireUSB_drv.o
再起動! 動作確認! おっけー!
かくして最新の USB タブレットも Linux で動作することが確認されたのであった。(完)