Enabling Xiaomi PC Manager hotkey in Xiaomi RedmiBook Pro 14/16

I intended this to be a guide, but failed right next to the finish line…

In laptops Xiaomi RedmiBook Pro 14 and Xiaomi RedmiBook Pro 16 there is this special button. On Windows 10/11 it launches a special program called “Xiaomi PC Manager”. On Linux, by default, it does nothing.


(image source)

First, I opened kernel logs…

journalctl -kf

…and saw this:

Jun 08 14:26:25 hostname kernel: atkbd serio0: Unknown key released (translated set 2, code 0xf2 on isa0060/serio0).
Jun 08 14:26:25 hostname kernel: atkbd serio0: Use 'setkeycodes e072 <keycode>' to make it known.

I lookedup the value of KEY_TOUCHPAD_TOGGLE, run the command:

sudo setkeycodes e072 0x212

Now sudo evtest correctly detect the keycode:

Event: time 1749383228.531538, type 4 (EV_MSC), code 4 (MSC_SCAN), value f2
Event: time 1749383228.531538, type 1 (EV_KEY), code 530 (KEY_TOUCHPAD_TOGGLE), value 0
Event: time 1749383228.531538, -------------- SYN_REPORT ------------

But for some goddman reason this doesn’t send any envents to the display manager! Neither xev, not wev show any output when pressing this button.

I then realised the output is generated only for the event codes that are present in evtest output by default:

evtest output
$ sudo evtest /dev/input/event1
Input driver version is 1.0.1
Input device ID: bus 0x11 vendor 0x1 product 0x1 version 0xab83
Input device name: "AT Translated Set 2 keyboard"
Supported events:
  Event type 0 (EV_SYN)
  Event type 1 (EV_KEY)
    Event code 1 (KEY_ESC)
    Event code 2 (KEY_1)
    Event code 3 (KEY_2)
    Event code 4 (KEY_3)
    Event code 5 (KEY_4)
    Event code 6 (KEY_5)
    Event code 7 (KEY_6)
    Event code 8 (KEY_7)
    Event code 9 (KEY_8)
    Event code 10 (KEY_9)
    Event code 11 (KEY_0)
    Event code 12 (KEY_MINUS)
    Event code 13 (KEY_EQUAL)
    Event code 14 (KEY_BACKSPACE)
    Event code 15 (KEY_TAB)
    Event code 16 (KEY_Q)
    Event code 17 (KEY_W)
    Event code 18 (KEY_E)
    Event code 19 (KEY_R)
    Event code 20 (KEY_T)
    Event code 21 (KEY_Y)
    Event code 22 (KEY_U)
    Event code 23 (KEY_I)
    Event code 24 (KEY_O)
    Event code 25 (KEY_P)
    Event code 26 (KEY_LEFTBRACE)
    Event code 27 (KEY_RIGHTBRACE)
    Event code 28 (KEY_ENTER)
    Event code 29 (KEY_LEFTCTRL)
    Event code 30 (KEY_A)
    Event code 31 (KEY_S)
    Event code 32 (KEY_D)
    Event code 33 (KEY_F)
    Event code 34 (KEY_G)
    Event code 35 (KEY_H)
    Event code 36 (KEY_J)
    Event code 37 (KEY_K)
    Event code 38 (KEY_L)
    Event code 39 (KEY_SEMICOLON)
    Event code 40 (KEY_APOSTROPHE)
    Event code 41 (KEY_GRAVE)
    Event code 42 (KEY_LEFTSHIFT)
    Event code 43 (KEY_BACKSLASH)
    Event code 44 (KEY_Z)
    Event code 45 (KEY_X)
    Event code 46 (KEY_C)
    Event code 47 (KEY_V)
    Event code 48 (KEY_B)
    Event code 49 (KEY_N)
    Event code 50 (KEY_M)
    Event code 51 (KEY_COMMA)
    Event code 52 (KEY_DOT)
    Event code 53 (KEY_SLASH)
    Event code 54 (KEY_RIGHTSHIFT)
    Event code 55 (KEY_KPASTERISK)
    Event code 56 (KEY_LEFTALT)
    Event code 57 (KEY_SPACE)
    Event code 58 (KEY_CAPSLOCK)
    Event code 59 (KEY_F1)
    Event code 60 (KEY_F2)
    Event code 61 (KEY_F3)
    Event code 62 (KEY_F4)
    Event code 63 (KEY_F5)
    Event code 64 (KEY_F6)
    Event code 65 (KEY_F7)
    Event code 66 (KEY_F8)
    Event code 67 (KEY_F9)
    Event code 68 (KEY_F10)
    Event code 69 (KEY_NUMLOCK)
    Event code 70 (KEY_SCROLLLOCK)
    Event code 71 (KEY_KP7)
    Event code 72 (KEY_KP8)
    Event code 73 (KEY_KP9)
    Event code 74 (KEY_KPMINUS)
    Event code 75 (KEY_KP4)
    Event code 76 (KEY_KP5)
    Event code 77 (KEY_KP6)
    Event code 78 (KEY_KPPLUS)
    Event code 79 (KEY_KP1)
    Event code 80 (KEY_KP2)
    Event code 81 (KEY_KP3)
    Event code 82 (KEY_KP0)
    Event code 83 (KEY_KPDOT)
    Event code 85 (KEY_ZENKAKUHANKAKU)
    Event code 86 (KEY_102ND)
    Event code 87 (KEY_F11)
    Event code 88 (KEY_F12)
    Event code 89 (KEY_RO)
    Event code 90 (KEY_KATAKANA)
    Event code 91 (KEY_HIRAGANA)
    Event code 92 (KEY_HENKAN)
    Event code 93 (KEY_KATAKANAHIRAGANA)
    Event code 94 (KEY_MUHENKAN)
    Event code 95 (KEY_KPJPCOMMA)
    Event code 96 (KEY_KPENTER)
    Event code 97 (KEY_RIGHTCTRL)
    Event code 98 (KEY_KPSLASH)
    Event code 99 (KEY_SYSRQ)
    Event code 100 (KEY_RIGHTALT)
    Event code 102 (KEY_HOME)
    Event code 103 (KEY_UP)
    Event code 104 (KEY_PAGEUP)
    Event code 105 (KEY_LEFT)
    Event code 106 (KEY_RIGHT)
    Event code 107 (KEY_END)
    Event code 108 (KEY_DOWN)
    Event code 109 (KEY_PAGEDOWN)
    Event code 110 (KEY_INSERT)
    Event code 111 (KEY_DELETE)
    Event code 112 (KEY_MACRO)
    Event code 113 (KEY_MUTE)
    Event code 114 (KEY_VOLUMEDOWN)
    Event code 115 (KEY_VOLUMEUP)
    Event code 116 (KEY_POWER)
    Event code 117 (KEY_KPEQUAL)
    Event code 118 (KEY_KPPLUSMINUS)
    Event code 119 (KEY_PAUSE)
    Event code 121 (KEY_KPCOMMA)
    Event code 122 (KEY_HANGUEL)
    Event code 123 (KEY_HANJA)
    Event code 124 (KEY_YEN)
    Event code 125 (KEY_LEFTMETA)
    Event code 126 (KEY_RIGHTMETA)
    Event code 127 (KEY_COMPOSE)
    Event code 128 (KEY_STOP)
    Event code 140 (KEY_CALC)
    Event code 142 (KEY_SLEEP)
    Event code 143 (KEY_WAKEUP)
    Event code 155 (KEY_MAIL)
    Event code 156 (KEY_BOOKMARKS)
    Event code 157 (KEY_COMPUTER)
    Event code 158 (KEY_BACK)
    Event code 159 (KEY_FORWARD)
    Event code 163 (KEY_NEXTSONG)
    Event code 164 (KEY_PLAYPAUSE)
    Event code 165 (KEY_PREVIOUSSONG)
    Event code 166 (KEY_STOPCD)
    Event code 172 (KEY_HOMEPAGE)
    Event code 173 (KEY_REFRESH)
    Event code 183 (KEY_F13)
    Event code 184 (KEY_F14)
    Event code 185 (KEY_F15)
    Event code 193 (KEY_F23)
    Event code 217 (KEY_SEARCH)
    Event code 226 (KEY_MEDIA)
    Event code 530 (KEY_TOUCHPAD_TOGGLE)  <- the one I added with `setkeycodes`
  Event type 4 (EV_MSC)
    Event code 4 (MSC_SCAN)
  Event type 17 (EV_LED)
    Event code 0 (LED_NUML) state 0
    Event code 1 (LED_CAPSL) state 0
    Event code 2 (LED_SCROLLL) state 0
Key repeat handling:
  Repeat type 20 (EV_REP)
    Repeat code 0 (REP_DELAY)
      Value    250
    Repeat code 1 (REP_PERIOD)
      Value     33

That means that add of any of this command do produce events in xev/wev:

sudo setkeycodes e072 226
sudo setkeycodes e072 143
sudo setkeycodes e072 88
sudo setkeycodes e072 30
# etc.

Funnily enough, Event code 193 (KEY_F23) is a XF86TouchpadOff keysym.

There is also another physical button that has a working LED and microphone icon, but pressing it doesn’t produce anything in any of those:

  • journalctl -f
  • journalctl -fk
  • sudo evtest /dev/input/event1
  • xev/wev

Output of sudo evtest:

No device specified, trying to scan all of /dev/input/event*
Available devices:
/dev/input/event0:	Video Bus
/dev/input/event1:	AT Translated Set 2 keyboard
/dev/input/event10:	sof-hda-dsp HDMI/DP,pcm=3
/dev/input/event11:	sof-hda-dsp HDMI/DP,pcm=4
/dev/input/event12:	sof-hda-dsp HDMI/DP,pcm=5
/dev/input/event2:	Lid Switch
/dev/input/event3:	Power Button
/dev/input/event4:	Power Button
/dev/input/event5:	USB Optical Mouse 
/dev/input/event6:	GXTP7300:00 27C6:0F90 Mouse
/dev/input/event7:	GXTP7300:00 27C6:0F90 Touchpad
/dev/input/event8:	sof-hda-dsp Mic
/dev/input/event9:	sof-hda-dsp Headphone

Btw, I tried using input-remapper and it sorta worked.

It does enable Xiaomi PC Manager to act as a XF86TouchpadToggle, but only after you manually run sudo setkeycodes e072 249 (doesn’t have to be 249, could be any value since it would be remapped either way). And the touchpad actually breaks and doesn’t work with one finger (you have to hold two fingers to move the cursor).

I think there is nothing “NixOS” in this problem, it’s entirely about the hardware. Screw these damn laptops, there is always something funny with how they (don’t) support Linux.

Update. Much better alternative to input-remapper would be keyd.

Initially it doesn’t recognize PC Manager key, because it doesn’t have any keycode associated with it — you have to manually or automatically run sudo setkeycodes e072 193 after every reboot.

Where is this e072 coming from?

Read the first message in this thread. We got it from journalctl -kf and pressing the aforementioned PC Manager button.

The is no NixOS option for this, by the way :​) I’ve created a feature request for a NixOS module that would do this declaratively. This feels like a “good first issue” for anyone who wants to contribute to NixOS.

The value 193 is not completely arbitrary. From the output of sudo keyd list-keys you can see what keys are supported by keyd. 193 is KEY_F23 and this key code does not seem to be used by anything on this keyboard.

The full list of available keycodes can be seen here — include/uapi/linux/input-event-codes.h. The values in this header may potentially be different for you kernel, though it is very unlikely. Also keep in mind that this value must be 255 or less (because of this).

After setting the key code run sudo keyd monitor and press the button. You would see something like this:

AT Translated Set 2 keyboard	0001:0001:70533846	f23 up

Our key is now registered as KEY_F23, great success! I don’t know what up is supposed to mean, so lets ignore it.

On my Xiaomi RedmiBook Pro 16 KEY_F23 by default acts as a XF86XK_TouchpadOff. So painfully close to XF86XK_TouchpadToggle :')

Finally

Now we can remap this new and shiny KEY_F23 to KEY_F21. Why KEY_F21 you might ask? Because keyd interpretes KEY_F23 as KEY_TOUCHPAD_TOGGLE.

This is a NixOS module that can be imported the same way as hardware-configuration.nix.

{ pkgs, ... }:
{
  services.keyd = {
    enable = false;
    keyboards = {
      default = {
        ids = [ "*" ];
        settings = {
          main = {
            f23 = "f21";
          };
          otherlayer = {};
        };
      };
    };
  };
}

And now your PC Manager key acts as a XF86XK_TouchpadToggle :​)

The only issue not is not being able to work with setkeycodes declaratively (Module Request: nixos/setkeycodes · Issue #415200 · NixOS/nixpkgs · GitHub).

@anon-20250105, @nova-nightfall, @mastoca, @ElvishJerricco, CC’ing this to yall since I’ve seen you in the different thread about this exact laptop model.

Hope this helps!

1 Like

Would be nice if whoever used this had provided their output of

nix-shell -p fastfetch --run "fastfetch -l none -c neofetch"

and what keycode they had to use.

If the keycode is the same for everyone with this laptop model, it would be possible to upstream this to GitHub - NixOS/nixos-hardware: A collection of NixOS modules covering hardware quirks..