Re: [PATCH v2 2/2] HID: logitech-hidpp: enable reprogrammable buttons on Signature M650
From: Bastien Nocera
Date: Thu Jul 30 2026 - 04:17:20 EST
On Sat, 2026-07-04 at 16:10 -0700, Elliot Douglas wrote:
> The Bluetooth Signature M650 exposes its side buttons through the
> normal
> mouse report, but the observed events are short click-like events
> emitted
> around release rather than physical press/release state.
>
> The device appears to use the held side-button state for its built-in
> gesture and side-button + wheel horizontal-scroll mode. As a result,
> holding a side button long enough
s/long enough/more than approximately 2 seconds/ ?
> can prevent the normal mouse report from
> emitting a usable button event at all.
>
> HID++ REPROG_CONTROLS_V4 diversion for control IDs 0x0053 and 0x0056
> provides real press and release timing for those same controls.
> Logitech
> documents the Signature M650 side buttons as Back/Forward buttons, so
> report the diverted controls as BTN_BACK and BTN_FORWARD.
>
> The HID++ 0x1b04 documentation lists those control IDs as Back and
> Forward. The driver still verifies that the controls are present in
> the
> device control table and advertised as divertable before changing
> their
> reporting mode.
>
> Link:
> https://support.logi.com/hc/en-nz/articles/4414473810583-Getting-Started-Signature-M650
> Signed-off-by: Elliot Douglas <edouglas7358@xxxxxxxxx>
Tested with my M650 mouse connected through Bluetooth.
Reviewed-by: Bastien Nocera <hadess@xxxxxxxxxx>
> ---
> drivers/hid/hid-logitech-hidpp.c | 20 +++++++++++++++++++-
> 1 file changed, 19 insertions(+), 1 deletion(-)
>
> diff --git a/drivers/hid/hid-logitech-hidpp.c b/drivers/hid/hid-
> logitech-hidpp.c
> index f9189e14fb78..e71dd2457e80 100644
> --- a/drivers/hid/hid-logitech-hidpp.c
> +++ b/drivers/hid/hid-logitech-hidpp.c
> @@ -3624,14 +3624,30 @@ static int
> hidpp10_extra_mouse_buttons_raw_event(struct hidpp_device *hidpp,
>
> #define HIDPP_REPROG_CONTROLS_EVENT_DIVERTED 0x00
>
> +#define HIDPP_REPROG_CONTROL_BACK 0x0053
> +#define HIDPP_REPROG_CONTROL_FORWARD 0x0056
> +
> +#define HIDPP_PRODUCT_SIGNATURE_M650 0xb02a
If you want to add a product ID constant, please do it in hid-ids.h
instead.
> +
> struct hidpp_reprog_control_mapping {
> u16 control;
> u16 code;
> };
>
> +static const struct hidpp_reprog_control_mapping
> m650_reprog_control_mappings[] = {
> + { HIDPP_REPROG_CONTROL_BACK, BTN_BACK },
> + { HIDPP_REPROG_CONTROL_FORWARD, BTN_FORWARD },
> + { }
> +};
> +
> static const struct hidpp_reprog_control_mapping *
> hidpp20_reprog_controls_get_mappings(struct hidpp_device *hidpp)
> {
> + switch (hidpp->hid_dev->product) {
> + case HIDPP_PRODUCT_SIGNATURE_M650:
> + return m650_reprog_control_mappings;
> + }
> +
> return NULL;
> }
>
> @@ -4911,7 +4927,9 @@ static const struct hid_device_id
> hidpp_devices[] = {
> { /* MX Vertical mouse over Bluetooth */
> HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_LOGITECH, 0xb020) },
> { /* Signature M650 over Bluetooth */
> - HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_LOGITECH, 0xb02a) },
> + HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_LOGITECH,
> + HIDPP_PRODUCT_SIGNATURE_M650),
> + .driver_data = HIDPP_QUIRK_HIDPP_REPROG_CONTROLS_BTNS },
> { /* MX Master 3 mouse over Bluetooth */
> HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_LOGITECH, 0xb023) },
> { /* MX Anywhere 3 mouse over Bluetooth */