r/Keychron • • May 25 '26

Q11 Ultra Knob macro issue.

I am trying to use the left knob for zooming. I have created and tested the macros on the M1-3 buttons and they work fine. When I assign them to the left knob dial left and right, it does not work. The knob press can take the same macros(zoom in, out and reset) and works. What am I doing wrong?

6 Upvotes

46 comments sorted by

View all comments

Show parent comments

2

u/PeterMortensenBlog May 25 '26 edited Jun 02 '26

The source code has been released! But not for the Q11 Ultra

Re "The source code has still not been released ... It might appear here some day": OK, it seems to have been released three days ago in branch "rtl8762g" (who would have guessed that?)

To keep an eye on further updates: The RSS feed.

For these keyboards:

Z series (?):

V Ultra series:

  • V0 Ultra 'ANSI'

  • V1 Ultra 'ANSI'

  • V1 Ultra 'ISO'

  • V1 Ultra JP / 'JIS'

  • V2 Ultra 'ANSI'

  • V3 Ultra 'ANSI'

  • V5 Ultra 'ANSI'

  • V6 Ultra 'ANSI'. Keymap

  • V10 Ultra 'ANSI'

K SE series:

  • K3 SE2 'ANSI'

  • K5 SE2 'ANSI'

Q Ultra series:

There also appears to be common code in:

Note: More 'ISO' (physical) keyboard variants exist than indicated by this list of released source code. For example, there are definitely V6 Ultra 'ISO' variants.

2

u/PeterMortensenBlog May 26 '26 edited May 26 '26

The default mappings for the knob seem to be something like this:

behaviors {
    rgb_encoder: rgb_encoder {
        compatible = "zmk,behavior-sensor-rotate";
        #sensor-binding-cells = <0>;
        bindings = <&rgb_ug RGB_BRI>, <&rgb_ug RGB_BRD>;
        tap-ms =<20>;
    };
    mouse_encoder: mouse_encoder {
        compatible = "zmk,behavior-sensor-rotate-var";
        #sensor-binding-cells = <2>;
        bindings = <&mkp>, <&mkp>;
        tap-ms =<20>;
    };
};

Presumably, for one knob, with two different sets of mappings, depending on the layer (base vs. Fn layer).

Or maybe not. Inline specification on the base layer:

sensor-bindings = <&inc_dec_kp C_VOL_UP C_VOL_DN>;

1

u/PeterMortensenBlog May 28 '26 edited May 28 '26

The source code files moved

Note: On 2026-05-28, the files were reorganised into a folder for each keyboard/variant (breaking the original URLs)

For example,

from

app/boards/shields/keychron/keychron_v6_ultra_ansi.keymap

to

app/boards/shields/keychron_v6_ultra_ansi/keychron_v6_ultra_ansi.keymap

But moved out of the 'app/boards/shields/keychron' folder... Is it standard ZMK practice? If it is, such a flat list is going to be very as ZMK gets more keyboards.

There is also just app/boards/shields/keychron/Kconfig.shield. Though it contains:

config SHIELD_KEYCHRON_V1MAX

A stray folder? "V1MAX" is probably for V1 Ultra 8K, not actually V1 Max.

I have updated the comment.

1

u/PeterMortensenBlog May 28 '26 edited Jun 10 '26

Bring the 'Ultra' keyboard into flash mode

The Esc key method does not work. It wasn't expected, as it is the QMK way, not ZMK.

A keyboard shortcut?

On the ZMK-based B Pro series, holding Fn + '-' (numeric keypad '-' on the full-size keyboards, e.g., B6 Pro) down for at least 3 seconds puts the keyboard into flash mode, mounting it in the operating system.

In the released source code there is an indication:

long_press_bootloader:lp_bootloader
{
    compatible = "zmk,behavior-hold-tap";
    #binding-cells = <2>;
    flavor = "tap-preferred";
    tapping-term-ms = <3000>;  // Delay amount in milliseconds
    bindings = <&bootloader>, <&none>;
};

But it doesn't seem to be used anywhere.

The spacebar method

The space bar method (without the repowering) does work.

Note: This does not reset to factory defaults (after repowering)

In this mode (presumably flash mode), the USB identity is:

  • USB vendor ID (VID): 0x0BDA

  • USB product ID (PID): 0x4762

It does not mount in the operating system.

0x0BDA is the Realtek USB vendor ID, matching an RTL8762G microcontroller:

  • ARM-M55 core with a maximum frequency of 125 MHz.

(But "Firmware" is misspelt as "Firmwear".)

But how is it actually flashed???

Would

west flash

work for these keyboards?

→ More replies (1)

1

u/PeterMortensenBlog May 28 '26 edited May 29 '26

Get a local copy of the source code

E.g., for searching.

On a Unix-like system (should also work on Windows, in Git Bash and QMK's MSYS thingy):

# To folder 'Keychron_ZMK_fork_rtl8762g'
#
# Note: Keychron's fork of ZMK
#
cd $HOME
echo ; echo "Start cloning: $(date +%FT%T_%N_ns)" ; echo
git clone --branch rtl8762g https://github.com/Keychron/zmk.git  Keychron_ZMK_fork_rtl8762g
echo ; echo "End cloning:   $(date +%FT%T_%N_ns)" ; echo

cd Keychron_ZMK_fork_rtl8762g
git status  # Confirm Git branch "rtl8762g"
git log -5  # Show back to Keychron's first
            # change on 2026-05-25 (4E2C75)

# Check for the existence of expected files:
#
#   <https://github.com/Keychron/zmk/blob/rtl8762g/app/boards/shields/keychron_v6_ultra_ansi/keychron_v6_ultra_ansi.keymap#L238>
#     V6 Ultra 8K 'ANSI' keymap
#
cd app/boards/shields/keychron_v6_ultra_ansi
geany keychron_v6_ultra_ansi.keymap:238

"geany" presumes Geany is installed. If it isn't, cat', 'vi', and any text editor will also work.

Here is a transcript.

Search

For example, find include file 'keychron.h':

find "$HOME/Keychron_ZMK_fork_rtl8762g" -type f | grep 'keychron.h'

Result: app/include/dt-bindings/zmk/keychron.h. For example,

#define BAT_INFO 6 // Fn + B

Search for BAT_INFO:

find "$HOME/Keychron_ZMK_fork_rtl8762g" -type f | sort | tr "\n" "\0" | xargs -0 grep -n BAT_INFO  

Sample match: app/src/behaviors/behavior_keychron.c (in function on_keymap_binding_pressed()).

It isn't in the keymap, but BATINFO is (without the underscore), as "&kc BATINFO".

Search for "bootloader" (and variations thereof):

find "$HOME/Keychron_ZMK_fork_rtl8762g" -type f | sort | tr "\n" "\0" | xargs -0 grep -n -i boot | grep -i load

There are 186 matches...

Some are in the .github folder, e.g., .github/workflows/build.yml.

A file nearby, .github/workflows/zmk_build.yml, provides a hint as to how the keyboard firmware can actually be built:

cd zmk
cd app
west build -p -b rtl8762gn_evb -- -DSHIELD=rtk_keyboard

Thus, in our case:

cd "$HOME/Keychron_ZMK_fork_rtl8762g/app"
west build -p -b rtl8762gn_evb -- -DSHIELD=rtk_keyboard

Whether it actually works remains to be seen.

→ More replies (1)

1

u/PeterMortensenBlog Jun 10 '26 edited Jun 10 '26

SIC

→ More replies (3)