Skip to content

Improving MX Desktop - Developer support #3136

@UserX404

Description

@UserX404

Continuing from my latest report i'll try to debug through solaar, implementing my receiver, mouse, keyboard.
I struggle with some issues and want to ask to keep this issue as my support channel to get some support through this journey.

First of all, somehow i managed my keyboard and mouse are not recognized as childs of the receiver any more and are connected to my internal bluetooth receiver and are independent hid devices.

But AFAIK my setup does not support long descriptors.

2026-02-21 15:06:08,129,129    DEBUG [MainThread] logitech_receiver.base: (11) pinging device 0
2026-02-21 15:06:08,129,129    DEBUG [MainThread] logitech_receiver.base: (11) <= w[11 00 0015 00005C00000000000000000000000000]
2026-02-21 15:06:08,227,227    DEBUG [MainThread] logitech_receiver.base: (11) => r[10 00 8F00 150100]
2026-02-21 15:06:08,227,227    DEBUG [MainThread] logitech_receiver.device: pinged 0: online True protocol 1.0 present True
  0: MX 5500 Keyboard
     Device path  : /dev/hidraw6
     USB id       : 046d:B30B
     Codename     : Y-RBF91
     Kind         : keyboard
     Protocol     : HID++ 1.0
     Serial number: 
2026-02-21 15:06:08,228,228    DEBUG [MainThread] logitech_receiver.base: (11) <= w[11 00 81F1 01000000000000000000000000000000]
2026-02-21 15:06:08,236,236    DEBUG [MainThread] logitech_receiver.base: (11) => r[10 00 8F81 F10100]
2026-02-21 15:06:08,236,236    DEBUG [MainThread] logitech_receiver.base: (11) device 0x00 error on request {81F1}: 1 = 1
2026-02-21 15:06:08,236,236    DEBUG [MainThread] logitech_receiver.base: (11) <= w[11 00 8100 00000000000000000000000000000000]
2026-02-21 15:06:08,244,244    DEBUG [MainThread] logitech_receiver.base: (11) => r[10 00 8F81 000100]
2026-02-21 15:06:08,245,245    DEBUG [MainThread] logitech_receiver.base: (11) device 0x00 error on request {8100}: 1 = 1
2026-02-21 15:06:08,245,245    DEBUG [MainThread] logitech_receiver.base: (11) <= w[11 00 8101 00000000000000000000000000000000]
2026-02-21 15:06:08,263,263    DEBUG [MainThread] logitech_receiver.base: (11) => r[10 00 8F81 010100]
2026-02-21 15:06:08,263,263    DEBUG [MainThread] logitech_receiver.base: (11) device 0x00 error on request {8101}: 1 = 1
2026-02-21 15:06:12,376,376    DEBUG [MainThread] logitech_receiver.base: (11) <= w[11 00 810D 00000000000000000000000000000000]
2026-02-21 15:06:12,389,389    DEBUG [MainThread] logitech_receiver.base: (11) => r[10 00 8F81 0D0100]
2026-02-21 15:06:12,389,389    DEBUG [MainThread] logitech_receiver.base: (11) device 0x00 error on request {810D}: 1 = 1
     Battery status unavailable.

when forcing 'hidpp_long' to false in Device __init__ function

if self.number is None:  # for direct-connected devices get 'number' from descriptor protocol else use 0xFF
                if self.descriptor and self.descriptor.protocol and self.descriptor.protocol < 2.0:
                    number = 0x00
                else:
                    number = 0xFF
                if self.product_id == 'B30B':
                    self.hidpp_long=False
                self.number = number
            self.ping()  # determine whether a direct-connected device is online

Output:

     Device path  : /dev/hidraw6
     USB id       : 046d:B30B
     Codename     : Y-RBF91
     Kind         : keyboard
     Protocol     : HID++ 1.0
     Serial number: 
2026-02-21 15:19:22,494,494    DEBUG [MainThread] logitech_receiver.base: (11) <= w[10 00 81F1 010000]
2026-02-21 15:19:22,500,500    DEBUG [MainThread] logitech_receiver.base: (11) => r[10 00 81F1 010100]
2026-02-21 15:19:22,500,500    DEBUG [MainThread] logitech_receiver.base: (11) <= w[10 00 81F1 020000]
2026-02-21 15:19:22,506,506    DEBUG [MainThread] logitech_receiver.base: (11) => r[10 00 81F1 020052]
2026-02-21 15:19:22,506,506    DEBUG [MainThread] logitech_receiver.base: (11) <= w[10 00 81F1 040000]
2026-02-21 15:19:22,514,514    DEBUG [MainThread] logitech_receiver.base: (11) => r[10 00 8F81 F10300]
2026-02-21 15:19:22,514,514    DEBUG [MainThread] logitech_receiver.base: (11) device 0x00 error on request {81F1}: 3 = 3
2026-02-21 15:19:22,514,514    DEBUG [MainThread] logitech_receiver.base: (11) <= w[10 00 81F1 030000]
2026-02-21 15:19:22,533,533    DEBUG [MainThread] logitech_receiver.base: (11) => r[10 00 8F81 F10300]
2026-02-21 15:19:22,533,533    DEBUG [MainThread] logitech_receiver.base: (11) device 0x00 error on request {81F1}: 3 = 3
                 0: 01.00.B0052
2026-02-21 15:19:22,534,534    DEBUG [MainThread] logitech_receiver.base: (11) <= w[10 00 8100 000000]
2026-02-21 15:19:22,579,579    DEBUG [MainThread] logitech_receiver.base: (11) => r[10 00 8100 110000]
     Notifications: battery status, keyboard multimedia raw (0x110000).
2026-02-21 15:19:22,580,580    DEBUG [MainThread] logitech_receiver.base: (11) <= w[10 00 8101 000000]
2026-02-21 15:19:22,599,599    DEBUG [MainThread] logitech_receiver.base: (11) => r[10 00 8101 000000]
     Features: (none)
2026-02-21 15:19:24,926,926    DEBUG [MainThread] logitech_receiver.base: (11) <= w[10 00 810D 000000]
2026-02-21 15:19:24,995,995    DEBUG [MainThread] logitech_receiver.base: (11) => r[10 00 810D 28B430]
     Battery: 40%, BatteryStatus.DISCHARGING.

It seems it got it's value form udev_impl.py
hidpp_long = 0x11 in rd.input_report_ids and 19 * 8 == int(rd.get_input_report_size(0x11))
which leads me to the assumption the descriptor is wrong.
I bet this is out of scope of solaar but how to handle this or where to report it?
Also i'm not sure where is the right place to do this, or just keep it here only applying for Device B30B (looks ugly)

I also noticed that both hidpp_short AND hidpp_long are True. Maybe we need to prioritize hidpp_short?

For reference - Descriptor:

./hid-decode /sys/bus/hid/devices/0005\:046D\:B30B.0014/report_descriptor
# device 0:0
# 0x05, 0x01,                    // Usage Page (Generic Desktop)        0
# 0x09, 0x06,                    // Usage (Keyboard)                    2
# 0xa1, 0x01,                    // Collection (Application)            4
# 0x85, 0x01,                    //  Report ID (1)                      6
# 0x75, 0x01,                    //  Report Size (1)                    8
# 0x95, 0x08,                    //  Report Count (8)                   10
# 0x05, 0x07,                    //  Usage Page (Keyboard)              12
# 0x19, 0xe0,                    //  Usage Minimum (224)                14
# 0x29, 0xe7,                    //  Usage Maximum (231)                16
# 0x15, 0x00,                    //  Logical Minimum (0)                18
# 0x25, 0x01,                    //  Logical Maximum (1)                20
# 0x81, 0x02,                    //  Input (Data,Var,Abs)               22
# 0x95, 0x01,                    //  Report Count (1)                   24
# 0x75, 0x08,                    //  Report Size (8)                    26
# 0x81, 0x03,                    //  Input (Cnst,Var,Abs)               28
# 0x95, 0x05,                    //  Report Count (5)                   30
# 0x75, 0x01,                    //  Report Size (1)                    32
# 0x05, 0x08,                    //  Usage Page (LEDs)                  34
# 0x19, 0x01,                    //  Usage Minimum (1)                  36
# 0x29, 0x05,                    //  Usage Maximum (5)                  38
# 0x91, 0x02,                    //  Output (Data,Var,Abs)              40
# 0x95, 0x01,                    //  Report Count (1)                   42
# 0x75, 0x03,                    //  Report Size (3)                    44
# 0x91, 0x03,                    //  Output (Cnst,Var,Abs)              46
# 0x95, 0x06,                    //  Report Count (6)                   48
# 0x75, 0x08,                    //  Report Size (8)                    50
# 0x15, 0x00,                    //  Logical Minimum (0)                52
# 0x26, 0xff, 0x00,              //  Logical Maximum (255)              54
# 0x05, 0x07,                    //  Usage Page (Keyboard)              57
# 0x19, 0x00,                    //  Usage Minimum (0)                  59
# 0x29, 0xff,                    //  Usage Maximum (255)                61
# 0x81, 0x00,                    //  Input (Data,Arr,Abs)               63
# 0xc0,                          // End Collection                      65
# 0x05, 0x0c,                    // Usage Page (Consumer Devices)       66
# 0x09, 0x01,                    // Usage (Consumer Control)            68
# 0xa1, 0x01,                    // Collection (Application)            70
# 0x85, 0x03,                    //  Report ID (3)                      72
# 0x75, 0x10,                    //  Report Size (16)                   74
# 0x95, 0x02,                    //  Report Count (2)                   76
# 0x15, 0x01,                    //  Logical Minimum (1)                78
# 0x26, 0x7f, 0x10,              //  Logical Maximum (4223)             80
# 0x19, 0x01,                    //  Usage Minimum (1)                  83
# 0x2a, 0x7f, 0x10,              //  Usage Maximum (4223)               85
# 0x81, 0x60,                    //  Input (Data,Arr,Abs,NoPref,Null)   88
# 0xc0,                          // End Collection                      90
# 0x05, 0x01,                    // Usage Page (Generic Desktop)        91
# 0x09, 0x80,                    // Usage (System Control)              93
# 0xa1, 0x01,                    // Collection (Application)            95
# 0x85, 0x04,                    //  Report ID (4)                      97
# 0x15, 0x00,                    //  Logical Minimum (0)                99
# 0x25, 0x01,                    //  Logical Maximum (1)                101
# 0x75, 0x01,                    //  Report Size (1)                    103
# 0x95, 0x01,                    //  Report Count (1)                   105
# 0x09, 0x82,                    //  Usage (System Sleep)               107
# 0x81, 0x02,                    //  Input (Data,Var,Abs)               109
# 0x95, 0x01,                    //  Report Count (1)                   111
# 0x75, 0x07,                    //  Report Size (7)                    113
# 0x81, 0x03,                    //  Input (Cnst,Var,Abs)               115
# 0xc0,                          // End Collection                      117
# 0x05, 0x0c,                    // Usage Page (Consumer Devices)       118
# 0x09, 0x01,                    // Usage (Consumer Control)            120
# 0xa1, 0x01,                    // Collection (Application)            122
# 0x85, 0xff,                    //  Report ID (255)                    124
# 0x05, 0x06,                    //  Usage Page (Generic Device Controls) 126
# 0x15, 0x00,                    //  Logical Minimum (0)                128
# 0x25, 0x02,                    //  Logical Maximum (2)                130
# 0x95, 0x01,                    //  Report Count (1)                   132
# 0x75, 0x02,                    //  Report Size (2)                    134
# 0x19, 0x24,                    //  Usage Minimum (36)                 136
# 0x29, 0x26,                    //  Usage Maximum (38)                 138
# 0x81, 0x40,                    //  Input (Data,Arr,Abs,Null)          140
# 0x75, 0x06,                    //  Report Size (6)                    142
# 0x81, 0x01,                    //  Input (Cnst,Arr,Abs)               144
# 0xc0,                          // End Collection                      146
# 0x06, 0x00, 0xff,              // Usage Page (Vendor Defined Page 1)  147
# 0x09, 0x01,                    // Usage (Vendor Usage 1)              150
# 0xa1, 0x01,                    // Collection (Application)            152
# 0x85, 0x10,                    //  Report ID (16)                     154
# 0x75, 0x08,                    //  Report Size (8)                    156
# 0x95, 0x06,                    //  Report Count (6)                   158
# 0x15, 0x00,                    //  Logical Minimum (0)                160
# 0x26, 0xff, 0x00,              //  Logical Maximum (255)              162
# 0x09, 0x01,                    //  Usage (Vendor Usage 1)             165
# 0x81, 0x00,                    //  Input (Data,Arr,Abs)               167
# 0x09, 0x01,                    //  Usage (Vendor Usage 1)             169
# 0x91, 0x00,                    //  Output (Data,Arr,Abs)              171
# 0xc0,                          // End Collection                      173
# 0x06, 0x00, 0xff,              // Usage Page (Vendor Defined Page 1)  174
# 0x09, 0x02,                    // Usage (Vendor Usage 2)              177
# 0xa1, 0x01,                    // Collection (Application)            179
# 0x85, 0x11,                    //  Report ID (17)                     181
# 0x75, 0x08,                    //  Report Size (8)                    183
# 0x95, 0x13,                    //  Report Count (19)                  185
# 0x15, 0x00,                    //  Logical Minimum (0)                187
# 0x26, 0xff, 0x00,              //  Logical Maximum (255)              189
# 0x09, 0x02,                    //  Usage (Vendor Usage 2)             192
# 0x81, 0x00,                    //  Input (Data,Arr,Abs)               194
# 0x09, 0x02,                    //  Usage (Vendor Usage 2)             196
# 0x91, 0x00,                    //  Output (Data,Arr,Abs)              198
# 0xc0,                          // End Collection                      200
# 0x06, 0x00, 0xff,              // Usage Page (Vendor Defined Page 1)  201
# 0x09, 0x03,                    // Usage (Vendor Usage 0x03)           204
# 0xa1, 0x01,                    // Collection (Application)            206
# 0x85, 0x12,                    //  Report ID (18)                     208
# 0x75, 0x08,                    //  Report Size (8)                    210
# 0x95, 0x2d,                    //  Report Count (45)                  212
# 0x15, 0x00,                    //  Logical Minimum (0)                214
# 0x26, 0xff, 0x00,              //  Logical Maximum (255)              216
# 0x09, 0x03,                    //  Usage (Vendor Usage 0x03)          219
# 0x81, 0x00,                    //  Input (Data,Arr,Abs)               221
# 0x09, 0x03,                    //  Usage (Vendor Usage 0x03)          223
# 0x91, 0x00,                    //  Output (Data,Arr,Abs)              225
# 0xc0,                          // End Collection                      227
# 
R: 228 05 01 09 06 a1 01 85 01 75 01 95 08 05 07 19 e0 29 e7 15 00 25 01 81 02 95 01 75 08 81 03 95 05 75 01 05 08 19 01 29 05 91 02 95 01 75 03 91 03 95 06 75 08 15 00 26 ff 00 05 07 19 00 29 ff 81 00 c0 05 0c 09 01 a1 01 85 03 75 10 95 02 15 01 26 7f 10 19 01 2a 7f 10 81 60 c0 05 01 09 80 a1 01 85 04 15 00 25 01 75 01 95 01 09 82 81 02 95 01 75 07 81 03 c0 05 0c 09 01 a1 01 85 ff 05 06 15 00 25 02 95 01 75 02 19 24 29 26 81 40 75 06 81 01 c0 06 00 ff 09 01 a1 01 85 10 75 08 95 06 15 00 26 ff 00 09 01 81 00 09 01 91 00 c0 06 00 ff 09 02 a1 01 85 11 75 08 95 13 15 00 26 ff 00 09 02 81 00 09 02 91 00 c0 06 00 ff 09 03 a1 01 85 12 75 08 95 2d 15 00 26 ff 00 09 03 81 00 09 03 91 00 c0
N: device 0:0
I: 3 0001 0001
``

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions