Увеличьте скорость опроса USB на всех устройствах в Linux?

Я просто наткнулся на эту настройку , которая позволяет увеличить частоту опроса usb мышь до 1 кГц. Можно ли добиться такого же увеличения на других USB-устройствах (или на всех USB-устройствах)? Я исследователь в области когнитивной науки, и я провожу эксперименты с использованием клавиатур и игровых приставок (обычно это проводной игровой пульт xbox 360) для ввода человеком, где повышенная частота опроса будет означать лучшую точность измерения времени отклика.

7 голосов | спросил Mike Lawrence 20 TueEurope/Moscow2011-12-20T17:33:20+04:00Europe/Moscow12bEurope/MoscowTue, 20 Dec 2011 17:33:20 +0400 2011, 17:33:20

2 ответа


2

Я не знаю какого-либо общего механизма. Я считаю, что нужно настроить источники ядра или соответствующий драйвер.

Луч надежды дается этот ответ в тему Скорость опроса I-PAC /Keyboard Encoder :

  

В Linux можно установить скорость опроса USB-мыши, и почти   все мыши могут работать с опросом 500 Гц. Официальной поддержки нет   увеличенная скорость опроса других HID-устройств (и я предполагаю, что I-PAC   является стандартным HID-устройством), но с простой модификацией    драйверы /usb /input /hid-core.c вы можете увеличить частоту опроса для них. Я опросала свою клавиатуру USB на частоте 250 Гц, и она отлично работает,   но я не тестировал другие клавиатуры, и, скорее всего, он не будет   работа со всеми устройствами.

ответил harrymc 13 Jpm1000000pmFri, 13 Jan 2012 19:06:11 +040012 2012, 19:06:11
3

Если вы хотите скомпилировать свое собственное ядро, можно изменить модификацию drivers/hid/usbhid/hid-core.c.
У меня была аналогичная проблема: Я хочу изменить частоту опроса моей клавиатуры и планшета, поэтому я уже некоторое время модифицировал свой hid-core.c.

Похоже, что в новых ядрах (4.12 и выше) уже есть параметр usbhid.jspoll, но для клавиатуры еще нет параметров.

С ядрами старше 4.12 я изменил свой hid-core.c следующим образом, заставив mousepoll воздействовать на все устройства, которые он обрабатывает:

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

И для версий 4.12 и выше я изменил его по-другому, так как я не хотел нарушать рабочий 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;
+                       }

Теперь, чтобы получить 1000 Гц (1 мс интервал) опрос на геймпадах и клавиатурах:

  • if builtin или unsure: add usbhid.mousepoll=1 или usbhid.jspoll=1 usbhid.elsepoll=1 для командной строки ядра и перезагрузки.

  • if module: write options usbhid mousepoll=1 или options usbhid jspoll=1 elsepoll=1 до /etc/modprobe.d/usbhid.conf

Если вы просто rmmod usbhid;modprobe usbhid после изменения вышеприведенного файла, вам нужно отключить и переустановить USB-устройство, чтобы фактически изменить интервал опроса хотя сообщения ядра, похоже, предлагают иначе .

После перезагрузки или перезагрузки usbhid, чтобы убедиться, что он работает, отключите и снова подключите USB-устройства и запустите dmesg |grep poll
Expect что-то вроде этого на последних нескольких строках:

[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

Устройства здесь 04d9:2013, 0810:0003 и 056a:030e

ответил user2179798 3 PM000000120000003731 2017, 12:10:37

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132