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
ouusbhid.jspoll=1 usbhid.elsepoll=1
à la ligne de commande du noyau et redémarrez. -
si module :écrivez
options usbhid mousepoll=1
ouoptions 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.