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?