Skip to contentSkip to conversation

How write driver for gamepad, that detected by usbhid but not work correctly?

DISCUSSION [email protected] 2 participants 2 messages Sep 29, 2013 HID

lore
Share & tools
lore
#0 lore raw

I have "Genesis to USB adapter" and two genesis gamepads. On windows it is work correctly. On linux do not work "left" and "up" buttons on D-pad, and two gamepads appear as one with double buttons.
At first I tried to write usb driver(usb_register), but when I connect gamepad system choose usbhid driver not my. When I unplug gamepad system call "probe" in my driver, but then immediately call "disconnect". Is there a way to force the system to choose my driver first? Than I tried to write hid driver(hid_register_driver), but "probe" is not called. I can not find documentation describing how to make a working driver for hid, it exists at all?
What is the correct way to write a driver for the gamepad? What am I doing wrong?

#1 lore raw
Quoted 4 lines · On Sun, 29 September 2013 "[email protected]" <[email protected]> wrote:

I have "Genesis to USB adapter" and two genesis gamepads. On windows it is work correctly. On linux do not work "left" and "up" buttons on D-pad, and two gamepads appear as one with double buttons. At first I tried to write usb driver(usb_register), but when I connect

Quoted 8 lines

gamepad system choose usbhid driver not my. When I unplug gamepad system call "probe" in my driver, but then immediately call "disconnect". Is there a way to force the system to choose my driver first? Than I tried to write hid driver(hid_register_driver), but "probe" is not called. I can not find documentation describing how to make a working driver for hid, it exists at all?
What is the correct way to write a driver for the gamepad? What am I doing wrong?

You can have a look at all the drivers located under drivers/hid/ for how they do it.

Two drivers that represent gamepads:
hid-pl.c
hid-saitek.c

Depending on how your gamepad shows up when there are two pads connected you may need to register a second input device to send buttons from the first pad to first input device, buttons from second to the extra input device.

A good start to find out what your device does is to enable debugging in your kernel and cat /sys/kernel/debug/hid/<your device>/events to determine what happens on button presses.
You can then check how that output matches events sent from /dev/input/event* matching your device and determine if all that is needed is proper scancode translation of if more tuning is needed.

Bruno