Solaar: Logitech G533 Support

Created on 15 Jan 2020  ·  33Comments  ·  Source: pwr-Solaar/Solaar

  • Solaar version: 1.0.1
  • Distribution: Arch Linux
  • Kernel version (ex. uname -srmo): Linux 5.4.11-arch1-1 x86_64 GNU/Linux
  • Output of solaar show:
solaar: error: Logitech receiver not found

lsusb:

Bus 004 Device 005: ID 046d:0a66 Logitech, Inc. [G533 Wireless Headset Dongle]
Bus 004 Device 004: ID 1532:0020 Razer USA, Ltd 
Bus 004 Device 003: ID 046d:c31c Logitech, Inc. Keyboard K120
Bus 004 Device 002: ID 8087:0024 Intel Corp. Integrated Rate Matching Hub
Bus 004 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 006 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Bus 005 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 003 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Bus 002 Device 002: ID 04e8:1f0a Samsung Electronics Co., Ltd Samsung S2 Portable
Bus 002 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 001 Device 003: ID 046d:0a67 Logitech, Inc. 
Bus 001 Device 002: ID 8087:0024 Intel Corp. Integrated Rate Matching Hub
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub

Steps to reproduce the behavior:

  1. pacman -Syu solaar
  2. solaar show
enhancement

Most helpful comment

That only works for the battery feature. All other features need to be implemented somewhere, and it's not going to be in the kernel driver. We only use the kernel driver for things that require access to kernel internals. Right now, we have two drivers, hid-logitech-dj which does multiplexing (you can have multiple devices connected to the same receiver and we will export them to userspace as different devices) and hid-logitech-hidpp which automatically enables high-resolution scrolling and reports battery information. Everything other than that is out of scope.

All 33 comments

Comment removed as incorrect.

@pfps line Bus 004 Device 005: ID 046d:0a66 Logitech, Inc. [G533 Wireless Headset Dongle] indeed is a receiver. And I remember in feature list some features like EQUALIZER=0x8310, HEADSET_OUT=0x8320 - looks like they are for headphones.

@sistematico Can you please connect dongle and provide output of dmesg and sudo lsusb -v -d 046d:0a66 ?

@doctor64

dmesg

[ 9188.245823] usb 1-2: new full-speed USB device number 8 using xhci_hcd
[ 9188.414826] usb 1-2: New USB device found, idVendor=046d, idProduct=0a66
[ 9188.414830] usb 1-2: New USB device strings: Mfr=3, Product=4, SerialNumber=0
[ 9188.414834] usb 1-2: Product: G533 Gaming Headset
[ 9188.414837] usb 1-2: Manufacturer: Logitech
[ 9188.550781] input: Logitech G533 Gaming Headset as /devices/pci0000:00/0000:00:14.0/usb1/1-2/1-2:1.3/0003:046D:0A66.000C/input/input23
[ 9188.610576] hid-generic 0003:046D:0A66.000C: input,hiddev1,hidraw2: USB HID v1.11 Device [Logitech G533 Gaming Headset] on usb-0000:00:14.0-2/input3 

lsusb

Bus 001 Device 008: ID 046d:0a66 Logitech, Inc. 
Device Descriptor:
  bLength                18
  bDescriptorType         1
  bcdUSB               1.10
  bDeviceClass            0 (Defined at Interface level)
  bDeviceSubClass         0 
  bDeviceProtocol         0 
  bMaxPacketSize0        64
  idVendor           0x046d Logitech, Inc.
  idProduct          0x0a66 
  bcdDevice            1.00
  iManufacturer           3 Logitech
  iProduct                4 G533 Gaming Headset
  iSerial                 0 
  bNumConfigurations      1
  Configuration Descriptor:
    bLength                 9
    bDescriptorType         2
    wTotalLength          269
    bNumInterfaces          4
    bConfigurationValue     1
    iConfiguration          0 
    bmAttributes         0x80
      (Bus Powered)
    MaxPower              100mA
    Interface Descriptor:
      bLength                 9
      bDescriptorType         4
      bInterfaceNumber        0
      bAlternateSetting       0
      bNumEndpoints           0
      bInterfaceClass         1 Audio
      bInterfaceSubClass      1 Control Device
      bInterfaceProtocol      0 
      iInterface              1 G533 Gaming Headset
      AudioControl Interface Descriptor:
        bLength                10
        bDescriptorType        36
        bDescriptorSubtype      1 (HEADER)
        bcdADC               1.00
        wTotalLength           71
        bInCollection           2
        baInterfaceNr( 0)       1
        baInterfaceNr( 1)       2
      AudioControl Interface Descriptor:
        bLength                12
        bDescriptorType        36
        bDescriptorSubtype      2 (INPUT_TERMINAL)
        bTerminalID             6
        wTerminalType      0x0201 Microphone
        bAssocTerminal          0
        bNrChannels             1
        wChannelConfig     0x0000
        iChannelNames           0 
        iTerminal               0 
      AudioControl Interface Descriptor:
        bLength                 9
        bDescriptorType        36
        bDescriptorSubtype      6 (FEATURE_UNIT)
        bUnitID                 3
        bSourceID               6
        bControlSize            1
        bmaControls( 0)      0x03
          Mute Control
          Volume Control
        bmaControls( 1)      0x00
        iFeature                0 
      AudioControl Interface Descriptor:
        bLength                 9
        bDescriptorType        36
        bDescriptorSubtype      3 (OUTPUT_TERMINAL)
        bTerminalID             7
        wTerminalType      0x0101 USB Streaming
        bAssocTerminal          0
        bSourceID               3
        iTerminal               0 
      AudioControl Interface Descriptor:
        bLength                12
        bDescriptorType        36
        bDescriptorSubtype      2 (INPUT_TERMINAL)
        bTerminalID             1
        wTerminalType      0x0101 USB Streaming
        bAssocTerminal          0
        bNrChannels             2
        wChannelConfig     0x0003
          Left Front (L)
          Right Front (R)
        iChannelNames           0 
        iTerminal               0 
      AudioControl Interface Descriptor:
        bLength                10
        bDescriptorType        36
        bDescriptorSubtype      6 (FEATURE_UNIT)
        bUnitID                 2
        bSourceID               1
        bControlSize            1
        bmaControls( 0)      0x03
          Mute Control
          Volume Control
        bmaControls( 1)      0x00
        bmaControls( 2)      0x00
        iFeature                0 
      AudioControl Interface Descriptor:
        bLength                 9
        bDescriptorType        36
        bDescriptorSubtype      3 (OUTPUT_TERMINAL)
        bTerminalID             5
        wTerminalType      0x0301 Speaker
        bAssocTerminal          0
        bSourceID               2
        iTerminal               0 
    Interface Descriptor:
      bLength                 9
      bDescriptorType         4
      bInterfaceNumber        1
      bAlternateSetting       0
      bNumEndpoints           0
      bInterfaceClass         1 Audio
      bInterfaceSubClass      2 Streaming
      bInterfaceProtocol      0 
      iInterface              0 
    Interface Descriptor:
      bLength                 9
      bDescriptorType         4
      bInterfaceNumber        1
      bAlternateSetting       1
      bNumEndpoints           1
      bInterfaceClass         1 Audio
      bInterfaceSubClass      2 Streaming
      bInterfaceProtocol      0 
      iInterface              0 
      AudioStreaming Interface Descriptor:
        bLength                 7
        bDescriptorType        36
        bDescriptorSubtype      1 (AS_GENERAL)
        bTerminalLink           7
        bDelay                  0 frames
        wFormatTag              1 PCM
      AudioStreaming Interface Descriptor:
        bLength                32
        bDescriptorType        36
        bDescriptorSubtype      2 (FORMAT_TYPE)
        bFormatType             1 (FORMAT_TYPE_I)
        bNrChannels             1
        bSubframeSize           2
        bBitResolution         16
        bSamFreqType            8 Discrete
        tSamFreq[ 0]         8000
        tSamFreq[ 1]        11025
        tSamFreq[ 2]        16000
        tSamFreq[ 3]        22050
        tSamFreq[ 4]        24000
        tSamFreq[ 5]        32000
        tSamFreq[ 6]        44100
        tSamFreq[ 7]        48000
      Endpoint Descriptor:
        bLength                 9
        bDescriptorType         5
        bEndpointAddress     0x81  EP 1 IN
        bmAttributes           13
          Transfer Type            Isochronous
          Synch Type               Synchronous
          Usage Type               Data
        wMaxPacketSize     0x0090  1x 144 bytes
        bInterval               1
        bRefresh                0
        bSynchAddress           0
        AudioControl Endpoint Descriptor:
          bLength                 7
          bDescriptorType        37
          bDescriptorSubtype      1 (EP_GENERAL)
          bmAttributes         0x01
            Sampling Frequency
          bLockDelayUnits         0 Undefined
          wLockDelay              0 Undefined
    Interface Descriptor:
      bLength                 9
      bDescriptorType         4
      bInterfaceNumber        2
      bAlternateSetting       0
      bNumEndpoints           0
      bInterfaceClass         1 Audio
      bInterfaceSubClass      2 Streaming
      bInterfaceProtocol      0 
      iInterface              0 
    Interface Descriptor:
      bLength                 9
      bDescriptorType         4
      bInterfaceNumber        2
      bAlternateSetting       1
      bNumEndpoints           0
      bInterfaceClass         1 Audio
      bInterfaceSubClass      2 Streaming
      bInterfaceProtocol      0 
      iInterface              0 
    Interface Descriptor:
      bLength                 9
      bDescriptorType         4
      bInterfaceNumber        2
      bAlternateSetting       2
      bNumEndpoints           1
      bInterfaceClass         1 Audio
      bInterfaceSubClass      2 Streaming
      bInterfaceProtocol      0 
      iInterface              0 
      AudioStreaming Interface Descriptor:
        bLength                 7
        bDescriptorType        36
        bDescriptorSubtype      1 (AS_GENERAL)
        bTerminalLink           1
        bDelay                  0 frames
        wFormatTag              1 PCM
      AudioStreaming Interface Descriptor:
        bLength                32
        bDescriptorType        36
        bDescriptorSubtype      2 (FORMAT_TYPE)
        bFormatType             1 (FORMAT_TYPE_I)
        bNrChannels             2
        bSubframeSize           2
        bBitResolution         16
        bSamFreqType            8 Discrete
        tSamFreq[ 0]         8000
        tSamFreq[ 1]        11025
        tSamFreq[ 2]        16000
        tSamFreq[ 3]        22050
        tSamFreq[ 4]        24000
        tSamFreq[ 5]        32000
        tSamFreq[ 6]        44100
        tSamFreq[ 7]        48000
      Endpoint Descriptor:
        bLength                 9
        bDescriptorType         5
        bEndpointAddress     0x02  EP 2 OUT
        bmAttributes           13
          Transfer Type            Isochronous
          Synch Type               Synchronous
          Usage Type               Data
        wMaxPacketSize     0x0120  1x 288 bytes
        bInterval               1
        bRefresh                0
        bSynchAddress           0
        AudioControl Endpoint Descriptor:
          bLength                 7
          bDescriptorType        37
          bDescriptorSubtype      1 (EP_GENERAL)
          bmAttributes         0x01
            Sampling Frequency
          bLockDelayUnits         0 Undefined
          wLockDelay              0 Undefined
    Interface Descriptor:
      bLength                 9
      bDescriptorType         4
      bInterfaceNumber        3
      bAlternateSetting       0
      bNumEndpoints           1
      bInterfaceClass         3 Human Interface Device
      bInterfaceSubClass      0 No Subclass
      bInterfaceProtocol      0 None
      iInterface              2 G533 Gaming Headset
        HID Device Descriptor:
          bLength                 9
          bDescriptorType        33
          bcdHID               1.11
          bCountryCode            0 Not supported
          bNumDescriptors         1
          bDescriptorType        34 Report
          wDescriptorLength     407
         Report Descriptors: 
           ** UNAVAILABLE **
      Endpoint Descriptor:
        bLength                 7
        bDescriptorType         5
        bEndpointAddress     0x83  EP 3 IN
        bmAttributes            3
          Transfer Type            Interrupt
          Synch Type               None
          Usage Type               Data
        wMaxPacketSize     0x0020  1x 32 bytes
        bInterval               1
Device Status:     0x0000
  (Bus Powered)

@0x4C4A Ah, so at least it detected as hdraw device. This looks promising. I try to get hardware and play with it.

Just got mine and I would love to see support for it!

If anyone with the hardware wants to push this further, you could try to add the receiver to the list of supported receivers in lib/logitech_recceiver/base_usb.py. If you are already running solaar then making small changes to it should be easy.

First clone this repository and try running bin/solaar from your clone. (You may have to install some dependencies - see docs/installation.md.)
Then add the receiver to base_usb.py as a unifying receiver by adding the lines

UNIFYING_RECEIVER_0A66 = _unifying_receiver(0x0a66)

and

        UNIFYING_RECEIVER_0A66,

in the obvious places. (That's probably not correct, but should be good enough for now.)
Next run Solaar as root, as in

sudo bin/solaar

(You have to run as root because the udev script that changes permissions on hidraw devices doesn't have this receiver in it.)
If you don't see your receiver and device in the Solaar window then support for this device is probably not going to be easy. If you do see something there please respond with the output of sudo bin/solaar show and sudo bin/solaar probe (assuming you only have one Logitech receiver attached to your computer, otherwise you will probably need to use the -D option to select the correct receiver).

Adding support for the features of this device that are currently not supported in Solaar may require you to do the programming for them.

Can you install hid-tools and run hid-recorder on the receiver? You can ctrl+c when it starts recording, I am just interested in the initial information it spits out.

@pfps I'll try that later

@FFY00

# Logitech G533 Gaming Headset
# 0x05, 0x0c,                    // Usage Page (Consumer Devices)       0
# 0x09, 0x01,                    // Usage (Consumer Control)            2
# 0xa1, 0x01,                    // Collection (Application)            4
# 0x85, 0x01,                    //  Report ID (1)                      6
# 0x09, 0xe9,                    //  Usage (Volume Up)                  8
# 0x09, 0xea,                    //  Usage (Volume Down)                10
# 0x75, 0x01,                    //  Report Size (1)                    12
# 0x95, 0x02,                    //  Report Count (2)                   14
# 0x15, 0x00,                    //  Logical Minimum (0)                16
# 0x25, 0x01,                    //  Logical Maximum (1)                18
# 0x81, 0x02,                    //  Input (Data,Var,Abs)               20
# 0x75, 0x06,                    //  Report Size (6)                    22
# 0x95, 0x01,                    //  Report Count (1)                   24
# 0x81, 0x03,                    //  Input (Cnst,Var,Abs)               26
# 0x75, 0x18,                    //  Report Size (24)                   28
# 0x81, 0x03,                    //  Input (Cnst,Var,Abs)               30
# 0xc0,                          // End Collection                      32
# 0x05, 0x0b,                    // Usage Page (Telephony Devices)      33
# 0x09, 0x01,                    // Usage (Phone)                       35
# 0xa1, 0x01,                    // Collection (Application)            37
# 0x85, 0x08,                    //  Report ID (8)                      39
# 0x09, 0x2f,                    //  Usage (Phone Mute)                 41
# 0x75, 0x01,                    //  Report Size (1)                    43
# 0x81, 0x06,                    //  Input (Data,Var,Rel)               45
# 0x09, 0x20,                    //  Usage (Hook Switch)                47
# 0x81, 0x06,                    //  Input (Data,Var,Rel)               49
# 0x75, 0x06,                    //  Report Size (6)                    51
# 0x81, 0x03,                    //  Input (Cnst,Var,Abs)               53
# 0xc0,                          // End Collection                      55
# 0x06, 0x43, 0xff,              // Usage Page (Vendor Usage Page 0xff43) 56
# 0x0a, 0x02, 0x02,              // Usage (Vendor Usage 0x202)          59
# 0xa1, 0x01,                    // Collection (Application)            62
# 0x85, 0x11,                    //  Report ID (17)                     64
# 0x95, 0x13,                    //  Report Count (19)                  66
# 0x75, 0x08,                    //  Report Size (8)                    68
# 0x26, 0xff, 0x00,              //  Logical Maximum (255)              70
# 0x09, 0x02,                    //  Usage (Vendor Usage 0x02)          73
# 0x81, 0x00,                    //  Input (Data,Arr,Abs)               75
# 0x09, 0x02,                    //  Usage (Vendor Usage 0x02)          77
# 0x91, 0x00,                    //  Output (Data,Arr,Abs)              79
# 0xc0,                          // End Collection                      81
# 0x06, 0x00, 0xff,              // Usage Page (Vendor Defined Page 1)  82
# 0x09, 0x01,                    // Usage (Vendor Usage 1)              85
# 0xa1, 0x01,                    // Collection (Application)            87
# 0x09, 0x0a,                    //  Usage (Vendor Usage 0x0a)          89
# 0xa1, 0x02,                    //  Collection (Logical)               91
# 0x85, 0xff,                    //   Report ID (255)                   93
# 0x95, 0x01,                    //   Report Count (1)                  95
# 0x75, 0x20,                    //   Report Size (32)                  97
# 0x09, 0x0b,                    //   Usage (Vendor Usage 0x0b)         99
# 0x17, 0x01, 0x00, 0x00, 0x80,  //   Logical Minimum (-2147483647)     101
# 0x27, 0xff, 0xff, 0xff, 0x7f,  //   Logical Maximum (2147483647)      106
# 0x81, 0x02,                    //   Input (Data,Var,Abs)              111
# 0xc0,                          //  End Collection                     113
# 0x09, 0x22,                    //  Usage (Vendor Usage 0x22)          114
# 0xa1, 0x02,                    //  Collection (Logical)               116
# 0x85, 0x90,                    //   Report ID (144)                   118
# 0x09, 0x33,                    //   Usage (Vendor Usage 0x33)         120
# 0x75, 0x08,                    //   Report Size (8)                   122
# 0x15, 0x00,                    //   Logical Minimum (0)               124
# 0x26, 0xff, 0x00,              //   Logical Maximum (255)             126
# 0x81, 0x02,                    //   Input (Data,Var,Abs)              129
# 0x09, 0x34,                    //   Usage (Vendor Usage 0x34)         131
# 0x81, 0x02,                    //   Input (Data,Var,Abs)              133
# 0x05, 0x01,                    //   Usage Page (Generic Desktop)      135
# 0x09, 0x3b,                    //   Usage (Byte Count)                137
# 0x75, 0x10,                    //   Report Size (16)                  139
# 0x27, 0xff, 0xff, 0x00, 0x00,  //   Logical Maximum (65535)           141
# 0x81, 0x02,                    //   Input (Data,Var,Abs)              146
# 0x06, 0x00, 0xff,              //   Usage Page (Vendor Defined Page 1) 148
# 0x09, 0x0a,                    //   Usage (Vendor Usage 0x0a)         151
# 0xa1, 0x02,                    //   Collection (Logical)              153
# 0x05, 0x0a,                    //    Usage Page (Ordinals)            155
# 0x19, 0x01,                    //    Usage Minimum (1)                157
# 0x29, 0x0a,                    //    Usage Maximum (10)               159
# 0x95, 0x0a,                    //    Report Count (10)                161
# 0x75, 0x08,                    //    Report Size (8)                  163
# 0x26, 0xff, 0x00,              //    Logical Maximum (255)            165
# 0x81, 0x02,                    //    Input (Data,Var,Abs)             168
# 0xc0,                          //   End Collection                    170
# 0xc0,                          //  End Collection                     171
# 0x06, 0x00, 0xff,              //  Usage Page (Vendor Defined Page 1) 172
# 0x09, 0x22,                    //  Usage (Vendor Usage 0x22)          175
# 0xa1, 0x02,                    //  Collection (Logical)               177
# 0x85, 0x90,                    //   Report ID (144)                   179
# 0x09, 0x33,                    //   Usage (Vendor Usage 0x33)         181
# 0x95, 0x01,                    //   Report Count (1)                  183
# 0x91, 0x02,                    //   Output (Data,Var,Abs)             185
# 0x09, 0x34,                    //   Usage (Vendor Usage 0x34)         187
# 0x91, 0x02,                    //   Output (Data,Var,Abs)             189
# 0x05, 0x01,                    //   Usage Page (Generic Desktop)      191
# 0x09, 0x3b,                    //   Usage (Byte Count)                193
# 0x75, 0x10,                    //   Report Size (16)                  195
# 0x27, 0xff, 0xff, 0x00, 0x00,  //   Logical Maximum (65535)           197
# 0x91, 0x02,                    //   Output (Data,Var,Abs)             202
# 0x06, 0x00, 0xff,              //   Usage Page (Vendor Defined Page 1) 204
# 0x09, 0x0a,                    //   Usage (Vendor Usage 0x0a)         207
# 0xa1, 0x02,                    //   Collection (Logical)              209
# 0x05, 0x0a,                    //    Usage Page (Ordinals)            211
# 0x19, 0x01,                    //    Usage Minimum (1)                213
# 0x29, 0x0a,                    //    Usage Maximum (10)               215
# 0x95, 0x0a,                    //    Report Count (10)                217
# 0x75, 0x08,                    //    Report Size (8)                  219
# 0x26, 0xff, 0x00,              //    Logical Maximum (255)            221
# 0x91, 0x02,                    //    Output (Data,Var,Abs)            224
# 0xc0,                          //   End Collection                    226
# 0xc0,                          //  End Collection                     227
# 0x06, 0x00, 0xff,              //  Usage Page (Vendor Defined Page 1) 228
# 0x09, 0x22,                    //  Usage (Vendor Usage 0x22)          231
# 0xa1, 0x02,                    //  Collection (Logical)               233
# 0x85, 0xc4,                    //   Report ID (196)                   235
# 0x09, 0x33,                    //   Usage (Vendor Usage 0x33)         237
# 0x95, 0x01,                    //   Report Count (1)                  239
# 0x81, 0x02,                    //   Input (Data,Var,Abs)              241
# 0x09, 0x34,                    //   Usage (Vendor Usage 0x34)         243
# 0x81, 0x02,                    //   Input (Data,Var,Abs)              245
# 0x05, 0x01,                    //   Usage Page (Generic Desktop)      247
# 0x09, 0x3b,                    //   Usage (Byte Count)                249
# 0x75, 0x10,                    //   Report Size (16)                  251
# 0x27, 0xff, 0xff, 0x00, 0x00,  //   Logical Maximum (65535)           253
# 0x81, 0x02,                    //   Input (Data,Var,Abs)              258
# 0x06, 0x00, 0xff,              //   Usage Page (Vendor Defined Page 1) 260
# 0x09, 0x0a,                    //   Usage (Vendor Usage 0x0a)         263
# 0xa1, 0x02,                    //   Collection (Logical)              265
# 0x05, 0x0a,                    //    Usage Page (Ordinals)            267
# 0x19, 0x01,                    //    Usage Minimum (1)                269
# 0x29, 0x3b,                    //    Usage Maximum (59)               271
# 0x95, 0x3b,                    //    Report Count (59)                273
# 0x75, 0x08,                    //    Report Size (8)                  275
# 0x26, 0xff, 0x00,              //    Logical Maximum (255)            277
# 0x81, 0x02,                    //    Input (Data,Var,Abs)             280
# 0xc0,                          //   End Collection                    282
# 0xc0,                          //  End Collection                     283
# 0x06, 0x00, 0xff,              //  Usage Page (Vendor Defined Page 1) 284
# 0x09, 0x22,                    //  Usage (Vendor Usage 0x22)          287
# 0xa1, 0x02,                    //  Collection (Logical)               289
# 0x85, 0xc4,                    //   Report ID (196)                   291
# 0x09, 0x33,                    //   Usage (Vendor Usage 0x33)         293
# 0x95, 0x01,                    //   Report Count (1)                  295
# 0x91, 0x02,                    //   Output (Data,Var,Abs)             297
# 0x09, 0x34,                    //   Usage (Vendor Usage 0x34)         299
# 0x91, 0x02,                    //   Output (Data,Var,Abs)             301
# 0x05, 0x01,                    //   Usage Page (Generic Desktop)      303
# 0x09, 0x3b,                    //   Usage (Byte Count)                305
# 0x75, 0x10,                    //   Report Size (16)                  307
# 0x27, 0xff, 0xff, 0x00, 0x00,  //   Logical Maximum (65535)           309
# 0x91, 0x02,                    //   Output (Data,Var,Abs)             314
# 0x06, 0x00, 0xff,              //   Usage Page (Vendor Defined Page 1) 316
# 0x09, 0x0a,                    //   Usage (Vendor Usage 0x0a)         319
# 0xa1, 0x02,                    //   Collection (Logical)              321
# 0x05, 0x0a,                    //    Usage Page (Ordinals)            323
# 0x19, 0x01,                    //    Usage Minimum (1)                325
# 0x29, 0x3b,                    //    Usage Maximum (59)               327
# 0x95, 0x3b,                    //    Report Count (59)                329
# 0x75, 0x08,                    //    Report Size (8)                  331
# 0x26, 0xff, 0x00,              //    Logical Maximum (255)            333
# 0x91, 0x02,                    //    Output (Data,Var,Abs)            336
# 0xc0,                          //   End Collection                    338
# 0xc0,                          //  End Collection                     339
# 0x06, 0x00, 0xff,              //  Usage Page (Vendor Defined Page 1) 340
# 0x09, 0x0c,                    //  Usage (Vendor Usage 0x0c)          343
# 0xa1, 0x02,                    //  Collection (Logical)               345
# 0x85, 0xff,                    //   Report ID (255)                   347
# 0x05, 0x01,                    //   Usage Page (Generic Desktop)      349
# 0x09, 0x3b,                    //   Usage (Byte Count)                351
# 0x95, 0x01,                    //   Report Count (1)                  353
# 0xb1, 0x02,                    //   Feature (Data,Var,Abs)            355
# 0x09, 0x3a,                    //   Usage (Counted Buffer)            357
# 0xa1, 0x02,                    //   Collection (Logical)              359
# 0x05, 0x0a,                    //    Usage Page (Ordinals)            361
# 0x19, 0x01,                    //    Usage Minimum (1)                363
# 0x29, 0x3e,                    //    Usage Maximum (62)               365
# 0x95, 0x3e,                    //    Report Count (62)                367
# 0xb1, 0x02,                    //    Feature (Data,Var,Abs)           369
# 0xc0,                          //   End Collection                    371
# 0xc0,                          //  End Collection                     372
# 0x06, 0x00, 0xff,              //  Usage Page (Vendor Defined Page 1) 373
# 0x09, 0x0c,                    //  Usage (Vendor Usage 0x0c)          376
# 0xa1, 0x02,                    //  Collection (Logical)               378
# 0x85, 0xe2,                    //   Report ID (226)                   380
# 0x05, 0x01,                    //   Usage Page (Generic Desktop)      382
# 0x09, 0x3b,                    //   Usage (Byte Count)                384
# 0x95, 0x01,                    //   Report Count (1)                  386
# 0x81, 0x02,                    //   Input (Data,Var,Abs)              388
# 0x09, 0x3a,                    //   Usage (Counted Buffer)            390
# 0xa1, 0x02,                    //   Collection (Logical)              392
# 0x05, 0x0a,                    //    Usage Page (Ordinals)            394
# 0x19, 0x01,                    //    Usage Minimum (1)                396
# 0x29, 0x3e,                    //    Usage Maximum (62)               398
# 0x95, 0x3e,                    //    Report Count (62)                400
# 0x81, 0x02,                    //    Input (Data,Var,Abs)             402
# 0xc0,                          //   End Collection                    404
# 0xc0,                          //  End Collection                     405
# 0xc0,                          // End Collection                      406
# 
R: 407 05 0c 09 01 a1 01 85 01 09 e9 09 ea 75 01 95 02 15 00 25 01 81 02 75 06 95 01 81 03 75 18 81 03 c0 05 0b 09 01 a1 01 85 08 09 2f 75 01 81 06 09 20 81 06 75 06 81 03 c0 06 43 ff 0a 02 02 a1 01 85 11 95 13 75 08 26 ff 00 09 02 81 00 09 02 91 00 c0 06 00 ff 09 01 a1 01 09 0a a1 02 85 ff 95 01 75 20 09 0b 17 01 00 00 80 27 ff ff ff 7f 81 02 c0 09 22 a1 02 85 90 09 33 75 08 15 00 26 ff 00 81 02 09 34 81 02 05 01 09 3b 75 10 27 ff ff 00 00 81 02 06 00 ff 09 0a a1 02 05 0a 19 01 29 0a 95 0a 75 08 26 ff 00 81 02 c0 c0 06 00 ff 09 22 a1 02 85 90 09 33 95 01 91 02 09 34 91 02 05 01 09 3b 75 10 27 ff ff 00 00 91 02 06 00 ff 09 0a a1 02 05 0a 19 01 29 0a 95 0a 75 08 26 ff 00 91 02 c0 c0 06 00 ff 09 22 a1 02 85 c4 09 33 95 01 81 02 09 34 81 02 05 01 09 3b 75 10 27 ff ff 00 00 81 02 06 00 ff 09 0a a1 02 05 0a 19 01 29 3b 95 3b 75 08 26 ff 00 81 02 c0 c0 06 00 ff 09 22 a1 02 85 c4 09 33 95 01 91 02 09 34 91 02 05 01 09 3b 75 10 27 ff ff 00 00 91 02 06 00 ff 09 0a a1 02 05 0a 19 01 29 3b 95 3b 75 08 26 ff 00 91 02 c0 c0 06 00 ff 09 0c a1 02 85 ff 05 01 09 3b 95 01 b1 02 09 3a a1 02 05 0a 19 01 29 3e 95 3e b1 02 c0 c0 06 00 ff 09 0c a1 02 85 e2 05 01 09 3b 95 01 81 02 09 3a a1 02 05 0a 19 01 29 3e 95 3e 81 02 c0 c0 c0
N: Logitech G533 Gaming Headset
I: 3 046d 0a66

Looks like it should support long HID++ packets, so that's good. But it also looks like there is something else going on, I am not sure how relevant the other vendor usages are, we will need to find out.

Please do what @pfps said and we'll see what we can get from there.

Well, it didn't show up. Installed the udev rules and replugged the device. I don't have the plugdev group to add myself to, but hidraw0 seems to have my user's group. And I'm running it with sudo anyway.

See if I'm missing something:

diff --git a/lib/logitech_receiver/base_usb.py b/lib/logitech_receiver/base_usb.py
index 832024a..5057563 100644
--- a/lib/logitech_receiver/base_usb.py
+++ b/lib/logitech_receiver/base_usb.py
@@ -79,6 +79,7 @@ _lightspeed_receiver = lambda product_id: {
 # standard Unifying receivers (marked with the orange Unifying logo)
 UNIFYING_RECEIVER_C52B    = _unifying_receiver(0xc52b)
 UNIFYING_RECEIVER_C532    = _unifying_receiver(0xc532)
+UNIFYING_RECEIVER_0A66    = _unifying_receiver(0x0a66)

 # Nano receviers that support the Unifying protocol
 NANO_RECEIVER_ADVANCED    = _nano_receiver(0xc52f)
@@ -108,6 +109,7 @@ del _DRIVER, _unifying_receiver, _nano_receiver, _lenovo_receiver, _lightspeed_r
 ALL = (
        UNIFYING_RECEIVER_C52B,
        UNIFYING_RECEIVER_C532,
+       UNIFYING_RECEIVER_0A66,
        NANO_RECEIVER_ADVANCED,
        NANO_RECEIVER_C517,
        NANO_RECEIVER_C518,
diff --git a/rules.d/42-logitech-unify-permissions.rules b/rules.d/42-logitech-unify-permissions.rules
index bcd2b4c..30e9014 100644
--- a/rules.d/42-logitech-unify-permissions.rules
+++ b/rules.d/42-logitech-unify-permissions.rules
@@ -10,6 +10,7 @@ SUBSYSTEM != "hidraw", GOTO="solaar_end"
 # official Unifying receivers
 ATTRS{idVendor}=="046d", ATTRS{idProduct}=="c52b", GOTO="solaar_apply"
 ATTRS{idVendor}=="046d", ATTRS{idProduct}=="c532", GOTO="solaar_apply"
+ATTRS{idVendor}=="046d", ATTRS{idProduct}=="0a66", GOTO="solaar_apply"

 # Nano receiver, "Unifying Ready"
 ATTRS{idVendor}=="046d", ATTRS{idProduct}=="c52f", GOTO="solaar_apply"
boris@g1 ~/Solaar (master *%) » sudo hid-recorder
Available devices:
/dev/hidraw0:   Logitech G533 Gaming Headset
/dev/hidraw1:   Logitech Gaming Mouse G502
/dev/hidraw2:   Logitech Gaming Mouse G502
/dev/hidraw3:   Ultimate Gadget Laboratories Ultimate Hacking Keyboard
/dev/hidraw4:   Ultimate Gadget Laboratories Ultimate Hacking Keyboard
/dev/hidraw5:   Ultimate Gadget Laboratories Ultimate Hacking Keyboard
/dev/hidraw6:   Ultimate Gadget Laboratories Ultimate Hacking Keyboard
/dev/hidraw7:   Ultimate Gadget Laboratories Ultimate Hacking Keyboard
/dev/hidraw8:   American Power Conversion Back-UPS XS 950U   FW:925.T2 .I USB FW:T2 
Select the device event number [0-8]: ^C%                                                                                                                                                                                                                                boris@g1 ~/Solaar (master *%) » ll /dev/hidraw0  
crw-rw----+ 1 root boris 238, 0 Mar 26 16:11 /dev/hidraw0
boris@g1 ~/Solaar (master *%) » sudo bin/solaar

(solaar:13930): libappindicator-WARNING **: 16:13:58.416: Unable to get the session bus: Error spawning command line “dbus-launch --autolaunch=d4c88f517698407e984c821ecae31c7e --binary-syntax --close-stderr”: Child process exited with code 1

(solaar:13930): LIBDBUSMENU-GLIB-WARNING **: 16:13:58.416: Unable to get session bus: Error spawning command line “dbus-launch --autolaunch=d4c88f517698407e984c821ecae31c7e --binary-syntax --close-stderr”: Child process exited with code 1
boris@g1 ~/Solaar (master *%) » sudo bin/solaar show
solaar: error: Logitech receiver not found

That's weird. I wonder why solaar show isn't picking up the receiver at all. I don't see debugging statements in the part of the code that I think is involved so I don't think debugging output will be helpful, but you could try sudo bin/solaar -dd show

-dd didn't show anything else.

The receiver probably doesn't respond. This indicates that it maybe doesn't support HID++?

Once you have time try to connect it to a Windows VM, run Logitech's software and sniff the communication with Wireshark. When you do this make sure to capture the initial packets sent by the software, to do this you can pass the receiver to the VM while Windows is starting or alternatively kill the background app, start recording and start the app again.

I was thinking about doing that. I have dual-boot, I'll try to sniff it there. I guess reconnecting the device would cause the driver to send what's necessary.

Here's the capture file, filtered just this device:
https://drive.google.com/open?id=1zwBnaTlrNBlw6w_SX_h6eHw9Z_jCJmf0

I tried adding the G533 to the list of detectable devices. Solaar hangs at https://github.com/pwr-Solaar/Solaar/blob/58a1c7ffb0e153159e9482d5683357feff84c7ce/lib/logitech_receiver/receiver.py#L342 because it presumes it's dealing with a unified receiver which understands HID++ 1.0.

G533 comes with a dedicated dongle that cannot be paired to arbitrary devices. lsusb output:

Bus 003 Device 038: ID 046d:0a66 Logitech, Inc. [G533 Wireless Headset Dongle]

It works out of the box on Linux as a USB audio device, however it talks HID++4.2 in case of my headset (the dongle itself reports that version when queried).

So the first stage would be refactoring the code to conditionally skip the HID++1.0 conversation in Receiver.__init__ and allow treating the dongle as the target device itself. If you look at the HID++ driver in Linux kernel, the very first thing they do is to ask the device which protocol version it supports before they send any more queries to it:
https://github.com/torvalds/linux/blob/v5.6/drivers/hid/hid-logitech-hidpp.c#L877

Yeah, I don't really think such big changes should go into solaar. We are basically just trying to fix the current code and adding minor improvements.

The plan is to write a daemon and drop the backend from Solaar. I have already been working on the daemon but is still very barebones, you can still test it with your device and make sure the daemon can correctly talk to it. You can find the code here, you will need to add your device to __main__.py. To run the daemon simply invoke python -m logitechd.

Right now I am working on a DBus library to use in the daemon (see https://github.com/FFY00/jeepney-objects) so don't expect much movement there. All other python dbus libraries are a bit old and with dead or inactive upstreams so I choose to take this route.

IMO the optimal solution long-term would be upstreaming support for all these devices into the hid-logitech-hidpp kernel driver and then using the kernel's power supply interface, e.g. reading from /sys/class/power_supply/hidpp_battery_X/voltage_now for matching devices.

That only works for the battery feature. All other features need to be implemented somewhere, and it's not going to be in the kernel driver. We only use the kernel driver for things that require access to kernel internals. Right now, we have two drivers, hid-logitech-dj which does multiplexing (you can have multiple devices connected to the same receiver and we will export them to userspace as different devices) and hid-logitech-hidpp which automatically enables high-resolution scrolling and reports battery information. Everything other than that is out of scope.

Closing as out of scope for Solaar at this time.

If someone wants this, they will have to figure out how to add support for the receiver. Either that or wait for a new API for HID++ interactions.

@kdomanski Solaar now supports direct-connected devices that are not receivers. This may mean that your device can easily supported. If you are interested, please respond and reopen this issue.

I'd be interested to assist with this, however would need some pointers as to what to do. (Have a G533 to test with)

@pfps I tried the git checkout pull_968 thing you posted in issue #272 and added a line for G533 as follows:
```diff --git a/lib/logitech_receiver/descriptors.py b/lib/logitech_receiver/descriptors.py
index e861655..f779b82 100644
--- a/lib/logitech_receiver/descriptors.py
+++ b/lib/logitech_receiver/descriptors.py
@@ -726,3 +726,4 @@ _D('Fujitsu Sonic Mouse', codename='Sonic', protocol=1.0, wpid='1029')
# Headsets (experimental)

_D('G930 Headset Dongle', codename='G930', protocol=4.5, usbid=0x0a1f, kind=_DK.headset, interface=3)
+_D('G533 Headset Dongle', codename='G533', protocol=4.5, usbid=0x0a66, kind=_DK.headset, interface=3)

Unfortunately it didn't work 

<details>
<p>

```$ bin/solaar show
/home/x4c4a/Work/Solaar/lib/solaar/ui/__init__.py:27: PyGIWarning: Gtk was imported without specifying a version first. Use gi.require_version('Gtk', '3.0') before import to ensure that the right version gets loaded.
  from gi.repository import GLib, Gtk
[ snipped lines relating to my G900 mouse ]

Wired Devices
solaar: error: Traceback (most recent call last):
  File "/home/x4c4a/Work/Solaar/lib/logitech_receiver/base.py", line 209, in write
    _hid.write(int(handle), wdata)
  File "/home/x4c4a/Work/Solaar/lib/hidapi/udev.py", line 336, in write
    raise IOError(_errno.EIO, 'written %d bytes out of expected %d' % (bytes_written, len(data)))
OSError: [Errno 5] written 0 bytes out of expected 7

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/home/x4c4a/Work/Solaar/lib/solaar/cli/__init__.py", line 199, in run
    m.run(c, args, _find_receiver, _find_device)
  File "/home/x4c4a/Work/Solaar/lib/solaar/cli/show.py", line 277, in run
    _print_device(d, num=dev_num)
  File "/home/x4c4a/Work/Solaar/lib/solaar/cli/show.py", line 90, in _print_device
    dev.ping()
  File "/home/x4c4a/Work/Solaar/lib/logitech_receiver/device.py", line 438, in ping
    protocol = _base.ping(self.handle or self.receiver.handle, self.number, long_message=self.bluetooth)
  File "/home/x4c4a/Work/Solaar/lib/logitech_receiver/base.py", line 495, in ping
    write(ihandle, devnumber, request_data, long_message)
  File "/home/x4c4a/Work/Solaar/lib/logitech_receiver/base.py", line 213, in write
    raise NoReceiver(reason=reason)
logitech_receiver.base.NoReceiver: {'reason': OSError(5, 'written 0 bytes out of expected 7')}

Running bin/solaar -dd show yields

$ bin/solaar -dd show
/home/x4c4a/Work/Solaar/lib/solaar/ui/__init__.py:27: PyGIWarning: Gtk was imported without specifying a version first. Use gi.require_version('Gtk', '3.0') before import to ensure that the right version gets loaded.
  from gi.repository import GLib, Gtk
22:12:24,440    DEBUG [MainThread] solaar.ui.tray: using AppIndicator3
22:12:24,452    DEBUG [MainThread] logitech_receiver.base: (7) <= w[10 FF 83B5 030000]
22:12:24,455    DEBUG [MainThread] logitech_receiver.base: (7) => r[11 FF 83B5 03B52E928B0401080000000000000000]
22:12:24,455    DEBUG [MainThread] logitech_receiver.base: (7) <= w[10 FF 80B2 000000]
22:12:24,457    DEBUG [MainThread] logitech_receiver.base: (7) => r[10 01 410C 325340]
22:12:24,458    DEBUG [MainThread] logitech_receiver.base: (7) => r[10 FF 8002 000000]
22:12:24,490    DEBUG [MainThread] logitech_receiver.base: (7) => r[11 01 0001 00000000000000000000000000000000]
22:12:25,391  WARNING [MainThread] logitech_receiver.base: timeout (0.90/0.90) on device 255 request {80B2} params []
22:12:25,391    DEBUG [MainThread] solaar.cli: [/dev/hidraw5] => <LightspeedReceiver(/dev/hidraw5,7)>
22:12:25,394    DEBUG [MainThread] solaar.cli: [/dev/hidraw2] => <Device(0,0A66,G533 Headset Dongle,?)>
22:12:25,396    DEBUG [MainThread] logitech_receiver.base: (7) <= w[10 FF 8102 000000]
22:12:25,398    DEBUG [MainThread] logitech_receiver.base: (7) => r[10 FF 8102 000100]

[ Snipped G900 related stuff ] 

Wired Devices
22:12:27,459    DEBUG [MainThread] logitech_receiver.base: (9) pinging device 0
22:12:27,459    DEBUG [MainThread] logitech_receiver.base: (9) <= w[10 00 001E 000067]
22:12:27,762    ERROR [MainThread] logitech_receiver.base: write failed, assuming handle 9 no longer available
solaar: error: Traceback (most recent call last):
  File "/home/x4c4a/Work/Solaar/lib/logitech_receiver/base.py", line 209, in write
    _hid.write(int(handle), wdata)
  File "/home/x4c4a/Work/Solaar/lib/hidapi/udev.py", line 336, in write
    raise IOError(_errno.EIO, 'written %d bytes out of expected %d' % (bytes_written, len(data)))
OSError: [Errno 5] written 0 bytes out of expected 7

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/home/x4c4a/Work/Solaar/lib/solaar/cli/__init__.py", line 199, in run
    m.run(c, args, _find_receiver, _find_device)
  File "/home/x4c4a/Work/Solaar/lib/solaar/cli/show.py", line 277, in run
    _print_device(d, num=dev_num)
  File "/home/x4c4a/Work/Solaar/lib/solaar/cli/show.py", line 90, in _print_device
    dev.ping()
  File "/home/x4c4a/Work/Solaar/lib/logitech_receiver/device.py", line 438, in ping
    protocol = _base.ping(self.handle or self.receiver.handle, self.number, long_message=self.bluetooth)
  File "/home/x4c4a/Work/Solaar/lib/logitech_receiver/base.py", line 495, in ping
    write(ihandle, devnumber, request_data, long_message)
  File "/home/x4c4a/Work/Solaar/lib/logitech_receiver/base.py", line 213, in write
    raise NoReceiver(reason=reason)
logitech_receiver.base.NoReceiver: {'reason': OSError(5, 'written 0 bytes out of expected 7')}

And here's the udevadm results

$ udevadm info -q all -a /dev/hidraw2

Udevadm info starts with the device specified by the devpath and then
walks up the chain of parent devices. It prints for every device
found, all possible attributes in the udev rules key format.
A rule to match, can be composed by the attributes of the device
and the attributes from one single parent device.

  looking at device '/devices/pci0000:00/0000:00:14.0/usb1/1-5/1-5.1/1-5.1.1/1-5.1.1:1.3/0003:046D:0A66.0017/hidraw/hidraw2':
    KERNEL=="hidraw2"
    SUBSYSTEM=="hidraw"
    DRIVER==""

  looking at parent device '/devices/pci0000:00/0000:00:14.0/usb1/1-5/1-5.1/1-5.1.1/1-5.1.1:1.3/0003:046D:0A66.0017':
    KERNELS=="0003:046D:0A66.0017"
    SUBSYSTEMS=="hid"
    DRIVERS=="hid-generic"
    ATTRS{country}=="00"

  looking at parent device '/devices/pci0000:00/0000:00:14.0/usb1/1-5/1-5.1/1-5.1.1/1-5.1.1:1.3':
    KERNELS=="1-5.1.1:1.3"
    SUBSYSTEMS=="usb"
    DRIVERS=="usbhid"
    ATTRS{authorized}=="1"
    ATTRS{bAlternateSetting}==" 0"
    ATTRS{bInterfaceSubClass}=="00"
    ATTRS{bInterfaceProtocol}=="00"
    ATTRS{bNumEndpoints}=="01"
    ATTRS{supports_autosuspend}=="1"
    ATTRS{bInterfaceNumber}=="03"
    ATTRS{bInterfaceClass}=="03"
    ATTRS{interface}=="G533 Gaming Headset"

  looking at parent device '/devices/pci0000:00/0000:00:14.0/usb1/1-5/1-5.1/1-5.1.1':
    KERNELS=="1-5.1.1"
    SUBSYSTEMS=="usb"
    DRIVERS=="usb"
    ATTRS{quirks}=="0x0"
    ATTRS{bcdDevice}=="0100"
    ATTRS{product}=="G533 Gaming Headset"
    ATTRS{manufacturer}=="Logitech"
    ATTRS{tx_lanes}=="1"
    ATTRS{bMaxPacketSize0}=="64"
    ATTRS{bConfigurationValue}=="1"
    ATTRS{devpath}=="5.1.1"
    ATTRS{ltm_capable}=="no"
    ATTRS{idVendor}=="046d"
    ATTRS{bmAttributes}=="80"
    ATTRS{version}==" 1.10"
    ATTRS{authorized}=="1"
    ATTRS{bDeviceSubClass}=="00"
    ATTRS{bDeviceProtocol}=="00"
    ATTRS{removable}=="removable"
    ATTRS{maxchild}=="0"
    ATTRS{bDeviceClass}=="00"
    ATTRS{avoid_reset_quirk}=="0"
    ATTRS{bNumConfigurations}=="1"
    ATTRS{bNumInterfaces}==" 4"
    ATTRS{bMaxPower}=="100mA"
    ATTRS{devnum}=="36"
    ATTRS{busnum}=="1"
    ATTRS{urbnum}=="270496"
    ATTRS{configuration}==""
    ATTRS{speed}=="12"
    ATTRS{idProduct}=="0a66"
    ATTRS{rx_lanes}=="1"

  looking at parent device '/devices/pci0000:00/0000:00:14.0/usb1/1-5/1-5.1':
    KERNELS=="1-5.1"
    SUBSYSTEMS=="usb"
    DRIVERS=="usb"
    ATTRS{bMaxPower}=="100mA"
    ATTRS{configuration}==""
    ATTRS{rx_lanes}=="1"
    ATTRS{urbnum}=="89"
    ATTRS{version}==" 2.10"
    ATTRS{maxchild}=="4"
    ATTRS{devpath}=="5.1"
    ATTRS{bMaxPacketSize0}=="64"
    ATTRS{ltm_capable}=="no"
    ATTRS{manufacturer}=="GenesysLogic"
    ATTRS{authorized}=="1"
    ATTRS{tx_lanes}=="1"
    ATTRS{avoid_reset_quirk}=="0"
    ATTRS{quirks}=="0x0"
    ATTRS{bNumInterfaces}==" 1"
    ATTRS{speed}=="480"
    ATTRS{bDeviceClass}=="09"
    ATTRS{idProduct}=="0610"
    ATTRS{bConfigurationValue}=="1"
    ATTRS{bDeviceSubClass}=="00"
    ATTRS{bmAttributes}=="e0"
    ATTRS{product}=="USB2.0 Hub"
    ATTRS{bDeviceProtocol}=="02"
    ATTRS{devnum}=="4"
    ATTRS{bNumConfigurations}=="1"
    ATTRS{removable}=="removable"
    ATTRS{idVendor}=="05e3"
    ATTRS{bcdDevice}=="9226"
    ATTRS{busnum}=="1"

  looking at parent device '/devices/pci0000:00/0000:00:14.0/usb1/1-5':
    KERNELS=="1-5"
    SUBSYSTEMS=="usb"
    DRIVERS=="usb"
    ATTRS{bDeviceProtocol}=="02"
    ATTRS{bConfigurationValue}=="1"
    ATTRS{urbnum}=="631"
    ATTRS{bcdDevice}=="9226"
    ATTRS{bDeviceSubClass}=="00"
    ATTRS{busnum}=="1"
    ATTRS{idVendor}=="05e3"
    ATTRS{removable}=="removable"
    ATTRS{authorized}=="1"
    ATTRS{devpath}=="5"
    ATTRS{avoid_reset_quirk}=="0"
    ATTRS{tx_lanes}=="1"
    ATTRS{idProduct}=="0610"
    ATTRS{configuration}==""
    ATTRS{version}==" 2.10"
    ATTRS{bNumInterfaces}==" 1"
    ATTRS{bmAttributes}=="e0"
    ATTRS{manufacturer}=="GenesysLogic"
    ATTRS{devnum}=="2"
    ATTRS{ltm_capable}=="no"
    ATTRS{rx_lanes}=="1"
    ATTRS{bMaxPacketSize0}=="64"
    ATTRS{maxchild}=="4"
    ATTRS{bMaxPower}=="100mA"
    ATTRS{bNumConfigurations}=="1"
    ATTRS{product}=="USB2.0 Hub"
    ATTRS{bDeviceClass}=="09"
    ATTRS{speed}=="480"
    ATTRS{quirks}=="0x0"

  looking at parent device '/devices/pci0000:00/0000:00:14.0/usb1':
    KERNELS=="usb1"
    SUBSYSTEMS=="usb"
    DRIVERS=="usb"
    ATTRS{devnum}=="1"
    ATTRS{bDeviceProtocol}=="01"
    ATTRS{product}=="xHCI Host Controller"
    ATTRS{manufacturer}=="Linux 5.4.0-48-generic xhci-hcd"
    ATTRS{serial}=="0000:00:14.0"
    ATTRS{bNumInterfaces}==" 1"
    ATTRS{bDeviceClass}=="09"
    ATTRS{bMaxPacketSize0}=="64"
    ATTRS{configuration}==""
    ATTRS{authorized}=="1"
    ATTRS{bcdDevice}=="0504"
    ATTRS{devpath}=="0"
    ATTRS{authorized_default}=="1"
    ATTRS{ltm_capable}=="no"
    ATTRS{idProduct}=="0002"
    ATTRS{maxchild}=="16"
    ATTRS{tx_lanes}=="1"
    ATTRS{bConfigurationValue}=="1"
    ATTRS{bMaxPower}=="0mA"
    ATTRS{bmAttributes}=="e0"
    ATTRS{rx_lanes}=="1"
    ATTRS{busnum}=="1"
    ATTRS{urbnum}=="69"
    ATTRS{avoid_reset_quirk}=="0"
    ATTRS{speed}=="480"
    ATTRS{removable}=="unknown"
    ATTRS{version}==" 2.00"
    ATTRS{bDeviceSubClass}=="00"
    ATTRS{bNumConfigurations}=="1"
    ATTRS{interface_authorized_default}=="1"
    ATTRS{quirks}=="0x0"
    ATTRS{idVendor}=="1d6b"

  looking at parent device '/devices/pci0000:00/0000:00:14.0':
    KERNELS=="0000:00:14.0"
    SUBSYSTEMS=="pci"
    DRIVERS=="xhci_hcd"
    ATTRS{local_cpulist}=="0-3"
    ATTRS{d3cold_allowed}=="1"
    ATTRS{msi_bus}=="1"
    ATTRS{consistent_dma_mask_bits}=="64"
    ATTRS{enable}=="1"
    ATTRS{driver_override}=="(null)"
    ATTRS{vendor}=="0x8086"
    ATTRS{device}=="0xa12f"
    ATTRS{subsystem_device}=="0x8694"
    ATTRS{broken_parity_status}=="0"
    ATTRS{numa_node}=="-1"
    ATTRS{subsystem_vendor}=="0x1043"
    ATTRS{dma_mask_bits}=="64"
    ATTRS{irq}=="125"
    ATTRS{local_cpus}=="f"
    ATTRS{dbc}=="disabled"
    ATTRS{ari_enabled}=="0"
    ATTRS{revision}=="0x31"
    ATTRS{class}=="0x0c0330"

  looking at parent device '/devices/pci0000:00':
    KERNELS=="pci0000:00"
    SUBSYSTEMS==""
    DRIVERS==""


Any tips on how to proceed?

Thanks for testing. Unfortunately, I forget to say that the Solaar udev rule needs to be installed.

[From installation.md]

You can install this rule by copying, as root,
rules.d/42-logitech-unify-permissions.rules from Solaar to
/etc/udev/rules.d.
You will probably also have to tell udev to reload its rule via
sudo udevadm control --reload-rules.
And then disconnect (unplug) and reconnect (replug) your receiver.
The output of ls -l /dev/hidrawN (where /dev/hidrawN is the node for your receiver) should have a + after the permissions once you do this.

If you do have permissions on the device node, then what you are seeing is likely caused by trying to write to an interface that does not accept HID++ messages. See if there are other nodes in /dev/hidraw* that correspond to other interfaces for your receiver. (Use the udevadm command on them and look for 046D:0A66.) If not, you are likely out of luck. If there are other nodes, find their bInterfaceNumber and change the number for interface accordingly.

One way to find out which nodes talk HID++ is to send them an HID++ message using ./tools/hidconsole. (But you have to redownload the PR first, as there was a bug in hidconsole.)

Here is what I see with two nodes, one that doesn't talk HID++ and one that does:

idefix Solaar> ./tools/hidconsole /dev/hidraw2
.. Opening device /dev/hidraw2
.. Opened handle 3, vendor b'Logitech' product b'G502 LIGHTSPEED Wireless Gaming Mouse' serial '0x330x460x320x330x380x410x460x360x390x420x390x360x350x440x410x42'.
.. Press ^C/^D to exit, or type hex bytes to write to the device.
?? Input: 10000000000000
<< (   1.792) [10 00 0000 000000] b'\x10\x00\x00\x00\x00\x00\x00'
.. Closing handle 3
Traceback (most recent call last):
  File "./tools/hidconsole", line 22, in <module>
    hidconsole.main()
  File "/home/local/SoftwareDownloads/Solaar/lib/hidapi/hidconsole.py", line 243, in main
    _hid.write(handle, data)
  File "/home/local/SoftwareDownloads/Solaar/lib/hidapi/udev.py", line 336, in write
    raise IOError(_errno.EIO, 'written %d bytes out of expected %d' % (bytes_written, len(data)))
OSError: [Errno 5] written 0 bytes out of expected 7
idefix Solaar> ./tools/hidconsole /dev/hidraw5
.. Opening device /dev/hidraw5
.. Opened handle 3, vendor b'Logitech' product b'G502 LIGHTSPEED Wireless Gaming Mouse' serial '0x330x460x320x330x380x410x460x360x390x420x390x360x350x440x410x42'.
.. Press ^C/^D to exit, or type hex bytes to write to the device.
?? Input: 10000000000000
<< (   3.744) [10 00 0000 000000] b'\x10\x00\x00\x00\x00\x00\x00'
?? Input: >> (   3.746) [11 00 0000 00000100000000000000000000000000] b'\x11\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
?? Input: 
.. Closing handle 3
idefix Solaar> 

Thanks for the tips!

I ran the tests with the udev rules installed, that's all fine.
When performing $ ls -l /dev/hidraw*, the plus does show up on the Logitech devices and I checked with udevadm info /dev/hidraw* that the hidraw device with the VID:PID corresponding to the dongle (046D:0A66) has the correct TAGS added.
I did notice that unlike the G900 mouse, there is only one entry, and there's no entry with a sub VID:PID pair (by sub device I mean this - P: /devices/pci0000:00/0000:00:14.0/usb1/1-5/1-5.1/1-5.1.2/1-5.1.2:1.2/0003:046D:C539.0008/0003:046D:4053.0009/hidraw/hidraw8).

There is only one entry with the VID/PID of the G533 (P: /devices/pci0000:00/0000:00:14.0/usb1/1-5/1-5.1/1-5.1.1/1-5.1.1:1.3/0003:046D:0A66.0004/hidraw/hidraw4)

Attempting the hidconsole (I did fetch & checkout your newest edits and I'm on a8adeb0982e31cd540dd2d75974d837ce6eaeace) trick on the G533 device yielded

$ ./tools/hidconsole /dev/hidraw4
.. Opening device /dev/hidraw4
.. Opened handle 3, vendor b'Logitech' product b'G533 Gaming Headset' serial None.
.. Press ^C/^D to exit, or type hex bytes to write to the device.
?? Input: 1000
<< (   1.400) [10 00  ] b'\x10\x00'
.. Closing handle 3
Traceback (most recent call last):
  File "./tools/hidconsole", line 22, in <module>
    hidconsole.main()
  File "/home/x4c4a/Work/Solaar/lib/hidapi/hidconsole.py", line 243, in main
    _hid.write(handle, data)
  File "/home/x4c4a/Work/Solaar/lib/hidapi/udev.py", line 336, in write
    raise IOError(_errno.EIO, 'written %d bytes out of expected %d' % (bytes_written, len(data)))
OSError: [Errno 5] written 0 bytes out of expected 2

If I try to write it to another of the Logitech hidraw devices (G900 related) I get

$ ./tools/hidconsole /dev/hidraw8
.. Opening device /dev/hidraw8
.. Opened handle 3, vendor b'Logitech' product b'USB Receiver' serial None.
.. Logitech receiver detected, HID++ validation enabled.
.. Press ^C/^D to exit, or type hex bytes to write to the device.
?? Input: 10000000000000
!! Invalid HID++ request: second byte must be 0xFF or one of 0x01..0x06
?? Input: 1000
!! Invalid HID++ request: need at least 4 bytes
?? Input: 
.. Closing handle 3

In one of the devices I get a huge dump of data every once in a while (I presume it's the device talking to the computer), so it seems to work.

Does this mean that the G533 doesn't "talk" via HID++? Is there anything else I should read/check out etc. related to this?

Yes, it seems that the G533 does not do HID++. Or, at least, the interface that is exposed in Linux does not do HID++. There might be a different interface that is not exposed in Linux. I don't know how to explore whether this is the case.

Ok, thank you for the assistance!
I guess this can be closed as Solaar can't support a device that doesn't communicate with it. :/

Yes, unfortunately. If I get some information to the contrary I'll reopen the issue. There is also Issue #272 about other headesets.

And here is some more information.

I looked at the lsusb output for the G533 and there is definitely an HID interface (#3). So modifying the suggestion in Issue #272 to use the USB PID 0a66 will provide evidence about whether this interface talks HID++.

Running with an adjusted PID yields

$ sudo python3 g933battery.py 
Battery:~0% (estimated from:-3/2,6/255) Status: Disconnected

I guess the bitpacking is different. The sound cuts out while I run the command and restarts again after it finished and I need to replug the device for the volume control to start working again.

That's to be expected. The script changes driver settings. The device probably supports different features so their "offset" is different.

The net result is that the G533 can talk HID++ but it is not trivial to set up a driver to send it HID++ commands. I'll see if someone I know can tell me how to get the driver to work.

Was this page helpful?
0 / 5 - 0 ratings