Я только что натолкнулся на этот твик, который позволяет увеличить частоту опроса USB-мыши до 1 кГц. Можно ли добиться такого же увеличения для других USB-устройств (или всех USB-устройств)? Я - исследователь в когнитивной науке, и я провожу эксперименты, используя клавиатуры и геймпады (как правило, проводной геймпад для xbox 360) для ввода данных человеком, где увеличение частоты опроса будет означать лучшую точность измерения времени отклика.
2 ответа
Если вы хотите скомпилировать свое собственное ядро, можно изменить 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 мс) на геймпадах и клавиатурах:
если встроенный или неуверенный: добавьте
usbhid.mousepoll=1
илиusbhid.jspoll=1 usbhid.elsepoll=1
в командную строку ядра и перезагрузите компьютер.Если модуль: напишите
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
Ожидайте что-то подобное в последних нескольких строках:
[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
Я не знаю ни одного общего механизма. Я считаю, что нужно настроить источники ядра или соответствующего драйвера.
Этот ответ дает луч надежды потоку I-PAC / Keyboard Encoder :
В Linux можно установить частоту опроса USB-мыши, и почти все мыши могут работать с опросом 500 Гц. Официальной поддержки увеличения скорости опроса других устройств HID нет (и я предполагаю, что I-PAC является стандартным устройством HID), но с помощью простой модификации драйверов /usb /input /hid-core.c вы можете увеличить частоту опроса для тех, кто тоже. Я опрашиваю свою USB-клавиатуру на частоте 250 Гц, и она отлично работает, но я не тестировал другие клавиатуры, и вполне вероятно, что она не будет работать со всеми устройствами.