[PATCH v2 0/2] HID: logitech-hidpp: fix Signature M650 side button timing
From: Elliot Douglas <hidden>
Date: 2026-07-04 23:11:00
Also in:
lkml
The Logitech Signature M650 over Bluetooth exposes its side buttons in the normal mouse report, but the reported BTN_SIDE/BTN_EXTRA events are short click-like events emitted around button release rather than physical press/release events with the real hold duration. The device appears to reserve the held side-button state for a built-in gesture mode: holding a side button long enough, or holding it while using the wheel for horizontal scrolling, can mean the normal mouse report never emits a usable side-button press at all. That makes the buttons unusable for standard Linux hold actions such as push-to-talk, drag modifiers, or remapping rules that depend on key-up timing. When HID++ 2.0 feature 0x1b04, SpecialKeysMseButtons / REPROG_CONTROLS_V4, temporarily diverts the same controls, the device sends diverted-control notifications with real press and release timing. This series adds quirk-gated support for those notifications and enables it for the Bluetooth Signature M650. Before enabling diversion, the driver verifies that each mapped control is present in the device's HID++ control table and is advertised as a divertable mouse control. The kernel only programs temporary diversion when the device connects. It does not continuously force the setting. A userspace HID++ tool such as Solaar can still issue HID++ commands through hidraw; if Solaar changes the reporting mode for the same controls afterwards, the last writer wins. That means Solaar can still take over those controls for custom actions, but the kernel will no longer receive the diverted button notifications for normal evdev reporting until the kernel diverts the controls again, for example after reconnect. While the controls remain diverted, hidraw clients should still receive the raw reports and the kernel reports the matching evdev state. The diverted M650 controls are reported as BTN_BACK and BTN_FORWARD. Logitech's Signature M650 getting-started page labels these physical controls as Back/Forward buttons and describes their default page-navigation behavior: https://support.logi.com/hc/en-nz/articles/4414473810583-Getting-Started-Signature-M650 The reprogrammable-control support is per-product and parses the full HID++ divertedButtonsEvent pressed-control list, so it can support devices with more buttons without relying on a single last-control release heuristic. Only the Signature M650 opts in for now. Other Logitech devices should only be enabled after their HID++ control IDs and divertedButtonsEvent behavior are captured and verified. There is evidence that this is not unique to the M650. A prior MX Anywhere 3 patch used the same HID++ feature to fix thumb buttons that only activated on release, and Logitech documents side-button + wheel horizontal scrolling for both the MX Anywhere 3/3S and Signature M650. Solaar's device reports and rules documentation also show HID++ divertable back/forward controls on MX Master 3 and MX Master 3S class devices. This series remains conservative and only enables the device tested here. Tested with a Logitech Signature M650 L over Bluetooth, HID ID 0005:046D:B02A. Baseline evtest showed short release-time BTN_SIDE/BTN_EXTRA events. Earlier local testing of the same HID++ diversion path showed real hold-duration press/release events, including holds longer than 4 seconds for both buttons. Changes in v2: - Replace the profile/count wrapper with NULL-terminated mapping arrays. - Cache the selected reprogrammable-control mapping in struct hidpp_device. - Add a named constant for the M650 Bluetooth product ID. - Use common Back/Forward names for the 0x0053/0x0056 HID++ control IDs. Elliot Douglas (2): HID: logitech-hidpp: add HID++ 2.0 reprogrammable button support HID: logitech-hidpp: enable reprogrammable buttons on Signature M650 drivers/hid/hid-logitech-hidpp.c | 225 ++++++++++++++++++++++++++++++- 1 file changed, 224 insertions(+), 1 deletion(-) base-commit: f0866517be9345d8245d32b722574b8aecccb348 -- 2.54.0