マウスのポーリングレート
高解像度マウスを購入したときは、マウスの精度を活用するために USB のポーリングレートを調整するのが常套手段です。ポーリングレート (またはレポートレート) はマウスがコンピュータに情報を送信する頻度を示します。
目次
ポーリングレートとポーリング間隔
デバイスのポーリングレートはヘルツ (Hz) で表され、ポーリング間隔によってポーリングレートが決まります。ポーリング間隔はミリ秒 (ms) で表記され、遅延時間と置き換えることができます。
デフォルトのポーリング間隔は 10ms です。ただし、USB コントローラはポーリング間隔を2の冪乗に切り捨ててしまいます。したがって、ポーリング間隔が 10ms に設定されている場合、実際には 8ms がポーリング間隔になります。7ms に設定したときは 4ms になります。
Hz | ms |
---|---|
1000 | 1 |
500 | 2 |
250 | 4 |
125 | 8 |
100 | 10 |
上記はポーリングレートのヘルツの値とポーリング間隔のミリ秒の対応表です。
ポーリングレートが 125 Hz に設定されている場合、マウスカーソルは8ミリ秒毎にしか更新されないことになります。遅延が致命的な状況 (例えばゲームなど) では、できるかぎりポーリングレートを下げるのが良いでしょう。ただし、ポーリングの間隔を増やすと精度が上がりますが、代わりに CPU の使用量は増加します。値を調整するときはこのことに注意してください。
ポーリングレートの表示
evhz
ツールを使うことでマウスのリフレッシュレートを表示できます。
evhz-gitAUR パッケージをインストールして root で以下のコマンドを実行:
# evhz
Average
の値が安定するまで大きな円を描くようにマウスを動かしてください。確認できたら Ctrl+c
で終了できます。
Latest
の値が安定せず、2つの値をいったりきたりする場合、設定されているポーリングレートがデバイスの限界値を上回っています。#USB デバイスの速度を見てください。
ポーリングレートは DirectX mouserate checker などの Windows のツールを Wine で実行することでも確認可能です。
ポーリング間隔の表示
ポーリング間隔などのデバイス情報は debugfs で確認できます。root 権限が必要です。
まずは、デバイスの Vendor ID と Product ID を確認してください:
$ lsusb
Bus 001 Device 002: ID 045e:0024 Microsoft Corp. Trackball Explorer Bus 001 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
それから確認できた ID を指定して以下のコマンドを実行することでデバイスのデバッグ状態を表示できます:
# grep -B3 -A6 045e.*0024 /sys/kernel/debug/usb/devices
T: Bus=01 Lev=01 Prnt=01 Port=01 Cnt=01 Dev#= 2 Spd=1.5 MxCh= 0 D: Ver= 1.10 Cls=00(>ifc ) Sub=00 Prot=00 MxPS= 8 #Cfgs= 1 P: Vendor=045e ProdID=0024 Rev= 1.21 S: Manufacturer=Microsoft S: Product=Microsoft Trackball Explorer® C:* #Ifs= 1 Cfg#= 1 Atr=a0 MxPwr=100mA I:* If#= 0 Alt= 0 #EPs= 1 Cls=03(HID ) Sub=01 Prot=02 Driver=usbhid E: Ad=81(I) Atr=03(Int.) MxPS= 4 Ivl=10ms
Ivl
がポーリング間隔です。上記の例では 10ms が要求されています (#ポーリングレートとポーリング間隔で説明しているように実際に使われる値は 8ms になります)。Spd
はデバイスの速度です。詳しくは #USB デバイスの速度を見てください。他のフィールドの情報については カーネルドキュメント を参照してください。
debugfs や root 権限が使えない場合、以下のコマンドでポーリング間隔を表示できます:
$ lsusb -vd 045e:0024 | grep bInterval
bInterval 10
USB デバイスの速度
USB デバイスは特定のビットレートで動作するように設計されています。ポインティングデバイスの多くは "Low Speed" 1.5Mbit/s デバイスです。デバイスの速度は#ポーリング間隔の表示と一緒に確認できます。
"Low Speed" デバイスは 8ms 未満のポーリング間隔を使うことができません。
全ての USB ハブが "Full Speed" 12Mbit/s を利用できる必要があります。デバイスが接続しているハブの速度は以下のコマンドで確認できます (Bus=xx
は#ポーリング間隔の表示で確認できた値を使います):
# grep -B1 -A10 "Bus=01 Lev=00" /sys/kernel/debug/usb/devices
T: Bus=01 Lev=00 Prnt=00 Port=00 Cnt=00 Dev#= 1 Spd=12 MxCh= 2 B: Alloc= 11/900 us ( 1%), #Int= 1, #Iso= 0 D: Ver= 1.10 Cls=09(hub ) Sub=00 Prot=00 MxPS=64 #Cfgs= 1 P: Vendor=1d6b ProdID=0001 Rev= 4.01 S: Manufacturer=Linux 4.1.18-1-lts uhci_hcd S: Product=UHCI Host Controller S: SerialNumber=0000:00:10.0 C:* #Ifs= 1 Cfg#= 1 Atr=e0 MxPwr= 0mA I:* If#= 0 Alt= 0 #EPs= 1 Cls=09(hub ) Sub=00 Prot=00 Driver=hub E: Ad=81(I) Atr=03(Int.) MxPS= 2 Ivl=255ms
ハブの Ivl
はデバイスのポーリングレートとは無関係です。
ポーリングレートの設定
usbhid
カーネルモジュールの mousepoll
オプションを使うことでポーリングレートを設定できます。デフォルトの値は 0 で、デバイスによって要求された値が使用されます。
オプションの現在の値を確認するには:
$ systool -m usbhid -A mousepoll
Module = "usbhid" mousepoll = "0"
設定を変更するには以下のファイルを作成:
/etc/modprobe.d/usbhid.conf
options usbhid mousepoll=4
上記の例ではポーリングレートを 250Hz とするよう要求しています。
再起動せずにポーリング間隔を変更するには:
# modprobe -r usbhid && modprobe usbhid
変更を適用するにはマウスを一度切断してから再接続してください。
既知の問題
要求したポーリングレートの半分でポーリングされる
2015年5月現在、特定の設定ではデバイスのポーリングレートを 1000Hz (1ms) にできないというカーネルバグが存在します。フォーラムスレッド や バグレポート を見てください。
デバイスを、異なるドライバーが適用された USB ポートに繋ぐことが回避策となることがあります。
ポーリングレートが変更されない
USB 3 ドライバー xhci-hcd
が usbhid
mousepoll
の設定を無視することがあります。linux-usb メーリングリストのメッセージ や バグレポート を参照してください。
xhci-hcd
モジュールはデバイスによるインターバル要求を受け入れるので、デバイスのハードウエアやファームウエアの設定ドキュメントを確認してください。
デバイスを、異なるドライバーが適用された USB ポートに繋ぐと回避策となることがあります。
他の回避策としては、BIOS の設定を変更するか、xhci-hcd
モジュールをブラックリストに入れて、xHCI を無効にする方法があります。しかし、xHCI を無効にすると、ehci-hcd
モジュールが利用され、USB 3 ポート全てが USB 2 相当に制限されます。
参照
- CS:S Mouse Optimization Guide - Windows ユーザーを対象にしていますが、原則的には Linux にも当てはまる部分があります。