From 4b9687098d1795bd3299e6dca2dcc07114f7a997 Mon Sep 17 00:00:00 2001
From: adophoxia <100170946+adophoxia@users.noreply.github.com>
Date: Sun, 9 Apr 2023 18:02:39 -0700
Subject: [PATCH] Update Q0; Port Keychron Q0 Plus to VIAL (#416)
* Update Q0; Port Keychron Q0 Plus to VIAL
* Update VIAL UIDs for Q0 and Q0 Plus
* Remove `via` keymaps and mentions of `VIA_ENABLE = yes` for `keychron` keymaps for Q0 and Q0 Plus
* Update readme.md
* Add VIAL-specific flags for `vial` keymap
---
keyboards/keychron/q0/config.h | 79 +--------
keyboards/keychron/q0/q0.c | 6 +-
keyboards/keychron/q0/q0.h | 23 ---
keyboards/keychron/q0/readme.md | 8 +-
keyboards/keychron/q0/rev_0130/config.h | 4 +
keyboards/keychron/q0/rev_0130/info.json | 125 +++++++++++---
.../q0/rev_0130/keymaps/default/keymap.c | 12 +-
.../q0/rev_0130/keymaps/keychron/keymap.c | 65 ++++++++
.../q0/rev_0130/keymaps/keychron/rules.mk | 4 +
.../q0/rev_0130/keymaps/vial/config.h | 2 +-
.../q0/rev_0130/keymaps/vial/keymap.c | 26 ++-
.../q0/rev_0130/keymaps/vial/rules.mk | 5 +-
.../q0/rev_0130/keymaps/vial/vial.json | 20 +--
keyboards/keychron/q0/rev_0130/rev_0130.c | 33 ----
keyboards/keychron/q0/rev_0130/rules.mk | 22 ---
.../rev_0130.h => rev_0131/config.h} | 34 ++--
keyboards/keychron/q0/rev_0131/info.json | 138 +++++++++++++++
.../q0/rev_0131/keymaps/default/keymap.c | 49 ++++++
.../q0/rev_0131/keymaps/default/rules.mk | 1 +
.../q0/rev_0131/keymaps/keychron/keymap.c | 83 +++++++++
.../q0/rev_0131/keymaps/keychron/rules.mk | 2 +
.../q0/rev_0131/keymaps/vial/config.h | 8 +
.../q0/rev_0131/keymaps/vial/keymap.c | 83 +++++++++
.../q0/rev_0131/keymaps/vial/rules.mk | 7 +
.../q0/rev_0131/keymaps/vial/vial.json | 157 ++++++++++++++++++
keyboards/keychron/q0/rev_0131/readme.md | 6 +
keyboards/keychron/q0/rev_0131/rev_0131.c | 62 +++++++
keyboards/keychron/q0/rev_0131/rules.mk | 5 +
28 files changed, 839 insertions(+), 230 deletions(-)
delete mode 100644 keyboards/keychron/q0/q0.h
create mode 100644 keyboards/keychron/q0/rev_0130/keymaps/keychron/keymap.c
create mode 100644 keyboards/keychron/q0/rev_0130/keymaps/keychron/rules.mk
rename keyboards/keychron/q0/{rev_0130/rev_0130.h => rev_0131/config.h} (57%)
create mode 100644 keyboards/keychron/q0/rev_0131/info.json
create mode 100644 keyboards/keychron/q0/rev_0131/keymaps/default/keymap.c
create mode 100644 keyboards/keychron/q0/rev_0131/keymaps/default/rules.mk
create mode 100644 keyboards/keychron/q0/rev_0131/keymaps/keychron/keymap.c
create mode 100644 keyboards/keychron/q0/rev_0131/keymaps/keychron/rules.mk
create mode 100644 keyboards/keychron/q0/rev_0131/keymaps/vial/config.h
create mode 100644 keyboards/keychron/q0/rev_0131/keymaps/vial/keymap.c
create mode 100644 keyboards/keychron/q0/rev_0131/keymaps/vial/rules.mk
create mode 100644 keyboards/keychron/q0/rev_0131/keymaps/vial/vial.json
create mode 100644 keyboards/keychron/q0/rev_0131/readme.md
create mode 100644 keyboards/keychron/q0/rev_0131/rev_0131.c
create mode 100644 keyboards/keychron/q0/rev_0131/rules.mk
diff --git a/keyboards/keychron/q0/config.h b/keyboards/keychron/q0/config.h
index 9422fadb42..454d8a2cc6 100644
--- a/keyboards/keychron/q0/config.h
+++ b/keyboards/keychron/q0/config.h
@@ -16,86 +16,11 @@
#pragma once
-/* key matrix size */
-#define MATRIX_ROWS 6
-#define MATRIX_COLS 4
-
-/* key matrix pins */
-#define MATRIX_ROW_PINS { B5, B4, B3, A15, A14, A13 }
-#define MATRIX_COL_PINS { A5, A6, A7, B0 }
-
-/* COL2ROW or ROW2COL */
-#define DIODE_DIRECTION ROW2COL
-
-/* Set 0 if debouncing isn't needed */
-#define DEBOUNCE 5
-
-/* RGB Matrix Driver Configuration */
-#define DRIVER_COUNT 1
-#define DRIVER_ADDR_1 0b1110100
-
-#define CKLED2001_CURRENT_TUNE \
- { 0xFF, 0xFF, 0x70, 0xFF, 0xFF, 0x70, 0xFF, 0xFF, 0x70, 0xFF, 0xFF, 0x70 }
-
-#define RGB_MATRIX_CENTER \
- { 56, 16 }
-
-/* NKRO */
-#define FORCE_NKRO
+#define CKLED2001_CURRENT_TUNE { 0xFF, 0xFF, 0x70, 0xFF, 0xFF, 0x70, 0xFF, 0xFF, 0x70, 0xFF, 0xFF, 0x70 }
/* turn off effects when suspended */
#define RGB_DISABLE_WHEN_USB_SUSPENDED
/* EEPROM Driver Configuration */
#define WEAR_LEVELING_LOGICAL_SIZE 2048
-#define WEAR_LEVELING_BACKING_SIZE (WEAR_LEVELING_LOGICAL_SIZE * 2)
-
-// RGB Matrix Animation modes. Explicitly enabled
-// For full list of effects, see:
-// https://docs.qmk.fm/#/feature_rgb_matrix?id=rgb-matrix-effects
-// #define ENABLE_RGB_MATRIX_ALPHAS_MODS
-// #define ENABLE_RGB_MATRIX_GRADIENT_UP_DOWN
-// #define ENABLE_RGB_MATRIX_GRADIENT_LEFT_RIGHT
-#define ENABLE_RGB_MATRIX_BREATHING
-// #define ENABLE_RGB_MATRIX_BAND_SAT
-// #define ENABLE_RGB_MATRIX_BAND_VAL
-// #define ENABLE_RGB_MATRIX_BAND_PINWHEEL_SAT
-// #define ENABLE_RGB_MATRIX_BAND_PINWHEEL_VAL
-// #define ENABLE_RGB_MATRIX_BAND_SPIRAL_SAT
-// #define ENABLE_RGB_MATRIX_BAND_SPIRAL_VAL
-#define ENABLE_RGB_MATRIX_CYCLE_ALL
-#define ENABLE_RGB_MATRIX_CYCLE_LEFT_RIGHT
-#define ENABLE_RGB_MATRIX_CYCLE_UP_DOWN
-#define ENABLE_RGB_MATRIX_RAINBOW_MOVING_CHEVRON
-#define ENABLE_RGB_MATRIX_CYCLE_OUT_IN
-#define ENABLE_RGB_MATRIX_CYCLE_OUT_IN_DUAL
-#define ENABLE_RGB_MATRIX_CYCLE_PINWHEEL
-#define ENABLE_RGB_MATRIX_CYCLE_SPIRAL
-#define ENABLE_RGB_MATRIX_DUAL_BEACON
-#define ENABLE_RGB_MATRIX_RAINBOW_BEACON
-// #define ENABLE_RGB_MATRIX_RAINBOW_PINWHEELS
-#define ENABLE_RGB_MATRIX_RAINDROPS
-// #define ENABLE_RGB_MATRIX_JELLYBEAN_RAINDROPS
-// #define ENABLE_RGB_MATRIX_HUE_BREATHING
-// #define ENABLE_RGB_MATRIX_HUE_PENDULUM
-// #define ENABLE_RGB_MATRIX_HUE_WAVE
-// #define ENABLE_RGB_MATRIX_PIXEL_RAIN
-// #define ENABLE_RGB_MATRIX_PIXEL_FLOW
-// #define ENABLE_RGB_MATRIX_PIXEL_FRACTAL
-// enabled only if RGB_MATRIX_FRAMEBUFFER_EFFECTS is defined
-#define ENABLE_RGB_MATRIX_TYPING_HEATMAP
-#define ENABLE_RGB_MATRIX_DIGITAL_RAIN
-// enabled only of RGB_MATRIX_KEYPRESSES or RGB_MATRIX_KEYRELEASES is defined
-#define ENABLE_RGB_MATRIX_SOLID_REACTIVE_SIMPLE
-#define ENABLE_RGB_MATRIX_SOLID_REACTIVE
-#define ENABLE_RGB_MATRIX_SOLID_REACTIVE_WIDE
-#define ENABLE_RGB_MATRIX_SOLID_REACTIVE_MULTIWIDE
-#define ENABLE_RGB_MATRIX_SOLID_REACTIVE_CROSS
-#define ENABLE_RGB_MATRIX_SOLID_REACTIVE_MULTICROSS
-#define ENABLE_RGB_MATRIX_SOLID_REACTIVE_NEXUS
-#define ENABLE_RGB_MATRIX_SOLID_REACTIVE_MULTINEXUS
-#define ENABLE_RGB_MATRIX_SPLASH
-#define ENABLE_RGB_MATRIX_MULTISPLASH
-#define ENABLE_RGB_MATRIX_SOLID_SPLASH
-#define ENABLE_RGB_MATRIX_SOLID_MULTISPLASH
-// #define RGB_MATRIX_KEYPRESSES
\ No newline at end of file
+#define WEAR_LEVELING_BACKING_SIZE (WEAR_LEVELING_LOGICAL_SIZE * 2)
\ No newline at end of file
diff --git a/keyboards/keychron/q0/q0.c b/keyboards/keychron/q0/q0.c
index d17ab77f47..672c8111d3 100644
--- a/keyboards/keychron/q0/q0.c
+++ b/keyboards/keychron/q0/q0.c
@@ -14,7 +14,7 @@
* along with this program. If not, see .
*/
-#include "q0.h"
+#include "quantum.h"
#if defined(RGB_MATRIX_ENABLE) && defined(NUM_LOCK_LED_INDEX)
@@ -42,9 +42,7 @@ bool process_record_kb(uint16_t keycode, keyrecord_t *record) {
return true;
}
-__attribute__((weak)) void rgb_matrix_indicators_advanced_user(uint8_t led_min, uint8_t led_max) {
- // RGB_MATRIX_INDICATOR_SET_COLOR(index, red, green, blue);
-
+void rgb_matrix_indicators_advanced_kb(uint8_t led_min, uint8_t led_max) {
if (host_keyboard_led_state().num_lock) {
RGB_MATRIX_INDICATOR_SET_COLOR(NUM_LOCK_LED_INDEX, 255, 255, 255);
} else {
diff --git a/keyboards/keychron/q0/q0.h b/keyboards/keychron/q0/q0.h
deleted file mode 100644
index 6eaa41e87c..0000000000
--- a/keyboards/keychron/q0/q0.h
+++ /dev/null
@@ -1,23 +0,0 @@
-/* Copyright 2022 @ Keychron (https://www.keychron.com)
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see .
- */
-
-#pragma once
-
-#include "quantum.h"
-
-#if defined(KEYBOARD_keychron_q0_rev_0130)
-# include "rev_0130.h"
-#endif
diff --git a/keyboards/keychron/q0/readme.md b/keyboards/keychron/q0/readme.md
index d0180d386e..cab643be3b 100644
--- a/keyboards/keychron/q0/readme.md
+++ b/keyboards/keychron/q0/readme.md
@@ -7,12 +7,12 @@ A customizable number keypad.
* Hardware Availability: [Keychron](https://www.keychron.com)
Make example for this keyboard (after setting up your build environment):
-
- make keychron/q0/rev_0130:default
+
+ make keychron/q0/rev_0131:vial (Keychron Q0 Plus)
Flashing example for this keyboard:
-
- make keychron/q0/rev_0130:default:flash
+
+ make keychron/q0/rev_0131:vial:flash (Keychron Q0 Plus)
**Reset Key**: Hold down the key located at *K00*, commonly programmed as *Esc* while plugging in the keyboard.
diff --git a/keyboards/keychron/q0/rev_0130/config.h b/keyboards/keychron/q0/rev_0130/config.h
index e7fabed664..6b5bf30fda 100644
--- a/keyboards/keychron/q0/rev_0130/config.h
+++ b/keyboards/keychron/q0/rev_0130/config.h
@@ -16,6 +16,10 @@
#pragma once
+/* RGB Matrix Driver Configuration */
+#define DRIVER_COUNT 1
+#define DRIVER_ADDR_1 0b1110100
+
/* RGB Matrix Configuration */
#define DRIVER_1_LED_TOTAL 21
#define DRIVER_LED_TOTAL DRIVER_1_LED_TOTAL
diff --git a/keyboards/keychron/q0/rev_0130/info.json b/keyboards/keychron/q0/rev_0130/info.json
index d42a43ef66..cf1503db23 100644
--- a/keyboards/keychron/q0/rev_0130/info.json
+++ b/keyboards/keychron/q0/rev_0130/info.json
@@ -6,38 +6,117 @@
"usb": {
"vid": "0x3434",
"pid": "0x0130",
- "device_version": "1.0.2"
+ "device_version": "1.0.2",
+ "force_nkro": true
+ },
+ "matrix_pins": {
+ "cols": ["A5", "A6", "A7", "B0"],
+ "rows": ["B5", "B4", "B3", "A15", "A14", "A13"]
+ },
+ "features": {
+ "audio": false,
+ "backlight": false,
+ "bootmagic": true,
+ "command": false,
+ "console": false,
+ "extrakey": true,
+ "mousekey": true,
+ "nkro": true,
+ "rgb_matrix": true,
+ "rgblight": false
+ },
+ "diode_direction": "ROW2COL",
+ "bootmagic": {
+ "matrix": [0, 1]
+ },
+ "processor": "STM32L432",
+ "bootloader": "stm32-dfu",
+ "rgb_matrix": {
+ "driver": "CKLED2001",
+ "animations": {
+ "band_spiral_val": true,
+ "cycle_all": true,
+ "cycle_left_right": true,
+ "cycle_up_down": true,
+ "rainbow_moving_chevron": true,
+ "cycle_out_in": true,
+ "cycle_out_in_dual": true,
+ "cycle_pinwheel": true,
+ "cycle_spiral": true,
+ "dual_beacon": true,
+ "rainbow_beacon": true,
+ "jellybean_raindrops": true,
+ "pixel_rain": true,
+ "typing_heatmap": true,
+ "digital_rain": true,
+ "solid_reactive_simple": true,
+ "solid_reactive_multiwide": true,
+ "solid_reactive_multinexus": true,
+ "splash": true,
+ "solid_splash": true,
+ "keypresses": true,
+ "framebuffer_effects": true
+ },
+ "center_point": [56, 16],
+ "layout": [
+ {"flags": 1,"matrix":[0,0], "x":0, "y":0},
+ {"flags": 1,"matrix":[0,1], "x":1, "y":0},
+ {"flags": 1,"matrix":[0,2], "x":2, "y":0},
+ {"flags": 1,"matrix":[0,3], "x":3, "y":0},
+
+ {"flags": 9,"matrix":[1,0], "x":0, "y":6},
+ {"flags": 4,"matrix":[1,1], "x":1, "y":6},
+ {"flags": 4,"matrix":[1,2], "x":2, "y":6},
+ {"flags": 4,"matrix":[1,3], "x":3, "y":6},
+
+ {"flags": 4,"matrix":[2,0], "x":0, "y":13},
+ {"flags": 4,"matrix":[2,1], "x":1, "y":13},
+ {"flags": 4,"matrix":[2,2], "x":2, "y":13},
+
+ {"flags": 4,"matrix":[3,0], "x":0, "y":19},
+ {"flags": 4,"matrix":[3,1], "x":1, "y":19},
+ {"flags": 4,"matrix":[3,2], "x":2, "y":19},
+ {"flags": 4,"matrix":[2,3], "x":3, "y":16},
+
+ {"flags": 4,"matrix":[4,0], "x":0, "y":25},
+ {"flags": 4,"matrix":[4,1], "x":1, "y":25},
+ {"flags": 4,"matrix":[4,2], "x":2, "y":25},
+
+ {"flags": 4,"matrix":[5,0], "x":0, "y":32},
+ {"flags": 4,"matrix":[5,2], "x":2, "y":32},
+ {"flags": 1,"matrix":[4,3], "x":3, "y":29}
+ ]
},
"layouts": {
"LAYOUT_numpad_6x4": {
"layout": [
- {"label":"Fn", "x":0, "y":0},
- {"label":"Esc", "x":1, "y":0},
- {"label":"Backspace", "x":2, "y":0},
- {"label":"Tab", "x":3, "y":0},
+ {"matrix":[0,0], "x":0, "y":0},
+ {"matrix":[0,1], "x":1, "y":0},
+ {"matrix":[0,2], "x":2, "y":0},
+ {"matrix":[0,3], "x":3, "y":0},
- {"label":"Num Lock", "x":0, "y":1},
- {"label":"/", "x":1, "y":1},
- {"label":"*", "x":2, "y":1},
- {"label":"-", "x":3, "y":1},
+ {"matrix":[1,0], "x":0, "y":1},
+ {"matrix":[1,1], "x":1, "y":1},
+ {"matrix":[1,2], "x":2, "y":1},
+ {"matrix":[1,3], "x":3, "y":1},
- {"label":"7", "x":0, "y":2},
- {"label":"8", "x":1, "y":2},
- {"label":"9", "x":2, "y":2},
+ {"matrix":[2,0], "x":0, "y":2},
+ {"matrix":[2,1], "x":1, "y":2},
+ {"matrix":[2,2], "x":2, "y":2},
- {"label":"4", "x":0, "y":3},
- {"label":"5", "x":1, "y":3},
- {"label":"6", "x":2, "y":3},
- {"label":"+", "x":3, "y":2, "h":2},
+ {"matrix":[3,0], "x":0, "y":3},
+ {"matrix":[3,1], "x":1, "y":3},
+ {"matrix":[3,2], "x":2, "y":3},
+ {"matrix":[2,3], "x":3, "y":2, "h":2},
- {"label":"1", "x":0, "y":4},
- {"label":"2", "x":1, "y":4},
- {"label":"3", "x":2, "y":4},
+ {"matrix":[4,0], "x":0, "y":4},
+ {"matrix":[4,1], "x":1, "y":4},
+ {"matrix":[4,2], "x":2, "y":4},
- {"label":"0", "x":0, "y":5, "w":2},
- {"label":".", "x":2, "y":5},
- {"label":"Enter", "x":3, "y":4, "h":2}
+ {"matrix":[5,0], "x":0, "y":5, "w":2},
+ {"matrix":[5,2], "x":2, "y":5},
+ {"matrix":[4,3], "x":3, "y":4, "h":2}
]
}
}
-}
\ No newline at end of file
+}
diff --git a/keyboards/keychron/q0/rev_0130/keymaps/default/keymap.c b/keyboards/keychron/q0/rev_0130/keymaps/default/keymap.c
index 6a05648074..387ff2d686 100644
--- a/keyboards/keychron/q0/rev_0130/keymaps/default/keymap.c
+++ b/keyboards/keychron/q0/rev_0130/keymaps/default/keymap.c
@@ -20,12 +20,12 @@ enum layers { _BASE, _FN1};
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
[_BASE] = LAYOUT_numpad_6x4(
- MO(_FN1), KC_ESC, KC_BSPACE, KC_TAB,
- KC_NUMLOCK, KC_PSLS, KC_PAST, KC_PMNS,
- KC_P7, KC_P8, KC_P9,
- KC_P4, KC_P5, KC_P6, KC_PPLS,
- KC_P1, KC_P2, KC_P3,
- KC_P0, KC_PDOT, KC_PENT),
+ MO(_FN1), KC_ESC, KC_BSPC, KC_TAB,
+ KC_NUM, KC_PSLS, KC_PAST, KC_PMNS,
+ KC_P7, KC_P8, KC_P9,
+ KC_P4, KC_P5, KC_P6, KC_PPLS,
+ KC_P1, KC_P2, KC_P3,
+ KC_P0, KC_PDOT, KC_PENT),
[_FN1] = LAYOUT_numpad_6x4(
_______, KC_MUTE, KC_VOLD, KC_VOLU,
diff --git a/keyboards/keychron/q0/rev_0130/keymaps/keychron/keymap.c b/keyboards/keychron/q0/rev_0130/keymaps/keychron/keymap.c
new file mode 100644
index 0000000000..73826716fc
--- /dev/null
+++ b/keyboards/keychron/q0/rev_0130/keymaps/keychron/keymap.c
@@ -0,0 +1,65 @@
+/* Copyright 2023 @ Keychron (https://www.keychron.com)
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+
+#include QMK_KEYBOARD_H
+#include "keychron_common.h"
+
+enum layers { _BASE, _FN1, _RESERVED1, _RESERVED2 };
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+ [_BASE] = LAYOUT_numpad_6x4(
+ MO(_FN1), KC_ESC, KC_BSPC, KC_TAB,
+ KC_NUM, KC_PSLS, KC_PAST, KC_PMNS,
+ KC_P7, KC_P8, KC_P9,
+ KC_P4, KC_P5, KC_P6, KC_PPLS,
+ KC_P1, KC_P2, KC_P3,
+ KC_P0, KC_PDOT, KC_PENT),
+
+ [_FN1] = LAYOUT_numpad_6x4(
+ _______, KC_MUTE, KC_VOLD, KC_VOLU,
+ RGB_MOD, RGB_VAI, RGB_HUI, KC_DEL,
+ RGB_RMOD, RGB_VAD, RGB_HUD,
+ RGB_SAI, RGB_SPI, KC_MPRV, _______,
+ RGB_SAD, RGB_SPD, KC_MPLY,
+ RGB_TOG, KC_MNXT, _______),
+
+ [_RESERVED1] = LAYOUT_numpad_6x4(
+ _______, _______, _______, _______,
+ _______, _______, _______, _______,
+ _______, _______, _______,
+ _______, _______, _______, _______,
+ _______, _______, _______,
+ _______, _______, _______),
+
+ [_RESERVED2] = LAYOUT_numpad_6x4(
+ _______, _______, _______, _______,
+ _______, _______, _______, _______,
+ _______, _______, _______,
+ _______, _______, _______, _______,
+ _______, _______, _______,
+ _______, _______, _______)
+};
+
+void housekeeping_task_user(void) {
+ housekeeping_task_keychron();
+}
+
+bool process_record_user(uint16_t keycode, keyrecord_t *record) {
+ if (!process_record_keychron(keycode, record)) {
+ return false;
+ }
+ return true;
+}
diff --git a/keyboards/keychron/q0/rev_0130/keymaps/keychron/rules.mk b/keyboards/keychron/q0/rev_0130/keymaps/keychron/rules.mk
new file mode 100644
index 0000000000..e5ae43813e
--- /dev/null
+++ b/keyboards/keychron/q0/rev_0130/keymaps/keychron/rules.mk
@@ -0,0 +1,4 @@
+ENCODER_MAP_ENABLE = yes
+
+VPATH += keyboards/keychron/common
+SRC += keychron_common.c
diff --git a/keyboards/keychron/q0/rev_0130/keymaps/vial/config.h b/keyboards/keychron/q0/rev_0130/keymaps/vial/config.h
index 5065e78b68..7dab45c639 100644
--- a/keyboards/keychron/q0/rev_0130/keymaps/vial/config.h
+++ b/keyboards/keychron/q0/rev_0130/keymaps/vial/config.h
@@ -2,7 +2,7 @@
#pragma once
-#define VIAL_KEYBOARD_UID {0xCD, 0xB9, 0xD4, 0xC9, 0x53, 0x9A, 0x68, 0xC3}
+#define VIAL_KEYBOARD_UID {0xCB, 0x44, 0x98, 0x8F, 0x71, 0xAE, 0x25, 0x99}
#define VIAL_UNLOCK_COMBO_ROWS { 0, 4 }
#define VIAL_UNLOCK_COMBO_COLS { 0, 3 }
diff --git a/keyboards/keychron/q0/rev_0130/keymaps/vial/keymap.c b/keyboards/keychron/q0/rev_0130/keymaps/vial/keymap.c
index 078ede4041..73826716fc 100644
--- a/keyboards/keychron/q0/rev_0130/keymaps/vial/keymap.c
+++ b/keyboards/keychron/q0/rev_0130/keymaps/vial/keymap.c
@@ -1,4 +1,4 @@
-/* Copyright 2022 @ Keychron (https://www.keychron.com)
+/* Copyright 2023 @ Keychron (https://www.keychron.com)
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -15,17 +15,18 @@
*/
#include QMK_KEYBOARD_H
+#include "keychron_common.h"
enum layers { _BASE, _FN1, _RESERVED1, _RESERVED2 };
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
[_BASE] = LAYOUT_numpad_6x4(
- MO(_FN1), KC_ESC, KC_BSPACE, KC_TAB,
- KC_NUMLOCK, KC_PSLS, KC_PAST, KC_PMNS,
- KC_P7, KC_P8, KC_P9,
- KC_P4, KC_P5, KC_P6, KC_PPLS,
- KC_P1, KC_P2, KC_P3,
- KC_P0, KC_PDOT, KC_PENT),
+ MO(_FN1), KC_ESC, KC_BSPC, KC_TAB,
+ KC_NUM, KC_PSLS, KC_PAST, KC_PMNS,
+ KC_P7, KC_P8, KC_P9,
+ KC_P4, KC_P5, KC_P6, KC_PPLS,
+ KC_P1, KC_P2, KC_P3,
+ KC_P0, KC_PDOT, KC_PENT),
[_FN1] = LAYOUT_numpad_6x4(
_______, KC_MUTE, KC_VOLD, KC_VOLU,
@@ -51,3 +52,14 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
_______, _______, _______,
_______, _______, _______)
};
+
+void housekeeping_task_user(void) {
+ housekeeping_task_keychron();
+}
+
+bool process_record_user(uint16_t keycode, keyrecord_t *record) {
+ if (!process_record_keychron(keycode, record)) {
+ return false;
+ }
+ return true;
+}
diff --git a/keyboards/keychron/q0/rev_0130/keymaps/vial/rules.mk b/keyboards/keychron/q0/rev_0130/keymaps/vial/rules.mk
index 31bb6d699f..c4077f69ff 100644
--- a/keyboards/keychron/q0/rev_0130/keymaps/vial/rules.mk
+++ b/keyboards/keychron/q0/rev_0130/keymaps/vial/rules.mk
@@ -1,3 +1,6 @@
VIA_ENABLE = yes
VIAL_ENABLE = yes
-VIALRGB_ENABLE = yes
\ No newline at end of file
+VIALRGB_ENABLE = yes
+
+VPATH += keyboards/keychron/common
+SRC += keychron_common.c
diff --git a/keyboards/keychron/q0/rev_0130/keymaps/vial/vial.json b/keyboards/keychron/q0/rev_0130/keymaps/vial/vial.json
index 4e75265ffa..65216a9750 100644
--- a/keyboards/keychron/q0/rev_0130/keymaps/vial/vial.json
+++ b/keyboards/keychron/q0/rev_0130/keymaps/vial/vial.json
@@ -1,14 +1,14 @@
{
- "name": "Keychron Q0",
- "vendorId": "0x3434",
- "productId": "0x0130",
- "lighting": "vialrgb",
- "matrix": {
- "rows": 6,
- "cols": 4
- },
- "layouts": {
- "keymap":[
+ "name": "Keychron Q0",
+ "vendorId": "0x3434",
+ "productId": "0x0130",
+ "lighting": "vialrgb",
+ "matrix": {
+ "rows": 6,
+ "cols": 4
+ },
+ "layouts": {
+ "keymap":[
[
"0,0",
"0,1",
diff --git a/keyboards/keychron/q0/rev_0130/rev_0130.c b/keyboards/keychron/q0/rev_0130/rev_0130.c
index 64c4842086..5d03282dd4 100644
--- a/keyboards/keychron/q0/rev_0130/rev_0130.c
+++ b/keyboards/keychron/q0/rev_0130/rev_0130.c
@@ -54,37 +54,4 @@ const ckled2001_led PROGMEM g_ckled2001_leds[DRIVER_LED_TOTAL] = {
{0, L_1, J_1, K_1}, // 19
{0, C_2, A_2, B_2}, // 20
};
-
-#define __ NO_LED
-
-led_config_t g_led_config = {
- {
- // Key Matrix to LED Index
- { 0, 1, 2, 3 },
- { 4, 5, 6, 7 },
- { 8, 9, 10, 14 },
- { 11, 12, 13, __ },
- { 15, 16, 17, 20 },
- { 18, __, 19, __ }
- },
- {
- // LED Index to Physical Position
- {0,0}, {37,0}, {75,0}, {112,0},
- {0,6}, {37,6}, {75,6}, {112,6},
- {0,13}, {37,13}, {75,13},
- {0,19}, {37,19}, {75,19}, {112,16},
- {0,25}, {37,25}, {75,25},
- {18,32}, {75,32}, {112,29},
- },
- {
- // LED Index to Flag
- 1, 1, 1, 1,
- 9, 4, 4, 4,
- 4, 4, 4,
- 4, 4, 4, 4,
- 4, 4, 4,
- 4, 4, 1
- }
-};
-
#endif // RGB_MATRIX_ENABLE
diff --git a/keyboards/keychron/q0/rev_0130/rules.mk b/keyboards/keychron/q0/rev_0130/rules.mk
index 5a04c755cd..4eebc33437 100644
--- a/keyboards/keychron/q0/rev_0130/rules.mk
+++ b/keyboards/keychron/q0/rev_0130/rules.mk
@@ -1,25 +1,3 @@
-# MCU name
-MCU = STM32L432
-
-# Bootloader selection
-BOOTLOADER = stm32-dfu
-
-# Build Options
-# change yes to no to disable.
-#
-BOOTMAGIC_ENABLE = yes # Enable Bootmagic Lite
-MOUSEKEY_ENABLE = yes # Mouse keys
-EXTRAKEY_ENABLE = yes # Audio control and System control
-CONSOLE_ENABLE = no # Console for debug
-COMMAND_ENABLE = no # Commands for debug and configuration
-NKRO_ENABLE = yes # Enable USB N-key Rollover
-BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality
-RGBLIGHT_ENABLE = no # Enable keyboard RGB underglow
-AUDIO_ENABLE = no # Audio output
-DIP_SWITCH_ENABLE = no
-RGB_MATRIX_ENABLE = yes
-RGB_MATRIX_DRIVER = CKLED2001
-LTO_ENABLE = yes
EEPROM_DRIVER = wear_leveling
WEAR_LEVELING_DRIVER = embedded_flash
diff --git a/keyboards/keychron/q0/rev_0130/rev_0130.h b/keyboards/keychron/q0/rev_0131/config.h
similarity index 57%
rename from keyboards/keychron/q0/rev_0130/rev_0130.h
rename to keyboards/keychron/q0/rev_0131/config.h
index d66c880aa9..be99f3d3bc 100644
--- a/keyboards/keychron/q0/rev_0130/rev_0130.h
+++ b/keyboards/keychron/q0/rev_0131/config.h
@@ -1,4 +1,4 @@
-/* Copyright 2022 @ Keychron (https://www.keychron.com)
+/* Copyright 2023 @ Keychron (https://www.keychron.com)
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -16,23 +16,19 @@
#pragma once
-#include "quantum.h"
+/* RGB Matrix Driver Configuration */
+#define DRIVER_COUNT 1
+#define DRIVER_ADDR_1 0b1110111
-#define XXX KC_NO
+/* RGB Matrix Configuration */
+#define DRIVER_1_LED_TOTAL 26
+#define DRIVER_LED_TOTAL DRIVER_1_LED_TOTAL
-#define LAYOUT_numpad_6x4( \
- K00, K01, K02, K03, \
- K10, K11, K12, K13, \
- K20, K21, K22, \
- K30, K31, K32, K23, \
- K40, K41, K42, \
- K50, K52, K43 \
-) \
-{ \
- { K00, K01, K02, K03 }, \
- { K10, K11, K12, K13 }, \
- { K20, K21, K22, K23 }, \
- { K30, K31, K32, XXX }, \
- { K40, K41, K42, K43 }, \
- { K50, XXX, K52, XXX }, \
-}
+/* Scan phase of led driver set as MSKPHASE_9CHANNEL(defined as 0x03 in CKLED2001.h) */
+#define PHASE_CHANNEL MSKPHASE_9CHANNEL
+
+/* Enable num-lock LED */
+#define NUM_LOCK_LED_INDEX 5
+
+/* Encoder Configuration */
+#define ENCODER_DEFAULT_POS 0x3
diff --git a/keyboards/keychron/q0/rev_0131/info.json b/keyboards/keychron/q0/rev_0131/info.json
new file mode 100644
index 0000000000..2f057ea985
--- /dev/null
+++ b/keyboards/keychron/q0/rev_0131/info.json
@@ -0,0 +1,138 @@
+{
+ "keyboard_name": "Keychron Q0 Plus",
+ "manufacturer": "Keychron",
+ "url": "https://github.com/Keychron",
+ "maintainer": "lalalademaxiya1",
+ "usb": {
+ "vid": "0x3434",
+ "pid": "0x0131",
+ "device_version": "1.0.0",
+ "force_nkro": true
+ },
+ "matrix_pins": {
+ "cols": ["C14", "C15", "A0", "A1", "A2"],
+ "rows": ["B5", "B4", "B3", "A15", "A14", "A13"]
+ },
+ "features": {
+ "audio": false,
+ "backlight": false,
+ "bootmagic": true,
+ "command": false,
+ "console": false,
+ "encoder": true,
+ "extrakey": true,
+ "mousekey": true,
+ "nkro": true,
+ "rgb_matrix": true,
+ "rgblight": false
+ },
+ "diode_direction": "ROW2COL",
+ "encoder": {
+ "rotary": [
+ {"pin_a": "A3", "pin_b": "A4"}
+ ]
+ },
+ "bootmagic": {
+ "matrix": [0, 1]
+ },
+ "processor": "STM32L432",
+ "bootloader": "stm32-dfu",
+ "rgb_matrix": {
+ "driver": "CKLED2001",
+ "animations": {
+ "band_spiral_val": true,
+ "cycle_all": true,
+ "cycle_left_right": true,
+ "cycle_up_down": true,
+ "rainbow_moving_chevron": true,
+ "cycle_out_in": true,
+ "cycle_out_in_dual": true,
+ "cycle_pinwheel": true,
+ "cycle_spiral": true,
+ "dual_beacon": true,
+ "rainbow_beacon": true,
+ "jellybean_raindrops": true,
+ "pixel_rain": true,
+ "typing_heatmap": true,
+ "digital_rain": true,
+ "solid_reactive_simple": true,
+ "solid_reactive_multiwide": true,
+ "solid_reactive_multinexus": true,
+ "splash": true,
+ "solid_splash": true,
+ "keypresses": true,
+ "framebuffer_effects": true
+ },
+ "layout": [
+ {"flags": 1, "matrix":[0,1], "x":1.25, "y":0},
+ {"flags": 1, "matrix":[0,2], "x":2.25, "y":0},
+ {"flags": 1, "matrix":[0,3], "x":3.25, "y":0},
+ {"flags": 1, "matrix":[0,4], "x":4.25, "y":0},
+
+ {"flags": 4, "matrix":[1,0], "x":0, "y":1.25},
+ {"flags": 8, "matrix":[1,1], "x":1.25, "y":1.25},
+ {"flags": 4, "matrix":[1,2], "x":2.25, "y":1.25},
+ {"flags": 4, "matrix":[1,3], "x":3.25, "y":1.25},
+ {"flags": 4, "matrix":[1,4], "x":4.25, "y":1.25},
+
+ {"flags": 4, "matrix":[2,0], "x":0, "y":2.25},
+ {"flags": 4, "matrix":[2,1], "x":1.25, "y":2.25},
+ {"flags": 4, "matrix":[2,2], "x":2.25, "y":2.25},
+ {"flags": 4, "matrix":[2,3], "x":3.25, "y":2.25},
+ {"flags": 4, "matrix":[2,4], "x":4.25, "y":2.25},
+
+ {"flags": 4, "matrix":[3,0], "x":0, "y":3.25},
+ {"flags": 4, "matrix":[3,1], "x":1.25, "y":3.25},
+ {"flags": 4, "matrix":[3,2], "x":2.25, "y":3.25},
+ {"flags": 4, "matrix":[3,3], "x":3.25, "y":3.25},
+
+ {"flags": 4, "matrix":[4,0], "x":0, "y":4.25},
+ {"flags": 4, "matrix":[4,1], "x":1.25, "y":4.25},
+ {"flags": 4, "matrix":[4,2], "x":2.25, "y":4.25},
+ {"flags": 4, "matrix":[4,3], "x":3.25, "y":4.25},
+ {"flags": 4, "matrix":[4,4], "x":4.25, "y":4.25},
+
+ {"flags": 4, "matrix":[5,0], "x":0, "y":5.25},
+ {"flags": 4, "matrix":[5,1], "x":1.25, "y":5.25},
+ {"flags": 1, "matrix":[5,3], "x":3.25, "y":5.25}
+ ]
+ },
+ "layouts": {
+ "LAYOUT_numpad_6x5": {
+ "layout": [
+ {"matrix":[0,0], "x":0, "y":0},
+ {"matrix":[0,1], "x":1.25, "y":0},
+ {"matrix":[0,2], "x":2.25, "y":0},
+ {"matrix":[0,3], "x":3.25, "y":0},
+ {"matrix":[0,4], "x":4.25, "y":0},
+
+ {"matrix":[1,0], "x":0, "y":1.25},
+ {"matrix":[1,1], "x":1.25, "y":1.25},
+ {"matrix":[1,2], "x":2.25, "y":1.25},
+ {"matrix":[1,3], "x":3.25, "y":1.25},
+ {"matrix":[1,4], "x":4.25, "y":1.25},
+
+ {"matrix":[2,0], "x":0, "y":2.25},
+ {"matrix":[2,1], "x":1.25, "y":2.25},
+ {"matrix":[2,2], "x":2.25, "y":2.25},
+ {"matrix":[2,3], "x":3.25, "y":2.25},
+ {"matrix":[2,4], "x":4.25, "y":2.25, "h":2},
+
+ {"matrix":[3,0], "x":0, "y":3.25},
+ {"matrix":[3,1], "x":1.25, "y":3.25},
+ {"matrix":[3,2], "x":2.25, "y":3.25},
+ {"matrix":[3,3], "x":3.25, "y":3.25},
+
+ {"matrix":[4,0], "x":0, "y":4.25},
+ {"matrix":[4,1], "x":1.25, "y":4.25},
+ {"matrix":[4,2], "x":2.25, "y":4.25},
+ {"matrix":[4,3], "x":3.25, "y":4.25},
+ {"matrix":[4,4], "x":4.25, "y":4.25, "h":2},
+
+ {"matrix":[5,0], "x":0, "y":5.25},
+ {"matrix":[5,1], "x":1.25, "y":5.25, "w":2},
+ {"matrix":[5,3], "x":3.25, "y":5.25}
+ ]
+ }
+ }
+}
diff --git a/keyboards/keychron/q0/rev_0131/keymaps/default/keymap.c b/keyboards/keychron/q0/rev_0131/keymaps/default/keymap.c
new file mode 100644
index 0000000000..f92d6b8362
--- /dev/null
+++ b/keyboards/keychron/q0/rev_0131/keymaps/default/keymap.c
@@ -0,0 +1,49 @@
+/* Copyright 2023 @ Keychron (https://www.keychron.com)
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+
+#include QMK_KEYBOARD_H
+
+// clang-format off
+
+enum layers {
+ BASE,
+ FUNC
+};
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+ [BASE] = LAYOUT_numpad_6x5(
+ KC_MUTE, MO(FUNC), KC_ESC, KC_BSPC, KC_TAB,
+ _______, KC_NUM, KC_PSLS, KC_PAST, KC_PMNS,
+ _______, KC_P7, KC_P8, KC_P9, KC_PPLS,
+ _______, KC_P4, KC_P5, KC_P6,
+ _______, KC_P1, KC_P2, KC_P3, KC_PENT,
+ _______, KC_P0, KC_PDOT),
+
+ [FUNC] = LAYOUT_numpad_6x5(
+ RGB_TOG, _______, KC_MUTE, KC_VOLD, KC_VOLU,
+ _______, RGB_MOD, RGB_VAI, RGB_HUI, KC_DEL,
+ _______, RGB_RMOD, RGB_VAD, RGB_HUD, _______,
+ _______, RGB_SAI, RGB_SPI, KC_MPRV,
+ _______, RGB_SAD, RGB_SPD, KC_MPLY, _______,
+ _______, RGB_TOG, KC_MNXT),
+};
+
+#if defined(ENCODER_MAP_ENABLE)
+const uint16_t PROGMEM encoder_map[][NUM_ENCODERS][2] = {
+ [BASE] = { ENCODER_CCW_CW(KC_VOLD, KC_VOLU) },
+ [FUNC] = { ENCODER_CCW_CW(RGB_VAD, RGB_VAI) },
+};
+#endif // ENCODER_MAP_ENABLE
diff --git a/keyboards/keychron/q0/rev_0131/keymaps/default/rules.mk b/keyboards/keychron/q0/rev_0131/keymaps/default/rules.mk
new file mode 100644
index 0000000000..ee32568148
--- /dev/null
+++ b/keyboards/keychron/q0/rev_0131/keymaps/default/rules.mk
@@ -0,0 +1 @@
+ENCODER_MAP_ENABLE = yes
diff --git a/keyboards/keychron/q0/rev_0131/keymaps/keychron/keymap.c b/keyboards/keychron/q0/rev_0131/keymaps/keychron/keymap.c
new file mode 100644
index 0000000000..5d73b5733f
--- /dev/null
+++ b/keyboards/keychron/q0/rev_0131/keymaps/keychron/keymap.c
@@ -0,0 +1,83 @@
+/* Copyright 2023 @ Keychron (https://www.keychron.com)
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+
+#include QMK_KEYBOARD_H
+#include "keychron_common.h"
+
+// clang-format off
+
+enum layers {
+ BASE,
+ FUNC,
+ L2,
+ L3
+};
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+ [BASE] = LAYOUT_numpad_6x5(
+ KC_MUTE, MO(FUNC), KC_ESC, KC_BSPC, KC_TAB,
+ MACRO01, KC_NUM, KC_PSLS, KC_PAST, KC_PMNS,
+ MACRO02, KC_P7, KC_P8, KC_P9, KC_PPLS,
+ MACRO03, KC_P4, KC_P5, KC_P6,
+ MACRO04, KC_P1, KC_P2, KC_P3, KC_PENT,
+ MACRO05, KC_P0, KC_PDOT),
+
+ [FUNC] = LAYOUT_numpad_6x5(
+ RGB_TOG, _______, KC_MUTE, KC_VOLD, KC_VOLU,
+ MACRO01, RGB_MOD, RGB_VAI, RGB_HUI, KC_DEL,
+ MACRO02, RGB_RMOD, RGB_VAD, RGB_HUD, _______,
+ MACRO03, RGB_SAI, RGB_SPI, KC_MPRV,
+ MACRO04, RGB_SAD, RGB_SPD, KC_MPLY, _______,
+ MACRO05, RGB_TOG, KC_MNXT),
+
+ [L2] = LAYOUT_numpad_6x5(
+ _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______,
+ _______, _______, _______, _______,
+ _______, _______, _______, _______, _______,
+ _______, _______, _______),
+
+ [L3] = LAYOUT_numpad_6x5(
+ _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______,
+ _______, _______, _______, _______,
+ _______, _______, _______, _______, _______,
+ _______, _______, _______)
+};
+
+#if defined(ENCODER_MAP_ENABLE)
+const uint16_t PROGMEM encoder_map[][NUM_ENCODERS][2] = {
+ [BASE] = { ENCODER_CCW_CW(KC_VOLD, KC_VOLU) },
+ [FUNC] = { ENCODER_CCW_CW(RGB_VAD, RGB_VAI) },
+ [L2] = { ENCODER_CCW_CW(_______, _______) },
+ [L3] = { ENCODER_CCW_CW(_______, _______) }
+};
+#endif // ENCODER_MAP_ENABLE
+
+// clang-format on
+
+void housekeeping_task_user(void) {
+ housekeeping_task_keychron();
+}
+
+bool process_record_user(uint16_t keycode, keyrecord_t *record) {
+ if (!process_record_keychron(keycode, record)) {
+ return false;
+ }
+ return true;
+}
diff --git a/keyboards/keychron/q0/rev_0131/keymaps/keychron/rules.mk b/keyboards/keychron/q0/rev_0131/keymaps/keychron/rules.mk
new file mode 100644
index 0000000000..4b0e1da76e
--- /dev/null
+++ b/keyboards/keychron/q0/rev_0131/keymaps/keychron/rules.mk
@@ -0,0 +1,2 @@
+VPATH += keyboards/keychron/common
+SRC += keychron_common.c
diff --git a/keyboards/keychron/q0/rev_0131/keymaps/vial/config.h b/keyboards/keychron/q0/rev_0131/keymaps/vial/config.h
new file mode 100644
index 0000000000..15f11cf4df
--- /dev/null
+++ b/keyboards/keychron/q0/rev_0131/keymaps/vial/config.h
@@ -0,0 +1,8 @@
+/* SPDX-License-Identifier: GPL-2.0-or-later */
+
+#pragma once
+
+#define VIAL_KEYBOARD_UID {0xD2, 0xD3, 0x91, 0xAE, 0xA4, 0x06, 0x6C, 0x30}
+
+#define VIAL_UNLOCK_COMBO_ROWS { 0, 4 }
+#define VIAL_UNLOCK_COMBO_COLS { 1, 4 }
diff --git a/keyboards/keychron/q0/rev_0131/keymaps/vial/keymap.c b/keyboards/keychron/q0/rev_0131/keymaps/vial/keymap.c
new file mode 100644
index 0000000000..52e1ee2eb2
--- /dev/null
+++ b/keyboards/keychron/q0/rev_0131/keymaps/vial/keymap.c
@@ -0,0 +1,83 @@
+/* Copyright 2023 @ Keychron (https://www.keychron.com)
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+
+#include QMK_KEYBOARD_H
+#include "keychron_common.h"
+
+// clang-format off
+
+enum layers {
+ BASE,
+ FUNC,
+ L2,
+ L3
+};
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+ [BASE] = LAYOUT_numpad_6x5(
+ KC_MUTE, MO(FUNC), KC_ESC, KC_BSPC, KC_TAB,
+ MACRO01, KC_NUM, KC_PSLS, KC_PAST, KC_PMNS,
+ MACRO02, KC_P7, KC_P8, KC_P9, KC_PPLS,
+ MACRO03, KC_P4, KC_P5, KC_P6,
+ MACRO04, KC_P1, KC_P2, KC_P3, KC_PENT,
+ MACRO05, KC_P0, KC_PDOT),
+
+ [FUNC] = LAYOUT_numpad_6x5(
+ RGB_TOG, _______, KC_MUTE, KC_VOLD, KC_VOLU,
+ MACRO01, RGB_MOD, RGB_VAI, RGB_HUI, KC_DEL,
+ MACRO02, RGB_RMOD, RGB_VAD, RGB_HUD, _______,
+ MACRO03, RGB_SAI, RGB_SPI, KC_MPRV,
+ MACRO04, RGB_SAD, RGB_SPD, KC_MPLY, _______,
+ MACRO05, RGB_TOG, KC_MNXT),
+
+ [L2] = LAYOUT_numpad_6x5(
+ _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______,
+ _______, _______, _______, _______,
+ _______, _______, _______, _______, _______,
+ _______, _______, _______),
+
+ [L3] = LAYOUT_numpad_6x5(
+ _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______,
+ _______, _______, _______, _______,
+ _______, _______, _______, _______, _______,
+ _______, _______, _______)
+};
+
+#if defined(ENCODER_MAP_ENABLE)
+const uint16_t PROGMEM encoder_map[][NUM_ENCODERS][2] = {
+ [BASE] = { ENCODER_CCW_CW(KC_VOLD, KC_VOLU) },
+ [FUNC] = { ENCODER_CCW_CW(RGB_VAD, RGB_VAI) },
+ [L2] = { ENCODER_CCW_CW(_______, _______) },
+ [L3] = { ENCODER_CCW_CW(_______, _______) }
+};
+#endif // ENCODER_MAP_ENABLE
+
+// clang-format on
+
+void housekeeping_task_user(void) {
+ housekeeping_task_keychron();
+}
+
+bool process_record_user(uint16_t keycode, keyrecord_t *record) {
+ if (!process_record_keychron(keycode, record)) {
+ return false;
+ }
+ return true;
+}
diff --git a/keyboards/keychron/q0/rev_0131/keymaps/vial/rules.mk b/keyboards/keychron/q0/rev_0131/keymaps/vial/rules.mk
new file mode 100644
index 0000000000..c4ca639d6c
--- /dev/null
+++ b/keyboards/keychron/q0/rev_0131/keymaps/vial/rules.mk
@@ -0,0 +1,7 @@
+VIA_ENABLE = yes
+VIAL_ENABLE = yes
+VIALRGB_ENABLE = yes
+ENCODER_MAP_ENABLE = yes
+
+VPATH += keyboards/keychron/common
+SRC += keychron_common.c
diff --git a/keyboards/keychron/q0/rev_0131/keymaps/vial/vial.json b/keyboards/keychron/q0/rev_0131/keymaps/vial/vial.json
new file mode 100644
index 0000000000..06922df10d
--- /dev/null
+++ b/keyboards/keychron/q0/rev_0131/keymaps/vial/vial.json
@@ -0,0 +1,157 @@
+{
+ "name": "Keychron Q0 Plus",
+ "vendorId": "0x3434",
+ "productId": "0x0131",
+ "lighting": "vialrgb",
+ "customKeycodes": [
+ {
+ "name": "Mission Control",
+ "title": "Mission Control in macOS",
+ "shortName": "MCtrl"
+ },
+ {
+ "name": "Launch Pad",
+ "title": "Launch Pad in macOS",
+ "shortName": "LPad"
+ },
+ {
+ "name": "Left Option",
+ "title": "Left Option in macOS",
+ "shortName": "LOpt"
+ },
+ {
+ "name": "Right Option",
+ "title": "Right Option in macOS",
+ "shortName": "ROpt"
+ },
+ {
+ "name": "Left Cmd",
+ "title": "Left Command in macOS",
+ "shortName": "LCmd"
+ },
+ {
+ "name": "Right Cmd",
+ "title": "Right Command in macOS",
+ "shortName": "RCmd"
+ },
+ {
+ "name": "Siri",
+ "title": "Siri in macOS",
+ "shortName": "Siri"
+ },
+ {
+ "name": "Task View",
+ "title": "Task View in windows",
+ "shortName": "Task"
+ },
+ {
+ "name": "File Explorer",
+ "title": "File Explorer in windows",
+ "shortName": "File"
+ },
+ {
+ "name": "Screen Shot",
+ "title": "Screenshot in macOS",
+ "shortName": "SShot"
+ },
+ {
+ "name": "Cortana",
+ "title": "Cortana in windows",
+ "shortName": "Cortana"
+ }
+ ],
+ "matrix": {"rows": 6, "cols": 5},
+ "layouts": {
+ "keymap": [
+ [
+ "0,0\n\n\n\n\n\n\n\n\ne",
+ "0,1\n\n\n\n\n\n\n\n\ne"
+ ],
+ [
+ {
+ "x": 0.5
+ },
+ "0,0",
+ {
+ "x": 0.25,
+ "c": "#aaaaaa"
+ },
+ "0,1",
+ "0,2",
+ "0,3",
+ "0,4"
+ ],
+ [
+ {
+ "y": 0.25,
+ "x": 0.5,
+ "c": "#cccccc"
+ },
+ "1,0",
+ {
+ "x": 0.25
+ },
+ "1,1",
+ "1,2",
+ "1,3",
+ "1,4"
+ ],
+ [
+ {
+ "x": 0.5
+ },
+ "2,0",
+ {
+ "x": 0.25
+ },
+ "2,1",
+ "2,2",
+ "2,3",
+ {
+ "h": 2
+ },
+ "2,4"
+ ],
+ [
+ {
+ "x": 0.5
+ },
+ "3,0",
+ {
+ "x": 0.25
+ },
+ "3,1",
+ "3,2",
+ "3,3"
+ ],
+ [
+ {
+ "x": 0.5
+ },
+ "4,0",
+ {
+ "x": 0.25
+ },
+ "4,1",
+ "4,2",
+ "4,3",
+ {
+ "h": 2
+ },
+ "4,4"
+ ],
+ [
+ {
+ "x": 0.5
+ },
+ "5,0",
+ {
+ "x": 0.25,
+ "w": 2
+ },
+ "5,1",
+ "5,3"
+ ]
+ ]
+ }
+}
diff --git a/keyboards/keychron/q0/rev_0131/readme.md b/keyboards/keychron/q0/rev_0131/readme.md
new file mode 100644
index 0000000000..df07c40e49
--- /dev/null
+++ b/keyboards/keychron/q0/rev_0131/readme.md
@@ -0,0 +1,6 @@
+# The enhanced version with encoder of the Keychron Q0
+
+- The name of this keyboard is "Q0 Plus"
+- Enable EC11 rotary encoder
+- Turn clockwise to increase volume and turn anti-clockwise to decrease volume
+- Press the knob button to mute
diff --git a/keyboards/keychron/q0/rev_0131/rev_0131.c b/keyboards/keychron/q0/rev_0131/rev_0131.c
new file mode 100644
index 0000000000..89f812e681
--- /dev/null
+++ b/keyboards/keychron/q0/rev_0131/rev_0131.c
@@ -0,0 +1,62 @@
+/* Copyright 2023 @ Keychron (https://www.keychron.com)
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+
+#include "quantum.h"
+
+#ifdef RGB_MATRIX_ENABLE
+
+// clang-format off
+
+const ckled2001_led PROGMEM g_ckled2001_leds[DRIVER_LED_TOTAL] = {
+/* Refer to CKLED manual for these locations
+ * driver
+ * | R location
+ * | | G location
+ * | | | B location
+ * | | | | */
+ {0, I_2, G_2, H_2},
+ {0, I_3, G_3, H_3},
+ {0, I_4, G_4, H_4},
+ {0, I_5, G_5, H_5},
+
+ {0, C_1, A_1, B_1},
+ {0, C_2, A_2, B_2},
+ {0, C_3, A_3, B_3},
+ {0, C_4, A_4, B_4},
+ {0, C_5, A_5, B_5},
+
+ {0, F_1, D_1, E_1},
+ {0, F_2, D_2, E_2},
+ {0, F_3, D_3, E_3},
+ {0, F_4, D_4, E_4},
+ {0, F_5, D_5, E_5},
+
+ {0, I_6, G_6, H_6},
+ {0, I_7, G_7, H_7},
+ {0, I_8, G_8, H_8},
+ {0, I_9, G_9, H_9},
+
+ {0, C_6, A_6, B_6},
+ {0, C_7, A_7, B_7},
+ {0, C_8, A_8, B_8},
+ {0, C_9, A_9, B_9},
+ {0, C_10, A_10, B_10},
+
+ {0, F_6, D_6, E_6},
+ {0, F_7, D_7, E_7},
+ {0, F_9, D_9, E_9},
+};
+#endif // RGB_MATRIX_ENABLE
diff --git a/keyboards/keychron/q0/rev_0131/rules.mk b/keyboards/keychron/q0/rev_0131/rules.mk
new file mode 100644
index 0000000000..4eebc33437
--- /dev/null
+++ b/keyboards/keychron/q0/rev_0131/rules.mk
@@ -0,0 +1,5 @@
+EEPROM_DRIVER = wear_leveling
+WEAR_LEVELING_DRIVER = embedded_flash
+
+# Enter lower-power sleep mode when on the ChibiOS idle thread
+OPT_DEFS += -DCORTEX_ENABLE_WFI_IDLE=TRUE