Nếu bạn sẵn sàng biên dịch kernel của riêng mình, hãy sửa đổi drivers/hid/usbhid/hid-core.c
là một lựa chọn.
Tôi đã gặp một vấn đề tương tự vì tôi muốn thay đổi tỷ lệ bỏ phiếu của bàn phím và máy tính bảng vẽ của mình vì vậy tôi đã sửa đổi hid-core.c của mình một thời gian rồi.
Dường như các hạt nhân mới hơn (4.12 trở lên) đã có tham số usbhid.jspoll nhưng vẫn không có tham số cho bàn phím.
Với các nhân cũ hơn 4,12, tôi đã sửa đổi hid-core.c của mình như sau, làm cho mousepoll ảnh hưởng đến tất cả các thiết bị mà nó xử lý:
--- 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;
+ }
Và đối với các phiên bản 4.12 trở lên, tôi đã sửa đổi nó theo cách khác vì tôi không muốn phá vỡ usbhid.jspoll đang hoạt động:
--- 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;
+ }
Bây giờ để có được cuộc thăm dò 1000Hz (khoảng thời gian 1ms) trên gamepad và bàn phím:
nếu dựng sẵn hoặc không chắc chắn: thêm usbhid.mousepoll=1
hoặc là usbhid.jspoll=1 usbhid.elsepoll=1
để dòng lệnh kernel và khởi động lại.
nếu mô-đun: viết options usbhid mousepoll=1
hoặc là options usbhid jspoll=1 elsepoll=1
đến /etc/modprobe.d/usbhid.conf
Nếu bạn chỉ rmmod usbhid;modprobe usbhid
Sau khi sửa đổi tệp ở trên, bạn cần rút phích cắm và cắm lại thiết bị USB để thực sự thay đổi khoảng thời gian bỏ phiếu của nó mặc dù các thông điệp kernel dường như đề xuất khác .
Sau khi khởi động lại hoặc tải lại usbhid, để xác minh nó hoạt động, rút phích cắm và cắm lại các thiết bị USB và chạy dmesg |grep poll
Mong đợi một cái gì đó như thế này trên một vài dòng cuối cùng:
[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
Các thiết bị ở đây là 04d9:2013
, 0810:0003
và 056a:030e