GNU/Linux >> Belajar Linux >  >> Linux

Tingkatkan tingkat polling USB di semua perangkat di linux?

Jika Anda ingin mengkompilasi kernel Anda sendiri, modifikasi drivers/hid/usbhid/hid-core.c adalah pilihan.
Saya memiliki masalah yang sama karena saya ingin mengubah kecepatan polling keyboard dan tablet gambar saya, jadi saya telah memodifikasi hid-core.c saya untuk beberapa waktu sekarang.

Tampaknya kernel yang lebih baru (4.12 dan lebih tinggi) sudah memiliki parameter usbhid.jspoll tetapi masih belum ada parameter untuk keyboard.

Dengan kernel yang lebih tua dari 4,12 saya memodifikasi hid-core.c saya sebagai berikut, membuat mousepoll memengaruhi semua perangkat yang ditanganinya:

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

Dan untuk versi 4.12 ke atas saya memodifikasinya secara berbeda karena saya tidak ingin merusak usbhid.jspoll yang berfungsi:

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

Sekarang untuk mendapatkan jajak pendapat 1000Hz (interval 1 ms) di gamepad dan keyboard:

  • jika bawaan atau tidak yakin:tambahkan usbhid.mousepoll=1 atau usbhid.jspoll=1 usbhid.elsepoll=1 ke baris perintah kernel dan reboot.

  • jika modul:tulis options usbhid mousepoll=1 atau options usbhid jspoll=1 elsepoll=1 ke /etc/modprobe.d/usbhid.conf

Jika Anda hanya rmmod usbhid;modprobe usbhid setelah memodifikasi file di atas, Anda perlu mencabut dan memasang kembali perangkat USB untuk benar-benar mengubah interval polling meskipun pesan kernel sepertinya menyarankan sebaliknya .

Setelah mem-boot ulang atau memuat ulang usbhid, untuk memverifikasinya berfungsi, cabut dan pasang kembali perangkat USB dan jalankan dmesg |grep poll
Harapkan sesuatu seperti ini pada beberapa baris terakhir:

[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

Perangkat di sini adalah 04d9:2013 , 0810:0003 dan 056a:030e


Saya tidak mengetahui mekanisme umum apa pun. Saya percaya bahwa seseorang harus men-tweak sumber kernel atau driver masing-masing.

Secercah harapan diberikan oleh jawaban ini untuk tingkat jajak pendapat threadI-PAC / Keyboard Encoder :

Di Linux, dimungkinkan untuk mengatur laju polling mouse USB, dan hampir semua mouse dapat bekerja dengan polling 500Hz. Tidak ada dukungan resmi untuk peningkatan kecepatan polling perangkat HID lainnya (dan saya menganggap I-PAC adalah perangkat HID standar), tetapi dengan modifikasi sederhana padadrivers/usb/input/hid-core.c Anda juga dapat meningkatkan tingkat polling untuk itu. Saya polling keyboard USB saya pada 250Hz dan bekerja dengan sempurna, tetapi saya belum menguji keyboard lain, dan kemungkinan itu tidak akan berfungsi dengan semua perangkat.


Linux
  1. 3 distro Linux drive USB tercinta

  2. Bagaimana menemukan semua perangkat serial (ttyS, ttyUSB, ..) di Linux tanpa membukanya?

  3. Menemukan semua perangkat penyimpanan yang terpasang pada mesin Linux

  1. Linux – Bagaimana Cara Meningkatkan Maxsymlink?

  2. Enkripsi Drive USB di Linux - Langkah Demi Langkah

  3. Temukan semua perangkat penyimpanan yang terhubung ke mesin Linux

  1. Kenali lebih banyak perangkat di Linux dengan Repositori ID USB ini

  2. Membaca aliran input USB di linux

  3. Bagaimana saya bisa membuat daftar mode video yang tersedia untuk webcam USB di Linux?