GNU/Linux >> Znalost Linux >  >> Linux

Zvýšit rychlost dotazování USB na všech zařízeních v linuxu?

Pokud jste ochotni zkompilovat své vlastní jádro, upravte drivers/hid/usbhid/hid-core.c je možnost.
Měl jsem podobný problém, protože chci změnit rychlost dotazování své klávesnice a kreslícího tabletu, takže jsem svůj hid-core.c už nějakou dobu upravil.

Zdá se, že novější jádra (4.12 a vyšší) již mají parametr usbhid.jspoll, ale stále žádný parametr pro klávesnice.

Se staršími jádry než 4.12 jsem svůj hid-core.c upravil následovně, takže mousepoll ovlivní všechna zařízení, která zpracovává:

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

A pro verze 4.12 a vyšší jsem to upravil jinak, protože jsem nechtěl narušit fungující 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;
+                       }

Nyní chcete získat 1000 Hz (interval 1 ms) na gamepadech a klávesnicích:

  • pokud je integrováno nebo si nejste jisti:přidejte usbhid.mousepoll=1 nebo usbhid.jspoll=1 usbhid.elsepoll=1 na příkazový řádek jádra a restartujte počítač.

  • if module:napište options usbhid mousepoll=1 nebo options usbhid jspoll=1 elsepoll=1/etc/modprobe.d/usbhid.conf

Pokud stačí rmmod usbhid;modprobe usbhid po úpravě výše uvedeného souboru musíte USB zařízení odpojit a znovu připojit, aby se skutečně změnil jeho interval dotazování i když se zdá, že zprávy jádra naznačují opak .

Po restartování nebo opětovném načtení usbhid ověřte, že funguje, odpojte a znovu připojte zařízení USB a spusťte dmesg |grep poll
Na posledních pár řádcích očekávejte něco takového:

[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

Zde jsou zařízení 04d9:2013 , 0810:0003 a 056a:030e


Nevím o žádném obecném mechanismu. Domnívám se, že je třeba vyladit zdrojové kódy jádra nebo příslušného ovladače.

Paprsek naděje dává tato odpověď na míru dotazování threadI-PAC / Keyboard Encoder:

V Linuxu je možné nastavit rychlost dotazování myši USB a téměř všechny myši mohou pracovat s dotazováním 500 Hz. Neexistuje žádná oficiální podpora pro zvýšení rychlosti dotazování jiných HID zařízení (a předpokládám, že I-PAC je standardní HID zařízení), ale s jednoduchou úpravou nadrivers/usb/input/hid-core.c i pro ně můžete zvýšit míru dotazování. Svou klávesnici USB jsem dotazoval na 250 Hz a funguje perfektně, ale jiné klávesnice jsem netestoval a je pravděpodobné, že nebude fungovat se všemi zařízeními.


Linux
  1. Linux – Jak zvýšit Maxsymlinks?

  2. Najděte všechna úložná zařízení připojená k počítači se systémem Linux

  3. Jak mohu uvést dostupné režimy videa pro webovou kameru USB v systému Linux?

  1. 3 oblíbené USB disky Linuxové distribuce

  2. Šifrování jednotky USB v systému Linux – krok za krokem

  3. Jak najít všechna sériová zařízení (ttyS, ttyUSB, ..) v Linuxu bez jejich otevření?

  1. Rozpoznejte více zařízení v systému Linux pomocí tohoto úložiště USB ID

  2. Čtení vstupního USB datového proudu na linuxu

  3. Vyhledání všech úložných zařízení připojených k počítači se systémem Linux