Si está dispuesto a compilar su propio kernel, modifique drivers/hid/usbhid/hid-core.c
es una opción
Tuve un problema similar, ya que quiero cambiar la tasa de sondeo de mi teclado y tableta de dibujo, por lo que he modificado mi hid-core.c desde hace algún tiempo.
Parece que los núcleos más nuevos (4.12 y posteriores) ya tienen el parámetro usbhid.jspoll pero aún no tienen parámetros para teclados.
Con kernels anteriores a 4.12, modifiqué mi hid-core.c de la siguiente manera, haciendo que mousepoll afecte a todos los dispositivos que maneja:
--- 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;
+ }
Y para las versiones 4.12 y posteriores, lo modifiqué de manera diferente porque no quería romper el usbhid.jspoll en funcionamiento:
--- 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;
+ }
Ahora, para obtener una encuesta de 1000 Hz (intervalo de 1 ms) en gamepads y teclados:
-
si está integrado o no está seguro:agregue
usbhid.mousepoll=1
ousbhid.jspoll=1 usbhid.elsepoll=1
a la línea de comando del núcleo y reinicie. -
si módulo:escribe
options usbhid mousepoll=1
ooptions usbhid jspoll=1 elsepoll=1
a/etc/modprobe.d/usbhid.conf
Si solo rmmod usbhid;modprobe usbhid
después de modificar el archivo anterior, debe desconectar y volver a conectar un dispositivo USB para cambiar realmente su intervalo de sondeo aunque los mensajes del núcleo parezcan sugerir lo contrario .
Después de reiniciar o recargar usbhid, para verificar que funciona, desconecte y vuelva a conectar los dispositivos USB y ejecute dmesg |grep poll
Espere algo como esto en las últimas líneas:
[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
Los dispositivos aquí son 04d9:2013
, 0810:0003
y 056a:030e
No conozco ningún mecanismo general. Creo que uno tiene que modificar las fuentes del kernel o el controlador respectivo.
Esta respuesta a la tasa de sondeo de threadI-PAC / Keyboard Encoder da un rayo de esperanza:
En Linux, es posible establecer la frecuencia de sondeo del mouse USB y casi todos los ratones pueden funcionar con sondeo de 500 Hz. No hay soporte oficial para aumentar la velocidad de sondeo de otros dispositivos HID (y supongo que el I-PAC es un dispositivo HID estándar), pero con una simple modificación en drivers/usb/input/hid-core.c también puede aumentar la tasa de votación para ellos. Sondeo mi teclado USB a 250 Hz y funciona perfectamente, pero no he probado otros teclados y es probable que no funcione con todos los dispositivos.