Re: input devices vs. keyboard backlights [WAS: [PATCH v2] platform/x86: add support for Acer Predator LEDs]

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

 



Hi,

On 6/22/21 12:19 PM, Enrico Weigelt, metux IT consult wrote:
> On 21.06.21 21:43, Hans de Goede wrote:
> 
> Hi,
> 
>> The LED API actually has specific features which are typically
>> only used with kbd-backlights, such as the brightness_hw_changed
>> attribute which was specifically added to allow userspace to
>> monitor when a laptops embedded controller changes the kbd-backlight
>> brightness in response to a Fn + somekey hotkey keypress, so that
>> userspace can show an on-screen-display notification that the
>> kbd brightness has changed (like how it typically does for
>> audio volume changes too) and also showing the new brightness
>> level. See: Documentation/ABI/testing/sysfs-class-led for
>> the docs for the /sys/class/leds/<led>/brightness_hw_changed
> 
> yes, that's great. but it seems we're still lacking a direct standard
> way for associating an input device with the corresponding backlight
> LED.

True.

> Or am I missing something ?

In most cases the lacking way to associate the 2 is not a problem
because almost all systems have only a single keyboard backlight
and all existing standard Linux userspace code around kbd-backlights
(like upower) has been written with this assumption.

This is actually a problem when you plug in a fancy USB kbd with
backlight into a laptop where the laptop kbd also has a backlight ...

Fixing this would be great, but it requires fixes all over
the stack and associating the backlight with a specific kbd
is probably the smallest of the issues to solve here.

>>> Looks like a very complicated way to do that. But actually I've never
>>> understood why I should use this strange upower thing anways :p
>>
>> Just because you don't have a use for it does not mean that it
>> is not useful (and widely used) in cases where people use Linux
>> as a desktop OS, rather then for more embedded cases.
> 
> I'm actually using Linux on desktop for over 25 years now.
> 
> But let's go back to the kernel side.
> 
>>> In general, LED class isn't so bad, as it already gives us LED control
>>> (*1), but I don't see any portable way for finding the corresponding
>>> LED for some input device. In DRM I see the backlight as subdevice.
>>
>> With USB-HID keyboards the LED class device will have the same HID-device
>> as parent as the input device. If there is no HID parent-device, then any
>> foo_kbd_backlight device will belong to the atkbd (PS/2) input-device.
> 
> Still a lot of if's and guessing :(
> 
> Why can't we make it appear the same way like the other leds (eg. caps-
> lock) ?
> Here's how it looks on my Portege:
> 
> | ~ ls -l /dev/input/input0:

So you have an input0 symlink under /dev/input to /sys/class/input/input0/
that is non standard, but that is not really relevant you get the same
output if you directly do:

ls -l /sys/class/input/input0/

> |
> | drwxr-xr-x 2 root root    0 Jun 22 11:42 capabilities
> | lrwxrwxrwx 1 root root    0 Jun 22 11:42 device -> ../../../serio0
> | drwxr-xr-x 3 root root    0 Jun 22 11:42 event0
> | drwxr-xr-x 2 root root    0 Jun 22 11:42 id
> | drwxr-xr-x 3 root root    0 Jun 22 11:37 input0::capslock
> | drwxr-xr-x 3 root root    0 Jun 22 11:42 input0::numlock
> | drwxr-xr-x 3 root root    0 Jun 22 11:42 input0::scrolllock
> | -r--r--r-- 1 root root 4096 Jun 22 11:42 modalias
> | -r--r--r-- 1 root root 4096 Jun 22 11:42 name
> | -r--r--r-- 1 root root 4096 Jun 22 11:42 phys
> | drwxr-xr-x 2 root root    0 Jun 22 11:42 power
> | -r--r--r-- 1 root root 4096 Jun 22 11:42 properties
> | lrwxrwxrwx 1 root root    0 Jun 22 11:42 subsystem ->
> ../../../../../../class/input
> | -rw-r--r-- 1 root root 4096 Jun 22 11:42 uevent
> | -r--r--r-- 1 root root 4096 Jun 22 11:42 uniq
> 
> I'd imagine also having some "input0::backlight" here.
> 
> These leds seem to be sub-devices of the keyboard device,

They are child devices of the input-device instantiated for the
keyboard device, the keyboard device itself is likely actually:

/sys/devices/platform/i8042/serio0

If you do "ls -l /sys/class/input/input0" then you will see
that this is a symlink pointing to

/sys/devices/platform/i8042/serio0/input/input0

The LED class devices for the kbd LEDs are instantiated
by the input-subsys itself, hence they use the input-device
as parent.

For HID based keyboards the HID device which is the parent
of the input-device will also be the parent of the kbd-backlight
LED class device since both are instantiated by the HID driver.

E.g. if I plug in a Logitech G510 keyboard I get this:

[hans@x1 ~]$ ls -l /sys/bus/hid/devices/0003:046D:C22D.000D/{leds,input}/
'/sys/bus/hid/devices/0003:046D:C22D.000D/input/':
total 0
drwxr-xr-x. 6 root root 0 Jun 22 12:32 input53
drwxr-xr-x. 6 root root 0 Jun 22 12:32 input54

'/sys/bus/hid/devices/0003:046D:C22D.000D/leds/':
total 0
drwxr-xr-x. 3 root root 0 Jun 22 12:32 g15::kbd_backlight
drwxr-xr-x. 3 root root 0 Jun 22 12:32 g15::macro_preset1
drwxr-xr-x. 3 root root 0 Jun 22 12:32 g15::macro_preset2
drwxr-xr-x. 3 root root 0 Jun 22 12:32 g15::macro_preset3
drwxr-xr-x. 3 root root 0 Jun 22 12:32 g15::macro_record
drwxr-xr-x. 3 root root 0 Jun 22 12:32 g15::power_on_backlight_val

So the input and LED class devices can already be associated
with each other by finding a common parent. This is not
unusual, this is e.g. also how video4linux tv-apps like
xawtv and tvtime find the alsa record/input device to get
the audio from the tvcard, they look for an alsa device
which has the same parent (which can be either USB or PCI)
as the /dev/video# device from which they are grabbing the
video.

As I already mentioned, this linking the 2 by finding a
common parent works fine for HID devices, but is a problem
for laptops with a PS/2 kbd + embedded-controller controlled
kbd-backlight since on one hand we have the PS/2 stack and
on the other hand we have some drivers/platform/x86 driver
talking some vendor specific ACPI (or WMI or some-such)
interface to the embedded-controller for controlling the
kbd-backlight. So in this case we have to fallback to
some heuristics and guess that the kbd-backlight belongs
to the keyboard registered by the atkbd driver.

Now we could make the kernel do this heuristics for us
and have it register a symlink but that brings interesting
questions like which code is going to be responsible for
registering the symlink + possible probe-ordering issues
between the 2 drivers; and it would still be just a
heuristic, which will likely need some quirk tables for
some exceptions.

We are simply better of handling these heuristics in
userspace, so that we can e.g. use hwdb for any quirks.

We could even have a udev rule adding a symlink if that
is seen as useful, but I don't believe that these kinda
heuristics belong in the kernel.

Regards,

Hans




[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