GNU/Linux >> Linux の 問題 >  >> Linux

Linux のすべてのデバイスで USB ポーリング レートを上げますか?

独自のカーネルをコンパイルする場合は、 drivers/hid/usbhid/hid-core.c を変更します はオプションです。
キーボードと描画タブレットのポーリング レートを変更したいので、同様の問題が発生したため、しばらくの間 hid-core.c を変更しました。

新しいカーネル (4.12 以降) には既に usbhid.jspoll パラメーターがありますが、キーボードのパラメーターはまだないようです。

4.12 より古いカーネルでは、hid-core.c を次のように変更して、mousepoll が処理するすべてのデバイスに影響するようにしました:

--- a/linux-4.11-original/drivers/hid/usbhid/hid-core.c
+++ b/linux-4.11/drivers/hid/usbhid/hid-core.c
@@ -1081,9 +1081,14 @@ static int usbhid_start(struct hid_device *hid)
                               hid->name, endpoint->bInterval, interval);
                }

-               /* Change the polling interval of mice. */
-               if (hid->collection->usage == HID_GD_MOUSE && hid_mousepoll_interval > 0)
+               /* Change the polling interval of mice.
+               EDIT 2016-09-03: poll everything with mousepoll
+                */
+               if (/*hid->collection->usage == HID_GD_MOUSE &&*/ hid_mousepoll_interval > 0) {
+                       printk(KERN_INFO "%s: Changed interval to mousepoll: %d -> %d\n",
+                              hid->name, interval, hid_mousepoll_interval);
                        interval = hid_mousepoll_interval;
+               }

バージョン 4.12 以降では、動作中の usbhid.jspoll を壊したくなかったので、別の方法で変更しました:

--- a/linux-4.12.4-original/drivers/hid/usbhid/hid-core.c
+++ b/linux-4.12.4/drivers/hid/usbhid/hid-core.c
@@ -56,6 +56,10 @@ static unsigned int hid_jspoll_interval;
 module_param_named(jspoll, hid_jspoll_interval, uint, 0644);
 MODULE_PARM_DESC(jspoll, "Polling interval of joysticks");

+static unsigned int hid_elsepoll_interval;
+module_param_named(elsepoll, hid_elsepoll_interval, uint, 0644);
+MODULE_PARM_DESC(elsepoll, "Polling interval of non-mouse non-joysticks");
+
@@ -1083,15 +1087,31 @@ static int usbhid_start(struct hid_device *hid)
                }

                /* Change the polling interval of mice and joysticks. */
+               /* EDIT 2017-08-03:
+                       added elsepoll
+                       always print to KERN_INFO when one of mousepoll, jspoll, elsepoll takes effect.
+               */
                switch (hid->collection->usage) {
                case HID_GD_MOUSE:
-                       if (hid_mousepoll_interval > 0)
+                       if (hid_mousepoll_interval > 0) {
+                               printk(KERN_INFO "%s: Changed interval to mousepoll: %d -> %d\n",
+                                      hid->name, interval, hid_mousepoll_interval);
                                interval = hid_mousepoll_interval;
+                       }
                        break;
                case HID_GD_JOYSTICK:
-                       if (hid_jspoll_interval > 0)
+                       if (hid_jspoll_interval > 0) {
+                               printk(KERN_INFO "%s: Changed interval to jspoll: %d -> %d\n",
+                                      hid->name, interval, hid_jspoll_interval);
                                interval = hid_jspoll_interval;
+                       }
                        break;
+               default:
+                       if (hid_elsepoll_interval > 0) {
+                               printk(KERN_INFO "%s: Changed interval to elsepoll: %d -> %d\n",
+                                      hid->name, interval, hid_elsepoll_interval);
+                               interval = hid_elsepoll_interval;
+                       }

ゲームパッドとキーボードで 1000Hz (1ms 間隔) のポーリングを取得するには:

  • 組み込みまたは不確かな場合:usbhid.mousepoll=1 を追加 または usbhid.jspoll=1 usbhid.elsepoll=1 カーネル コマンド ラインに移動して再起動します。

  • モジュールの場合:options usbhid mousepoll=1 と書く または options usbhid jspoll=1 elsepoll=1 /etc/modprobe.d/usbhid.confまで

rmmod usbhid;modprobe usbhid だけの場合 上記のファイルを変更した後、実際にポーリング間隔を変更するには、USB デバイスを取り外して再接続する必要があります。 .

usbhid を再起動または再ロードした後、動作を確認するには、USB デバイスを取り外してから再度接続し、dmesg |grep poll を実行します。
最後の数行は次のようになります:

[476243.420106] daskeyboard: Changed interval to elsepoll: 10 -> 1
[476243.497161] daskeyboard: Changed interval to elsepoll: 10 -> 1
[476251.633110] USB Gamepad : Changed interval to jspoll: 17 -> 1
[476260.726864] Wacom Co.,Ltd. Intuos PS: Changed interval to elsepoll: 2 -> 1
[476260.730403] Wacom Co.,Ltd. Intuos PS: Changed interval to elsepoll: 2 -> 1

ここのデバイスは 04d9:2013 です 、 0810:0003 および 056a:030e


一般的なメカニズムについては知りません。カーネルまたはそれぞれのドライバーのソースを微調整する必要があると思います。

threadI-PAC / キーボード エンコーダーのポーリング レートに対するこの回答によって、希望の光が与えられます。

<ブロック引用>

Linux では、USB マウスのポーリング レートを設定することができ、ほとんどすべてのマウスが 500Hz のポーリングで動作します。他の HID デバイスのポーリング速度の向上に対する公式のサポートはありません (I-PAC は標準の HID デバイスであると想定しています)。 それらのポーリングレートも上げることができます。 USB キーボードを 250Hz でポーリングすると完全に動作しますが、他のキーボードはテストしていません。すべてのデバイスで動作するとは限りません。


Linux
  1. LinuxでUSB入力ストリームを読み取る

  2. Linux の USB Web カメラで利用可能なビデオ モードを一覧表示するにはどうすればよいですか?

  3. Linux マシンに接続されているすべてのストレージ デバイスの検索

  1. 3つの最愛のUSBドライブLinuxディストリビューション

  2. Linux – Maxsymlinksを増やす方法は?

  3. LinuxでUSBドライブを暗号化する - ステップバイステップ

  1. このUSBIDリポジトリを使用してLinux上のより多くのデバイスを認識します

  2. Linux マシンに接続されているすべてのストレージ デバイスを見つける

  3. Linuxですべてのシリアルデバイス(ttyS、ttyUSBなど)を開かずに見つける方法は?