GNU/Linux >> Tutoriels Linux >  >> Linux

Augmenter le taux d'interrogation USB sur tous les appareils sous Linux ?

Si vous souhaitez compiler votre propre noyau, modifiez drivers/hid/usbhid/hid-core.c est une option.
J'ai eu un problème similaire car je veux changer le taux d'interrogation de mon clavier et de ma tablette graphique, j'ai donc modifié mon hid-core.c depuis un certain temps maintenant.

Il semble que les noyaux plus récents (4.12 et versions ultérieures) aient déjà le paramètre usbhid.jspoll mais toujours aucun paramètre pour les claviers.

Avec des noyaux antérieurs à 4.12, j'ai modifié mon hid-core.c comme suit, ce qui fait que mousepoll affecte tous les appareils qu'il gère :

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

Et pour les versions 4.12 et supérieures, je l'ai modifié différemment car je ne voulais pas casser le fonctionnement 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;
+                       }

Maintenant, pour obtenir un sondage à 1 000 Hz (intervalle de 1 ms) sur les manettes de jeu et les claviers :

  • si intégré ou incertain :ajouter usbhid.mousepoll=1 ou usbhid.jspoll=1 usbhid.elsepoll=1 à la ligne de commande du noyau et redémarrez.

  • si module :écrivez options usbhid mousepoll=1 ou options usbhid jspoll=1 elsepoll=1 à /etc/modprobe.d/usbhid.conf

Si vous venez de rmmod usbhid;modprobe usbhid après avoir modifié le fichier ci-dessus, vous devez débrancher et rebrancher un périphérique USB pour modifier réellement son intervalle d'interrogation même si les messages du noyau semblent suggérer le contraire .

Après avoir redémarré ou rechargé usbhid, pour vérifier qu'il fonctionne, débranchez et rebranchez les périphériques USB et exécutez dmesg |grep poll
Attendez-vous à quelque chose comme ça sur les dernières lignes :

[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

Les appareils ici sont 04d9:2013 , 0810:0003 et 056a:030e


Je ne connais aucun mécanisme général. Je pense qu'il faut modifier les sources du noyau ou le pilote respectif.

Une lueur d'espoir est donnée par cette réponse au thread I-PAC / Keyboard Encoder polling rate :

Sous Linux, il est possible de définir le taux d'interrogation de la souris USB, et presque toutes les souris peuvent fonctionner avec une interrogation à 500 Hz. Il n'y a pas de support officiel pour l'augmentation de la vitesse d'interrogation des autres appareils HID (et je suppose que l'I-PAC est un appareil HID standard), mais avec une simple modification de drivers/usb/input/hid-core.c vous pouvez également augmenter le taux d'interrogation pour ceux-ci. J'interroge mon clavier USB à 250 Hz et il fonctionne parfaitement, mais je n'ai pas testé d'autres claviers et il est probable qu'il ne fonctionnera pas avec tous les appareils.


Linux
  1. 3 distributions Linux de clé USB bien-aimées

  2. Crypter une clé USB sous Linux - étape par étape

  3. Comment trouver tous les périphériques série (ttyS, ttyUSB, ..) sous Linux sans les ouvrir ?

  4. Comment puis-je répertorier les modes vidéo disponibles pour une webcam USB sous Linux ?

  5. Recherche de tous les périphériques de stockage connectés à une machine Linux

Ecriture USB multiple sous Linux

Comment installer Antergos Linux

Afficher l'historique des événements des périphériques USB à l'aide d'Usbrip sous Linux

Comment exécuter tous les scripts dans un répertoire sous Linux

Installer Linux Mint à partir d'une clé USB

Haut débit USB :comment connecter des périphériques modem USB sous Linux