On 12/04/2015 03:38 PM, Tolga Cakir wrote:
> Am 04.12.2015 um 12:22 schrieb Clément Vuchener:
>> On 12/04/2015 07:40 AM, Tolga Cakir wrote:
>>> I think we need a decision about what needs to be done in kernel and what 
>>> is better handled in user-space. I've walked through the Corsair Vengeance 
>>> K90 driver (hid-corsair.c) and I must say, I'm not really happy about the 
>>> desicions made in the design. In my opinion, we should only do essential 
>>> stuff in kernel space and do the rest in user-space.
>>>
>>> To be more precise about hid-corsair.c (and possibly future gaming keyboard 
>>> implementations):
>>>
>>> 1. We should not handle profile switching and exposing a sysfs ABI for 
>>> profile-number in kernel-space. This has no advantage over keeping track of 
>>> profiles in user-space. We need to use user-space programs anyway in order 
>>> to handle macros and profile-sensitive key-handling. Using a keyboard 
>>> specific ABI for parsing the profile just adds complexity to kernel- and 
>>> user-space.
>>>
>>> 2. We should not map false keycodes to keys. hid-corsair.c is using 
>>> BTN_TRIGGER_HAPPY[N] - this is a huge design flaw in my opinion. Eventhough 
>>> this might get the job done, I'm questioning the design decision. First of 
>>> all, we're generally talking about KEYs on a keyboard, not BTNs. Second, 
>>> they are not TRIGGERs. Third, they are not HAPPY. Also, 
>>> BTN_TRIGGER_HAPPY[N] is only specified for up to 40 extra keys. What do we 
>>> do with gaming keyboards, which offer more? The Microsoft Sidewinder X6 has 
>>> 33 non-standard extra keys for example (agreed, it's less than 40, but 
>>> still near the maximum). Do we really need to map random linux/input.h 
>>> keycodes to non-standard keys?
>> I choose the TRIGGER_HAPPY buttons because the only use I found for it was 
>> extra buttons on some devices. It seems the most appropriate. It would be 
>> nice to have special key codes for this kind of keys, I asked about that 
>> with my original patch but I did not get any answer so the BTN_TRIGGER_HAPPY 
>> stayed there.
>>
>> They are keys the user may be interested in, I don't see why they should not 
>> have key events.
>
> Hi Clement,
>
> I agree, but instead of using key events designed for joysticks and gamepads, 
> we should define and use keycodes for our specific use-case.
>
> How come 40 individual keycodes have been added for a single joystick (Saitek 
> X52 Pro Flight System), whereas macro keys and profile switching keys can be 
> found on hundreds of different gaming keyboards and we have no fitting 
> keycode for that?
>
> I'm quoting linux/input.h:
> > We avoid low common keys in module aliases so they don't get huge.
>
> Luckily, macro keys and profile switch keys are very common these days on 
> gaming keyboards. So that shouldn't be a problem.
>
> I think it's time to define KEY_G1 - KEY_G30 and KEY_M1 - KEY_M5, so we can 
> finally have appropiate keycodes for these kind of things. They can be found 
> on nearly every gaming keyboard, so that should be enough to justify them. 
> There is still enough room for additional keycodes. What are you thinking 
> about this?
I don't know what would be the correct number of key codes.
For Corsair keyboards I know, there is either 18 or 6 G-keys and 3 profile keys 
(M-keys). So that would be enough for me.
My current driver also exposes the MR (macro/mem record) key. But with two 
different key codes for start and stop. I am not sure it is really useful, I 
may just remove it when I update the key codes.

You should make this proposition to a maintainer. I will update the corsair 
driver when it is accepted.
>
>>> I think mapping linux/input.h keycodes to non-standard keys has only one 
>>> reason: to keep things simple with X11. As Clement mentioned, keycodes 
>>> above 256 don't work with X11. However, this should not be a reason to hack 
>>> workarounds into kernel. We can use hidraw / hiddev in user-space instead 
>>> to catch those events and map them accordingly to our needs (they are 
>>> designed to be fully programmable keys after all). This adds complexity in 
>>> user-space, but also adds flexibility and we don't need to break / 
>>> workaround any HID stuff.
>> It does not work with X11 but it works with existing remapping software 
>> based on evdev. I don't understand what you mean with "break / workaround", 
>> I am remapping *invalid* HID usage code from the keyboard. If I don't do 
>> that pressing those keys triggers unwanted key events.
>
> By "break / workaround" I mean mapping keycodes, which have not been designed 
> for this use-case. BTN suggests, that they are not designed for keyboards in 
> the first place.
>
>>> 3. We should either have common ABI for gaming keyboards or we shouldn't 
>>> have them at all (or just in very special cases). This just adds complexity 
>>> in kernel- and user-space, as lots of keyboards need to be handled their 
>>> own way. Gaming keyboards have things in common, like LEDs. Creating an ABI 
>>> for setting extra LEDs is totally legit, but we should define standards, so 
>>> user-space applications can rely on something. Most keyboards have multiple 
>>> profile LEDs, 1 recording LED, sometimes 1 gaming mode LED (disabling 
>>> Windows key) and sometimes keyboard backlight is also adjustable.
>>>
>>> We could define a common ABI for them:
>>> - read-only profile_led_count (or profile_led_max): parse number of 
>>> profile_leds
>>> - rw profile_led_[N]: setting and parsing profile_led_[N] status, 0 and 1
>> Isn't this the same as the current_profile attribute you were arguing 
>> against?
>
> Nope. Exposing an interface to interact with the profile LEDs isn't the same 
> as creating an ABI for the active profile. Turning on profile_led_1 for 
> example does not has to mean, that profile 1 must be active. It just means, 
> that the LED for profile 1 is turned on.
>
> We should not tie profile to profile_led in kernel space and give user-space 
> applications all flexibility, how to use these LEDs and keeping track of 
> profiles (really, instead of polling / parsing active_profile ABIs, they can 
> easily keep track of them on their own and set LEDs accordingly).
I won't be able to do that for the corsair driver, current profile and profile 
LEDs are tied in the hardware.
>
>>> - rw recording_led: setting and parsing recording_led status, 0 and 1
>>> - rw gaming_led: setting and parsing gaming_led status, 0 and 1
>>> - read-only backlight_max: parse maximum brightness
>>> - rw backlight: setting and parsing backlight intensity, 0 - backlight_max
>> LED class devices already do that.
>
> Perfect!
The LED class documentation, defines that LED names should be 
"devicename:colour:function". I think we should use common function names.

For the K90 (and similar keyboards, I expect K40 and K95), I cannot add the 
profile LEDs as explained above and the "gaming" LED exists but cannot be 
controlled or read (it is completely managed on the hardware).

>
> Cheers,
> Tolga

--
To unsubscribe from this list: send the line "unsubscribe linux-input" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to