GNU/Linux >> Tutoriales Linux >  >> Linux

¿Aumentar la tasa de sondeo USB en todos los dispositivos en Linux?

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 o usbhid.jspoll=1 usbhid.elsepoll=1 a la línea de comando del núcleo y reinicie.

  • si módulo:escribe options usbhid mousepoll=1 o options 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.


Linux
  1. 3 amadas distribuciones de Linux con unidades USB

  2. Cifrar unidad USB en Linux:paso a paso

  3. ¿Cómo encontrar todos los dispositivos seriales (ttyS, ttyUSB, ..) en Linux sin abrirlos?

  4. Lectura de flujo de entrada USB en Linux

  5. Encontrar todos los dispositivos de almacenamiento conectados a una máquina Linux

Escritura USB múltiple en Linux

Cómo instalar Antergos Linux

Mostrar historial de eventos de dispositivos USB usando Usbrip en Linux

Cómo ejecutar todos los scripts en un directorio en Linux

Instalar Linux Mint desde USB

Banda ancha USB:cómo conectar dispositivos de módem USB en Linux