GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Erhöhen Sie die USB-Abfragerate auf allen Geräten in Linux?

Wenn Sie bereit sind, Ihren eigenen Kernel zu kompilieren, ändern Sie drivers/hid/usbhid/hid-core.c ist eine Option.
Ich hatte ein ähnliches Problem, da ich die Abfragerate meiner Tastatur und meines Zeichentabletts ändern möchte, also habe ich meine hid-core.c seit einiger Zeit geändert.

Es scheint, dass neuere Kernel (4.12 und höher) bereits den usbhid.jspoll-Parameter haben, aber immer noch keinen Parameter für Tastaturen.

Bei älteren Kerneln als 4.12 habe ich meine hid-core.c wie folgt modifiziert, sodass mousepoll alle Geräte betrifft, die es handhabt:

--- 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;
+               }

Und für die Versionen 4.12 und höher habe ich es anders modifiziert, da ich die funktionierende usbhid.jspoll nicht beschädigen wollte:

--- 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;
+                       }

Jetzt erhalten Sie eine 1000-Hz-Abfrage (1-ms-Intervall) auf Gamepads und Tastaturen:

  • falls eingebaut oder unsicher:usbhid.mousepoll=1 hinzufügen oder usbhid.jspoll=1 usbhid.elsepoll=1 zur Kernel-Befehlszeile und Neustart.

  • wenn Modul:schreibe options usbhid mousepoll=1 oder options usbhid jspoll=1 elsepoll=1 bis /etc/modprobe.d/usbhid.conf

Wenn Sie nur rmmod usbhid;modprobe usbhid Nachdem Sie die obige Datei geändert haben, müssen Sie ein USB-Gerät trennen und wieder anschließen, um sein Abfrageintervall tatsächlich zu ändern, auch wenn die Kernel-Meldungen etwas anderes vermuten lassen .

Um nach dem Neustart oder Neuladen von usbhid zu überprüfen, ob es funktioniert, trennen Sie die USB-Geräte und schließen Sie sie wieder an und führen Sie dmesg |grep poll aus
Erwarten Sie in den letzten paar Zeilen so etwas:

[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

Die Geräte hier sind 04d9:2013 , 0810:0003 und 056a:030e


Mir ist kein genereller Mechanismus bekannt. Ich glaube, man muss die Sourcen des Kernels bzw. des jeweiligen Treibers anpassen.

Ein Lichtblick ist diese Antwort auf die Abfragerate des Threads I-PAC / Keyboard Encoder :

Unter Linux ist es möglich, die Polling-Rate der USB-Maus einzustellen, und fast alle Mäuse können mit 500-Hz-Polling arbeiten. Es gibt keine offizielle Unterstützung für eine erhöhte Abfragegeschwindigkeit anderer HID-Geräte (und ich gehe davon aus, dass das I-PAC ein Standard-HID-Gerät ist), aber mit einer einfachen Änderung an drivers/usb/input/hid-core.c Sie können die Abfragerate auch für diese erhöhen. Ich frage meine USB-Tastatur bei 250 Hz ab und sie funktioniert perfekt, aber ich habe keine anderen Tastaturen getestet und es ist wahrscheinlich, dass sie nicht mit allen Geräten funktioniert.


Linux
  1. 3 beliebte Linux-Distributionen für USB-Laufwerke

  2. Linux – Wie kann man Maxsymlinks erhöhen?

  3. USB-Laufwerk unter Linux verschlüsseln - Schritt für Schritt

  4. Wie kann ich die verfügbaren Videomodi für eine USB-Webcam unter Linux auflisten?

  5. Finden aller Speichergeräte, die an eine Linux-Maschine angeschlossen sind

Mehrere USB-Schreibvorgänge unter Linux

So installieren Sie Antergos Linux

Zeigen Sie den Ereignisverlauf von USB-Geräten mit Usbrip in Linux an

So führen Sie alle Skripte in einem Verzeichnis unter Linux aus

Installieren Sie Linux Mint von USB

USB-Breitband:So verbinden Sie USB-Modemgeräte unter Linux