Re: [PATCH v2 2/2] HID: logitech-hidpp: enable reprogrammable buttons on Signature M650
From: Elliot Douglas
Date: Thu Jul 30 2026 - 15:45:27 EST
Thanks for the feedback. I just left for a trip, but I'll be back and
should be able to work on it on Tuesday, August 11th.
On Thu, Jul 30, 2026 at 1:07 AM Bastien Nocera <hadess@xxxxxxxxxx> wrote:
>
> 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 */