[2001/04/15更新]

インストールと設定


ここでは、Linuxの2.4系カーネルでUSBドライバを利用する方法、および、USBマウスとHandspring VisorのUSBクレイドルの設定方法について解説します。


注意事項

ディストリビューションからインストールされるカーネルでサポートされていない場合、LinuxでUSBを使用するには、2.4系のカーネル(最低でもドライバモジュール)をコンパイルする必要があります。 2.2系でも可能ですが、手元では一切検証しておりませんし、いずれにせよカーネルのコンパイルは必要です。

ここでは、カーネルの再構築についての解説は行ないませんので、やり方がわからない方は、別の文献などで調べておいてください。 なお、基本的なUNIXの操作ができることを前提としておりますので、御了承ください。


用意するもの

あらかじめ必要なものを以下に挙げておきます。 参考までに、私が使用したものも挙げておきます。

  1. USBポートのついたPC

    USBコントローラの解説の項で述べた通り、USBコントローラにはUHCIとOHCIがあります。 どちらが搭載されているかを調べておいてください。

    従来(2.3.33以前)、Linuxカーネルでは、UHCIには1種類、OHCIには2種類のドライバが用意されていましたが、2.3.34以降では、OHCIのドライバは1本化されています。 一方、2.3.42以降では、UHCIのドライバが2系統に分裂しています。

    私は、IBMのThinkPad235(OHCI)を用意しました。 ここでは、これに合わせて、ノートPCを主な対象として解説しておりますが、デスクトップPCでも基本的な状況は変わりません。

  2. Linuxカーネル

    ここでは、2.4カーネルのUSBドライバを利用することを想定しています。 まだ2.4系カーネルを採用したディストリビューションはほとんどありませんので、事実上自力でコンパイルしてインストールして戴くことが前提です。 カーネルを2.4系にアップグレードする方法については、別のドキュメントで詳しく解説しておりますので、そちらを参照してください。

    なお、最新のカーネルのソースコードは、Ringサーバ等から入手可能です。 2001年4月8日現在、2.4系の最新カーネルは2.4.3です。

  3. USB機器

    本解説の主な対象であるノート環境において、Linuxで使用可能なUSB機器のうち最も需要が多いものは、マウスではないでしょうか。 デスクトップ機では、起動時にBIOSがUSBのマウスやキーボードを認識して、PS/2エミュレーションデバイスとして見せてくれるので、それほど需要があるとは思えません。 実際は、ノート機で必要なときにマウスを挿して使う、というのが、最もよくある使い方ではないかと思います。

    特に、ホイールマウスは非常に便利ですので重宝します。 私もELECOM製のUSBホイールマウスを使っていますので、参考情報として、ホイールの設定についても紹介します。


インストール

以下の手順で、カーネルを再構築して、USBドライバをインストールします。 ここでは、linux-2.4.3カーネルを用意しているものと仮定して解説しています。

カーネルの再構築方法は、通常と変わりありませんので、詳しいやり方については、他の文献などを参照してください。

  1. 2.4.3のカーネルソースを展開します。
  2. カーネルの設定を行ないます。
    # make menuconfig (または xconfig等のお好きな方法で)
    

    以下の点に注意して設定してください。

  3. 新しいカーネルとカーネルモジュールを構築してインストールします。
    # make dep clean zlilo (または bzlilo, zImage, bzImage等)
    # make modules modules_install
    

起動方法

モジュールをインストールして、リブートまたはdepmod -aを実行した後、以下の順にUSBモジュールを組み込みます。

  1. usbcore.o
  2. input.o

    マウスやキーボードなどのHID入力系ドライバを選択した場合、input.oを先に組み込んでおいてください。

  3. 各種USBデバイスドライバやHID系ドライバ

    使用するデバイスに関するドライバを組み込んでください。

  4. usb-ohci.oなどのUSBホストコントローラドライバ

成功すれば、syslogに次のように出力されます。 これは、dmesgコマンドで確認可能です。 なお、このメッセージは一例であり、組み込むドライバなどによってメッセージが若干異なります。

usb.c: registered new driver usbdevfs
usb.c: registered new driver hub
usb-ohci.c: USB OHCI at membase 0xc6a93000, IRQ 15
usb-ohci.c: OPTi Inc. 82C861
usb.c: new USB bus registered, assigned bus number 1
usb.c: USB new device connect, assigned device number 1
hub.c: USB hub found 
hub.c: 2 ports detected 
usb.c: registered new driver hid 

また、khubdという、カーネルスレッドが生成されます(psコマンドで確認可)。

この後、USBポートにUSBデバイスを挿すと、自動認識され、適切なドライバとそれに対応するデバイスファイルさえあれば、使用できるはずです。

なお、2.4系カーネルの新機能であるHotPlug機構を利用すると、USBデバイスの挿抜に応じて、対応するドライバのロード・アンロードを行なうことができます。 詳細は別ドキュメントに記載しておりますので、こちらを参照してください。

usbdevfsを有効にしている場合は、

# mount -t usbdevfs none /proc/bus/usb

として、マウントしてください。 ただし、USBドライバをモジュール化している場合は、起動時にマウントできませんので、/etc/fstabに書く際は、

none    /proc/bus/usb    usbdevfs    noauto    0    0

と、noautoを指定しておいてください。

うまくいったら、起動時のスクリプトに組み込んで、自動的にドライバがロードされるようにしておけばよいでしょう。 HotPlug機構のサポートエージェントである、Linux Hotpluggingmurasakiは、どちらもUSBのドライバを組み込むための起動スクリプトを備えていますので、これを用いるのがいいでしょう。 なお、Vine Linux 2.1では、usbmgrが採用されていますが、これもmurasakiと同様の働きをします。 ただ、2.4系カーネルでは、usbmgrは動作しないらしく、代わりにmurasakiを利用するようにとあります。

murasakiの利用については、こちらを参照してください。


マウスの動作確認

あらかじめ、

# mknod /dev/input/mice c 13 63

などとして、デバイスファイルを作成しておきます。 なお、2.3系のdevfsを使っている場合は、/dev/input/miceが自動的に生成されるようです。

上記のデバイスには、USBバスに繋がった全てのマウスの信号が混合されて出力されます。 逆に、マウスを全く繋いでいない場合でも開くことができますので、通常はこれを使うのがいいでしょう。

混合されていない、特定のマウスの信号を利用したい場合は、/dev/input/mousenを13, 32+nのメジャー・マイナー番号で作成してください。 マウス以外のデバイスファイルのマイナー番号については、各ドライバのソースやドキュメント等に書かれていますので参照してください。 なお、USBキーボードのように、デバイスファイルが存在しないものもあります。

この後、USBポートにマウスを挿して、cat /dev/input/miceとして、適当にマウスを動かした時に何か出力されれば、マウスは認識されています。 この時、syslogには以下のような出力が出ます。

usb.c: USB new device connect, assigned device number 2
mouse0: PS/2 mouse device for input0
input0: USB HID v1.00 Mouse

上述の通り、13, 63のデバイスを使用すれば、USBマウスを挿していない状態でも、デバイスファイルをオープンすることが可能です。


マウスの使用方法

ノートPCの場合、すでにあるポインティングデバイスと共存させる必要があるでしょう。 ここでは、3つ方法を紹介します。

  1. gpmやMultiMouseを使う

    3ボタンマウスまでなら、これが最も簡単でしょう。 USBマウスはデフォルトでPS/2プロトコルを吐きますので、内蔵のデバイスとUSBのデバイスを共存させるようにすればOKです。

    例えば、2ボタンの内蔵ポインティングデバイスと3ボタンのUSBマウスを共存させ、内蔵ポインティングデバイス用の3ボタンエミュレーションをX側で処理するなら、gpmを、

    # gpm -R -m/dev/psaux -tps2 -M -m/dev/input/mice -tps2
    

    として起動します。 混合されたマウスイベントが/dev/gpmdataからMouseSystems互換プロトコルで出力されますので、Xではこれを利用します。

    MultiMouseの場合は、

    # multimouse -ps2 /dev/psaux -ps2 /dev/input/mice
    

    として起動します。 マウスイベントは/dev/mumseからMouseSystems互換プロトコルで出力されます。

    Xで利用するには、/etc/XF86Configファイル(/etc/X11/XF86Configの場合もあります)に、

    Section "Pointer"
          Protocol     "MouseSystems"
          Device       "/dev/gpmdata"   # MultiMouseでは /dev/mumse
          Buttons      3
          Emulate3Buttons
          Emulate3Timeout 50
    EndSection
    

    のように設定すればOKです。

    MultiMouse側の3ボタンエミュレート機能を利用する場合は、MultiMouseを、

    # multimouse -ps2 -emu /dev/psaux -ps2 /dev/input/mice
    

    として起動し、XF86Configファイルから、Emulate3ButtonsEmulate3Timeoutの行を消してください。 ただ、MultiMouseの3ボタンエミュレーションより、Xのそれの方が、Emulate3Timeoutなどがある分よくできています。 というわけで、MultiMouseを使うなら、X側で処理をする方がおすすめです。 あるいは、後述するiMultiMouseを使うという手もあります。

  2. iMultiMouseを使う

    最近流行りのホイール付きマウスで、ホイールを有効にするには、USBマウスの場合、デフォルトのPS/2プロトコルでなく、IMPS/2と呼ばれるマイクロソフトインテリマウス互換プロトコルを用いる必要があります。

    PS/2プロトコルを使う内蔵ポインティングデバイスと、IMPS/2プロトコルを使う外付けホイールマウスを共存させるには、MultiMouseの改良版であるiMultiMouseを使うのがいいでしょう。 これは、オリジナルのMultiMouseに、IMPS/2によるホイール対応化と、3ボタンエミュレーション機能の改善(2.2以降)の機能追加を行なったものです。

    武さんのページから、iMultiMouseを拾ってきてインストールします。

    # tar zxf iMultiMouse-2.4.0.tar.gz
    # cd iMultiMouse-2.4.0
    # make
    # make install JMANDIR=/usr/local/man/ja_JP.ujis
    (JMANDIRは適宜設定してください)
    

    以下のようにして起動することで、ホイール対応のMultiMouseが使用できるようになります。

    # imultimouse -ps2 -emu /dev/psaux -imps2 /dev/input/mice
    

    混合されたマウスイベントは、/dev/mumseにIMPS/2プロトコルで出力されますので、/etc/XF86Configでは、

    Section "Pointer"
          Protocol     "IMPS/2"
          Device       "/dev/mumse"
          Buttons      5
          ZAxisMapping 4 5
    EndSection
    

    と設定します。 ただし、この場合、先にも述べた通り、Emulate3Buttonsを設定するとホイールが使えなくなりますのでご注意ください。 上記の例の通り、内蔵ポインティングデバイスが2ボタンの場合、iMultiMouse側で3ボタンエミュレーションを行なう必要があります。 標準のMultiMouseと違って、3ボタンエミュレーションが改善されて、XFree86のそれとほぼ同等になっています。

  3. Xinputの機能を用いる

    Xでは、Xinputの機能を設定することによって、複数のポインティングデバイスを扱うことができます。 これらを同時に使用することも、好きなときに切り換えて使用することも可能です。

    2ボタンの内蔵ポインティングデバイスと、USBホイールマウスを共存させるには、/etc/XF86Configファイルを、以下のように設定します。

    Section "Pointer"
          Protocol     "PS/2"
          Device       "/dev/psaux"
          Buttons      5
          Emulate3Buttons
          Emulate3Timeout 50
    EndSection
    
    Section "Xinput"
       SubSection "Mouse"
          DeviceName   "USB"
          Protocol     "IMPS/2"
          Device       "/dev/input/mice"
          ZAxisMapping 4 5
          AlwaysCore
       EndSubSection
    EndSection
    

    USBマウスがホイールマウスでないなら、"Pointer"セクションのButtonsのパラメータを、最もボタン数の多いものに合わせて設定し、"Xinput"セクションのZAxisMappingの行を削除してください。

    また、同時にでなく、切り換えて使用したい場合は、"Xinput"セクションのAlwaysCoreの行を削除してください。 この場合、ポインティングデバイスを切り換えるには、xsetpointerコマンドを使用します。

    % xsetpointer pointer
    

    で内蔵ポインティングデバイスに、

    % xsetpointer usb
    

    で外付けUSBマウスにそれぞれ切り換わります。


マウスホイールの設定

ホイールマウスを使用するには、Xサーバとアプリケーションの双方で適宜設定する必要があります。 Colasさんのページに詳細な解説がありますので、そちらも参照してください。

  1. Xサーバ

    XF86ConfigのPointerセクションで、"Buttons 5"と、"ZAxisMapping 4 5"を指定してください。 これによって、ホイールの上回転がボタン4、下回転がボタン5に対応します。

  2. Xリソース

    ホームディレクトリの.Xdefaults(または.Xresources)に、以下の内容を追加すれば、アテナウィジェット系のアプリケーションとNetscape(4.x)でホイールによるスクロールが可能になります。

    *Text.translations: #override \
            Shift<Btn4Down>:        scroll-one-line-down() \n\
            Shift<Btn5Down>:        scroll-one-line-up() \n\
            <Btn4Down>:             scroll-one-line-down() \
                                    scroll-one-line-down() \
                                    scroll-one-line-down() \n\
            <Btn5Down>:             scroll-one-line-up() \
                                    scroll-one-line-up() \
                                    scroll-one-line-up()
    KTerm*vt100.translations: #override \
            Shift<Btn4Down>:        scroll-back(1,line) \n\
            Shift<Btn5Down>:        scroll-forw(1,line) \n\
            <Btn4Down>:             scroll-back(1,line) \
                                    scroll-back(1,line) \
                                    scroll-back(1,line) \n\
            <Btn5Down>:             scroll-forw(1,line) \
                                    scroll-forw(1,line) \
                                    scroll-forw(1,line)
    XTerm*vt100.translations: #override \
            Shift<Btn4Down>:        scroll-back(1,line) \n\
            Shift<Btn5Down>:        scroll-forw(1,line) \n\
            <Btn4Down>:             scroll-back(1,line) \
                                    scroll-back(1,line) \
                                    scroll-back(1,line) \n\
            <Btn5Down>:             scroll-forw(1,line) \
                                    scroll-forw(1,line) \
                                    scroll-forw(1,line)
    Netscape*drawingArea.translations: #replace \
            <Btn1Down>:             ArmLink() \n\
            <Btn2Down>:             ArmLink() \n\
            ~Shift<Btn1Up>:         ActivateLink() \n\
            ~Shift<Btn2Up>:         ActivateLink(new-window) \
                                    DisarmLink() \n\
            Shift<Btn1Up>:          ActivateLink(save-only) \
                                    DisarmLink() \n\
            Shift<Btn2Up>:          ActivateLink(save-only) \
                                    DisarmLink() \n\
            <Btn1Motion>:           DisarmLinkIfMoved() \n\
            <Btn2Motion>:           DisarmLinkIfMoved() \n\
            <Btn3Motion>:           DisarmLinkIfMoved() \n\
            <Motion>:               DescribeLink() \n\
            <Btn3Down>:             xfeDoPopup() \n\
            <Btn3Up>:               ActivatePopup() \n\
            Shift<Btn4Down>:        LineUp() \n\
            Shift<Btn5Down>:        LineDown() \n\
            <Btn4Down>:             LineUp() \
                                    LineUp() \
                                    LineUp() \n\
            <Btn5Down>:             LineDown() \
                                    LineDown() \
                                    LineDown()
    Netscape*globalNonTextTranslations: #override \
            Shift<Btn4Down>:        LineUp() \n\
            Shift<Btn5Down>:        LineDown() \n\
            <Btn4Down>:             LineUp() \
                                    LineUp() \
                                    LineUp() \n\
            <Btn5Down>:             LineDown() \
                                    LineDown() \
                                    LineDown()
    
  3. Emacs

    Emacs19系以降では、.emacsファイルに以下のように設定すればよいでしょう。

    (global-set-key [down-mouse-4] '(lambda () (scroll-down 3)))
    (global-set-key [down-mouse-5] '(lambda () (scroll-up 3)))
    (global-set-key [S-down-mouse-4] '(lambda () (scroll-down 1)))
    (global-set-key [S-down-mouse-5] '(lambda () (scroll-up 1)))
    

    XEmacs20以降では、.emacsファイルに以下のように設定します。

    (require 'mwheel)
    (mwheel-install)
    (setq mwheel-scroll-amount '(3 . 1))
    (setq mwheel-follow-mouse t)
    
  4. Gtk+アプリケーション

    GNOME系アプリケーションやNetscape6/Mozilla等、最近流行のGtk+アプリケーションは、最初からホイールに対応していますので、特に設定する必要はありません。


VisorとのUSB接続

Handspring社のPalm PDA、Visorシリーズは、USBクレイドルやUSBスナップコネクトケーブル(別売)を用いて、USB経由での同期(HotSync)が可能です。 Linuxカーネルにも、Visor用のUSBシリアルドライバが用意されていますので、USBによる接続が可能です。

VisorのUSBインターフェースは、内部的に2ポートのシリアルデバイスになっています。 1つめはPPP接続用で、2つめがHotSync用です。

Linuxの "USB Generic USB Serial Driver" (usbserial.o)では、1つめのシリアルデバイスしか見えません。 これは、/dev/usb/ttyUSB0(メジャー番号188, マイナー番号0)として見えます。

これに加えて "USB Handspring Visor Driver" (visor.o)をロードしておくと、/dev/usb/ttyUSB1(メジャー番号188, マイナー番号1)が見えるようになります。 pilot-linkなどで、このポートを指すようにすれば、シリアル接続などと全く同じように使うことができます。

ただし、USB独自の注意点として、「VisorをHotSync状態にしたときに初めてUSB的に接続された状態になる」ことが挙げられます。 つまり、HotSyncするプログラムを走らせる前に、クレイドルのHotSyncボタンを押すか、HotSync画面から「ローカルSync」を選ぶかして、VisorをHotSync状態にしておく必要があるということです。

未確認ですが、visor.oをロードしたままにしておくと、他のUSBシリアルデバイスを使おうとしたときに不都合が起きるかもしれません。 手動でモジュールをロード/アンロードするのは面倒ですが、前述のHotPlug機能を用いると、Visorが接続されている間、visor.o(とusbserial.o)がロードされますので、実際には特に気にする必要はありません。


Created by XEmacs Made with CSS