Tăng tỷ lệ bỏ phiếu USB trên tất cả các thiết bị trong linux?


7

Tôi vừa đi qua điều chỉnh này cho phép một người tăng tỷ lệ bỏ phiếu của chuột usb lên 1KHz. Có thể đạt được mức tăng tương tự với các thiết bị USB khác (hoặc tất cả các thiết bị USB) không? Tôi là nhà nghiên cứu về khoa học nhận thức và tôi thực hiện các thí nghiệm sử dụng bàn phím và gamepad (thường là gamepad xbox 360 có dây) cho đầu vào của con người trong đó tỷ lệ bỏ phiếu tăng có nghĩa là độ chính xác của thời gian phản hồi tốt hơn.


Bàn phím USB thậm chí có độ trễ bỏ phiếu?
pjc50

Câu trả lời:


2

Tôi không biết về bất kỳ cơ chế chung nào. Tôi tin rằng người ta phải điều chỉnh các nguồn của kernel hoặc trình điều khiển tương ứng.

Một tia hy vọng được đưa ra bởi câu trả lời này đến chủ đề I-PAC / Tỷ lệ bỏ phiếu của Bộ mã hóa Bàn phím :

Trên Linux, có thể đặt tỷ lệ bỏ phiếu của chuột USB và gần như   tất cả các con chuột có thể làm việc với bỏ phiếu 500Hz. Không có hỗ trợ chính thức cho   tăng tốc độ bỏ phiếu của các thiết bị HID khác (và tôi giả sử I-PAC   là một thiết bị HID tiêu chuẩn), nhưng với một sửa đổi đơn giản để trình điều khiển / usb / đầu vào / hid-core.c bạn có thể tăng tỷ lệ bỏ phiếu cho những người quá. Tôi thăm dò bàn phím USB ở tần số 250Hz và nó hoạt động hoàn hảo.   nhưng tôi đã không kiểm tra các bàn phím khác và có khả năng là nó sẽ không   làm việc với tất cả các thiết bị.


3

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:0003056a:030e


bạn không phải biên dịch lại toàn bộ kernel, bạn chỉ biên dịch lại mô-đun usbhid
Suici Doga

bạn nên gửi nó dưới dạng một bản vá trong danh sách gửi thư kernel
Suici Doga
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.