独自のカーネルをコンパイルする場合は、 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 でポーリングすると完全に動作しますが、他のキーボードはテストしていません。すべてのデバイスで動作するとは限りません。