Re: [PATCH] Fixed ideapad-laptop driver to support Yoga 9 2 in 1 14imh9 unknown keys

From: Peter F. Patel-Schneider
Date: Mon Mar 17 2025 - 10:09:45 EST


On 3/16/25 4:41 AM, Hans de Goede wrote:
Hi Gašper,

On 14-Mar-25 12:35 PM, Gašper Nemgar wrote:
Thanks for the feedback,

I will go over your notes here and explain things.
The Eye button on windows triggeres "Eye Care mode" https://download.lenovo.com/consumer/mobiles_pub/yoga_9i_2-in-1_14_9_ug_en.pdf#page=50 <https://download.lenovo.com/consumer/mobiles_pub/yoga_9i_2-in-1_14_9_ug_en.pdf#page=50>,  does linux have a keycode as something like this, i didn't found any, should we jus assign it to one of the programmable keys?

Yes that sounds like the best solution.

I will handle the performance as you have suggested, thanks

You're welcome.

The shift + prtSc i have made a mistake here, i meant the Fn + prtSc.
Just PrtSc is handled by a different device ("AT Translated Set 2 keyboard") and is not managed by this module. evtest told me it sends SysRq code which is intended and it triggers the selective screenshot.

Right, e.g. GNOME does not really differentiate between sysrq/printscreen
and KEY_SELECTIVE_SCREENSHOT and always uses the dialog instead of making
printscreen directly take a full screen screenshot. Still making this
the Fn + printscreen comboe send KEY_SELECTIVE_SCREENSHOT is the right thing
todo and is also done on other laptop models with the same icon.

If I assign the Fn + PrtSc to KEY_SELECTIVE_SCREENSHOT the evtest shows
me it triggers code 634 and code name is "?". Is this correct behaviour?

This just means that your evtest is a bit old and does not know about
KEY_SELECTIVE_SCREENSHOT yet.

Regards,

Hans

I have this laptop and did some digging to find out which keys use WMI, how they are described by Lenovo, what they do now, and a suggestion for what to do with them if different. I think that this is a comprehensive list.
The descriptions are from the User Guide Yoga 9i 2-in-1 (14″, 9) from Lenovo.

Key: Microphone Mute (Fn+F4)
WMI Code: 0x3e
Described as: p43 Enables/Disables the microphone.
Status: Already handled in ideapad_laptop
Key: KEY_MICMUTE 248

Key: Airplane Mode (Fn+F8)
WMI Code: 0x3f
Described as: p43 Enables/Disables airplane mode
Status: Already handled in ideapad_laptop
Key: KEY_RFKILL 247

Key: Star with S inside (right of F12)
WMI code: 0x1
Described as: p27&43 Displays the Lenovo Smart Key quick launch panel.
Status: Already handled in ideapad_laptop
Key: KEY_FAVORITES 0x16c

Key: Snip (Fn+PrtSrc)
WMI Code: 0x2d
Described as: p43 Opens the Snipping tool.
Status: Proposed patch uses KEY_PROG3.
Suggestion: KEY_CUT 137
Note: If the snipping tool does a selective screenshot then the KEY_SELECTIVE_SCREENSHOT would be better.

Key: Performance Meter (just below Delete)
WMI Code: 0x3d
Described as: p44 Switches the computer’s active operation mode.
Suggestion: KEY_PROG4 203
Rationale: There already is a mapping from a thermal management button to KEY_PROG4 in ideapad_laptop.
Note: I think that it is better to not hardwire keys.

Key: Speaker with gear (just below Perf key)
WMI Code: 0x12
Described as: p44 Switches the computer’s active audio mode.
Status: Already handled in indeapad_laptop
Key: KEY_PROG2 149

Key: Eye (just below Speaker with gear key)
WMI code: 0x45
Desribed as: p44 Turns on/off the Eye Care mode.
Status: Proposed patch uses KEY_DISPLAYTOGGLE.
Suggestion: KEY_BRIGHTNESS_CYCLE 243
Rationale: This KEY_DISPLAYTOGGLE appears to be for switching screens, not adjusting brightness/color.

Key: Star (just below Eye key)
WMI code: 0x44
Described as: p44 Opens a custom (user-defined) app.
Status: In proposed patch
Key: KEY_PROG1 148

Key: Fn+Esc
WMI code: 0x2 or 0x3
Described as: p20 Switch F<n> hotkey behaviour.
Status: Explicitly ignored in ideapad_laptop, as the switching is done in the device

Key: Fn+spce
Described as: p43 Adjusts the keyboard backlight. (Done in device.)
WMI code: 0x41
Status: The code is not mentioned in ideadpad_laptop. The backlight is adjusted by the device.
Suggestion: Document with an explicit ignore.

Key: Fn+M
Described as: p21 Enable/disable the touchpad.
WMI code: 0x29
Suggestion: KEY_TOUCHPAD_TOGGLE 0x212

Key: Fn+N
Described as: p21 Shows device information.
WMI code: 0x2a
Suggestion: KEY_ROOT_MENU 0x26a
Note: There doesn't seem to be a really good match for this.

Key: Fn+Q
Described as: p21&32 Switch among different performance modes.
WMI code: 0x3d
Suggestion: KEY_PROG4 203
Rationale: Same as Perf key

Key: Fn+R
Described as: p21&32 Change the display refresh rate.
WMI code: 0x10
Status: Already in ideapad_laptop.
Key: KEY_REFRESH_RATE_TOGGLE 0x232

peter




On Fri, 14 Mar 2025 at 10:34, Hans de Goede <hdegoede@xxxxxxxxxx <mailto:hdegoede@xxxxxxxxxx>> wrote:

Hi Gašper,

Thank you for your patch.

First if all a few generic notes:

1. When sending out v2 of the patch please add
   platform-driver-x86@xxxxxxxxxxxxxxx <mailto:platform-driver-x86@xxxxxxxxxxxxxxx> to the Cc

2. The patch subject (first line of commit message) should have
   a prefix describing the subsystem + driver, e.g. use:
   "platform/x86: ideapad-laptop: Add a few new keymap entries"

3. Your patch is missing a signed-off-by, see:
https://www.kernel.org/doc/html/latest/process/submitting-patches.html#sign-your-work-the-developer-s-certificate-of-origin <https://www.kernel.org/doc/html/latest/process/submitting-patches.html#sign-your-work-the-developer-s-certificate-of-origin>

4. Your commit message / patch should also have a body, e.g.
   the entirety of the commit message could look something like this:

-- begin --
platform/x86: ideapad-laptop: Add a few new keymap entries

The Yoga 9 2 in 1 14imh9 introduces 4 new hotkeys which are not
yet in ideapad_keymap[], add entries to map these keys.

Signed-off-by: Gašper Nemgar <your-email-here>
-- end --

A few more specific remarks below based on looking at
this picture of the keyboard:

https://ardes.bg/uploads/original/lenovo-yoga-9-2-in-1-14-g9-550178.jpg <https://ardes.bg/uploads/original/lenovo-yoga-9-2-in-1-14-g9-550178.jpg>

On 13-Mar-25 4:17 PM, Gašper Nemgar wrote:
> diff --git a/drivers/platform/x86/ideapad-laptop.c b/drivers/platform/x86/ideapad-laptop.c
> index 30bd366d7..af124aafe 100644
> --- a/drivers/platform/x86/ideapad-laptop.c
> +++ b/drivers/platform/x86/ideapad-laptop.c
> @@ -1308,6 +1308,14 @@ static const struct key_entry ideapad_keymap[] = {
>       /* Specific to some newer models */
>       { KE_KEY,       0x3e | IDEAPAD_WMI_KEY, { KEY_MICMUTE } },
>       { KE_KEY,       0x3f | IDEAPAD_WMI_KEY, { KEY_RFKILL } },
> +     /*Star- (User Asignable Key)*/
> +     { KE_KEY,       0x44 | IDEAPAD_WMI_KEY, { KEY_PROG1 } },

Ack.

> +     /*Eye*/
> +     { KE_KEY,       0x45 | IDEAPAD_WMI_KEY, { KEY_DISPLAYTOGGLE } },

It looks like the laptop already does display-toggle as Fn-F7 although
it like sends super + P for this (AKA meta + P).

So mapping this to KEY_DISPLAYTOGGLE seems wrong, what does this
do under Windows?

Maybe KEY_ZOOM ?

> +     /*Performance*/
> +     { KE_KEY,       0x3d | IDEAPAD_WMI_KEY, { KEY_SPORT } },

I think that instead of mapping this it should be handled specially
and call platform_profile_cycle() instead of sending a key-press
to userspace

> +     /*shift + prtsc*/
> +     { KE_KEY,       0x2d | IDEAPAD_WMI_KEY, { KEY_PROG3 } },

Looking a the symbol on the keyboard this should send
KEY_SELECTIVE_SCREENSHOT

>
>       { KE_END },
>  };
>

Regards,

Hans