protonscr

Fall back to non-hidraw devices not working for device with multiple input interfaces

protonopen
ValveSoftware/Proton#9034 · opened 2025-09-08 by JacKeTUs · updated 2025-11-09 · 5 comments · github
JJacKeTUs 2025-09-08 github

Hello!
After this commit my pedals (based on Freejoy firmware) stopped being recognized in Proton.

Device has two input interfaces, only one of them is exposing actual axis/buttons. I believe second one is for configuration.

lsusb output
Bus 007 Device 017: ID ddfd:5008 FreeJoy SIMSONN v1.7.1
Negotiated speed: Full Speed (12Mbps)
Device Descriptor:
  bLength                18
  bDescriptorType         1
  bcdUSB               2.00
  bDeviceClass            0 [unknown]
  bDeviceSubClass         0 [unknown]
  bDeviceProtocol         0
  bMaxPacketSize0        64
  idVendor           0xddfd FreeJoy
  idProduct          0x5008 SIMSONN v1.7.1
  bcdDevice            2.00
  iManufacturer           1 FreeJoy
  iProduct                2 SIMSONN v1.7.1
  iSerial                 3
  bNumConfigurations      1
  Configuration Descriptor:
    bLength                 9
    bDescriptorType         2
    wTotalLength       0x0042
    bNumInterfaces          2
    bConfigurationValue     1
    iConfiguration          0
    bmAttributes         0x80
      (Bus Powered)
    MaxPower              100mA
    Interface Descriptor:
      bLength                 9
      bDescriptorType         4
      bInterfaceNumber        0
      bAlternateSetting       0
      bNumEndpoints           1
      bInterfaceClass         3 Human Interface Device
      bInterfaceSubClass      0 [unknown]
      bInterfaceProtocol      0
      iInterface              0
        HID Device Descriptor:
          bLength                 9
          bDescriptorType        33
          bcdHID               1.10
          bCountryCode            0 Not supported
          bNumDescriptors         1
          bDescriptorType        34 (null)
          wDescriptorLength      43
          Report Descriptors:
            ** UNAVAILABLE **
      Endpoint Descriptor:
        bLength                 7
        bDescriptorType         5
        bEndpointAddress     0x81  EP 1 IN
        bmAttributes            3
          Transfer Type            Interrupt
          Synch Type               None
          Usage Type               Data
        wMaxPacketSize     0x0040  1x 64 bytes
        bInterval               1
    Interface Descriptor:
      bLength                 9
      bDescriptorType         4
      bInterfaceNumber        1
      bAlternateSetting       0
      bNumEndpoints           2
      bInterfaceClass         3 Human Interface Device
      bInterfaceSubClass      0 [unknown]
      bInterfaceProtocol      0
      iInterface              0
        HID Device Descriptor:
          bLength                 9
          bDescriptorType        33
          bcdHID               1.10
          bCountryCode            0 Not supported
          bNumDescriptors         1
          bDescriptorType        34 (null)
          wDescriptorLength     122
          Report Descriptors:
            ** UNAVAILABLE **
      Endpoint Descriptor:
        bLength                 7
        bDescriptorType         5
        bEndpointAddress     0x82  EP 2 IN
        bmAttributes            3
          Transfer Type            Interrupt
          Synch Type               None
          Usage Type               Data
        wMaxPacketSize     0x0040  1x 64 bytes
        bInterval               2
      Endpoint Descriptor:
        bLength                 7
        bDescriptorType         5
        bEndpointAddress     0x02  EP 2 OUT
        bmAttributes            3
          Transfer Type            Interrupt
          Synch Type               None
          Usage Type               Data
        wMaxPacketSize     0x0040  1x 64 bytes
        bInterval              16
Device Status:     0x0000
  (Bus Powered)
dmesg output when device is connected
[  +2,482314] usb 7-2.4.3: new full-speed USB device number 17 using xhci_hcd
[  +0,126076] usb 7-2.4.3: New USB device found, idVendor=ddfd, idProduct=5008, bcdDevice= 2.00
[  +0,000005] usb 7-2.4.3: New USB device strings: Mfr=1, Product=2, SerialNumber=3
[  +0,000002] usb 7-2.4.3: Product: SIMSONN v1.7.1
[  +0,000002] usb 7-2.4.3: Manufacturer: FreeJoy
[  +0,132126] input: FreeJoy SIMSONN v1.7.1 as /devices/pci0000:00/0000:00:08.1/0000:0b:00.3/usb7/7-2/7-2.4/7-2.4.3/7-2.4.3:1.0/0003:DDFD:5008.0026/input/input60
[  +0,000149] hid-generic 0003:DDFD:5008.0026: input,hidraw9: USB HID v1.10 Joystick [FreeJoy SIMSONN v1.7.1] on usb-0000:0b:00.3-2.4.3/input0
[  +0,021891] hid-generic 0003:DDFD:5008.0027: hiddev102,hidraw13: USB HID v1.10 Device [FreeJoy SIMSONN v1.7.1] on usb-0000:0b:00.3-2.4.3/input1
rdesc of first interface
# cat /sys/kernel/debug/hid/0003\:DDFD\:5008.0026/rdesc

05 01 09 04 a1 01 85 01 05 09 19 01 29 04 15 00 25 01 75 01 95 08 81 02 05 01 09 30 09 31 16 01 80 26 ff 7f 75 10 95 02 81 02 c0

  INPUT(1)[INPUT]
    Field(0)
      Application(GenericDesktop.Joystick)
      Usage(8)
        Button.0001
        Button.0002
        Button.0003
        Button.0004
        Button.0004
        Button.0004
        Button.0004
        Button.0004
      Logical Minimum(0)
      Logical Maximum(1)
      Report Size(1)
      Report Count(8)
      Report Offset(0)
      Flags( Variable Absolute )
    Field(1)
      Application(GenericDesktop.Joystick)
      Usage(2)
        GenericDesktop.X
        GenericDesktop.Y
      Logical Minimum(-32767)
      Logical Maximum(32767)
      Report Size(16)
      Report Count(2)
      Report Offset(8)
      Flags( Variable Absolute )

Button.0001 ---> Key.Trigger
Button.0002 ---> Key.ThumbBtn
Button.0003 ---> Key.ThumbBtn2
Button.0004 ---> Key.TopBtn
Button.0004 ---> Sync.Report
Button.0004 ---> Sync.Report
Button.0004 ---> Sync.Report
Button.0004 ---> Sync.Report
GenericDesktop.X ---> Absolute.X
GenericDesktop.Y ---> Absolute.Y
rdesc of second interface
# cat /sys/kernel/debug/hid/0003\:DDFD\:5008.0027/rdesc

06 00 ff 09 01 a1 01 85 02 06 00 ff 09 02 15 00 26 ff 00 75 08 95 3f 81 00 09 03 75 08 95 01 91 00 85 03 06 00 ff 09 04 15 00 26 ff 00 75 08 95 3f 81 00 09 05 75 08 95 01 91 00 85 04 09 06 75 08 95 01 81 00 09 07 75 08 95 3f 91 00 85 05 09 08 75 08 95 02 81 00 09 09 75 08 95 3f 91 00 85 06 06 00 ff 09 0a 15 00 26 ff 00 75 08 95 3f 81 00 09 0b 75 08 95 3f 91 00 c0

  INPUT(2)[INPUT]
    Field(0)
      Application(ff00.0001)
      Usage(63)
        ff00.0002
        ff00.0002
        ff00.0002
        ff00.0002
        ff00.0002
        ff00.0002
        ff00.0002
        ff00.0002
        ff00.0002
        ff00.0002
        ff00.0002
        ff00.0002
        ff00.0002
        ff00.0002
        ff00.0002
        ff00.0002
        ff00.0002
        ff00.0002
        ff00.0002
        ff00.0002
        ff00.0002
        ff00.0002
        ff00.0002
        ff00.0002
        ff00.0002
        ff00.0002
        ff00.0002
        ff00.0002
        ff00.0002
        ff00.0002
        ff00.0002
        ff00.0002
        ff00.0002
        ff00.0002
        ff00.0002
        ff00.0002
        ff00.0002
        ff00.0002
        ff00.0002
        ff00.0002
        ff00.0002
        ff00.0002
        ff00.0002
        ff00.0002
        ff00.0002
        ff00.0002
        ff00.0002
        ff00.0002
        ff00.0002
        ff00.0002
        ff00.0002
        ff00.0002
        ff00.0002
        ff00.0002
        ff00.0002
        ff00.0002
        ff00.0002
        ff00.0002
        ff00.0002
        ff00.0002
        ff00.0002
        ff00.0002
        ff00.0002
      Logical Minimum(0)
      Logical Maximum(255)
      Report Size(8)
      Report Count(63)
      Report Offset(0)
      Flags( Array Absolute )
  INPUT(3)[INPUT]
    Field(0)
      Application(ff00.0001)
      Usage(63)
        ff00.0004
        ff00.0004
        ff00.0004
        ff00.0004
        ff00.0004
        ff00.0004
        ff00.0004
        ff00.0004
        ff00.0004
        ff00.0004
        ff00.0004
        ff00.0004
        ff00.0004
        ff00.0004
        ff00.0004
        ff00.0004
        ff00.0004
        ff00.0004
        ff00.0004
        ff00.0004
        ff00.0004
        ff00.0004
        ff00.0004
        ff00.0004
        ff00.0004
        ff00.0004
        ff00.0004
        ff00.0004
        ff00.0004
        ff00.0004
        ff00.0004
        ff00.0004
        ff00.0004
        ff00.0004
        ff00.0004
        ff00.0004
        ff00.0004
        ff00.0004
        ff00.0004
        ff00.0004
        ff00.0004
        ff00.0004
        ff00.0004
        ff00.0004
        ff00.0004
        ff00.0004
        ff00.0004
        ff00.0004
        ff00.0004
        ff00.0004
        ff00.0004
        ff00.0004
        ff00.0004
        ff00.0004
        ff00.0004
        ff00.0004
        ff00.0004
        ff00.0004
        ff00.0004
        ff00.0004
        ff00.0004
        ff00.0004
        ff00.0004
      Logical Minimum(0)
      Logical Maximum(255)
      Report Size(8)
      Report Count(63)
      Report Offset(0)
      Flags( Array Absolute )
  INPUT(4)[INPUT]
    Field(0)
      Application(ff00.0001)
      Usage(1)
        ff00.0006
      Logical Minimum(0)
      Logical Maximum(255)
      Report Size(8)
      Report Count(1)
      Report Offset(0)
      Flags( Array Absolute )
  INPUT(5)[INPUT]
    Field(0)
      Application(ff00.0001)
      Usage(2)
        ff00.0008
        ff00.0008
      Logical Minimum(0)
      Logical Maximum(255)
      Report Size(8)
      Report Count(2)
      Report Offset(0)
      Flags( Array Absolute )
  INPUT(6)[INPUT]
    Field(0)
      Application(ff00.0001)
      Usage(63)
        ff00.000a
        ff00.000a
        ff00.000a
        ff00.000a
        ff00.000a
        ff00.000a
        ff00.000a
        ff00.000a
        ff00.000a
        ff00.000a
        ff00.000a
        ff00.000a
        ff00.000a
        ff00.000a
        ff00.000a
        ff00.000a
        ff00.000a
        ff00.000a
        ff00.000a
        ff00.000a
        ff00.000a
        ff00.000a
        ff00.000a
        ff00.000a
        ff00.000a
        ff00.000a
        ff00.000a
        ff00.000a
        ff00.000a
        ff00.000a
        ff00.000a
        ff00.000a
        ff00.000a
        ff00.000a
        ff00.000a
        ff00.000a
        ff00.000a
        ff00.000a
        ff00.000a
        ff00.000a
        ff00.000a
        ff00.000a
        ff00.000a
        ff00.000a
        ff00.000a
        ff00.000a
        ff00.000a
        ff00.000a
        ff00.000a
        ff00.000a
        ff00.000a
        ff00.000a
        ff00.000a
        ff00.000a
        ff00.000a
        ff00.000a
        ff00.000a
        ff00.000a
        ff00.000a
        ff00.000a
        ff00.000a
        ff00.000a
        ff00.000a
      Logical Minimum(0)
      Logical Maximum(255)
      Report Size(8)
      Report Count(63)
      Report Offset(0)
      Flags( Array Absolute )
  OUTPUT(2)[OUTPUT]
    Field(0)
      Application(ff00.0001)
      Usage(1)
        ff00.0003
      Logical Minimum(0)
      Logical Maximum(255)
      Report Size(8)
      Report Count(1)
      Report Offset(0)
      Flags( Array Absolute )
  OUTPUT(3)[OUTPUT]
    Field(0)
      Application(ff00.0001)
      Usage(1)
        ff00.0005
      Logical Minimum(0)
      Logical Maximum(255)
      Report Size(8)
      Report Count(1)
      Report Offset(0)
      Flags( Array Absolute )
  OUTPUT(4)[OUTPUT]
    Field(0)
      Application(ff00.0001)
      Usage(63)
        ff00.0007
        ff00.0007
        ff00.0007
        ff00.0007
        ff00.0007
        ff00.0007
        ff00.0007
        ff00.0007
        ff00.0007
        ff00.0007
        ff00.0007
        ff00.0007
        ff00.0007
        ff00.0007
        ff00.0007
        ff00.0007
        ff00.0007
        ff00.0007
        ff00.0007
        ff00.0007
        ff00.0007
        ff00.0007
        ff00.0007
        ff00.0007
        ff00.0007
        ff00.0007
        ff00.0007
        ff00.0007
        ff00.0007
        ff00.0007
        ff00.0007
        ff00.0007
        ff00.0007
        ff00.0007
        ff00.0007
        ff00.0007
        ff00.0007
        ff00.0007
        ff00.0007
        ff00.0007
        ff00.0007
        ff00.0007
        ff00.0007
        ff00.0007
        ff00.0007
        ff00.0007
        ff00.0007
        ff00.0007
        ff00.0007
        ff00.0007
        ff00.0007
        ff00.0007
        ff00.0007
        ff00.0007
        ff00.0007
        ff00.0007
        ff00.0007
        ff00.0007
        ff00.0007
        ff00.0007
        ff00.0007
        ff00.0007
        ff00.0007
      Logical Minimum(0)
      Logical Maximum(255)
      Report Size(8)
      Report Count(63)
      Report Offset(0)
      Flags( Array Absolute )
  OUTPUT(5)[OUTPUT]
    Field(0)
      Application(ff00.0001)
      Usage(63)
        ff00.0009
        ff00.0009
        ff00.0009
        ff00.0009
        ff00.0009
        ff00.0009
        ff00.0009
        ff00.0009
        ff00.0009
        ff00.0009
        ff00.0009
        ff00.0009
        ff00.0009
        ff00.0009
        ff00.0009
        ff00.0009
        ff00.0009
        ff00.0009
        ff00.0009
        ff00.0009
        ff00.0009
        ff00.0009
        ff00.0009
        ff00.0009
        ff00.0009
        ff00.0009
        ff00.0009
        ff00.0009
        ff00.0009
        ff00.0009
        ff00.0009
        ff00.0009
        ff00.0009
        ff00.0009
        ff00.0009
        ff00.0009
        ff00.0009
        ff00.0009
        ff00.0009
        ff00.0009
        ff00.0009
        ff00.0009
        ff00.0009
        ff00.0009
        ff00.0009
        ff00.0009
        ff00.0009
        ff00.0009
        ff00.0009
        ff00.0009
        ff00.0009
        ff00.0009
        ff00.0009
        ff00.0009
        ff00.0009
        ff00.0009
        ff00.0009
        ff00.0009
        ff00.0009
        ff00.0009
        ff00.0009
        ff00.0009
        ff00.0009
      Logical Minimum(0)
      Logical Maximum(255)
      Report Size(8)
      Report Count(63)
      Report Offset(0)
      Flags( Array Absolute )
  OUTPUT(6)[OUTPUT]
    Field(0)
      Application(ff00.0001)
      Usage(63)
        ff00.000b
        ff00.000b
        ff00.000b
        ff00.000b
        ff00.000b
        ff00.000b
        ff00.000b
        ff00.000b
        ff00.000b
        ff00.000b
        ff00.000b
        ff00.000b
        ff00.000b
        ff00.000b
        ff00.000b
        ff00.000b
        ff00.000b
        ff00.000b
        ff00.000b
        ff00.000b
        ff00.000b
        ff00.000b
        ff00.000b
        ff00.000b
        ff00.000b
        ff00.000b
        ff00.000b
        ff00.000b
        ff00.000b
        ff00.000b
        ff00.000b
        ff00.000b
        ff00.000b
        ff00.000b
        ff00.000b
        ff00.000b
        ff00.000b
        ff00.000b
        ff00.000b
        ff00.000b
        ff00.000b
        ff00.000b
        ff00.000b
        ff00.000b
        ff00.000b
        ff00.000b
        ff00.000b
        ff00.000b
        ff00.000b
        ff00.000b
        ff00.000b
        ff00.000b
        ff00.000b
        ff00.000b
        ff00.000b
        ff00.000b
        ff00.000b
        ff00.000b
        ff00.000b
        ff00.000b
        ff00.000b
        ff00.000b
        ff00.000b
      Logical Minimum(0)
      Logical Maximum(255)
      Report Size(8)
      Report Count(63)
      Report Offset(0)
      Flags( Array Absolute )

ff00.0002 ---> Sync.Report
ff00.0002 ---> Sync.Report
ff00.0002 ---> Sync.Report
ff00.0002 ---> Sync.Report
ff00.0002 ---> Sync.Report
ff00.0002 ---> Sync.Report
ff00.0002 ---> Sync.Report
ff00.0002 ---> Sync.Report
ff00.0002 ---> Sync.Report
ff00.0002 ---> Sync.Report
ff00.0002 ---> Sync.Report
ff00.0002 ---> Sync.Report
ff00.0002 ---> Sync.Report
ff00.0002 ---> Sync.Report
ff00.0002 ---> Sync.Report
ff00.0002 ---> Sync.Report
ff00.0002 ---> Sync.Report
ff00.0002 ---> Sync.Report
ff00.0002 ---> Sync.Report
ff00.0002 ---> Sync.Report
ff00.0002 ---> Sync.Report
ff00.0002 ---> Sync.Report
ff00.0002 ---> Sync.Report
ff00.0002 ---> Sync.Report
ff00.0002 ---> Sync.Report
ff00.0002 ---> Sync.Report
ff00.0002 ---> Sync.Report
ff00.0002 ---> Sync.Report
ff00.0002 ---> Sync.Report
ff00.0002 ---> Sync.Report
ff00.0002 ---> Sync.Report
ff00.0002 ---> Sync.Report
ff00.0002 ---> Sync.Report
ff00.0002 ---> Sync.Report
ff00.0002 ---> Sync.Report
ff00.0002 ---> Sync.Report
ff00.0002 ---> Sync.Report
ff00.0002 ---> Sync.Report
ff00.0002 ---> Sync.Report
ff00.0002 ---> Sync.Report
ff00.0002 ---> Sync.Report
ff00.0002 ---> Sync.Report
ff00.0002 ---> Sync.Report
ff00.0002 ---> Sync.Report
ff00.0002 ---> Sync.Report
ff00.0002 ---> Sync.Report
ff00.0002 ---> Sync.Report
ff00.0002 ---> Sync.Report
ff00.0002 ---> Sync.Report
ff00.0002 ---> Sync.Report
ff00.0002 ---> Sync.Report
ff00.0002 ---> Sync.Report
ff00.0002 ---> Sync.Report
ff00.0002 ---> Sync.Report
ff00.0002 ---> Sync.Report
ff00.0002 ---> Sync.Report
ff00.0002 ---> Sync.Report
ff00.0002 ---> Sync.Report
ff00.0002 ---> Sync.Report
ff00.0002 ---> Sync.Report
ff00.0002 ---> Sync.Report
ff00.0002 ---> Sync.Report
ff00.0002 ---> Sync.Report
ff00.0004 ---> Sync.Report
ff00.0004 ---> Sync.Report
ff00.0004 ---> Sync.Report
ff00.0004 ---> Sync.Report
ff00.0004 ---> Sync.Report
ff00.0004 ---> Sync.Report
ff00.0004 ---> Sync.Report
ff00.0004 ---> Sync.Report
ff00.0004 ---> Sync.Report
ff00.0004 ---> Sync.Report
ff00.0004 ---> Sync.Report
ff00.0004 ---> Sync.Report
ff00.0004 ---> Sync.Report
ff00.0004 ---> Sync.Report
ff00.0004 ---> Sync.Report
ff00.0004 ---> Sync.Report
ff00.0004 ---> Sync.Report
ff00.0004 ---> Sync.Report
ff00.0004 ---> Sync.Report
ff00.0004 ---> Sync.Report
ff00.0004 ---> Sync.Report
ff00.0004 ---> Sync.Report
ff00.0004 ---> Sync.Report
ff00.0004 ---> Sync.Report
ff00.0004 ---> Sync.Report
ff00.0004 ---> Sync.Report
ff00.0004 ---> Sync.Report
ff00.0004 ---> Sync.Report
ff00.0004 ---> Sync.Report
ff00.0004 ---> Sync.Report
ff00.0004 ---> Sync.Report
ff00.0004 ---> Sync.Report
ff00.0004 ---> Sync.Report
ff00.0004 ---> Sync.Report
ff00.0004 ---> Sync.Report
ff00.0004 ---> Sync.Report
ff00.0004 ---> Sync.Report
ff00.0004 ---> Sync.Report
ff00.0004 ---> Sync.Report
ff00.0004 ---> Sync.Report
ff00.0004 ---> Sync.Report
ff00.0004 ---> Sync.Report
ff00.0004 ---> Sync.Report
ff00.0004 ---> Sync.Report
ff00.0004 ---> Sync.Report
ff00.0004 ---> Sync.Report
ff00.0004 ---> Sync.Report
ff00.0004 ---> Sync.Report
ff00.0004 ---> Sync.Report
ff00.0004 ---> Sync.Report
ff00.0004 ---> Sync.Report
ff00.0004 ---> Sync.Report
ff00.0004 ---> Sync.Report
ff00.0004 ---> Sync.Report
ff00.0004 ---> Sync.Report
ff00.0004 ---> Sync.Report
ff00.0004 ---> Sync.Report
ff00.0004 ---> Sync.Report
ff00.0004 ---> Sync.Report
ff00.0004 ---> Sync.Report
ff00.0004 ---> Sync.Report
ff00.0004 ---> Sync.Report
ff00.0004 ---> Sync.Report
ff00.0006 ---> Sync.Report
ff00.0008 ---> Sync.Report
ff00.0008 ---> Sync.Report
ff00.000a ---> Sync.Report
ff00.000a ---> Sync.Report
ff00.000a ---> Sync.Report
ff00.000a ---> Sync.Report
ff00.000a ---> Sync.Report
ff00.000a ---> Sync.Report
ff00.000a ---> Sync.Report
ff00.000a ---> Sync.Report
ff00.000a ---> Sync.Report
ff00.000a ---> Sync.Report
ff00.000a ---> Sync.Report
ff00.000a ---> Sync.Report
ff00.000a ---> Sync.Report
ff00.000a ---> Sync.Report
ff00.000a ---> Sync.Report
ff00.000a ---> Sync.Report
ff00.000a ---> Sync.Report
ff00.000a ---> Sync.Report
ff00.000a ---> Sync.Report
ff00.000a ---> Sync.Report
ff00.000a ---> Sync.Report
ff00.000a ---> Sync.Report
ff00.000a ---> Sync.Report
ff00.000a ---> Sync.Report
ff00.000a ---> Sync.Report
ff00.000a ---> Sync.Report
ff00.000a ---> Sync.Report
ff00.000a ---> Sync.Report
ff00.000a ---> Sync.Report
ff00.000a ---> Sync.Report
ff00.000a ---> Sync.Report
ff00.000a ---> Sync.Report
ff00.000a ---> Sync.Report
ff00.000a ---> Sync.Report
ff00.000a ---> Sync.Report
ff00.000a ---> Sync.Report
ff00.000a ---> Sync.Report
ff00.000a ---> Sync.Report
ff00.000a ---> Sync.Report
ff00.000a ---> Sync.Report
ff00.000a ---> Sync.Report
ff00.000a ---> Sync.Report
ff00.000a ---> Sync.Report
ff00.000a ---> Sync.Report
ff00.000a ---> Sync.Report
ff00.000a ---> Sync.Report
ff00.000a ---> Sync.Report
ff00.000a ---> Sync.Report
ff00.000a ---> Sync.Report
ff00.000a ---> Sync.Report
ff00.000a ---> Sync.Report
ff00.000a ---> Sync.Report
ff00.000a ---> Sync.Report
ff00.000a ---> Sync.Report
ff00.000a ---> Sync.Report
ff00.000a ---> Sync.Report
ff00.000a ---> Sync.Report
ff00.000a ---> Sync.Report
ff00.000a ---> Sync.Report
ff00.000a ---> Sync.Report
ff00.000a ---> Sync.Report
ff00.000a ---> Sync.Report
ff00.000a ---> Sync.Report
ff00.0003 ---> Sync.Report
ff00.0005 ---> Sync.Report
ff00.0007 ---> Sync.Report
ff00.0007 ---> Sync.Report
ff00.0007 ---> Sync.Report
ff00.0007 ---> Sync.Report
ff00.0007 ---> Sync.Report
ff00.0007 ---> Sync.Report
ff00.0007 ---> Sync.Report
ff00.0007 ---> Sync.Report
ff00.0007 ---> Sync.Report
ff00.0007 ---> Sync.Report
ff00.0007 ---> Sync.Report
ff00.0007 ---> Sync.Report
ff00.0007 ---> Sync.Report
ff00.0007 ---> Sync.Report
ff00.0007 ---> Sync.Report
ff00.0007 ---> Sync.Report
ff00.0007 ---> Sync.Report
ff00.0007 ---> Sync.Report
ff00.0007 ---> Sync.Report
ff00.0007 ---> Sync.Report
ff00.0007 ---> Sync.Report
ff00.0007 ---> Sync.Report
ff00.0007 ---> Sync.Report
ff00.0007 ---> Sync.Report
ff00.0007 ---> Sync.Report
ff00.0007 ---> Sync.Report
ff00.0007 ---> Sync.Report
ff00.0007 ---> Sync.Report
ff00.0007 ---> Sync.Report
ff00.0007 ---> Sync.Report
ff00.0007 ---> Sync.Report
ff00.0007 ---> Sync.Report
ff00.0007 ---> Sync.Report
ff00.0007 ---> Sync.Report
ff00.0007 ---> Sync.Report
ff00.0007 ---> Sync.Report
ff00.0007 ---> Sync.Report
ff00.0007 ---> Sync.Report
ff00.0007 ---> Sync.Report
ff00.0007 ---> Sync.Report
ff00.0007 ---> Sync.Report
ff00.0007 ---> Sync.Report
ff00.0007 ---> Sync.Report
ff00.0007 ---> Sync.Report
ff00.0007 ---> Sync.Report
ff00.0007 ---> Sync.Report
ff00.0007 ---> Sync.Report
ff00.0007 ---> Sync.Report
ff00.0007 ---> Sync.Report
ff00.0007 ---> Sync.Report
ff00.0007 ---> Sync.Report
ff00.0007 ---> Sync.Report
ff00.0007 ---> Sync.Report
ff00.0007 ---> Sync.Report
ff00.0007 ---> Sync.Report
ff00.0007 ---> Sync.Report
ff00.0007 ---> Sync.Report
ff00.0007 ---> Sync.Report
ff00.0007 ---> Sync.Report
ff00.0007 ---> Sync.Report
ff00.0007 ---> Sync.Report
ff00.0007 ---> Sync.Report
ff00.0007 ---> Sync.Report
ff00.0009 ---> Sync.Report
ff00.0009 ---> Sync.Report
ff00.0009 ---> Sync.Report
ff00.0009 ---> Sync.Report
ff00.0009 ---> Sync.Report
ff00.0009 ---> Sync.Report
ff00.0009 ---> Sync.Report
ff00.0009 ---> Sync.Report
ff00.0009 ---> Sync.Report
ff00.0009 ---> Sync.Report
ff00.0009 ---> Sync.Report
ff00.0009 ---> Sync.Report
ff00.0009 ---> Sync.Report
ff00.0009 ---> Sync.Report
ff00.0009 ---> Sync.Report
ff00.0009 ---> Sync.Report
ff00.0009 ---> Sync.Report
ff00.0009 ---> Sync.Report
ff00.0009 ---> Sync.Report
ff00.0009 ---> Sync.Report
ff00.0009 ---> Sync.Report
ff00.0009 ---> Sync.Report
ff00.0009 ---> Sync.Report
ff00.0009 ---> Sync.Report
ff00.0009 ---> Sync.Report
ff00.0009 ---> Sync.Report
ff00.0009 ---> Sync.Report
ff00.0009 ---> Sync.Report
ff00.0009 ---> Sync.Report
ff00.0009 ---> Sync.Report
ff00.0009 ---> Sync.Report
ff00.0009 ---> Sync.Report
ff00.0009 ---> Sync.Report
ff00.0009 ---> Sync.Report
ff00.0009 ---> Sync.Report
ff00.0009 ---> Sync.Report
ff00.0009 ---> Sync.Report
ff00.0009 ---> Sync.Report
ff00.0009 ---> Sync.Report
ff00.0009 ---> Sync.Report
ff00.0009 ---> Sync.Report
ff00.0009 ---> Sync.Report
ff00.0009 ---> Sync.Report
ff00.0009 ---> Sync.Report
ff00.0009 ---> Sync.Report
ff00.0009 ---> Sync.Report
ff00.0009 ---> Sync.Report
ff00.0009 ---> Sync.Report
ff00.0009 ---> Sync.Report
ff00.0009 ---> Sync.Report
ff00.0009 ---> Sync.Report
ff00.0009 ---> Sync.Report
ff00.0009 ---> Sync.Report
ff00.0009 ---> Sync.Report
ff00.0009 ---> Sync.Report
ff00.0009 ---> Sync.Report
ff00.0009 ---> Sync.Report
ff00.0009 ---> Sync.Report
ff00.0009 ---> Sync.Report
ff00.0009 ---> Sync.Report
ff00.0009 ---> Sync.Report
ff00.0009 ---> Sync.Report
ff00.0009 ---> Sync.Report
ff00.000b ---> Sync.Report
ff00.000b ---> Sync.Report
ff00.000b ---> Sync.Report
ff00.000b ---> Sync.Report
ff00.000b ---> Sync.Report
ff00.000b ---> Sync.Report
ff00.000b ---> Sync.Report
ff00.000b ---> Sync.Report
ff00.000b ---> Sync.Report
ff00.000b ---> Sync.Report
ff00.000b ---> Sync.Report
ff00.000b ---> Sync.Report
ff00.000b ---> Sync.Report
ff00.000b ---> Sync.Report
ff00.000b ---> Sync.Report
ff00.000b ---> Sync.Report
ff00.000b ---> Sync.Report
ff00.000b ---> Sync.Report
ff00.000b ---> Sync.Report
ff00.000b ---> Sync.Report
ff00.000b ---> Sync.Report
ff00.000b ---> Sync.Report
ff00.000b ---> Sync.Report
ff00.000b ---> Sync.Report
ff00.000b ---> Sync.Report
ff00.000b ---> Sync.Report
ff00.000b ---> Sync.Report
ff00.000b ---> Sync.Report
ff00.000b ---> Sync.Report
ff00.000b ---> Sync.Report
ff00.000b ---> Sync.Report
ff00.000b ---> Sync.Report
ff00.000b ---> Sync.Report
ff00.000b ---> Sync.Report
ff00.000b ---> Sync.Report
ff00.000b ---> Sync.Report
ff00.000b ---> Sync.Report
ff00.000b ---> Sync.Report
ff00.000b ---> Sync.Report
ff00.000b ---> Sync.Report
ff00.000b ---> Sync.Report
ff00.000b ---> Sync.Report
ff00.000b ---> Sync.Report
ff00.000b ---> Sync.Report
ff00.000b ---> Sync.Report
ff00.000b ---> Sync.Report
ff00.000b ---> Sync.Report
ff00.000b ---> Sync.Report
ff00.000b ---> Sync.Report
ff00.000b ---> Sync.Report
ff00.000b ---> Sync.Report
ff00.000b ---> Sync.Report
ff00.000b ---> Sync.Report
ff00.000b ---> Sync.Report
ff00.000b ---> Sync.Report
ff00.000b ---> Sync.Report
ff00.000b ---> Sync.Report
ff00.000b ---> Sync.Report
ff00.000b ---> Sync.Report
ff00.000b ---> Sync.Report
ff00.000b ---> Sync.Report
ff00.000b ---> Sync.Report
ff00.000b ---> Sync.Report

I tested it just launching wine control joy.cpl, without enabling hidraw.
With older Proton build all controllers, including pedals, shows up just fine without enabling hidraw, but with current build (specifically after this commit) pedals are absent. If i enable hidraw, pedals will show up and will be available to the games, but it's not the default setting, and vid/pid can be easily changed from FreeJoy configurator, so whitelisting like this is not preferable.

Log with WINEDEBUG="+hid": pedals.log

In pedals.log i can see these two lines, when udev bus is initializing:

00bc:trace:hid:udev_add_device dev 0x7f0d1c008ed0, node "/dev/hidraw14", desc {vid ddfd, pid 5008, version 0200, input 1, uid 00000000, is_gamepad 0, is_hidraw 1, is_bluetooth 0}.
...
00bc:trace:hid:udev_add_device dev 0x7f0d1c0091c0, node "/dev/hidraw13", desc {vid ddfd, pid 5008, version 0200, input 0, uid 00000000, is_gamepad 0, is_hidraw 1, is_bluetooth 0}.

And later, when sdl bus is initializing, these:

00c0:trace:hid:sdl_add_device joystick id 3, axis_offset 0, desc {vid ddfd, pid 5008, version 0110, input -1, uid 00000000, is_gamepad 0, is_hidraw 0, is_bluetooth 0}.
...
00c0:warn:hid:bus_main_thread failed to create device for L"SDL" bus device 0x7f0d1005a980

Right now it looks like it affects all controllers with multiple input interfaces (every freejoy based diy controller?), with Proton Experimental and newer.

Ssrounce 2025-10-19 github

Paging @ivyl

This has broken quite a lot of sim racing peripherals

Iivyl 2025-10-20 github

Thanks for the poke. I've missed the email about the original reports.

I'm looking into this. The behavior change was supposed to make the hotas / racing devices that we enabled hidraw for work in the first place, without the need to have the hidraw uaccess udev rules as that was a regression vs Proton 9.

Having the same the same device having 2 USB interface descriptors both exposing hidraw devices is not something any of my input devices has.

Iivyl 2025-10-20 github

@JacKeTUs can you try the following patch?

0001-fixup-HACK-winebus.sys-Fall-back-to-non-hidraw-devic.patch

The issue seems to be that the device exposes 2 different interfaces, both are HID. One of them has a vendor specific HID usage page + usage (ff00:0001). Since it's not a generic joystick/gamped we enable hidraw for it:

    if (usages->UsagePage != HID_USAGE_PAGE_GENERIC) return TRUE;
    if (usages->Usage == HID_USAGE_GENERIC_MOUSE || usages->Usage == HID_USAGE_GENERIC_KEYBOARD)
    {
        WARN("Ignoring unsupported %04X:%04X hidraw mouse/keyboard\n", vid, pid);
        return FALSE;
    }
    if (usages->Usage != HID_USAGE_GENERIC_GAMEPAD && usages->Usage != HID_USAGE_GENERIC_JOYSTICK) return TRUE;

Then when we are trying to create the SDL backend for the controller part of the device we fail as there's already a hidraw device with given vid and pid.

I've made this logic a bit smarter and check if we should even look for hidraw device in the first place.

I don't have anything that would be affected so I would appreciate if you could give this a spin.

Are there any affordable devices that I could buy for future testing?

JJacKeTUs 2025-10-20 github

@ivyl thank you for the patch, will test it soon!

Are there any affordable devices that I could buy for future testing?

You can get 'Blue pill' - STM32F103C8 based board, it will be perfect for FreeJoy. They are widely available (amazon link, ~15$; aliexpress link, ~3$). You will need ST-LINK programmer (or USB-TTL) for flashing FreeJoy firmware onto it, but sellers often include it as option.

Also you can get control box for these kind of pedals separately (aliexpress link, ~30$ without delivery), but they could vary in versions/revisions...

JJacKeTUs 2025-11-09 github

@ivyl finally got to test this patch, sorry it took so long.

With patched build pedals are detected and i had no issues with them!

Anything specific i can test? Enabling/disabling hidraw,sdl?

Proton versions

Launch options