マウスのポーリングレート

From ArchWiki
Jump to navigation Jump to search

関連記事

高解像度マウスを購入したときは、マウスの精度を活用するために 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
警告: 2番目のコマンドが失敗した場合、USB マウスやキーボードが全て使えなくなります。マシンを再起動するか SSH で接続しないと操作できなくなります。

変更を適用するにはマウスを一度切断してから再接続してください。

ノート: usbhid モジュールを initramfs イメージに組み込む場合、イメージにも /etc/modprobe.d/usbhid.conf を追加する必要があります。カーネルモジュール#/etc/modprobe.d/ 内のファイルを使うのノートを見てください。または、カーネルコマンドラインに usbhid.mousepoll=X を追加する方法もあります。カーネルモジュール#カーネルコマンドラインを使うを見てください。
ヒント: デフォルトのポーリング間隔よりも小さな値を使用する場合、マウスのアクセラレーション設定の VelocityScale オプションを調整すると良いでしょう。

既知の問題

要求したポーリングレートの半分でポーリングされる

2015年5月現在、特定の設定ではデバイスのポーリングレートを 1000Hz (1ms) にできないというカーネルバグが存在します。フォーラムスレッドバグレポート を見てください。

デバイスを、異なるドライバーが適用された USB ポートに繋ぐことが回避策となることがあります。

ポーリングレートが変更されない

USB 3 ドライバー xhci-hcdusbhid mousepoll の設定を無視することがあります。linux-usb メーリングリストのメッセージバグレポート を参照してください。

xhci-hcd モジュールはデバイスによるインターバル要求を受け入れるので、デバイスのハードウエアやファームウエアの設定ドキュメントを確認してください。

デバイスを、異なるドライバーが適用された USB ポートに繋ぐと回避策となることがあります。

他の回避策としては、BIOS の設定を変更するか、xhci-hcd モジュールをブラックリストに入れて、xHCI を無効にする方法があります。しかし、xHCI を無効にすると、ehci-hcd モジュールが利用され、USB 3 ポート全てが USB 2 相当に制限されます。

ヒント: /sys/kernel/debug/usb/devices の USB ハブデバイスにおける S: Manufacturer の行を確認すると、利用されている hcd ドライバーが確認できます。

参照

  • CS:S Mouse Optimization Guide - Windows ユーザーを対象にしていますが、原則的には Linux にも当てはまる部分があります。