Swap Ctrl+Fn for new AMD Ryzen 300 Series

I have the AMD Ryzen™ AI 300 Series, using the latest bios (3.04). I cannot figure out how to swap Ctrl+Fn.

I’ve looked all over the bios and I don’t see the option even though other people (on different Frameeworks) have posted photos. That option is simply not there.

So I’ve dug through the keyboard.frame.work and I can re-map every key EXCEPT the Fn key. Wtf?

Is there a solution for this? It’s so painful to have to change muscle memory and I still am switching back to a Mac keyboard regularly so I want my Ctrl key in the “right” place.

For anyone else who has this issue, Claude Code was able to recompile the keyboard drivers with this swapped. Attached is the compiled file and the steps to flash it are: framework_ansi_default

  1. Connect a second external keyboard
  2. Open the two slide switches in the bottom left/right of laptop base and slide the trackpad out a tiny bit
  3. While holding both Alt keys, slide the trackpad back in. Release Alt keys after a few seconds of holding.
  4. sudo mount /dev/sda1 /mnt && sudo cp framework_ansi_default.uf2 /mnt/ && sudo umount /mnt
  5. Then just wait a few seconds. The keyboard automatically reboots and starts working with the new firmware.

You can also swap them without rebuilding the firmware, using https://keyboard.frame.work.

1 Like

I tried that many different ways. It works for assigning every key except the Fn key, at least on my particular model.

So I just ran into this issue as well. I was able to rebind a few keys that I wanted to change but even when I am able to change the Fn key on https://keyboard.frame.work, it doesn’t actually apply to the keyboard. I can only assume this is a bug? Similar to the issue with F12 on the Gen1 systems described here: [Bug] Cannot remap F12 key throughh Via · Issue #43 · FrameworkComputer/qmk_firmware · GitHub

@Keith_Schacht - Can you provide the actual changes to the code that were made so that it might be possible for others to use them? A precompiled binary is not ideal.

@slabity sure, but my recommendation is just to use my compiled patch and then do all the other re-assignment in the keyboard.frame.work. That’s what worked for me.

But I’m happy to share. Pull this repo and then just run this command, then you’ll have the code locally all ready to compile (or make further changes):

git apply <<‘EOF’
diff --git i/keyboards/framework/ansi/keymaps/default/keymap.c w/keyboards/framework/ansi/keymaps/default/keymap.c
index 89618ecdf9..71e0c659fb 100644
— i/keyboards/framework/ansi/keymaps/default/keymap.c
+++ w/keyboards/framework/ansi/keymaps/default/keymap.c
@@ -37,7 +37,7 @@ const uint16_t PROGMEM keymaps
[MATRIX_ROWS][MATRIX_COLS] = {
KC_TAB,  KC_Q,    KC_W,    KC_E,    KC_R,    KC_T,    KC_Y,    KC_U,    KC_I,    KC_O,    KC_P,    KC_LBRC, KC_RBRC, KC_BSLS,
KC_CAPS, KC_A,    KC_S,    KC_D,    KC_F,    KC_G,    KC_H,    KC_J,    KC_K,    KC_L,    KC_SCLN, KC_QUOT,          KC_ENT,
KC_LSFT,          KC_Z,    KC_X,    KC_C,    KC_V,    KC_B,    KC_N,    KC_M,    KC_COMM, KC_DOT,  KC_SLSH,          KC_RSFT,

   KC_LCTL, MO(_FN), KC_LGUI, KC_LALT,          KC_SPC,                    KC_RALT, KC_RCTL, KC_LEFT,   KC_UP, KC_DOWN, KC_RGHT

   MO(_FN), KC_LCTL, KC_LGUI, KC_LALT,          KC_SPC,                    KC_RALT, KC_RCTL, KC_LEFT,   KC_UP, KC_DOWN, KC_RGHT

),
/*
* Function layer
@@ -74,7 +74,7 @@ const uint16_t PROGMEM keymaps
[MATRIX_ROWS][MATRIX_COLS] = {
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,          _______,
_______,          _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,          _______,

   _______, MO(_FM), _______, _______,          _______,                   _______, _______, _______, _______, _______, _______

   MO(_FM), KC_LCTL, _______, _______,          _______,                   _______, _______, _______, _______, _______, _______

),
// Locked+temporary FN (back to base plus extra keys)
[_FM] = LAYOUT(
EOF
1 Like

Thanks! I misunderstood and thought the patch was for allowing the key to be rebound instead of being hardcoded.

I definitely appreciate the patch regardless though! I’ll take a look to see what might be causing the underlying problem.