Re: Handling controllers that can be used separately and together

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Tue, Dec 25, 2018 at 2:42 PM Billy Laws <blaws05@xxxxxxxxx> wrote:
>
>
>
> On 23 December 2018 04:45:13 GMT, Roderick Colenbrander <thunderbird2k@xxxxxxxxx> wrote:
> >On Fri, Dec 21, 2018 at 8:16 AM Billy Laws <blaws05@xxxxxxxxx> wrote:
> >>
> >>
> >>
> >> On 21 December 2018 09:56:10 GMT, Benjamin Tissoires
> ><benjamin.tissoires@xxxxxxxxx> wrote:
> >> >Hi Billy,
> >> >
> >> >On Tue, Dec 18, 2018 at 11:16 AM Billy Laws <blaws05@xxxxxxxxx>
> >wrote:
> >> >>
> >> >> Hi,
> >> >> I'm looking into making a driver for the Nintendo switches joycon,
> >> >they are two separate controllers that can be used together or
> >> >separately but most of the time they are used together as one
> >> >controller.
> >> >> Each of them is presented as a separate Bluetooth hid device so
> >I'm
> >> >not sure the best way to represent them to user space. Should I have
> >a
> >> >new input device for each separate joycon or create a new input
> >device
> >> >for every pair of l+r joycon?
> >> >
> >> >I'd say if they are 2 distincts bluetooth devices, it makes sense to
> >> >have them separated. However, in the same way we have touch panels
> >> >that are doing pen and touch and that are exported as 2 separate
> >> >device nodes, you should be able to provide the info to the user
> >space
> >> >that those 2 devices are supposed to be used together.
> >> >For pen/touch devices, userspace (udev) relies on the physical path
> >> >and assign LIBINPUT_DEVICE_GROUP to group those 2 devices
> >altogether.
> >> >
> >> >So I think if you provide a way from the serial to be able to match
> >> >those 2, user space should be OK.
> >> >
> >> >However, please note that I am not in the SDL community (I am more a
> >> >regular input devices developer) so their advice might differ.
> >> >
> >> Also, what about programs that access the controller directly without
> >libinput, i guess they would need to be fixed?
> >> How would I tell userspace which one is left and which one is right?
> >
> >Do the left and the right joycon have a different product id? Ideally
> >applications use vendor and product id. Worst case you can put Left /
> >Right in the device string...
> >
> Yeah, they do.
> I've been discussing with some switch Linux folks and we have come to the conclusion that doing it this way isn't really going to be good for the intended use of them. There are lots of games that will enumerate each controller as a separate player  and that would be pretty hard to change for all if them.
> Could there be a sysfs knob to unify the inputs to one? Then there can be an application in user space can switch between modes.
> If not, then the only solution we could think of was to create a fake input device in userspace that joins both and somehow prevent games from using split ones, which I find really ugly.

I'm well aware of these kind of challenges for "composite devices". To
some extend it is a kernel issue, but also a userspace issue where
many applications / libraries on the gaming side assume "1 evdev
device = 1 player". This is not correct. There are many devices for
which the kernel reports multiple evdev devices e.g. Wacom tablets,
keyboards, Wii controller, Sony DualShock 3 / 4 and many others. Most
of these devices are non-gaming devices and handled through libinput,
which hides these challenges and most people are not even aware of the
issues behind the scenes.

On the gaming side many applications use evdev directly or through
SDL2, but there is an assumption about "1 evdev device = 1 player". A
few years ago we (=Sony) refactored the DualShock 3 /4 driver
(hid-sony). We had to expose multiple evdev devices 1 for "gamepad", 1
for "motion sensors" and 1 for "touchpad". Each device has different
evdev capabilities, some games are kind of aware now.

That said handling composite devices from userspace is a pain.
Basically right now you need to scrape sysfs and stitch devices
together. We had some threads before with Peter Hutterer among others
in which we proposed evdev improvements for composite device
enumeration. We never sorted it out. Part of the challenge is that
enumeration improvements, easily have to span multiple frameworks.
Gaming peripherals often have other  features e.g. speakers,
microphones, motion sensors to weird ones like heart rate sensors and
many others.

Back to the Joycon. A single Joycon to me looks like a composite
device as well. You have a stick and a few buttons in addition to a
accelerometer + gyroscope. This at least requires 2x evdev device per
Joycon (1 for buttons/sticks and 1 for motion sensors). In addition
the right Joycon has a depth sensor as well. Not sure how to expose
this sensor, whether it can be done through evdev in a new way or
should use IIO (we need to bridge IIO to evdev better).

Bundling of 2x Joycon left + right almost feels like a "dynamic
composite device". I don't know where such combining should be done.
My gut feeling tells me at the userspace side. The kernel side feels
like it would easily become really complicated to implement.

For example if each Joycon was initially separate, there would be at 1
least 1 evdev node per device (likely more due to sensors). Suddenly
"bundling them", might mean changing capabilities of a live evdev
device (adding more buttons/sticks) and removing evdev node for the
now redundant other evdev device. (There might be other approaches) It
feels quite messy also for applications, who see devices come/go and
capabilities change.

I recall the Wii driver supported adding of peripherals as well at
runtime. I forgot how it was done there. I suspect it are separate
evdev nodes..

All in all, I'm not sure what the best solution is. I'm thinking more
and more (also because of DS4 discussions) that it is a job for
userspace and that games and gaming libraries haven't caught up with
modern evdev usages. Though it is too hard for every game to catch up
and the sysfs/evdev logic is complicated. Ideally a higher level
library should be used. The kernel could probably do a slightly better
job making device enumeration easier to help as well.

Thanks,
Roderick




[Index of Archives]     [Linux Media Devel]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]     [Linux Wireless Networking]     [Linux Omap]

  Powered by Linux