Re: [PATCH v2 2/2] HID: logitech-hidpp: enable reprogrammable buttons on Signature M650

Elliot Douglas <[email protected]> Thu, 30 Jul 2026 12:33:38 -0700
Newsgroups org.kernel.vger.linux-input,org.kernel.vger.linux-kernel
Message-ID <CAGt6S1oVO1zE9+HZWfvVBEfgLEc6cisfG-SonUVFf+XSTft2+A@mail.gmail.com>
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 <[email protected]> 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 <[email protected]>
>
> Tested with my M650 mouse connected through Bluetooth.
>
> Reviewed-by: Bastien Nocera <[email protected]>
>
> > ---
> >  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 */