EG STARTS USB Joystick Interface

EG STARTS Joystick interface The EG STARTS is a cheap (10 € in June 2022) circuit to connect a joystick and buttons to a PC via the USB interface. It is often used to build arcade-style consoles for retrogaming using the MAME software or alike, it is supported by the GNU/Linux operating system, but…

Problems with GNU/Linux: disconnect loop

My first attempt to connect the EG STARTS to a Raspberry Pi running the operating system based on Debian 11 Bullseye was a total failure. The kernel started an infinite loop detecting and disconnecting the USB device:

usb 2-1.2: new low speed USB device using ehci_hcd and address 7
usb 2-1.2: New USB device found, idVendor=0079, idProduct=0006
usb 2-1.2: New USB device strings: Mfr=1, Product=2, SerialNumber=0
usb 2-1.2: Product: Generic   USB  Joystick
usb 2-1.2: Manufacturer: DragonRise inc.
usb 2-1.2: configuration #1 chosen from 1 choice
input: DragonRise inc.   Generic   USB  Joystick   
    as /devices/pci0000:00/0000:00:1a.0/usb2/2-1/2-1.2/2-1.2:1.0/input/input81
dragonrise 0003:0079:0006.004E: input,hidraw2: USB HID v1.10 Joystick
    [DragonRise inc.   Generic   USB  Joystick  ] on usb-0000:00:1a.0-1.2/input0
dragonrise 0003:0079:0006.004E: Force Feedback for DragonRise Inc. game controllers
    by Richard Walmsley <richwalm@gmail.com>
usb 2-1.2: USB disconnect, address 7

that loop was revealed also by the red LED on the interface blinking continously.

The problem occurred too using different GNU/Linux distributions: Raspberry Pi OS, Debian GNU/Linux, GRML; all running various kernel versions from the 4.x and 5.x series. The problem is caused by the kernel driver hid_dr, used for DragonRise Inc. game controller.

Running an old 2.6 version, the driver (named hid_drff) was stable enough to be able to read some input events from the device.

Fortunately I found a workaround for this problem in these posts:

It seems that the problem is caused by the driver that continously does a buffer overflows if it is not always polled for events. In that cases the Linux kernel offers a workaround; just add the following option on the kernel command line:

usbhid.quirks=0x0079:0x0006:0x00000400

In Debian and derived, just add that option into /etc/default/grub, at definition of GRUB_CMDLINE_LINUX, and execute update-grub. Notice that 0x79 is vendor code the and 0x06 is the product code, as revealed by lsusb:

Bus 002 Device 009: ID 0079:0006 DragonRise Inc. Generic USB Joystick

The bit mask 0x00000400 activates HID_QUIRK_ALWAYS_POLL.