GNU/Linux >> Linux Esercitazione >  >> Linux

Aumentare la frequenza di polling USB su tutti i dispositivi in ​​Linux?

Se sei disposto a compilare il tuo kernel, modificando drivers/hid/usbhid/hid-core.c è un'opzione.
Ho riscontrato un problema simile poiché desidero modificare la frequenza di polling della mia tastiera e del mio tablet grafico, quindi ho modificato il mio hid-core.c da un po' di tempo.

Sembra che i kernel più recenti (4.12 e successivi) abbiano già il parametro usbhid.jspoll ma ancora nessun parametro per le tastiere.

Con kernel precedenti alla 4.12 ho modificato il mio hid-core.c come segue, facendo in modo che il mousepoll abbia effetto su tutti i dispositivi che gestisce:

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

E per le versioni 4.12 e successive l'ho modificato in modo diverso perché non volevo interrompere il funzionamento di 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;
+                       }

Ora per ottenere un sondaggio a 1000 Hz (intervallo di 1 ms) su gamepad e tastiere:

  • se integrato o non sicuro:aggiungi usbhid.mousepoll=1 o usbhid.jspoll=1 usbhid.elsepoll=1 alla riga di comando del kernel e riavviare.

  • if modulo:scrivi options usbhid mousepoll=1 o options usbhid jspoll=1 elsepoll=1 a /etc/modprobe.d/usbhid.conf

Se fai solo rmmod usbhid;modprobe usbhid dopo aver modificato il file sopra, è necessario scollegare e ricollegare un dispositivo USB per modificare effettivamente il suo intervallo di polling anche se i messaggi del kernel sembrano suggerire diversamente .

Dopo aver riavviato o ricaricato usbhid, per verificare che funzioni, scollega e ricollega i dispositivi USB ed esegui dmesg |grep poll
Aspettatevi qualcosa di simile nelle ultime righe:

[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

I dispositivi qui sono 04d9:2013 , 0810:0003 e 056a:030e


Non conosco alcun meccanismo generale. Credo che si debbano modificare i sorgenti del kernel o il rispettivo driver.

Un raggio di speranza è dato da questa risposta al thread I-PAC / Keyboard Encoder polling rate :

Su Linux, è possibile impostare la frequenza di polling del mouse USB e quasi tutti i mouse possono funzionare con il polling a 500Hz. Non esiste supporto ufficiale per una maggiore velocità di polling di altri dispositivi HID (e presumo che l'I-PAC sia un dispositivo HID standard), ma con una semplice modifica a drivers/usb/input/hid-core.c puoi aumentare il tasso di polling anche per quelli. Eseguo il polling della mia tastiera USB a 250Hz e funziona perfettamente, ma non ho testato altre tastiere ed è probabile che non funzioni con tutti i dispositivi.


Linux
  1. 3 amate distribuzioni Linux di unità USB

  2. Trova tutti i dispositivi di archiviazione collegati a una macchina Linux

  3. Come trovare tutti i dispositivi seriali (ttyS, ttyUSB, ..) su Linux senza aprirli?

  4. Lettura del flusso di input USB su Linux

  5. Trovare tutti i dispositivi di archiviazione collegati a una macchina Linux

Scrittura USB multipla su Linux

Come installare Antergos Linux

Mostra la cronologia degli eventi dei dispositivi USB utilizzando Usbrip in Linux

Come eseguire tutti gli script in una directory in Linux

Installa Linux Mint da USB

Banda larga USB:come collegare dispositivi modem USB su Linux