FreeBSD Daily Topics

2011年11月29日おかしな動きをするUSBマウストラブルシューティング(PS/2-USB変換器編)

tips

How to fix the quirk moving mouse

FreeBSDではUSBマウスに関しては特別な設定をしなくても使えるように設定されています。USBマウスはdevd(8)経由での検出およびmoused(8)の起動という流れになりますので、/etc/rc.confに「moused_enable="YES"」といった指定も必要ありません。これは重複起動になるので、逆に「moused_enable="NO"」と書いておいたほうが良いでしょう。活線挿抜に対しても問題なく動作します。

しかし、PS/2-USB変換器やKVMスイッチを使っている場合にマウスがおかしな動きをすることがあります。原因はいくつかあると思いますが、問題の1つに存在しないマウスデバイスに対してmoused(8)が実行されているというものがあります。USBマウスを1つしか接続していないのに、USBマウスデバイスが2つ以上生成されている場合にはその可能性があります。

% ls /dev/ | grep ums
ums0
ums1
%

usbconfig(8)でUSBデバイスをチェックします。

% usbconfig 
ugen0.1: <EHCI root HUB Intel> at usbus0, cfg=0 md=HOST spd=HIGH (480Mbps) pwr=SAVE
ugen1.1: <XHCI root HUB 0x1033> at usbus1, cfg=0 md=HOST spd=SUPER (5.0Gbps) pwr=SAVE
ugen2.1: <EHCI root HUB Intel> at usbus2, cfg=0 md=HOST spd=HIGH (480Mbps) pwr=SAVE
ugen0.2: <product 0x0024 vendor 0x8087> at usbus0, cfg=0 md=HOST spd=HIGH (480Mbps) pwr=SAVE
ugen2.2: <product 0x0024 vendor 0x8087> at usbus2, cfg=0 md=HOST spd=HIGH (480Mbps) pwr=SAVE
ugen2.3: <ELECOM Wireless mouse ELECOM> at usbus2, cfg=0 md=HOST spd=LOW (1.5Mbps) pwr=ON
ugen0.3: <USB to PS2 Adaptor  V3.10 Composite USB PS2 Converter> at usbus0, cfg=0 md=HOST spd=LOW (1.5Mbps) pwr=ON
%

ugen0.3として認識されているデバイスが実に怪しい感じです。usbconfig(8)にshow_ifdrvを指定してデバイスを調べると、ums1が生成されていることがわかります。ugen0.3はPS/2-USB変換器なのですが、ここで接続していないマウスデバイスが生成されているわけです。

% usbconfig -u 0 -a 3 show_ifdrv
ugen0.3: <USB to PS2 Adaptor  V3.10 Composite USB PS2 Converter> at usbus0, cfg=0 md=HOST spd=LOW (1.5Mbps) pwr=ON
ugen0.3.0: ukbd0: <Composite USB PS2 Converter USB to PS2 Adaptor  V3.10, class 0/0, rev 1.10/3.10, addr 3>
ugen0.3.1: ums1: <Composite USB PS2 Converter USB to PS2 Adaptor  V3.10, class 0/0, rev 1.10/3.10, addr 3>
%

とりあえずPS/2-USB変換器の詳細情報を取得しておきます。

% usbconfig -u 0 -a 3 dump_device_desc
ugen0.3: <USB to PS2 Adaptor  V3.10 Composite USB PS2 Converter> at usbus0, cfg=0 md=HOST spd=LOW (1.5Mbps) pwr=ON

  bLength = 0x0012 
  bDescriptorType = 0x0001 
  bcdUSB = 0x0110 
  bDeviceClass = 0x0000 
  bDeviceSubClass = 0x0000 
  bDeviceProtocol = 0x0000 
  bMaxPacketSize0 = 0x0008 
  idVendor = 0x0b39 
  idProduct = 0x0001 
  bcdDevice = 0x0310 
  iManufacturer = 0x0001  <Composite USB PS2 Converter>
  iProduct = 0x0002  <USB to PS2 Adaptor  V3.10>
  iSerialNumber = 0x0000  <no string>
  bNumConfigurations = 0x0001 

%

対処方法はいくつかあります。/etc/devd.confを直接書き換えることで対処することもできます。ここでは/usr/local/etc/devd/にスクリプトを追加して対処する方法を紹介します。/etc/devd.confを書き換えると、システムのアップデートの度に/etc/devd.confのマージや確認作業が必要になって面倒だからです。usbconfig(8)のdump_device_desc指定でプロダクトIDやベンダIDを特定してから、次のような設定ファイルを作成して/usr/local/etc/devd/にコピーします。ここではelecommouse.confとして作成しました。

attach 101 {
        device-name "ums[0-9]+";
        match "vendor"          "0x0b39";
        match "product"         "0x0001";
        action "/etc/rc.d/moused stop $device-name";
};

これはPS/2-USB変換器のマウス部分が認識されたあとに動作し、起動されたmoused(8)を終了する処理を実施します。アタッチ/デタッチ・優先順位・デバイス・ベンダID・デバイスIDなどで動作すべき対象とタイミングを絞り込むことができます。このようにdevd(8)の動作には後から任意のタイミングで動作する設定を追加することができますので、結構便利です。

デバイスが認識されるタイミングと処理順序のタイミングでたまに処理に失敗することがあります。特に無線LANマウスを使っているとその傾向が見られるように思います。その場合、一旦USBマウス側を活線挿抜するとだいたいそのまま利用できます。

おすすめ記事

記事・ニュース一覧