Mouse polling rate
If you have invested in a high resolution mouse, adjusting the USB polling rate is a common trick to utilize the added precision it brings. The polling rate (or report rate) determines how often the mouse sends information to your computer.
Polling rate and polling interval
The polling rate of a device is measured in Hertz (Hz) and is determined by the polling interval. The polling interval is measured in milliseconds (ms) and equates to lag time.
The default polling interval is 10ms. However, USB controllers round the interval down to the nearest power of two. Thus, an interval setting of 10ms will actually use 8ms, 7ms will use 4ms, etc.
The table to the right shows the relation between polling rate Hertz and the corresponding interval milliseconds (rate = 1000 / interval).
If the polling rate is 125 Hz, the mouse position will be updated every 8 milliseconds. In situations where lag is critical—for example games—some users decrease the interval to as little as possible. However, this puts more load on the CPU, so care should be taken when adjusting this value.
Display polling rate
evhz tool can display the actual mouse refresh rate.
You can install it fromAUR and execute as root:
Now move the mouse continuously in large circles until the displayed
Average stabilizes then press
Ctrl+c to exit.
Latest value does not stabilize and switches between two values then the attempted polling rate is faster than the device is capable of, see #USB device speed.
Display polling interval
Device information including polling interval can be found in debugfs if it is mounted and you have root access.
First, find the Vendor and Product IDs of your device with:
Bus 001 Device 002: ID 045e:0024 Microsoft Corp. Trackball Explorer Bus 001 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Then run the following as root with those IDs to display the debug information for that device:
# grep -B3 -A6 045e.*0024 /sys/kernel/debug/usb/devices
T: Bus=01 Lev=01 Prnt=01 Port=01 Cnt=01 Dev#= 2 Spd=1.5 MxCh= 0 D: Ver= 1.10 Cls=00(>ifc ) Sub=00 Prot=00 MxPS= 8 #Cfgs= 1 P: Vendor=045e ProdID=0024 Rev= 1.21 S: Manufacturer=Microsoft S: Product=Microsoft Trackball Explorer® C:* #Ifs= 1 Cfg#= 1 Atr=a0 MxPwr=100mA I:* If#= 0 Alt= 0 #EPs= 1 Cls=03(HID ) Sub=01 Prot=02 Driver=usbhid E: Ad=81(I) Atr=03(Int.) MxPS= 4 Ivl=10ms
Ivl is the polling interval; this device has requested 10ms (and actually reports every 8ms as explained in #Polling rate and polling interval). The
Spd is the device speed explained in #USB device speed. For information about the other fields see the kernel documentation.
If debugfs or root access are not available the polling interval can be shown with:
$ lsusb -vd 045e:0024 | grep bInterval
USB device speed
"Low Speed" devices may not be capable of polling at intervals less than 8ms.
All USB hubs should be capable of at least "Full Speed" 12Mbit/s. The speed of the hub that the device is attached to can be shown with the following command with the same
Bus=xx as the device:
# grep -B1 -A10 "Bus=01 Lev=00" /sys/kernel/debug/usb/devices
T: Bus=01 Lev=00 Prnt=00 Port=00 Cnt=00 Dev#= 1 Spd=12 MxCh= 2 B: Alloc= 11/900 us ( 1%), #Int= 1, #Iso= 0 D: Ver= 1.10 Cls=09(hub ) Sub=00 Prot=00 MxPS=64 #Cfgs= 1 P: Vendor=1d6b ProdID=0001 Rev= 4.01 S: Manufacturer=Linux 4.1.18-1-lts uhci_hcd S: Product=UHCI Host Controller S: SerialNumber=0000:00:10.0 C:* #Ifs= 1 Cfg#= 1 Atr=e0 MxPwr= 0mA I:* If#= 0 Alt= 0 #EPs= 1 Cls=09(hub ) Sub=00 Prot=00 Driver=hub E: Ad=81(I) Atr=03(Int.) MxPS= 2 Ivl=255ms
Ivl of the hub is independent of the device and does not affect the polling rate of the device.
Set polling interval
To configure the polling rate use the
mousepoll option of the
usbhid kernel module. The default value is 0 which means the module uses the interval requested by the device(s).
The current value of the option can be verified with:
$ systool -m usbhid -A mousepoll
Module = "usbhid" mousepoll = "0"
To change the configuration create the following file:
options usbhid mousepoll=4
This example sets a polling rate of 250Hz.
To change the polling interval without rebooting
# modprobe -r usbhid && modprobe usbhid
You may have to unplug the mouse and plug it back in for the change to take effect.
- CS:S Mouse Optimization Guide -- largely aimed at Windows users, though the same principles apply for Linux.