Skip to content

Instantly share code, notes, and snippets.

@andrebrait
Last active September 22, 2023 20:27
Star You must be signed in to star a gist
Embed
What would you like to do?
Keychron keyboards on Linux + Bluetooth fixes

Here is the best setup (I think so :D) for K-series Keychron keyboards on Linux.

Most of these commands have been tested on Ubuntu 20.04 and should also work on most Debian-based distributions. If a command happens not to work for you, take a look in the comment section.

Make Fn + F-keys work

Keychron Keyboards on Linux use the hid_apple driver (even in Windows/Android mode), both in Bluetooth and Wired modes. By default, this driver uses the F-keys as multimedia shortcuts and you have to press Fn + the key to get the usual F1 through F12 keys.

In order to change this, you need to change the fnmode parameter for the hid_apple kernel module. Here's some documentation on it, but a quick summary can be found below:

  • 0 = disabled: Disable the 'fn' key. Pressing 'fn'+'F8' will behave like you only press 'F8'
  • 1 = fkeyslast: Function keys are used as last key. Pressing 'F8' key will act as a special key. Pressing 'fn'+'F8' will behave like a F8.
  • 2 = fkeysfirst: Function keys are used as first key. Pressing 'F8' key will behave like a F8. Pressing 'fn'+'F8' will act as special key (play/pause).

You can temporarily set the value (for testing, for example) by doing:

# replace <value> below with 0, 1 or 2
# example: echo 2 | sudo tee /sys/module/hid_apple/parameters/fnmode
echo <value> | sudo tee /sys/module/hid_apple/parameters/fnmode

Test how the keyboard behaves after each value. Pick the one the works for you. Once you have found the value that works for you, you can make the change permanent:

  1. Create the file /etc/modprobe.d/hid_apple.conf
  2. Add this line to the file: options hid_apple fnmode=<value>, replacing <value> with the one that worked for you in the previous step (0, 1 or 2)
  3. Save the file
  4. Run sudo update-initramfs -u
  5. Reboot

Here's a script, for convenience:

# replace <value> below with the one that worked for you in the previous step (0, 1 or 2)
# example: echo "options hid_apple fnmode=2 | sudo tee /etc/modprobe.d/hid_apple.conf"
# this will erase any pre-existing contents from /etc/modprobe.d/hid_apple.conf
echo "options hid_apple fnmode=<value>" | sudo tee /etc/modprobe.d/hid_apple.conf
# the "-k all" part is not always needed, but it's better to do that for all kernels anyway
sudo update-initramfs -u -k all
sudo systemctl reboot

If get stuck with numpad mode: Double hit F6 or fn + F6.

Enable Bluetooth fast connect config:

If your keyboard takes too long to connect to your computer over Bluetooth (for example, when you press a key and wakes it up), you can enable the Bluetooth fast connect. This usually makes the keyboard connect in less than 1 second.

Some users have reported issues with Bluetooth headphones such as popping audio and general instability, but I haven't experienced anything like that.

  1. Edit the file /etc/bluetooth/main.conf
  2. Uncomment FastConnectable config and set it to true: FastConnectable = true
  3. Uncomment ReconnectAttempts=7 (set the value to whatever number that you want)
  4. Uncomment ReconnectIntervals=1, 2, 3

Disable Autosuspend for USB Bluetooth dongles:

If your keyboard just won't reconnect after sleep, it might be because your Bluetooth card or dongle was automatically suspended by the operating system. You can disable the auto suspend feature for USB Bluetooth dongles by changing the settings for the btusb module.

Note: you might need to target a different module if your Bluetooth controller is somehow using some other module. The options and values themselves might change as well. You need to check the documentation for the module your Bluetooth controller uses. Most USB Bluetooth dongles (and sometimes internal cards that are wired to the USB bus) use btusb. Please check if the btusb module is used by your controller first.

# Disable autosuspend for btusb to make the bluetooth keyboard work again
# this will erase any pre-existing contents from /etc/modprobe.d/btusb_disable_autosuspend.conf
echo "options btusb enable_autosuspend=n" | sudo tee /etc/modprobe.d/btusb_disable_autosuspend.conf
sudo update-initramfs -u

Now reboot your computer, or run:

sudo modprobe -r btusb
sudo systemctl restart bluetooth
sudo modprobe btusb

Enable Bluetooth after waking up from sleep:

When your computer wakes up from sleep mode, the Bluetooth controller might not turn on automatically. In order to force it to do so, we can create a script that will be executed every time the computer comes back from sleep mode.

Note: just like in the previous step, this script assumes your Bluetooth controller uses the btusb module.

# Unload the btusb module, restart the bluetooth service and reload the module again
# post = after the computer wakes up
sudo tee /lib/systemd/system-sleep/bt << EOT
#!/bin/sh
case $1 in
  post)
    modprobe -r btusb
    sleep 1
    service bluetooth restart
    sleep 1
    modprobe btusb
    ;;
esac
EOT
# Now let's make the script executable
sudo chmod +x /lib/systemd/system-sleep/bt

Other resources

If the steps above haven't done it for you, try checking kurgol/keychron. Currently, it only mentions K2 and K6 keyboards, but the tips should work for most Keychron boards.

@hwilson03
Copy link

Sorted a lot of problems for me on Keychron K3

@ErdemOzgen
Copy link

sudo mkinitcpio -P can be use for arch based system instead of sudo update-initramfs -u

@gavingc
Copy link

gavingc commented Nov 17, 2022

Success & Thanks to Everyone

Keychron K4V2 on Debian 11 (11.5 Bullseye) w/Keychron Firmware

Out of the box, fnmode reported as 1 by:
cat /sys/module/hid_apple/parameters/fnmode

fnmode = 0 or 2 (I chose 2 but both seemed to work the same)

Keyboard switches: Windows/Android, Bluetooth or Cable.

As per included instructions, press "fn + x + l" keys together for 4 seconds.
(until keyboard lights flash; yes lower case works)
This toggles between Multimedia Keys and F1-F12 as first layer.

Caps Lock LED is red only and works as expected.

Num Lock LED is red only and works as expected, but it is possible to get into a state where it is always-off by playing with the NumLock on laptop keyboard or Plasma Startup settings.
Personally, I'd like an always-off state that was reliable as I have the OS force Num Lock function on, so don't need the red LED amongst my chosen RGB.
In either case the Num Lock key still works as expected.

Keyboard 'model' used: Generic 105-key PC (intl.).
Keyboard layout: us.

Bonus:
Fn + F5 adjusts RGB brightness down.
Fn + F6 adjusts RGB brightness up.
Fn + lamp key toggles RGB on/off and keeps brightness setting.

Would be fantastic to see QMK fully support these keyboards + Bluetooth - fingers crossed!

@Raremaa
Copy link

Raremaa commented Dec 13, 2022

Tks!

@edmarola
Copy link

My hero, thank you for this, i was already a bit disaaspointed that my keyboard was not working as expected in the first time but you saved my day! Thank you!

@eniocosta
Copy link

Thank you so much! It worked on my Keychron K2 with Ubuntu 18.04.6!

@Igeljaeger
Copy link

Thank you! It worked on Debian 11 Bullseye

@BiancaCristina
Copy link

Thank you, it worked on Debian 11!

@hughesjs
Copy link

hughesjs commented Jan 21, 2023

I'm having an issue where my K8P will pair with the laptop then immediately disconnect and won't connect again... Any ideas?

Not really sure where I'd even start debugging it

@andrebrait
Copy link
Author

I'm having an issue where my K8P will pair with the laptop then immediately disconnect and won't connect again... Any ideas?

Not really sure where I'd even start debugging it

The K8 Pro is an entirely different beast. It's based on a fork of QMK with some Keychron-specific code (if it hasn't been upstreamed yet). I'd recommend you try to look up information on Bluetooth on QMK boards and the issue you're having.

@hughesjs
Copy link

hughesjs commented Jan 21, 2023

@andrebrait - Gutted, cheers though

Might be worth putting a note in the Gist that it doesn't apply to the K8P

@dmkur
Copy link

dmkur commented Feb 5, 2023

Thank you so much!
F1-F12 are working perfect!

@kpwhit
Copy link

kpwhit commented Feb 7, 2023

The Bluetooth fast connect fix worked great! Was taking several seconds to reconnect after sleep, now it's just as quick as it is on Windows. Thanks for this fix!

@hughesjs
Copy link

hughesjs commented Feb 7, 2023

I'm having an issue where my K8P will pair with the laptop then immediately disconnect and won't connect again... Any ideas?

Not really sure where I'd even start debugging it

For anyone who does have a similar issue... I updated to the latest version of the QMK firmware and that seems to have resolved the issue, whatever it was.

@ox160d05d
Copy link

Thanks a lot! (:

@maykonsousa
Copy link

Hi guys,

How to use the print screen?

@mr337
Copy link

mr337 commented Feb 22, 2023

Option 2 fixed my issue, Keychron K5 on Ubuntu 22.04

@angelurbina4
Copy link

Tengo un problema en el que mi K8P se empareja con la computadora portátil y luego se desconecta inmediatamente y no se vuelve a conectar... ¿Alguna idea?

No estoy muy seguro de dónde comenzaría a depurarlo

Were you able to solve the problem? The same thing is happening to me with a k3 v2.

@ox160d05d
Copy link

Hi guys,

How to use the print screen?

As usual - there is a separate PrintScreen button on the right top corner (works normally)

@hughesjs
Copy link

hughesjs commented Mar 7, 2023 via email

@noelbautista91
Copy link

My Keychron K8 had connectivity issues with Bluetooth when connecting to my Linux/Windows PC, but not on my MacBook Pro. My symptoms were choppy connection several times an hour, connection taking a while after the keyboard goes on suspend, repeated key presses likeeeeee thisssss. Enabling fast connect fixed ALL my issues on Linux. Thank you! 👍

@ZANX3Y
Copy link

ZANX3Y commented Mar 31, 2023

Never would have figured it out on my own. Thank you!

@flooijdt
Copy link

flooijdt commented Apr 1, 2023

In OpenSUSE with KDE, the main.config file is located at /usr/share/doc/packages/bluez. In OpenSUSE with GNOME, it is in the same directory as related in this gist (/etc/bluetooth/).
Thanks a lot for the gist! This bluetooth problem was getting on my nerves!

@javierspn
Copy link

Just to point out: On Debían 11.6 my Bluetooth connection to my K2 keyboard wasn’t stable between reboots and many times I had to reconfigure it.

Enabling AutoConnect and FastConnect as per the instructions above fixed it. It takes however 5 to 10 seconds to connect but I am a patient man.

@mttkay
Copy link

mttkay commented Apr 21, 2023

Just a side note that this will work with any keyboard that uses the hid_apple driver not just Keychrons. I use the fnmode module setting for my NuPhy Air as well to turn on F-keys by default.

@Katharta
Copy link

Katharta commented Jun 1, 2023

Wow, FastConnectable = true made such a huge difference. I no longer have to fumble with switching the keyboard off and on over and over until it reconnects. Thank you for sharing this!

@cofeek-codes
Copy link

Thanks a lot. There is dracut --regenerate-all --force command to update initramfs for Fedora.

@h-braun
Copy link

h-braun commented Jun 6, 2023

Adding the hid_apple.conf file makes it such that wired mode no longer works for at least the K4 keyboard, when it is working fine for other devices like my android phone. But setting fnmode manually does work so that is a thing to note when doing this.

@RemcoSchrijver Thanks! I tried nearly everything, and really was confused as why bluetooth mode is working, but wired mode is not. I suspected a faulty cable but lsusb was clearly showing the keyboard. Is there a workaround to not use hid_apple.conf but somehow still have the fn keys working in fkeysfirst mode?

@RemcoSchrijver
Copy link

RemcoSchrijver commented Jun 7, 2023

Adding the hid_apple.conf file makes it such that wired mode no longer works for at least the K4 keyboard, when it is working fine for other devices like my android phone. But setting fnmode manually does work so that is a thing to note when doing this.

@RemcoSchrijver Thanks! I tried nearly everything, and really was confused as why bluetooth mode is working, but wired mode is not. I suspected a faulty cable but lsusb was clearly showing the keyboard. Is there a workaround to not use hid_apple.conf but somehow still have the fn keys working in fkeysfirst mode?

@h-braun what I ended up doing was to make a systemd service that calls a small script to add the manual switch to fix the fnmode.

So to replicate my setup do the following commands:

nano /etc/init/keyboard-fix.sh

Add the following content to the file and save it:

#!bin/bash
sleep 15s
echo 2 | sudo tee /sys/module/hid_apple/parameters/fnmode

Now to create the systemd service I did the following:

nano /etc/systemd/system/keyboard-startup-fix.service

Fill the file with the following content:

[Unit]
Description=Keychron enable fn keys mode

[Service]
ExecStart=/etc/init/keyboard-fix.sh

[Install]
WantedBy=multi-user.target

And then of course the standard things to enable your service:

sudo systemctl daemon-reload
sudo systemctl enable keyboard-startup-fix.service
sudo systemctl start keyboard-startup-fix.service

And now at every reboot your fn keys are setup like you want them to.

@jstiefel
Copy link

jstiefel commented Aug 8, 2023

Thanks for the setup instructions. Using Keychron K4 v2 on Ubuntu 20.04, I only needed to apply the following two fixes:

  • Switch Fnmode to mode 2 so that I can select the mode directly on the keyboard
  • Disable autosuspend in GRUB

I had a tiny delay after 5s of inactivity in BT mode on Ubuntu 20.04. Same applied for my BT mouse using the internal BT module. The solution with autosuspend in modprobe.d didn't work for me, but changing it in GRUB (for btusb AND usbcore) did:

sudo nano /etc/default/grub
# Add "GRUB_CMDLINE_LINUX_DEFAULT="quiet splash btusb.enable_autosuspend=n usbcore.autosuspend=-1 usbcore.autosuspend_delay_ms=-1"" to the corresponding line
sudo update-grub

Source: https://askubuntu.com/questions/1235456/issues-with-bluetooth-mouse-in-ubuntu-20-04

@BitesizedLion
Copy link

UPDATE: It seems the blueman applet was doing something weird, after remove the device and pair it again using the CLI, now the keyboard reconnects immediately without any issue. What I did:

$ bluetoothctl
power off
power on
scan on
# press fn+[1,2,3] for 4 secs and wait until appears the K2 device
scan off
pair DC:2C:26:2C:EE:46
trust DC:2C:26:2C:EE:46
connect DC:2C:26:2C:EE:46

@szaffarano Thank you, I've had the exact same issue, it's super frustrating

@khaled4vokalz
Copy link

khaled4vokalz commented Sep 4, 2023

Does any one see issues with K1 SE having issues when connected via bluetooth to ubuntu? In my case:

  • intermittently the keyboard gets mad and starts typing by itself, sometimes just starts adding the last character I made an input for... for example something like exxxxxaaaaaaaaaaaaaaaaaaaaaaaaammmmplllllllllllleeeee etc. This is really weird and I've been facing this for a long time. This doesn't happen even once while connected via Cable...

@532910
Copy link

532910 commented Sep 6, 2023

@ttrueten
Copy link

Does any one see issues with K1 SE having issues when connected via bluetooth to ubuntu? In my case:

* intermittently the keyboard gets mad and starts typing by itself, sometimes just starts adding the last character I made an input for... for example something like `exxxxxaaaaaaaaaaaaaaaaaaaaaaaaammmmplllllllllllleeeee` etc. This is really weird and I've been facing this for a long time. This doesn't happen even once while connected via Cable...

Same here with K10. Very annoying.

@532910
Copy link

532910 commented Sep 11, 2023

k1 (not se) works fine for me on debian sid

@andrebrait
Copy link
Author

Does any one see issues with K1 SE having issues when connected via bluetooth to ubuntu? In my case:

  • intermittently the keyboard gets mad and starts typing by itself, sometimes just starts adding the last character I made an input for... for example something like exxxxxaaaaaaaaaaaaaaaaaaaaaaaaammmmplllllllllllleeeee etc. This is really weird and I've been facing this for a long time. This doesn't happen even once while connected via Cable...

Yes, that's basically the reason why I gave up on Bluetooth keyboards. The firmware is usually poorly implemented, unless it's from some of the big guys like Logitech and whatnot.

Nowadays I run exclusively on wired mode, and I use exclusively QMK. I don't have the patience to deal with poor implementations of whatever feature I want, and QMK gives me the flexibility to do what I want with the board (since I know C, anyway).

I even caught some possible bugs in QMK's default debounce algorithm (which is already a lot better than the default firmware on non-QMK Keychron boards) and improved the OS detection feature so my keyboard now even switches automatically between Windows and Mac mode depending on what it connects to.

@khaled4vokalz
Copy link

Does any one see issues with K1 SE having issues when connected via bluetooth to ubuntu? In my case:

  • intermittently the keyboard gets mad and starts typing by itself, sometimes just starts adding the last character I made an input for... for example something like exxxxxaaaaaaaaaaaaaaaaaaaaaaaaammmmplllllllllllleeeee etc. This is really weird and I've been facing this for a long time. This doesn't happen even once while connected via Cable...

Yes, that's basically the reason why I gave up on Bluetooth keyboards. The firmware is usually poorly implemented, unless it's from some of the big guys like Logitech and whatnot.

Nowadays I run exclusively on wired mode, and I use exclusively QMK. I don't have the patience to deal with poor implementations of whatever feature I want, and QMK gives me the flexibility to do what I want with the board (since I know C, anyway).

I even caught some possible bugs in QMK's default debounce algorithm (which is already a lot better than the default firmware on non-QMK Keychron boards) and improved the OS detection feature so my keyboard now even switches automatically between Windows and Mac mode depending on what it connects to.

Sadly this issue does not occur when connected to a MAC... 🤔

@532910
Copy link

532910 commented Sep 19, 2023

The same as android!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment