Logitech G29 Steering Wheel

I’m trying, and failing, to get my Logitech G29 steering wheel work on Manjaro.

The device is being detected:
$ lsusb -v -d 046d:c294

Bus 001 Device 106: ID 046d:c294 Logitech, Inc. Driving Force
Couldn't open device, some information will be missing
Device Descriptor:
  bLength                18
  bDescriptorType         1
  bcdUSB               2.00
  bDeviceClass            0 
  bDeviceSubClass         0 
  bDeviceProtocol         0 
  bMaxPacketSize0        16
  idVendor           0x046d Logitech, Inc.
  idProduct          0xc294 Driving Force
  bcdDevice           13.50
  iManufacturer           1 Logitech
  iProduct                2 G29 Driving Force Racing Wheel
  iSerial                 0 
  bNumConfigurations      1
  Configuration Descriptor:
    bLength                 9
    bDescriptorType         2
    wTotalLength       0x0029
    bNumInterfaces          1
    bConfigurationValue     1
    iConfiguration          4 
    bmAttributes         0x80
      (Bus Powered)
    MaxPower               98mA
    Interface Descriptor:
      bLength                 9
      bDescriptorType         4
      bInterfaceNumber        0
      bAlternateSetting       0
      bNumEndpoints           2
      bInterfaceClass         3 Human Interface Device
      bInterfaceSubClass      0 
      bInterfaceProtocol      0 
      iInterface              0 
        HID Device Descriptor:
          bLength                 9
          bDescriptorType        33
          bcdHID               1.00
          bCountryCode           33 US
          bNumDescriptors         1
          bDescriptorType        34 Report
          wDescriptorLength     157
         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              10
      Endpoint Descriptor:
        bLength                 7
        bDescriptorType         5
        bEndpointAddress     0x01  EP 1 OUT
        bmAttributes            3
          Transfer Type            Interrupt
          Synch Type               None
          Usage Type               Data
        wMaxPacketSize     0x0010  1x 16 bytes
        bInterval              10

However, the device is not appearing under /dev/input/by-id/ and is not appearing in the Manjaro game controllers application, Oversteer or jstest.

I’ve read various articles, mostly aimed at Ubuntu about needing to switch from ps3 mode to HID mode. I tried using the config for g920:

# Logitech G920 Racing Wheel
DefaultVendor=046d
DefaultProduct=c294
MessageEndpoint=01
ResponseEndpoint=01
TargetClass=0x03
MessageContent="0f00010142"

Unfortunately I couldn’t find anything for the G29. The above config did nothing.

I’ve also read about a need to force the device into pretending to be a G27. To that end I’ve tried adding the following to /etc/udev/rules.d/90-logitech-g29.rules:

SUBSYSTEM=="input", ATTRS{idVendor}=="046d", ATTRS{idProduct}=="0294", MODE="0664", GROUP="plugdev", SYMLINK+="logitech_g29", RUN+="/home/richard/.local/g29config"

with the script is calls being:

#!/bin/bash
#
# Logitech G29 Udev initialization script.
# Run by udev to modify the alternate mode and sets the range.
# Change the ALTERNAME_MODE and RANGE values at the top of the script as desired.
#
# note, at first the device appears as a G29, but when changed to G27 the device id changes as does the driver folder
# eg
#   /sys/bus/hid/drivers/logitech/0003:046D:C24F.0033
# gets changed to
#   /sys/bus/hid/drivers/logitech/0003:046D:C29B.0035
# after changing the mode to G27

# User modifiable variables

# Define what mode to use
# cat alternate_modes for a full list of options:
# eg cat /sys/bus/hid/drivers/logitech/0003:046D:C24F.0033/altername_modes
ALTERNAME_MODE=G27
# steering wheel range
RANGE=540


# expected location of driver files, you should not have to change this more than once
logitechRoot=/sys/bus/hid/drivers/logitech

# make sure the logitechRoot exists or else we might royally screw up stuff later.
if [ ! -d "$logitechRoot" ]
then
  # echo no directory with $logitechRoot
  exit -1
fi

# initially, the device appears as a G29, i.e. C24F
g29device=$(find $logitechRoot -iname "*0294*")

# optional, write the location to a user location for debugging.
echo "G29: " $g29device >> /home/richard/logitechDevices


# if the g29 directory exists,
if [ -d "$g29device" ]
then
    # then change it to a g27
    echo $ALTERNAME_MODE > $g29device/alternate_modes
    # wait a bit for the driver to change the device
    sleep 1
fi

# once we set the mode to G27, the id changes from C24F to C29B as does the location of the files
g27device=$(find $logitechRoot -iname "*C29B*")

# optional, write the location to a user location for debugging.
echo "G27: " $g27device >> /home/richard/logitechDevices

# if the g27 device doesn't exist, exit
# *******************    don't screw this up!!! ****************
# If g27device isn't defined, you will chgrp/chmod your / directory recursively.
if [ ! -d "$g27device" ]
then
  echo no directory with C29B in $logitechRoot >> /home/richard/logitechDevices
  exit -1
fi

# echo found directory $g27device
# controls steering range
echo $RANGE > $g27device/range
# modify permissions so plugdev users can change settings
chgrp plugdev $g27device/* -R
chmod g+rw    $g27device/* -R

From what I can tell, the issue seems to be that the device isn’t getting mapped to /sys/bus/hid/drivers. There are some Logitech directories in there but the G29 device does not appear in there.

$ ls /sys/bus/hid/drivers
hid-generic  hid-steam  logitech-djreceiver  logitech-hidpp-device

nor is it showing in /dev/input

$ ls /dev/input/by-id
usb-Logitech_G533_Gaming_Headset-event-if03  usb-Logitech_USB_Receiver-if01-event-mouse  usb-Logitech_USB_Receiver-if02-event-kbd    usb-Logitech_USB_Receiver-if02-mouse             usb-Valve_Software_Steam_Controller-mouse
usb-Logitech_USB_Receiver-event-if02         usb-Logitech_USB_Receiver-if01-mouse        usb-Logitech_USB_Receiver-if02-event-mouse  usb-Valve_Software_Steam_Controller-event-mouse

I do have a Logitech wireless headset and keyboard which seems to be the source of the existing devices in there.

I also looked at this article on the Arch wiki:
https ://wiki.archlinux.org/index.php/Logitech_Racing_Wheel

which again deals with the usb_modeswitch. The G29 appears in dmesg but is not show in /proc/bus/input/devices.

[380405.768389] usb 1-10: new full-speed USB device number 110 using xhci_hcd
[380405.909922] usb 1-10: New USB device found, idVendor=046d, idProduct=c294, bcdDevice=13.50
[380405.909928] usb 1-10: New USB device strings: Mfr=1, Product=2, SerialNumber=0
[380405.909932] usb 1-10: Product: G29 Driving Force Racing Wheel
[380405.909935] usb 1-10: Manufacturer: Logitech

So, lsusb is showing the G29 device but it isn’t getting mapped to /dev/input.
Any thoughts?

Nevermind. Rebooted and now it’s working. I thought turn it off and on again was a Windows thing! :smiley:

1 Like