Practical guide to getting the EngineerBo Full Scroll Dial working well on Linux.
Tested on: Arch Linux, KDE Plasma 6, Wayland, KWin, AMD GPU (WebRender). Results and settings may differ on other distros, compositors, drivers, or display servers.
Magnetic encoder + MCU. Supports both Bluetooth LE and USB HID with identical HID descriptor and report layout on both transports. Implements the HID Resolution Multiplier: 120 hi-res units = 1 standard scroll detent. No physical detents; continuous free rotation.
| Property | Value |
|---|---|
| VID/PID | 0xFEED/0xBEEF (65261/48879 decimal) |
| BLE device name | Full Scroll Dial |
| USB device name | Engineer Bo Full Scroll Dial |
| USB polling rate | 125Hz (8ms) |
| BLE connection interval | ~15ms (~67Hz) |
| Encoder resolution | 4096 ticks/revolution |
| Issue | Fix |
|---|---|
| Large deadzone — slow rotation produces no output | Build libinput from git (yay -S libinput-git on Arch) — see docs/diagnosis.md |
| Stepped/jerky scrolling in Firefox | Set mousewheel.min_line_scroll_amount = 1 |
| Smooth scroll still stutters | Check about:support → Compositing is WebRender, not Basic |
| Firefox using X11 backend | Set MOZ_ENABLE_WAYLAND=1 in your environment |
Firefox about:config:
mousewheel.min_line_scroll_amount= 1 (default 5)general.smoothScroll=true
KDE per-device settings (~/.config/kcminputrc) — see daemon/kcminputrc-snippet.ini.
| docs/input-stack.md | Full pipeline from encoder to browser — how each layer transforms the signal |
| docs/diagnosis.md | How to inspect and debug each layer (evtest → libinput → Wayland → Firefox) |
| docs/firefox-scroll.md | Firefox scroll internals, WheelEvent analysis, key about:config settings |
scripts/measure-event-rate.py |
Print inter-event timing and v120 values at the kernel layer |
scripts/check-firefox-wheel.js |
DevTools console snippet — inspect deltaMode and deltaY in Firefox |