history

青木日記 RSS

<前の日 | この月 | 次の日>

2003-10-22

Linux / USB タブレットを使う (1) 準備

どうしても Linux でタブレットが使いたくなった。 ところが手持ちのタブレットは USB 接続なので、 USB タブレットを使う方法を調べた。

まず基礎情報から。持っているタブレットは Wacom の FAVO F510 というやつ。型番は ET-0507-U (描画領域 B6 サイズ、シルバー) である。 あとで正確に調べたところによると ET-0507-UV2.01 というらしい。 V2.01 の部分はハードウェアのリビジョンだ。

とりあえず「Linux USB タブレット Wacom FAVO」で Google すると 次のページが見付かった。

家のソフトウェア的な条件はと言うと、

  • Linux カーネルは 2.4.22
  • wacom.o はコンパイル済
  • XFree86 4.3.0

で、まず問題ないであろう部類に入る。

Linux / USB タブレットを使う (2) 特殊事情を解決する

問題ないであろう部類なのだが事情により 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 にコピーしておく。

Linux / USB タブレットを使う (3) カーネルレベルで認識させる

まずデバイスドライバをロードする。

# 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 デバイスの情報がどかどか出てくるから、その中に目的のデバイスがあるか見る。

Linux / USB タブレットを使う (4) X レベルで認識させる

次に 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 を再起動しなければならない。ださい。

再起動する。だめだ。タブレットが全然動作してない。

Linux / USB タブレットを使う (5) 雲行きが怪しくなってきた

状態は以下の通り。

  • タブレットのランプは点灯している
  • dmesg も X のログも異常なし
  • 他のデバイスの動作もおかしくはなってない
  • cat /dev/input/event0 してペンを動かすといろいろ出てくるので信号は来てるっぽい
  • しかしペンを動かしてもカーソルは動かない

さらに 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 かよ。

まだだめだ。状況変わらず。

Linux / USB タブレットを使う (6) 光明が見えた

次は別の 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 を再起動。

よし! カーソル動いたー!

Linux / USB タブレットを使う (7) 問題はまだ続く

と思ったらまだ問題があった。 タブレットのペン領域が狭く認識されているらしく、 右と下の 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 ぽいな。

……だめだ、まだ直らないよパトラッシュ……

Linux / USB タブレットを使う (8) ぶちきれ、そして解決

くそう、俺に逆らうとはいい度胸だな。 パラメータをハードコーディングしてやる!

~/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 で動作することが確認されたのであった。(完)

名前
メールアドレス

<前の日 | この月 | 次の日>
2002|04|05|06|07|08|09|10|11|12|
2003|01|02|03|04|05|06|07|08|09|10|11|12|
2004|01|02|03|04|05|06|07|08|09|10|11|12|
2005|01|02|03|04|05|06|07|08|09|10|11|12|
2006|01|02|03|04|05|06|07|08|09|10|11|12|
2007|01|02|03|04|05|06|07|08|09|10|11|12|
2008|01|02|04|05|06|09|10|
2009|07|
2010|09|

Copyright (c) 2002-2007 青木峰郎 / Minero Aoki. All rights reserved. LIRS