From d7188deb4f68eebc3c2a419f663d628e4e22fd9f Mon Sep 17 00:00:00 2001 From: lokher Date: Fri, 31 Oct 2025 11:09:07 +0800 Subject: [PATCH] Add QK_CR_0-QK_CR_51 custom keycode These keycodes are used by Keychron Quick Start --- keyboards/keychron/common/keychron_raw_hid.c | 5 +- keyboards/keychron/common/keychron_raw_hid.h | 4 +- quantum/action.c | 4 +- quantum/keycodes.h | 106 +++++++++++++++++++ quantum/keymap_common.c | 3 + tmk_core/protocol/report.h | 4 +- 6 files changed, 121 insertions(+), 5 deletions(-) diff --git a/keyboards/keychron/common/keychron_raw_hid.c b/keyboards/keychron/common/keychron_raw_hid.c index 07cabf8b10..f9277d25ca 100644 --- a/keyboards/keychron/common/keychron_raw_hid.c +++ b/keyboards/keychron/common/keychron_raw_hid.c @@ -69,6 +69,8 @@ void get_support_feature(uint8_t *data) { | FEATURE_KEYCHRON_RGB # endif ; + + data[2] = (FEATURE_QUICK_START >> 8); } void get_firmware_version(uint8_t *data) { @@ -151,12 +153,13 @@ bool kc_raw_hid_rx(uint8_t src, uint8_t *data, uint8_t length) { # ifdef USB_REPORT_INTERVAL_ENABLE | MISC_REPORT_REATE # endif - ; + | MISC_QUICK_START; break; case DFU_INFO_GET: dfu_info_rx(data, length); break; + case LANGUAGE_GET ... LANGUAGE_SET: language_rx(data, length); break; diff --git a/keyboards/keychron/common/keychron_raw_hid.h b/keyboards/keychron/common/keychron_raw_hid.h index 7d62483850..e04754a9ac 100644 --- a/keyboards/keychron/common/keychron_raw_hid.h +++ b/keyboards/keychron/common/keychron_raw_hid.h @@ -41,6 +41,8 @@ enum { FEATURE_DYNAMIC_DEBOUNCE = 0x01U << 5, FEATURE_SNAP_CLICK = 0x01U << 6, FEATURE_KEYCHRON_RGB = 0x01U << 7, + + FEATURE_QUICK_START = 0x01 << 8 }; enum { @@ -50,6 +52,7 @@ enum { MISC_SNAP_CLICK = 0x01 << 3, MISC_WIRELESS_LPM = 0x01 << 4, MISC_REPORT_REATE = 0x01 << 5, + MISC_QUICK_START = 0x01 << 6 }; enum { @@ -71,4 +74,3 @@ enum { }; void kc_raw_hid_send(uint8_t src, uint8_t *data, uint8_t len); - diff --git a/quantum/action.c b/quantum/action.c index d8910d247c..372949b3e7 100644 --- a/quantum/action.c +++ b/quantum/action.c @@ -972,7 +972,7 @@ __attribute__((weak)) void register_code(uint8_t code) { #ifdef EXTRAKEY_ENABLE } else if (IS_SYSTEM_KEYCODE(code)) { host_system_send(KEYCODE2SYSTEM(code)); - } else if (IS_CONSUMER_KEYCODE(code)) { + } else if (IS_CONSUMER_KEYCODE(code) || IS_CONSUMER_RESERVED_KEYCODE(code)) { host_consumer_send(KEYCODE2CONSUMER(code)); #endif @@ -1029,7 +1029,7 @@ __attribute__((weak)) void unregister_code(uint8_t code) { #ifdef EXTRAKEY_ENABLE } else if (IS_SYSTEM_KEYCODE(code)) { host_system_send(0); - } else if (IS_CONSUMER_KEYCODE(code)) { + } else if (IS_CONSUMER_KEYCODE(code) || IS_CONSUMER_RESERVED_KEYCODE(code)) { host_consumer_send(0); #endif diff --git a/quantum/keycodes.h b/quantum/keycodes.h index 6a59aa376d..2e33e2b6b7 100644 --- a/quantum/keycodes.h +++ b/quantum/keycodes.h @@ -834,6 +834,58 @@ enum qk_keycode_defines { QK_USER_29 = 0x7E5D, QK_USER_30 = 0x7E5E, QK_USER_31 = 0x7E5F, + QK_CONSUMER_RESERVED_0 = 0x07F00, + QK_CONSUMER_RESERVED_1 = 0x07F01, + QK_CONSUMER_RESERVED_2 = 0x07F02, + QK_CONSUMER_RESERVED_3 = 0x07F03, + QK_CONSUMER_RESERVED_4 = 0x07F04, + QK_CONSUMER_RESERVED_5 = 0x07F05, + QK_CONSUMER_RESERVED_6 = 0x07F06, + QK_CONSUMER_RESERVED_7 = 0x07F07, + QK_CONSUMER_RESERVED_8 = 0x07F08, + QK_CONSUMER_RESERVED_9 = 0x07F09, + QK_CONSUMER_RESERVED_10 = 0x07F0A, + QK_CONSUMER_RESERVED_11 = 0x07F0B, + QK_CONSUMER_RESERVED_12 = 0x07F0C, + QK_CONSUMER_RESERVED_13 = 0x07F0D, + QK_CONSUMER_RESERVED_14 = 0x07F0E, + QK_CONSUMER_RESERVED_15 = 0x07F0F, + QK_CONSUMER_RESERVED_16 = 0x07F10, + QK_CONSUMER_RESERVED_17 = 0x07F11, + QK_CONSUMER_RESERVED_18 = 0x07F12, + QK_CONSUMER_RESERVED_19 = 0x07F13, + QK_CONSUMER_RESERVED_20 = 0x07F14, + QK_CONSUMER_RESERVED_21 = 0x07F15, + QK_CONSUMER_RESERVED_22 = 0x07F16, + QK_CONSUMER_RESERVED_23 = 0x07F17, + QK_CONSUMER_RESERVED_24 = 0x07F18, + QK_CONSUMER_RESERVED_25 = 0x07F19, + QK_CONSUMER_RESERVED_26 = 0x07F1A, + QK_CONSUMER_RESERVED_27 = 0x07F1B, + QK_CONSUMER_RESERVED_28 = 0x07F1C, + QK_CONSUMER_RESERVED_29 = 0x07F1D, + QK_CONSUMER_RESERVED_30 = 0x07F1E, + QK_CONSUMER_RESERVED_31 = 0x07F1F, + QK_CONSUMER_RESERVED_32 = 0x07F20, + QK_CONSUMER_RESERVED_33 = 0x07F21, + QK_CONSUMER_RESERVED_34 = 0x07F22, + QK_CONSUMER_RESERVED_35 = 0x07F23, + QK_CONSUMER_RESERVED_36 = 0x07F24, + QK_CONSUMER_RESERVED_37 = 0x07F25, + QK_CONSUMER_RESERVED_38 = 0x07F26, + QK_CONSUMER_RESERVED_39 = 0x07F27, + QK_CONSUMER_RESERVED_40 = 0x07F28, + QK_CONSUMER_RESERVED_41 = 0x07F29, + QK_CONSUMER_RESERVED_42 = 0x07F2A, + QK_CONSUMER_RESERVED_43 = 0x07F2B, + QK_CONSUMER_RESERVED_44 = 0x07F2C, + QK_CONSUMER_RESERVED_45 = 0x07F2D, + QK_CONSUMER_RESERVED_46 = 0x07F2E, + QK_CONSUMER_RESERVED_47 = 0x07F2F, + QK_CONSUMER_RESERVED_48 = 0x07F30, + QK_CONSUMER_RESERVED_49 = 0x07F31, + QK_CONSUMER_RESERVED_50 = 0x07F32, + QK_CONSUMER_RESERVED_51 = 0x07F33, // Alias XXXXXXX = KC_NO, @@ -1457,6 +1509,58 @@ enum qk_keycode_defines { QK_REP = QK_REPEAT_KEY, QK_AREP = QK_ALT_REPEAT_KEY, QK_LLCK = QK_LAYER_LOCK, + QK_CR_0 = QK_CONSUMER_RESERVED_0, + QK_CR_1 = QK_CONSUMER_RESERVED_1, + QK_CR_2 = QK_CONSUMER_RESERVED_2, + QK_CR_3 = QK_CONSUMER_RESERVED_3, + QK_CR_4 = QK_CONSUMER_RESERVED_4, + QK_CR_5 = QK_CONSUMER_RESERVED_5, + QK_CR_6 = QK_CONSUMER_RESERVED_6, + QK_CR_7 = QK_CONSUMER_RESERVED_7, + QK_CR_8 = QK_CONSUMER_RESERVED_8, + QK_CR_9 = QK_CONSUMER_RESERVED_9, + QK_CR_10 = QK_CONSUMER_RESERVED_10, + QK_CR_11 = QK_CONSUMER_RESERVED_11, + QK_CR_12 = QK_CONSUMER_RESERVED_12, + QK_CR_13 = QK_CONSUMER_RESERVED_13, + QK_CR_14 = QK_CONSUMER_RESERVED_14, + QK_CR_15 = QK_CONSUMER_RESERVED_15, + QK_CR_16 = QK_CONSUMER_RESERVED_16, + QK_CR_17 = QK_CONSUMER_RESERVED_17, + QK_CR_18 = QK_CONSUMER_RESERVED_18, + QK_CR_19 = QK_CONSUMER_RESERVED_19, + QK_CR_20 = QK_CONSUMER_RESERVED_20, + QK_CR_21 = QK_CONSUMER_RESERVED_21, + QK_CR_22 = QK_CONSUMER_RESERVED_22, + QK_CR_23 = QK_CONSUMER_RESERVED_23, + QK_CR_24 = QK_CONSUMER_RESERVED_24, + QK_CR_25 = QK_CONSUMER_RESERVED_25, + QK_CR_26 = QK_CONSUMER_RESERVED_26, + QK_CR_27 = QK_CONSUMER_RESERVED_27, + QK_CR_28 = QK_CONSUMER_RESERVED_28, + QK_CR_29 = QK_CONSUMER_RESERVED_29, + QK_CR_30 = QK_CONSUMER_RESERVED_30, + QK_CR_31 = QK_CONSUMER_RESERVED_31, + QK_CR_32 = QK_CONSUMER_RESERVED_32, + QK_CR_33 = QK_CONSUMER_RESERVED_33, + QK_CR_34 = QK_CONSUMER_RESERVED_34, + QK_CR_35 = QK_CONSUMER_RESERVED_35, + QK_CR_36 = QK_CONSUMER_RESERVED_36, + QK_CR_37 = QK_CONSUMER_RESERVED_37, + QK_CR_38 = QK_CONSUMER_RESERVED_38, + QK_CR_39 = QK_CONSUMER_RESERVED_39, + QK_CR_40 = QK_CONSUMER_RESERVED_40, + QK_CR_41 = QK_CONSUMER_RESERVED_41, + QK_CR_42 = QK_CONSUMER_RESERVED_42, + QK_CR_43 = QK_CONSUMER_RESERVED_43, + QK_CR_44 = QK_CONSUMER_RESERVED_44, + QK_CR_45 = QK_CONSUMER_RESERVED_45, + QK_CR_46 = QK_CONSUMER_RESERVED_46, + QK_CR_47 = QK_CONSUMER_RESERVED_47, + QK_CR_48 = QK_CONSUMER_RESERVED_48, + QK_CR_49 = QK_CONSUMER_RESERVED_49, + QK_CR_50 = QK_CONSUMER_RESERVED_50, + QK_CR_51 = QK_CONSUMER_RESERVED_51, }; // Range Helpers @@ -1518,6 +1622,7 @@ enum qk_keycode_defines { #define IS_QUANTUM_KEYCODE(code) ((code) >= QK_BOOTLOADER && (code) <= QK_LAYER_LOCK) #define IS_KB_KEYCODE(code) ((code) >= QK_KB_0 && (code) <= QK_KB_31) #define IS_USER_KEYCODE(code) ((code) >= QK_USER_0 && (code) <= QK_USER_31) +#define IS_CONSUMER_RESERVED_KEYCODE(code) ((code) >= QK_CONSUMER_RESERVED_0 && (code) <= QK_CONSUMER_RESERVED_51) // Switch statement Helpers #define INTERNAL_KEYCODE_RANGE KC_NO ... KC_TRANSPARENT @@ -1544,3 +1649,4 @@ enum qk_keycode_defines { #define QUANTUM_KEYCODE_RANGE QK_BOOTLOADER ... QK_LAYER_LOCK #define KB_KEYCODE_RANGE QK_KB_0 ... QK_KB_31 #define USER_KEYCODE_RANGE QK_USER_0 ... QK_USER_31 +#define RESERVED_KEYCODE_RAGE QK_CONSUMER_RESERVED_0 ... QK_CONSUMER_RESERVED_51 diff --git a/quantum/keymap_common.c b/quantum/keymap_common.c index 9be9bae943..f7172a247e 100644 --- a/quantum/keymap_common.c +++ b/quantum/keymap_common.c @@ -74,6 +74,9 @@ action_t action_for_keycode(uint16_t keycode) { case CONSUMER_KEYCODE_RANGE: action.code = ACTION_USAGE_CONSUMER(KEYCODE2CONSUMER(keycode)); break; + case RESERVED_KEYCODE_RAGE: + action.code = ACTION_USAGE_CONSUMER(KEYCODE2CONSUMER(keycode)); + break; #endif case MOUSE_KEYCODE_RANGE: action.code = ACTION_MOUSEKEY(keycode); diff --git a/tmk_core/protocol/report.h b/tmk_core/protocol/report.h index aede5e51d2..389dc419e2 100644 --- a/tmk_core/protocol/report.h +++ b/tmk_core/protocol/report.h @@ -288,7 +288,7 @@ static inline uint16_t KEYCODE2SYSTEM(uint8_t key) { } /* keycode to consumer usage */ -static inline uint16_t KEYCODE2CONSUMER(uint8_t key) { +static inline uint16_t KEYCODE2CONSUMER(uint16_t key) { switch (key) { case KC_AUDIO_MUTE: return AUDIO_MUTE; @@ -344,6 +344,8 @@ static inline uint16_t KEYCODE2CONSUMER(uint8_t key) { return AC_DESKTOP_SHOW_ALL_WINDOWS; case KC_LAUNCHPAD: return AC_SOFT_KEY_LEFT; + case RESERVED_KEYCODE_RAGE: + return 0x1CC + (key - QK_CONSUMER_RESERVED_0); default: return 0; }