~ruther/qmk_firmware

f07841cce38d1ae63d6c41b2c067c650a7bee648 — lalalademaxiya1 2 years ago 41a5046
[Keyboard] Added JIS version for Keychron Q2 (#19491)

Co-authored-by: jack <0x6a73@protonmail.com>
Co-authored-by: Ryan <fauxpark@gmail.com>
M keyboards/keychron/q2/ansi/info.json => keyboards/keychron/q2/ansi/info.json +2 -0
@@ 8,6 8,8 @@
        "pid": "0x0110",
        "device_version": "1.0.0"
    },
    "processor": "STM32L432",
    "bootloader": "stm32-dfu",
    "layouts": {
        "LAYOUT_ansi_67": {
            "layout": [

M keyboards/keychron/q2/ansi/rules.mk => keyboards/keychron/q2/ansi/rules.mk +0 -6
@@ 1,9 1,3 @@
# MCU name
MCU = STM32L433

# Bootloader selection
BOOTLOADER = stm32-dfu

# Build Options
#   change yes to no to disable
#

M keyboards/keychron/q2/ansi_encoder/info.json => keyboards/keychron/q2/ansi_encoder/info.json +2 -0
@@ 8,6 8,8 @@
        "pid": "0x0111",
        "device_version": "1.0.0"
    },
    "processor": "STM32L432",
    "bootloader": "stm32-dfu",
    "layouts": {
        "LAYOUT_ansi_67": {
            "layout": [

M keyboards/keychron/q2/ansi_encoder/rules.mk => keyboards/keychron/q2/ansi_encoder/rules.mk +0 -6
@@ 1,9 1,3 @@
# MCU name
MCU = STM32L433

# Bootloader selection
BOOTLOADER = stm32-dfu

# Build Options
#   change yes to no to disable
#

M keyboards/keychron/q2/iso/info.json => keyboards/keychron/q2/iso/info.json +2 -0
@@ 8,6 8,8 @@
        "pid": "0x0112",
        "device_version": "1.0.0"
    },
    "processor": "STM32L432",
    "bootloader": "stm32-dfu",
    "layouts": {
        "LAYOUT_iso_68": {
            "layout": [

M keyboards/keychron/q2/iso/rules.mk => keyboards/keychron/q2/iso/rules.mk +0 -6
@@ 1,9 1,3 @@
# MCU name
MCU = STM32L433

# Bootloader selection
BOOTLOADER = stm32-dfu

# Build Options
#   change yes to no to disable
#

M keyboards/keychron/q2/iso_encoder/info.json => keyboards/keychron/q2/iso_encoder/info.json +2 -0
@@ 8,6 8,8 @@
        "pid": "0x0113",
        "device_version": "1.0.0"
    },
    "processor": "STM32L432",
    "bootloader": "stm32-dfu",
    "layouts": {
        "LAYOUT_iso_68": {
            "layout": [

M keyboards/keychron/q2/iso_encoder/rules.mk => keyboards/keychron/q2/iso_encoder/rules.mk +0 -6
@@ 1,9 1,3 @@
# MCU name
MCU = STM32L433

# Bootloader selection
BOOTLOADER = stm32-dfu

# Build Options
#   change yes to no to disable
#

A keyboards/keychron/q2/jis/config.h => keyboards/keychron/q2/jis/config.h +27 -0
@@ 0,0 1,27 @@
/* 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 <http://www.gnu.org/licenses/>.
 */

#pragma once

/* RGB Matrix Configuration */
#define DRIVER_1_LED_TOTAL 35
#define DRIVER_2_LED_TOTAL 36
#define RGB_MATRIX_LED_COUNT (DRIVER_1_LED_TOTAL + DRIVER_2_LED_TOTAL)

#define CKLED2001_CURRENT_TUNE { 0xC0, 0xC0, 0x5D, 0xC0, 0xC0, 0x5D, 0xC0, 0xC0, 0x5D, 0xC0, 0xC0, 0x5D }

/* Enable caps-lock LED */
#define CAPS_LOCK_LED_INDEX 30

A keyboards/keychron/q2/jis/info.json => keyboards/keychron/q2/jis/info.json +94 -0
@@ 0,0 1,94 @@
{
    "keyboard_name": "Keychron Q2",
    "manufacturer": "Keychron",
    "url": "https://github.com/Keychron",
    "maintainer": "lalalademaxiya1",
    "usb": {
        "vid": "0x3434",
        "pid": "0x0114",
        "device_version": "1.0.0"
    },
    "processor": "STM32L432",
    "bootloader": "stm32-dfu",
    "layouts": {
        "LAYOUT_jis_71": {
            "layout": [
                {"matrix":[0, 0], "x":0, "y":0.25},
                {"matrix":[0, 1], "x":1, "y":0.25},
                {"matrix":[0, 2], "x":2, "y":0.25},
                {"matrix":[0, 3], "x":3, "y":0.25},
                {"matrix":[0, 4], "x":4, "y":0.25},
                {"matrix":[0, 5], "x":5, "y":0.25},
                {"matrix":[0, 6], "x":6, "y":0.25},
                {"matrix":[0, 7], "x":7, "y":0.25},
                {"matrix":[0, 8], "x":8, "y":0.25},
                {"matrix":[0, 9], "x":9, "y":0.25},
                {"matrix":[0,10], "x":10, "y":0.25},
                {"matrix":[0,11], "x":11, "y":0.25},
                {"matrix":[0,12], "x":12, "y":0.25},
                {"matrix":[0,13], "x":13, "y":0.25},
                {"matrix":[3, 1], "x":14, "y":0.25},
                {"matrix":[0,14], "x":15.25, "y":0},

                {"matrix":[1, 0], "x":0, "y":1.25, "w":1.5},
                {"matrix":[1, 1], "x":1.5, "y":1.25},
                {"matrix":[1, 2], "x":2.5, "y":1.25},
                {"matrix":[1, 3], "x":3.5, "y":1.25},
                {"matrix":[1, 4], "x":4.5, "y":1.25},
                {"matrix":[1, 5], "x":5.5, "y":1.25},
                {"matrix":[1, 6], "x":6.5, "y":1.25},
                {"matrix":[1, 7], "x":7.5, "y":1.25},
                {"matrix":[1, 8], "x":8.5, "y":1.25},
                {"matrix":[1, 9], "x":9.5, "y":1.25},
                {"matrix":[1,10], "x":10.5, "y":1.25},
                {"matrix":[1,11], "x":11.5, "y":1.25},
                {"matrix":[1,12], "x":12.5, "y":1.25},
                {"matrix":[1,14], "x":15.25, "y":1.25},

                {"matrix":[2, 0], "x":0, "y":2.25, "w":1.75},
                {"matrix":[2, 1], "x":1.75, "y":2.25},
                {"matrix":[2, 2], "x":2.75, "y":2.25},
                {"matrix":[2, 3], "x":3.75, "y":2.25},
                {"matrix":[2, 4], "x":4.75, "y":2.25},
                {"matrix":[2, 5], "x":5.75, "y":2.25},
                {"matrix":[2, 6], "x":6.75, "y":2.25},
                {"matrix":[2, 7], "x":7.75, "y":2.25},
                {"matrix":[2, 8], "x":8.75, "y":2.25},
                {"matrix":[2, 9], "x":9.75, "y":2.25},
                {"matrix":[2,10], "x":10.75, "y":2.25},
                {"matrix":[2,11], "x":11.75, "y":2.25},
                {"matrix":[2,13], "x":12.75, "y":2.25},
                {"matrix":[1,13], "x":13.75, "y":1.25, "w":1.25, "h":2},
                {"matrix":[2,14], "x":15.25, "y":2.25},

                {"matrix":[3, 0], "x":0, "y":3.25, "w":2.25},
                {"matrix":[3, 2], "x":2.25, "y":3.25},
                {"matrix":[3, 3], "x":3.25, "y":3.25},
                {"matrix":[3, 4], "x":4.25, "y":3.25},
                {"matrix":[3, 5], "x":5.25, "y":3.25},
                {"matrix":[3, 6], "x":6.25, "y":3.25},
                {"matrix":[3, 7], "x":7.25, "y":3.25},
                {"matrix":[3, 8], "x":8.25, "y":3.25},
                {"matrix":[3, 9], "x":9.25, "y":3.25},
                {"matrix":[3,10], "x":10.25, "y":3.25},
                {"matrix":[3,11], "x":11.25, "y":3.25},
                {"matrix":[3,12], "x":12.25, "y":3.25},
                {"matrix":[3,13], "x":13.25, "y":3.25},
                {"matrix":[3,14], "x":14.25, "y":3.25},

                {"matrix":[4, 0], "x":0, "y":4.25, "w":1.25},
                {"matrix":[4, 1], "x":1.25, "y":4.25},
                {"matrix":[4, 2], "x":2.25, "y":4.25, "w":1.25},
                {"matrix":[4, 3], "x":3.5, "y":4.25},
                {"matrix":[4, 6], "x":4.5, "y":4.25, "w":4.5},
                {"matrix":[4, 9], "x":9, "y":4.25, "w":1.25},
                {"matrix":[4,10], "x":10.25, "y":4.25},
                {"matrix":[4,11], "x":11.25, "y":4.25},
                {"matrix":[4,12], "x":12.25, "y":4.25},
                {"matrix":[4,13], "x":13.25, "y":4.25},
                {"matrix":[2,12], "x":14.25, "y":4.25},
                {"matrix":[4,14], "x":15.25, "y":4.25}
            ]
        }
    }
}

A keyboards/keychron/q2/jis/jis.c => keyboards/keychron/q2/jis/jis.c +134 -0
@@ 0,0 1,134 @@
/* 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 <http://www.gnu.org/licenses/>.
 */

#include "quantum.h"

#ifdef RGB_MATRIX_ENABLE

const ckled2001_led PROGMEM g_ckled2001_leds[RGB_MATRIX_LED_COUNT] = {
/* Refer to IS31 manual for these locations
 *   driver
 *   |  R location
 *   |  |       G location
 *   |  |       |       B location
 *   |  |       |       | */
    {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, 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, C_11,   A_11,   B_11},
    {0, C_12,   A_12,   B_12},
    {0, C_13,   A_13,   B_13},
    {0, C_14,   A_14,   B_14},
    {0, C_15,   A_15,   B_15},
    {0, C_16,   A_16,   B_16},

    {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, F_6,    D_6,    E_6},
    {0, F_7,    D_7,    E_7},
    {0, F_8,    D_8,    E_8},
    {0, F_9,    D_9,    E_9},
    {0, F_10,   D_10,   E_10},
    {0, F_11,   D_11,   E_11},
    {0, F_12,   D_12,   E_12},
    {0, F_13,   D_13,   E_13},
    {0, F_16,   D_16,   E_16},

    {0, I_1,    G_1,    H_1},
    {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},
    {1, I_6,    G_6,    H_6},
    {1, I_7,    G_7,    H_7},
    {1, I_8,    G_8,    H_8},
    {1, I_9,    G_9,    H_9},
    {1, I_10,   G_10,   H_10},
    {1, I_11,   G_11,   H_11},
    {1, I_12,   G_12,   H_12},
    {1, I_14,   G_14,   H_14},
    {0, F_14,   D_14,   E_14},
    {1, I_16,   G_16,   H_16},

    {1, C_1,    A_1,    B_1},
    {1, C_3,    A_3,    B_3},
    {1, C_4,    A_4,    B_4},
    {1, C_5,    A_5,    B_5},
    {1, C_6,    A_6,    B_6},
    {1, C_7,    A_7,    B_7},
    {1, C_8,    A_8,    B_8},
    {1, C_9,    A_9,    B_9},
    {1, C_10,   A_10,   B_10},
    {1, C_11,   A_11,   B_11},
    {1, C_12,   A_12,   B_12},
    {1, C_13,   A_13,   B_13},
    {1, C_14,   A_14,   B_14},
    {1, C_15,   A_15,   B_15},

    {1, F_1,    D_1,    E_1},
    {1, F_2,    D_2,    E_2},
    {1, F_3,    D_3,    E_3},
    {1, F_4,    D_4,    E_4},
    {1, F_7,    D_7,    E_7},
    {1, F_10,   D_10,   E_10},
    {1, F_11,   D_11,   E_11},
    {1, F_12,   D_12,   E_12},
    {1, F_13,   D_13,   E_13},
    {1, F_14,   D_14,   E_14},
    {1, F_15,   D_15,   E_15},
    {1, F_16,   D_16,   E_16}
};

#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, 11, 12, 13, 15 },
        { 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 43, 29 },
        { 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 69, 42, 44 },
        { 45, 14, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58 },
        { 59, 60, 61, 62, __, __, 63, __, __, 64, 65, 66, 67, 68, 70 }
    },
    {
        // LED Index to Physical Position
        {0,4},  {15,4},  {29,4},  {44,4},  {59,4},  {73,4},  {88,4},  {103,4},  {117,4},  {132,4},  {146,4},  {161,4},  {176,4},  {190,4},  {205,4},  {224,0},
        {4,19}, {22,19}, {37,19}, {51,19}, {66,19}, {81,19}, {95,19}, {110,19}, {125,19}, {139,19}, {154,19}, {168,19}, {183,19},                     {224,19},
        {6,34}, {26,34}, {40,34}, {55,34}, {70,34}, {84,34}, {99,34}, {114,34}, {128,34}, {143,34}, {158,34}, {172,34}, {187,34}, {207,29},           {224,34},
        {9,49},          {33,49}, {48,49}, {62,49}, {77,49}, {92,49}, {106,49}, {121,49}, {136,49}, {150,49}, {165,49}, {179,49}, {194,49}, {209,49},
        {2,64}, {18,64}, {35,64}, {51,64},                   {92,64},                     {134,64}, {150,64}, {165,64}, {179,64}, {194,64}, {209,64}, {223,64},
    },
    {
        // RGB LED Index to Flag
        1, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 1, 1,
        1, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,       1,
        8, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 1,    1,
        1,    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 1, 1,
        1, 1, 1, 1,       4,       1, 1, 1, 1, 1, 1, 1
    }
};

#endif // RGB_MATRIX_ENABLE

A keyboards/keychron/q2/jis/keymaps/default/keymap.c => keyboards/keychron/q2/jis/keymaps/default/keymap.c +67 -0
@@ 0,0 1,67 @@
/* 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 <http://www.gnu.org/licenses/>.
 */

#include QMK_KEYBOARD_H

// clang-format off

enum layers{
    MAC_BASE,
    WIN_BASE,
    _FN1,
    _FN2,
    _FN3
};

#define KC_TASK LGUI(KC_TAB)
#define KC_FLXP LGUI(KC_E)

const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
    [MAC_BASE] = LAYOUT_jis_71(
        KC_ESC,  KC_1,     KC_2,     KC_3,    KC_4,    KC_5,    KC_6,    KC_7,    KC_8,    KC_9,    KC_0,     KC_MINS,  KC_EQL,   KC_INT3, KC_BSPC, KC_INS,
        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_DEL,
        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_NUHS,  KC_ENT,           KC_HOME,
        KC_LSFT,           KC_Z,     KC_X,    KC_C,    KC_V,    KC_B,    KC_N,    KC_M,    KC_COMM, KC_DOT,   KC_SLSH,  KC_INT1,  KC_RSFT, KC_UP,
        KC_LCTL, KC_LOPT,  KC_LCMD,  KC_LNG2,                   KC_SPC,                    KC_LNG1, KC_RCMD,  MO(_FN1), MO(_FN3), KC_LEFT, KC_DOWN, KC_RGHT),

    [WIN_BASE] = LAYOUT_jis_71(
        KC_ESC,  KC_1,     KC_2,     KC_3,    KC_4,    KC_5,    KC_6,    KC_7,    KC_8,    KC_9,    KC_0,     KC_MINS,  KC_EQL,   KC_INT3, KC_BSPC, KC_INS,
        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_DEL,
        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_NUHS,  KC_ENT,           KC_HOME,
        KC_LSFT,           KC_Z,     KC_X,    KC_C,    KC_V,    KC_B,    KC_N,    KC_M,    KC_COMM, KC_DOT,   KC_SLSH,  KC_INT1,  KC_RSFT, KC_UP,
        KC_LCTL, KC_LWIN,  KC_LALT,  KC_INT5,                   KC_SPC,                    KC_INT4, KC_RALT,  MO(_FN2), MO(_FN3), KC_LEFT, KC_DOWN, KC_RGHT),

    [_FN1] = LAYOUT_jis_71(
        KC_GRV,  KC_BRID,  KC_BRIU,  KC_NO,   KC_NO,   RGB_VAD, RGB_VAI, KC_MPRV, KC_MPLY, KC_MNXT, KC_MUTE,  KC_VOLD,  KC_VOLU,  _______, _______, _______,
        RGB_TOG, RGB_MOD,  RGB_VAI,  RGB_HUI, RGB_SAI, RGB_SPI, _______, _______, _______, _______, _______,  _______,  _______,                    _______,
        _______, RGB_RMOD, RGB_VAD,  RGB_HUD, RGB_SAD, RGB_SPD, _______, _______, _______, _______, _______,  _______,  _______,  _______,          _______,
        _______,           _______,  _______, _______, _______, _______, NK_TOGG, _______, _______, _______,  _______,  _______,  _______, _______,
        _______, _______,  _______,  _______,                   _______,                   _______, _______,  _______,  _______,  _______, _______, _______),

    [_FN2] = LAYOUT_jis_71(
        KC_GRV,  KC_BRID,  KC_BRIU,  KC_TASK, KC_FLXP, RGB_VAD, RGB_VAI, KC_MPRV, KC_MPLY, KC_MNXT, KC_MUTE,  KC_VOLD,  KC_VOLU,  _______, _______, _______,
        RGB_TOG, RGB_MOD,  RGB_VAI,  RGB_HUI, RGB_SAI, RGB_SPI, _______, _______, _______, _______, _______,  _______,  _______,                    _______,
        _______, RGB_RMOD, RGB_VAD,  RGB_HUD, RGB_SAD, RGB_SPD, _______, _______, _______, _______, _______,  _______,  _______,  _______,          _______,
        _______,           _______,  _______, _______, _______, _______, NK_TOGG, _______, _______, _______,  _______,  _______,  _______, _______,
        _______, _______,  _______,  _______,                   _______,                   _______, _______,  _______,  _______,  _______, _______, _______),

    [_FN3] = LAYOUT_jis_71(
        KC_TILD, KC_F1,    KC_F2,    KC_F3,   KC_F4,   KC_F5,   KC_F6,   KC_F7,   KC_F8,   KC_F9,   KC_F10,   KC_F11,   KC_F12,   _______, _______, _______,
        RGB_TOG, RGB_MOD,  RGB_VAI,  RGB_HUI, RGB_SAI, RGB_SPI, _______, _______, _______, _______, _______,  _______,  _______,                    _______,
        _______, RGB_RMOD, RGB_VAD,  RGB_HUD, RGB_SAD, RGB_SPD, _______, _______, _______, _______, _______,  _______,  _______,  _______,          _______,
        _______,           _______,  _______, _______, _______, _______, _______, _______, _______, _______,  _______,  _______,  _______, _______,
        _______, _______,  _______,  _______,                   _______,                   _______, _______,  _______,  _______,  _______, _______, _______)
};

A keyboards/keychron/q2/jis/keymaps/keychron/keymap.c => keyboards/keychron/q2/jis/keymaps/keychron/keymap.c +74 -0
@@ 0,0 1,74 @@
/* 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 <http://www.gnu.org/licenses/>.
 */

#include QMK_KEYBOARD_H
#include "keychron_common.h"

// clang-format off

enum layers{
    MAC_BASE,
    WIN_BASE,
    _FN1,
    _FN2,
    _FN3
};

const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
    [MAC_BASE] = LAYOUT_jis_71(
        KC_ESC,  KC_1,     KC_2,     KC_3,    KC_4,    KC_5,    KC_6,    KC_7,    KC_8,    KC_9,    KC_0,     KC_MINS,  KC_EQL,   KC_INT3, KC_BSPC, KC_INS,
        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_DEL,
        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_NUHS,  KC_ENT,           KC_HOME,
        KC_LSFT,           KC_Z,     KC_X,    KC_C,    KC_V,    KC_B,    KC_N,    KC_M,    KC_COMM, KC_DOT,   KC_SLSH,  KC_INT1,  KC_RSFT, KC_UP,
        KC_LCTL, KC_LOPTN, KC_LCMMD, KC_LNG2,                   KC_SPC,                    KC_LNG1, KC_RCMMD, MO(_FN1), MO(_FN3), KC_LEFT, KC_DOWN, KC_RGHT),

    [WIN_BASE] = LAYOUT_jis_71(
        KC_ESC,  KC_1,     KC_2,     KC_3,    KC_4,    KC_5,    KC_6,    KC_7,    KC_8,    KC_9,    KC_0,     KC_MINS,  KC_EQL,   KC_INT3, KC_BSPC, KC_INS,
        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_DEL,
        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_NUHS,  KC_ENT,           KC_HOME,
        KC_LSFT,           KC_Z,     KC_X,    KC_C,    KC_V,    KC_B,    KC_N,    KC_M,    KC_COMM, KC_DOT,   KC_SLSH,  KC_INT1,  KC_RSFT, KC_UP,
        KC_LCTL, KC_LWIN,  KC_LALT,  KC_INT5,                   KC_SPC,                    KC_INT4, KC_RALT,  MO(_FN2), MO(_FN3), KC_LEFT, KC_DOWN, KC_RGHT),

    [_FN1] = LAYOUT_jis_71(
        KC_GRV,  KC_BRID,  KC_BRIU,  KC_MCTL, KC_LPAD, RGB_VAD, RGB_VAI, KC_MPRV, KC_MPLY, KC_MNXT, KC_MUTE,  KC_VOLD,  KC_VOLU,  _______, _______, _______,
        RGB_TOG, RGB_MOD,  RGB_VAI,  RGB_HUI, RGB_SAI, RGB_SPI, _______, _______, _______, _______, _______,  _______,  _______,                    _______,
        _______, RGB_RMOD, RGB_VAD,  RGB_HUD, RGB_SAD, RGB_SPD, _______, _______, _______, _______, _______,  _______,  _______,  _______,          _______,
        _______,           _______,  _______, _______, _______, _______, NK_TOGG, _______, _______, _______,  _______,  _______,  _______, _______,
        _______, _______,  _______,  _______,                   _______,                   _______, _______,  _______,  _______,  _______, _______, _______),

    [_FN2] = LAYOUT_jis_71(
        KC_GRV,  KC_BRID,  KC_BRIU,  KC_TASK, KC_FLXP, RGB_VAD, RGB_VAI, KC_MPRV, KC_MPLY, KC_MNXT, KC_MUTE,  KC_VOLD,  KC_VOLU,  _______, _______, _______,
        RGB_TOG, RGB_MOD,  RGB_VAI,  RGB_HUI, RGB_SAI, RGB_SPI, _______, _______, _______, _______, _______,  _______,  _______,                    _______,
        _______, RGB_RMOD, RGB_VAD,  RGB_HUD, RGB_SAD, RGB_SPD, _______, _______, _______, _______, _______,  _______,  _______,  _______,          _______,
        _______,           _______,  _______, _______, _______, _______, NK_TOGG, _______, _______, _______,  _______,  _______,  _______, _______,
        _______, _______,  _______,  _______,                   _______,                   _______, _______,  _______,  _______,  _______, _______, _______),

    [_FN3] = LAYOUT_jis_71(
        KC_TILD, KC_F1,    KC_F2,    KC_F3,   KC_F4,   KC_F5,   KC_F6,   KC_F7,   KC_F8,   KC_F9,   KC_F10,   KC_F11,   KC_F12,   _______, _______, _______,
        RGB_TOG, RGB_MOD,  RGB_VAI,  RGB_HUI, RGB_SAI, RGB_SPI, _______, _______, _______, _______, _______,  _______,  _______,                    _______,
        _______, RGB_RMOD, RGB_VAD,  RGB_HUD, RGB_SAD, RGB_SPD, _______, _______, _______, _______, _______,  _______,  _______,  _______,          _______,
        _______,           _______,  _______, _______, _______, _______, _______, _______, _______, _______,  _______,  _______,  _______, _______,
        _______, _______,  _______,  _______,                   _______,                   _______, _______,  _______,  _______,  _______, _______, _______)
};

// clang-format on

bool process_record_user(uint16_t keycode, keyrecord_t *record) {
    if (!process_record_keychron(keycode, record)) {
        return false;
    }
    return true;
}

A keyboards/keychron/q2/jis/keymaps/keychron/rules.mk => keyboards/keychron/q2/jis/keymaps/keychron/rules.mk +4 -0
@@ 0,0 1,4 @@
VIA_ENABLE = yes

VPATH += keyboards/keychron/common
SRC += keychron_common.c

A keyboards/keychron/q2/jis/keymaps/via/keymap.c => keyboards/keychron/q2/jis/keymaps/via/keymap.c +67 -0
@@ 0,0 1,67 @@
/* 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 <http://www.gnu.org/licenses/>.
 */

#include QMK_KEYBOARD_H

// clang-format off

enum layers{
    MAC_BASE,
    WIN_BASE,
    _FN1,
    _FN2,
    _FN3
};

#define KC_TASK LGUI(KC_TAB)
#define KC_FLXP LGUI(KC_E)

const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
    [MAC_BASE] = LAYOUT_jis_71(
        KC_ESC,  KC_1,     KC_2,     KC_3,    KC_4,    KC_5,    KC_6,    KC_7,    KC_8,    KC_9,    KC_0,     KC_MINS,  KC_EQL,   KC_INT3, KC_BSPC, KC_INS,
        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_DEL,
        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_NUHS,  KC_ENT,           KC_HOME,
        KC_LSFT,           KC_Z,     KC_X,    KC_C,    KC_V,    KC_B,    KC_N,    KC_M,    KC_COMM, KC_DOT,   KC_SLSH,  KC_INT1,  KC_RSFT, KC_UP,
        KC_LCTL, KC_LOPT,  KC_LCMD,  KC_LNG2,                   KC_SPC,                    KC_LNG1, KC_RCMD,  MO(_FN1), MO(_FN3), KC_LEFT, KC_DOWN, KC_RGHT),

    [WIN_BASE] = LAYOUT_jis_71(
        KC_ESC,  KC_1,     KC_2,     KC_3,    KC_4,    KC_5,    KC_6,    KC_7,    KC_8,    KC_9,    KC_0,     KC_MINS,  KC_EQL,   KC_INT3, KC_BSPC, KC_INS,
        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_DEL,
        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_NUHS,  KC_ENT,           KC_HOME,
        KC_LSFT,           KC_Z,     KC_X,    KC_C,    KC_V,    KC_B,    KC_N,    KC_M,    KC_COMM, KC_DOT,   KC_SLSH,  KC_INT1,  KC_RSFT, KC_UP,
        KC_LCTL, KC_LWIN,  KC_LALT,  KC_INT5,                   KC_SPC,                    KC_INT4, KC_RALT,  MO(_FN2), MO(_FN3), KC_LEFT, KC_DOWN, KC_RGHT),

    [_FN1] = LAYOUT_jis_71(
        KC_GRV,  KC_BRID,  KC_BRIU,  KC_NO,   KC_NO,   RGB_VAD, RGB_VAI, KC_MPRV, KC_MPLY, KC_MNXT, KC_MUTE,  KC_VOLD,  KC_VOLU,  _______, _______, _______,
        RGB_TOG, RGB_MOD,  RGB_VAI,  RGB_HUI, RGB_SAI, RGB_SPI, _______, _______, _______, _______, _______,  _______,  _______,                    _______,
        _______, RGB_RMOD, RGB_VAD,  RGB_HUD, RGB_SAD, RGB_SPD, _______, _______, _______, _______, _______,  _______,  _______,  _______,          _______,
        _______,           _______,  _______, _______, _______, _______, NK_TOGG, _______, _______, _______,  _______,  _______,  _______, _______,
        _______, _______,  _______,  _______,                   _______,                   _______, _______,  _______,  _______,  _______, _______, _______),

    [_FN2] = LAYOUT_jis_71(
        KC_GRV,  KC_BRID,  KC_BRIU,  KC_TASK, KC_FLXP, RGB_VAD, RGB_VAI, KC_MPRV, KC_MPLY, KC_MNXT, KC_MUTE,  KC_VOLD,  KC_VOLU,  _______, _______, _______,
        RGB_TOG, RGB_MOD,  RGB_VAI,  RGB_HUI, RGB_SAI, RGB_SPI, _______, _______, _______, _______, _______,  _______,  _______,                    _______,
        _______, RGB_RMOD, RGB_VAD,  RGB_HUD, RGB_SAD, RGB_SPD, _______, _______, _______, _______, _______,  _______,  _______,  _______,          _______,
        _______,           _______,  _______, _______, _______, _______, NK_TOGG, _______, _______, _______,  _______,  _______,  _______, _______,
        _______, _______,  _______,  _______,                   _______,                   _______, _______,  _______,  _______,  _______, _______, _______),

    [_FN3] = LAYOUT_jis_71(
        KC_TILD, KC_F1,    KC_F2,    KC_F3,   KC_F4,   KC_F5,   KC_F6,   KC_F7,   KC_F8,   KC_F9,   KC_F10,   KC_F11,   KC_F12,   _______, _______, _______,
        RGB_TOG, RGB_MOD,  RGB_VAI,  RGB_HUI, RGB_SAI, RGB_SPI, _______, _______, _______, _______, _______,  _______,  _______,                    _______,
        _______, RGB_RMOD, RGB_VAD,  RGB_HUD, RGB_SAD, RGB_SPD, _______, _______, _______, _______, _______,  _______,  _______,  _______,          _______,
        _______,           _______,  _______, _______, _______, _______, _______, _______, _______, _______,  _______,  _______,  _______, _______,
        _______, _______,  _______,  _______,                   _______,                   _______, _______,  _______,  _______,  _______, _______, _______)
};

A keyboards/keychron/q2/jis/keymaps/via/rules.mk => keyboards/keychron/q2/jis/keymaps/via/rules.mk +1 -0
@@ 0,0 1,1 @@
VIA_ENABLE = yes

A keyboards/keychron/q2/jis/rules.mk => keyboards/keychron/q2/jis/rules.mk +21 -0
@@ 0,0 1,21 @@
# 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 = yes
RGB_MATRIX_ENABLE = yes
RGB_MATRIX_DRIVER = CKLED2001
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


A keyboards/keychron/q2/jis_encoder/config.h => keyboards/keychron/q2/jis_encoder/config.h +33 -0
@@ 0,0 1,33 @@
/* 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 <http://www.gnu.org/licenses/>.
 */

#pragma once

/* RGB Matrix Configuration */
#define DRIVER_1_LED_TOTAL 35
#define DRIVER_2_LED_TOTAL 36
#define RGB_MATRIX_LED_COUNT (DRIVER_1_LED_TOTAL + DRIVER_2_LED_TOTAL)

#define CKLED2001_CURRENT_TUNE { 0xC0, 0xC0, 0x5D, 0xC0, 0xC0, 0x5D, 0xC0, 0xC0, 0x5D, 0xC0, 0xC0, 0x5D }

/* Encoder Configuration */
#define ENCODERS_PAD_A { A10 }
#define ENCODERS_PAD_B { B5 }
#define ENCODER_RESOLUTION 4
#define ENCODER_DEFAULT_POS 0x3

/* Enable caps-lock LED */
#define CAPS_LOCK_LED_INDEX 30

A keyboards/keychron/q2/jis_encoder/info.json => keyboards/keychron/q2/jis_encoder/info.json +94 -0
@@ 0,0 1,94 @@
{
    "keyboard_name": "Keychron Q2",
    "manufacturer": "Keychron",
    "url": "https://github.com/Keychron",
    "maintainer": "lalalademaxiya1",
    "usb": {
        "vid": "0x3434",
        "pid": "0x0115",
        "device_version": "1.0.0"
    },
    "processor": "STM32L432",
    "bootloader": "stm32-dfu",
    "layouts": {
        "LAYOUT_jis_71": {
            "layout": [
                {"matrix":[0, 0], "x":0, "y":0.25},
                {"matrix":[0, 1], "x":1, "y":0.25},
                {"matrix":[0, 2], "x":2, "y":0.25},
                {"matrix":[0, 3], "x":3, "y":0.25},
                {"matrix":[0, 4], "x":4, "y":0.25},
                {"matrix":[0, 5], "x":5, "y":0.25},
                {"matrix":[0, 6], "x":6, "y":0.25},
                {"matrix":[0, 7], "x":7, "y":0.25},
                {"matrix":[0, 8], "x":8, "y":0.25},
                {"matrix":[0, 9], "x":9, "y":0.25},
                {"matrix":[0,10], "x":10, "y":0.25},
                {"matrix":[0,11], "x":11, "y":0.25},
                {"matrix":[0,12], "x":12, "y":0.25},
                {"matrix":[0,13], "x":13, "y":0.25},
                {"matrix":[3, 1], "x":14, "y":0.25},
                {"matrix":[0,14], "x":15.25, "y":0},

                {"matrix":[1, 0], "x":0, "y":1.25, "w":1.5},
                {"matrix":[1, 1], "x":1.5, "y":1.25},
                {"matrix":[1, 2], "x":2.5, "y":1.25},
                {"matrix":[1, 3], "x":3.5, "y":1.25},
                {"matrix":[1, 4], "x":4.5, "y":1.25},
                {"matrix":[1, 5], "x":5.5, "y":1.25},
                {"matrix":[1, 6], "x":6.5, "y":1.25},
                {"matrix":[1, 7], "x":7.5, "y":1.25},
                {"matrix":[1, 8], "x":8.5, "y":1.25},
                {"matrix":[1, 9], "x":9.5, "y":1.25},
                {"matrix":[1,10], "x":10.5, "y":1.25},
                {"matrix":[1,11], "x":11.5, "y":1.25},
                {"matrix":[1,12], "x":12.5, "y":1.25},
                {"matrix":[1,14], "x":15.25, "y":1.25},

                {"matrix":[2, 0], "x":0, "y":2.25, "w":1.75},
                {"matrix":[2, 1], "x":1.75, "y":2.25},
                {"matrix":[2, 2], "x":2.75, "y":2.25},
                {"matrix":[2, 3], "x":3.75, "y":2.25},
                {"matrix":[2, 4], "x":4.75, "y":2.25},
                {"matrix":[2, 5], "x":5.75, "y":2.25},
                {"matrix":[2, 6], "x":6.75, "y":2.25},
                {"matrix":[2, 7], "x":7.75, "y":2.25},
                {"matrix":[2, 8], "x":8.75, "y":2.25},
                {"matrix":[2, 9], "x":9.75, "y":2.25},
                {"matrix":[2,10], "x":10.75, "y":2.25},
                {"matrix":[2,11], "x":11.75, "y":2.25},
                {"matrix":[2,13], "x":12.75, "y":2.25},
                {"matrix":[1,13], "x":13.75, "y":1.25, "w":1.25, "h":2},
                {"matrix":[2,14], "x":15.25, "y":2.25},

                {"matrix":[3, 0], "x":0, "y":3.25, "w":2.25},
                {"matrix":[3, 2], "x":2.25, "y":3.25},
                {"matrix":[3, 3], "x":3.25, "y":3.25},
                {"matrix":[3, 4], "x":4.25, "y":3.25},
                {"matrix":[3, 5], "x":5.25, "y":3.25},
                {"matrix":[3, 6], "x":6.25, "y":3.25},
                {"matrix":[3, 7], "x":7.25, "y":3.25},
                {"matrix":[3, 8], "x":8.25, "y":3.25},
                {"matrix":[3, 9], "x":9.25, "y":3.25},
                {"matrix":[3,10], "x":10.25, "y":3.25},
                {"matrix":[3,11], "x":11.25, "y":3.25},
                {"matrix":[3,12], "x":12.25, "y":3.25},
                {"matrix":[3,13], "x":13.25, "y":3.25},
                {"matrix":[3,14], "x":14.25, "y":3.25},

                {"matrix":[4, 0], "x":0, "y":4.25, "w":1.25},
                {"matrix":[4, 1], "x":1.25, "y":4.25},
                {"matrix":[4, 2], "x":2.25, "y":4.25, "w":1.25},
                {"matrix":[4, 3], "x":3.5, "y":4.25},
                {"matrix":[4, 6], "x":4.5, "y":4.25, "w":4.5},
                {"matrix":[4, 9], "x":9, "y":4.25, "w":1.25},
                {"matrix":[4,10], "x":10.25, "y":4.25},
                {"matrix":[4,11], "x":11.25, "y":4.25},
                {"matrix":[4,12], "x":12.25, "y":4.25},
                {"matrix":[4,13], "x":13.25, "y":4.25},
                {"matrix":[2,12], "x":14.25, "y":4.25},
                {"matrix":[4,14], "x":15.25, "y":4.25}
            ]
        }
    }
}

A keyboards/keychron/q2/jis_encoder/jis_encoder.c => keyboards/keychron/q2/jis_encoder/jis_encoder.c +134 -0
@@ 0,0 1,134 @@
/* 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 <http://www.gnu.org/licenses/>.
 */

#include "quantum.h"

#ifdef RGB_MATRIX_ENABLE

const ckled2001_led PROGMEM g_ckled2001_leds[RGB_MATRIX_LED_COUNT] = {
/* Refer to IS31 manual for these locations
 *   driver
 *   |  R location
 *   |  |       G location
 *   |  |       |       B location
 *   |  |       |       | */
    {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, 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, C_11,   A_11,   B_11},
    {0, C_12,   A_12,   B_12},
    {0, C_13,   A_13,   B_13},
    {0, C_14,   A_14,   B_14},
    {0, C_15,   A_15,   B_15},
    {0, C_16,   A_16,   B_16},

    {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, F_6,    D_6,    E_6},
    {0, F_7,    D_7,    E_7},
    {0, F_8,    D_8,    E_8},
    {0, F_9,    D_9,    E_9},
    {0, F_10,   D_10,   E_10},
    {0, F_11,   D_11,   E_11},
    {0, F_12,   D_12,   E_12},
    {0, F_13,   D_13,   E_13},
    {0, F_16,   D_16,   E_16},

    {0, I_1,    G_1,    H_1},
    {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},
    {1, I_6,    G_6,    H_6},
    {1, I_7,    G_7,    H_7},
    {1, I_8,    G_8,    H_8},
    {1, I_9,    G_9,    H_9},
    {1, I_10,   G_10,   H_10},
    {1, I_11,   G_11,   H_11},
    {1, I_12,   G_12,   H_12},
    {1, I_14,   G_14,   H_14},
    {0, F_14,   D_14,   E_14},
    {1, I_16,   G_16,   H_16},

    {1, C_1,    A_1,    B_1},
    {1, C_3,    A_3,    B_3},
    {1, C_4,    A_4,    B_4},
    {1, C_5,    A_5,    B_5},
    {1, C_6,    A_6,    B_6},
    {1, C_7,    A_7,    B_7},
    {1, C_8,    A_8,    B_8},
    {1, C_9,    A_9,    B_9},
    {1, C_10,   A_10,   B_10},
    {1, C_11,   A_11,   B_11},
    {1, C_12,   A_12,   B_12},
    {1, C_13,   A_13,   B_13},
    {1, C_14,   A_14,   B_14},
    {1, C_15,   A_15,   B_15},

    {1, F_1,    D_1,    E_1},
    {1, F_2,    D_2,    E_2},
    {1, F_3,    D_3,    E_3},
    {1, F_4,    D_4,    E_4},
    {1, F_7,    D_7,    E_7},
    {1, F_10,   D_10,   E_10},
    {1, F_11,   D_11,   E_11},
    {1, F_12,   D_12,   E_12},
    {1, F_13,   D_13,   E_13},
    {1, F_14,   D_14,   E_14},
    {1, F_15,   D_15,   E_15},
    {1, F_16,   D_16,   E_16}
};

#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, 11, 12, 13, 15 },
        { 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 43, 29 },
        { 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 69, 42, 44 },
        { 45, 14, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58 },
        { 59, 60, 61, 62, __, __, 63, __, __, 64, 65, 66, 67, 68, 70 },
    },
    {
        // LED Index to Physical Position
        {0,4},  {15,4},  {29,4},  {44,4},  {59,4},  {73,4},  {88,4},  {103,4},  {117,4},  {132,4},  {146,4},  {161,4},  {176,4},  {190,4},  {205,4},  {224,0},
        {4,19}, {22,19}, {37,19}, {51,19}, {66,19}, {81,19}, {95,19}, {110,19}, {125,19}, {139,19}, {154,19}, {168,19}, {183,19},                     {224,19},
        {6,34}, {26,34}, {40,34}, {55,34}, {70,34}, {84,34}, {99,34}, {114,34}, {128,34}, {143,34}, {158,34}, {172,34}, {187,34}, {207,29},           {224,34},
        {9,49},          {33,49}, {48,49}, {62,49}, {77,49}, {92,49}, {106,49}, {121,49}, {136,49}, {150,49}, {165,49}, {179,49}, {194,49}, {209,49},
        {2,64}, {18,64}, {35,64}, {51,64},                   {92,64},                     {134,64}, {150,64}, {165,64}, {179,64}, {194,64}, {209,64}, {223,64},
    },
    {
        // RGB LED Index to Flag
        1, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 1, 1,
        1, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,       1,
        8, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 1,    1,
        1,    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 1, 1,
        1, 1, 1, 1,       4,       1, 1, 1, 1, 1, 1, 1,
    }
};

#endif // RGB_MATRIX_ENABLE

A keyboards/keychron/q2/jis_encoder/keymaps/default/keymap.c => keyboards/keychron/q2/jis_encoder/keymaps/default/keymap.c +77 -0
@@ 0,0 1,77 @@
/* 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 <http://www.gnu.org/licenses/>.
 */

#include QMK_KEYBOARD_H

// clang-format off

enum layers{
    MAC_BASE,
    WIN_BASE,
    _FN1,
    _FN2,
    _FN3
};

#define KC_TASK LGUI(KC_TAB)
#define KC_FLXP LGUI(KC_E)

const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
    [MAC_BASE] = LAYOUT_jis_71(
        KC_ESC,  KC_1,     KC_2,     KC_3,    KC_4,    KC_5,    KC_6,    KC_7,    KC_8,    KC_9,    KC_0,     KC_MINS,  KC_EQL,   KC_INT3, KC_BSPC, KC_MUTE,
        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_DEL,
        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_NUHS,  KC_ENT,           KC_HOME,
        KC_LSFT,           KC_Z,     KC_X,    KC_C,    KC_V,    KC_B,    KC_N,    KC_M,    KC_COMM, KC_DOT,   KC_SLSH,  KC_INT1,  KC_RSFT, KC_UP,
        KC_LCTL, KC_LOPT,  KC_LCMD,  KC_LNG2,                   KC_SPC,                    KC_LNG1, KC_RCMD,  MO(_FN1), MO(_FN3), KC_LEFT, KC_DOWN, KC_RGHT),

    [WIN_BASE] = LAYOUT_jis_71(
        KC_ESC,  KC_1,     KC_2,     KC_3,    KC_4,    KC_5,    KC_6,    KC_7,    KC_8,    KC_9,    KC_0,     KC_MINS,  KC_EQL,   KC_INT3, KC_BSPC, KC_MUTE,
        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_DEL,
        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_NUHS,  KC_ENT,           KC_HOME,
        KC_LSFT,           KC_Z,     KC_X,    KC_C,    KC_V,    KC_B,    KC_N,    KC_M,    KC_COMM, KC_DOT,   KC_SLSH,  KC_INT1,  KC_RSFT, KC_UP,
        KC_LCTL, KC_LWIN,  KC_LALT,  KC_INT5,                   KC_SPC,                    KC_INT4, KC_RALT,  MO(_FN2), MO(_FN3), KC_LEFT, KC_DOWN, KC_RGHT),

    [_FN1] = LAYOUT_jis_71(
        KC_GRV,  KC_BRID,  KC_BRIU,  KC_NO,   KC_NO,   RGB_VAD, RGB_VAI, KC_MPRV, KC_MPLY, KC_MNXT, KC_MUTE,  KC_VOLD,  KC_VOLU,  _______, _______, RGB_TOG,
        RGB_TOG, RGB_MOD,  RGB_VAI,  RGB_HUI, RGB_SAI, RGB_SPI, _______, _______, _______, _______, _______,  _______,  _______,                    _______,
        _______, RGB_RMOD, RGB_VAD,  RGB_HUD, RGB_SAD, RGB_SPD, _______, _______, _______, _______, _______,  _______,  _______,  _______,          _______,
        _______,           _______,  _______, _______, _______, _______, NK_TOGG, _______, _______, _______,  _______,  _______,  _______, _______,
        _______, _______,  _______,  _______,                   _______,                   _______, _______,  _______,  _______,  _______, _______, _______),

    [_FN2] = LAYOUT_jis_71(
        KC_GRV,  KC_BRID,  KC_BRIU,  KC_TASK, KC_FLXP, RGB_VAD, RGB_VAI, KC_MPRV, KC_MPLY, KC_MNXT, KC_MUTE,  KC_VOLD,  KC_VOLU,  _______, _______, RGB_TOG,
        RGB_TOG, RGB_MOD,  RGB_VAI,  RGB_HUI, RGB_SAI, RGB_SPI, _______, _______, _______, _______, _______,  _______,  _______,                    _______,
        _______, RGB_RMOD, RGB_VAD,  RGB_HUD, RGB_SAD, RGB_SPD, _______, _______, _______, _______, _______,  _______,  _______,  _______,          _______,
        _______,           _______,  _______, _______, _______, _______, NK_TOGG, _______, _______, _______,  _______,  _______,  _______, _______,
        _______, _______,  _______,  _______,                   _______,                   _______, _______,  _______,  _______,  _______, _______, _______),

    [_FN3] = LAYOUT_jis_71(
        KC_TILD, KC_F1,    KC_F2,    KC_F3,   KC_F4,   KC_F5,   KC_F6,   KC_F7,   KC_F8,   KC_F9,   KC_F10,   KC_F11,   KC_F12,   _______, _______, _______,
        RGB_TOG, RGB_MOD,  RGB_VAI,  RGB_HUI, RGB_SAI, RGB_SPI, _______, _______, _______, _______, _______,  _______,  _______,                    _______,
        _______, RGB_RMOD, RGB_VAD,  RGB_HUD, RGB_SAD, RGB_SPD, _______, _______, _______, _______, _______,  _______,  _______,  _______,          _______,
        _______,           _______,  _______, _______, _______, _______, _______, _______, _______, _______,  _______,  _______,  _______, _______,
        _______, _______,  _______,  _______,                   _______,                   _______, _______,  _______,  _______,  _______, _______, _______)
};

#if defined(ENCODER_MAP_ENABLE)
const uint16_t PROGMEM encoder_map[][NUM_ENCODERS][2] = {
    [MAC_BASE] = { ENCODER_CCW_CW(KC_VOLD, KC_VOLU)},
    [WIN_BASE] = { ENCODER_CCW_CW(KC_VOLD, KC_VOLU)},
    [_FN1]   = { ENCODER_CCW_CW(RGB_VAD, RGB_VAI)},
    [_FN2]   = { ENCODER_CCW_CW(RGB_VAD, RGB_VAI)},
    [_FN3]   = { ENCODER_CCW_CW(_______, _______)}
};
#endif // ENCODER_MAP_ENABLE

A keyboards/keychron/q2/jis_encoder/keymaps/default/rules.mk => keyboards/keychron/q2/jis_encoder/keymaps/default/rules.mk +1 -0
@@ 0,0 1,1 @@
ENCODER_MAP_ENABLE = yes

A keyboards/keychron/q2/jis_encoder/keymaps/keychron/keymap.c => keyboards/keychron/q2/jis_encoder/keymaps/keychron/keymap.c +84 -0
@@ 0,0 1,84 @@
/* 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 <http://www.gnu.org/licenses/>.
 */

#include QMK_KEYBOARD_H
#include "keychron_common.h"

// clang-format off

enum layers{
    MAC_BASE,
    WIN_BASE,
    _FN1,
    _FN2,
    _FN3
};

const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
    [MAC_BASE] = LAYOUT_jis_71(
        KC_ESC,  KC_1,     KC_2,     KC_3,    KC_4,    KC_5,    KC_6,    KC_7,    KC_8,    KC_9,    KC_0,     KC_MINS,  KC_EQL,   KC_INT3, KC_BSPC, KC_MUTE,
        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_DEL,
        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_NUHS,  KC_ENT,           KC_HOME,
        KC_LSFT,           KC_Z,     KC_X,    KC_C,    KC_V,    KC_B,    KC_N,    KC_M,    KC_COMM, KC_DOT,   KC_SLSH,  KC_INT1,  KC_RSFT, KC_UP,
        KC_LCTL, KC_LOPTN, KC_LCMMD, KC_LNG2,                   KC_SPC,                    KC_LNG1, KC_RCMMD, MO(_FN1), MO(_FN3), KC_LEFT, KC_DOWN, KC_RGHT),

    [WIN_BASE] = LAYOUT_jis_71(
        KC_ESC,  KC_1,     KC_2,     KC_3,    KC_4,    KC_5,    KC_6,    KC_7,    KC_8,    KC_9,    KC_0,     KC_MINS,  KC_EQL,   KC_INT3, KC_BSPC, KC_MUTE,
        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_DEL,
        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_NUHS,  KC_ENT,           KC_HOME,
        KC_LSFT,           KC_Z,     KC_X,    KC_C,    KC_V,    KC_B,    KC_N,    KC_M,    KC_COMM, KC_DOT,   KC_SLSH,  KC_INT1,  KC_RSFT, KC_UP,
        KC_LCTL, KC_LWIN,  KC_LALT,  KC_INT5,                   KC_SPC,                    KC_INT4, KC_RALT,  MO(_FN2), MO(_FN3), KC_LEFT, KC_DOWN, KC_RGHT),

    [_FN1] = LAYOUT_jis_71(
        KC_GRV,  KC_BRID,  KC_BRIU,  KC_MCTL, KC_LPAD, RGB_VAD, RGB_VAI, KC_MPRV, KC_MPLY, KC_MNXT, KC_MUTE,  KC_VOLD,  KC_VOLU,  _______, _______, RGB_TOG,
        RGB_TOG, RGB_MOD,  RGB_VAI,  RGB_HUI, RGB_SAI, RGB_SPI, _______, _______, _______, _______, _______,  _______,  _______,                    _______,
        _______, RGB_RMOD, RGB_VAD,  RGB_HUD, RGB_SAD, RGB_SPD, _______, _______, _______, _______, _______,  _______,  _______,  _______,          _______,
        _______,           _______,  _______, _______, _______, _______, NK_TOGG, _______, _______, _______,  _______,  _______,  _______, _______,
        _______, _______,  _______,  _______,                   _______,                   _______, _______,  _______,  _______,  _______, _______, _______),

    [_FN2] = LAYOUT_jis_71(
        KC_GRV,  KC_BRID,  KC_BRIU,  KC_TASK, KC_FLXP, RGB_VAD, RGB_VAI, KC_MPRV, KC_MPLY, KC_MNXT, KC_MUTE,  KC_VOLD,  KC_VOLU,  _______, _______, RGB_TOG,
        RGB_TOG, RGB_MOD,  RGB_VAI,  RGB_HUI, RGB_SAI, RGB_SPI, _______, _______, _______, _______, _______,  _______,  _______,                    _______,
        _______, RGB_RMOD, RGB_VAD,  RGB_HUD, RGB_SAD, RGB_SPD, _______, _______, _______, _______, _______,  _______,  _______,  _______,          _______,
        _______,           _______,  _______, _______, _______, _______, NK_TOGG, _______, _______, _______,  _______,  _______,  _______, _______,
        _______, _______,  _______,  _______,                   _______,                   _______, _______,  _______,  _______,  _______, _______, _______),

    [_FN3] = LAYOUT_jis_71(
        KC_TILD, KC_F1,    KC_F2,    KC_F3,   KC_F4,   KC_F5,   KC_F6,   KC_F7,   KC_F8,   KC_F9,   KC_F10,   KC_F11,   KC_F12,   _______, _______, _______,
        RGB_TOG, RGB_MOD,  RGB_VAI,  RGB_HUI, RGB_SAI, RGB_SPI, _______, _______, _______, _______, _______,  _______,  _______,                    _______,
        _______, RGB_RMOD, RGB_VAD,  RGB_HUD, RGB_SAD, RGB_SPD, _______, _______, _______, _______, _______,  _______,  _______,  _______,          _______,
        _______,           _______,  _______, _______, _______, _______, _______, _______, _______, _______,  _______,  _______,  _______, _______,
        _______, _______,  _______,  _______,                   _______,                   _______, _______,  _______,  _______,  _______, _______, _______)
};

// clang-format on

#if defined(ENCODER_MAP_ENABLE)
const uint16_t PROGMEM encoder_map[][NUM_ENCODERS][2] = {
    [MAC_BASE] = { ENCODER_CCW_CW(KC_VOLD, KC_VOLU)},
    [WIN_BASE] = { ENCODER_CCW_CW(KC_VOLD, KC_VOLU)},
    [_FN1]   = { ENCODER_CCW_CW(RGB_VAD, RGB_VAI)},
    [_FN2]   = { ENCODER_CCW_CW(RGB_VAD, RGB_VAI)},
    [_FN3]   = { ENCODER_CCW_CW(_______, _______)}
};
#endif // ENCODER_MAP_ENABLE

bool process_record_user(uint16_t keycode, keyrecord_t *record) {
    if (!process_record_keychron(keycode, record)) {
        return false;
    }
    return true;
}

A keyboards/keychron/q2/jis_encoder/keymaps/keychron/rules.mk => keyboards/keychron/q2/jis_encoder/keymaps/keychron/rules.mk +5 -0
@@ 0,0 1,5 @@
VIA_ENABLE = yes
ENCODER_MAP_ENABLE = yes

VPATH += keyboards/keychron/common
SRC += keychron_common.c

A keyboards/keychron/q2/jis_encoder/keymaps/via/keymap.c => keyboards/keychron/q2/jis_encoder/keymaps/via/keymap.c +77 -0
@@ 0,0 1,77 @@
/* 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 <http://www.gnu.org/licenses/>.
 */

#include QMK_KEYBOARD_H

// clang-format off

enum layers{
    MAC_BASE,
    WIN_BASE,
    _FN1,
    _FN2,
    _FN3
};

#define KC_TASK LGUI(KC_TAB)
#define KC_FLXP LGUI(KC_E)

const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
    [MAC_BASE] = LAYOUT_jis_71(
        KC_ESC,  KC_1,     KC_2,     KC_3,    KC_4,    KC_5,    KC_6,    KC_7,    KC_8,    KC_9,    KC_0,     KC_MINS,  KC_EQL,   KC_INT3, KC_BSPC, KC_MUTE,
        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_DEL,
        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_NUHS,  KC_ENT,           KC_HOME,
        KC_LSFT,           KC_Z,     KC_X,    KC_C,    KC_V,    KC_B,    KC_N,    KC_M,    KC_COMM, KC_DOT,   KC_SLSH,  KC_INT1,  KC_RSFT, KC_UP,
        KC_LCTL, KC_LOPT,  KC_LCMD,  KC_LNG2,                   KC_SPC,                    KC_LNG1, KC_RCMD,  MO(_FN1), MO(_FN3), KC_LEFT, KC_DOWN, KC_RGHT),

    [WIN_BASE] = LAYOUT_jis_71(
        KC_ESC,  KC_1,     KC_2,     KC_3,    KC_4,    KC_5,    KC_6,    KC_7,    KC_8,    KC_9,    KC_0,     KC_MINS,  KC_EQL,   KC_INT3, KC_BSPC, KC_MUTE,
        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_DEL,
        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_NUHS,  KC_ENT,           KC_HOME,
        KC_LSFT,           KC_Z,     KC_X,    KC_C,    KC_V,    KC_B,    KC_N,    KC_M,    KC_COMM, KC_DOT,   KC_SLSH,  KC_INT1,  KC_RSFT, KC_UP,
        KC_LCTL, KC_LWIN,  KC_LALT,  KC_INT5,                   KC_SPC,                    KC_INT4, KC_RALT,  MO(_FN2), MO(_FN3), KC_LEFT, KC_DOWN, KC_RGHT),

    [_FN1] = LAYOUT_jis_71(
        KC_GRV,  KC_BRID,  KC_BRIU,  KC_NO,   KC_NO,   RGB_VAD, RGB_VAI, KC_MPRV, KC_MPLY, KC_MNXT, KC_MUTE,  KC_VOLD,  KC_VOLU,  _______, _______, RGB_TOG,
        RGB_TOG, RGB_MOD,  RGB_VAI,  RGB_HUI, RGB_SAI, RGB_SPI, _______, _______, _______, _______, _______,  _______,  _______,                    _______,
        _______, RGB_RMOD, RGB_VAD,  RGB_HUD, RGB_SAD, RGB_SPD, _______, _______, _______, _______, _______,  _______,  _______,  _______,          _______,
        _______,           _______,  _______, _______, _______, _______, NK_TOGG, _______, _______, _______,  _______,  _______,  _______, _______,
        _______, _______,  _______,  _______,                   _______,                   _______, _______,  _______,  _______,  _______, _______, _______),

    [_FN2] = LAYOUT_jis_71(
        KC_GRV,  KC_BRID,  KC_BRIU,  KC_TASK, KC_FLXP, RGB_VAD, RGB_VAI, KC_MPRV, KC_MPLY, KC_MNXT, KC_MUTE,  KC_VOLD,  KC_VOLU,  _______, _______, RGB_TOG,
        RGB_TOG, RGB_MOD,  RGB_VAI,  RGB_HUI, RGB_SAI, RGB_SPI, _______, _______, _______, _______, _______,  _______,  _______,                    _______,
        _______, RGB_RMOD, RGB_VAD,  RGB_HUD, RGB_SAD, RGB_SPD, _______, _______, _______, _______, _______,  _______,  _______,  _______,          _______,
        _______,           _______,  _______, _______, _______, _______, NK_TOGG, _______, _______, _______,  _______,  _______,  _______, _______,
        _______, _______,  _______,  _______,                   _______,                   _______, _______,  _______,  _______,  _______, _______, _______),

    [_FN3] = LAYOUT_jis_71(
        KC_TILD, KC_F1,    KC_F2,    KC_F3,   KC_F4,   KC_F5,   KC_F6,   KC_F7,   KC_F8,   KC_F9,   KC_F10,   KC_F11,   KC_F12,   _______, _______, _______,
        RGB_TOG, RGB_MOD,  RGB_VAI,  RGB_HUI, RGB_SAI, RGB_SPI, _______, _______, _______, _______, _______,  _______,  _______,                    _______,
        _______, RGB_RMOD, RGB_VAD,  RGB_HUD, RGB_SAD, RGB_SPD, _______, _______, _______, _______, _______,  _______,  _______,  _______,          _______,
        _______,           _______,  _______, _______, _______, _______, _______, _______, _______, _______,  _______,  _______,  _______, _______,
        _______, _______,  _______,  _______,                   _______,                   _______, _______,  _______,  _______,  _______, _______, _______)
};

#if defined(ENCODER_MAP_ENABLE)
const uint16_t PROGMEM encoder_map[][NUM_ENCODERS][2] = {
    [MAC_BASE] = { ENCODER_CCW_CW(KC_VOLD, KC_VOLU)},
    [WIN_BASE] = { ENCODER_CCW_CW(KC_VOLD, KC_VOLU)},
    [_FN1]   = { ENCODER_CCW_CW(RGB_VAD, RGB_VAI)},
    [_FN2]   = { ENCODER_CCW_CW(RGB_VAD, RGB_VAI)},
    [_FN3]   = { ENCODER_CCW_CW(_______, _______)}
};
#endif // ENCODER_MAP_ENABLE

A keyboards/keychron/q2/jis_encoder/keymaps/via/rules.mk => keyboards/keychron/q2/jis_encoder/keymaps/via/rules.mk +2 -0
@@ 0,0 1,2 @@
VIA_ENABLE = yes
ENCODER_MAP_ENABLE = yes

A keyboards/keychron/q2/jis_encoder/rules.mk => keyboards/keychron/q2/jis_encoder/rules.mk +22 -0
@@ 0,0 1,22 @@
# 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
ENCODER_ENABLE = yes        # Enable Encoder
DIP_SWITCH_ENABLE = yes
RGB_MATRIX_ENABLE = yes
RGB_MATRIX_DRIVER = CKLED2001
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


M keyboards/keychron/q2/q2.c => keyboards/keychron/q2/q2.c +43 -1
@@ 1,4 1,4 @@
/* Copyright 2021 @ 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


@@ 35,3 35,45 @@ bool dip_switch_update_kb(uint8_t index, bool active) {
}

#endif // DIP_SWITCH_ENABLE

#if defined(RGB_MATRIX_ENABLE) && defined(CAPS_LOCK_LED_INDEX)

bool process_record_kb(uint16_t keycode, keyrecord_t *record) {
    if (!process_record_user(keycode, record)) { return false; }
    switch (keycode) {
        case RGB_TOG:
            if (record->event.pressed) {
                switch (rgb_matrix_get_flags()) {
                    case LED_FLAG_ALL: {
                        rgb_matrix_set_flags(LED_FLAG_NONE);
                        rgb_matrix_set_color_all(0, 0, 0);
                    } break;
                    default: {
                        rgb_matrix_set_flags(LED_FLAG_ALL);
                    } break;
                }
            }
            if (!rgb_matrix_is_enabled()) {
                rgb_matrix_set_flags(LED_FLAG_ALL);
                rgb_matrix_enable();
            }
            return false;
    }
    return true;
}

bool rgb_matrix_indicators_advanced_kb(uint8_t led_min, uint8_t led_max) {
    if (!rgb_matrix_indicators_advanced_user(led_min, led_max)) { return false; }
    // RGB_MATRIX_INDICATOR_SET_COLOR(index, red, green, blue);

    if (host_keyboard_led_state().caps_lock) {
        RGB_MATRIX_INDICATOR_SET_COLOR(CAPS_LOCK_LED_INDEX, 255, 255, 255);
    } else {
        if (!rgb_matrix_get_flags()) {
           RGB_MATRIX_INDICATOR_SET_COLOR(CAPS_LOCK_LED_INDEX, 0, 0, 0);
        }
    }
    return true;
}

#endif // CAPS_LOCK_LED_INDEX

M keyboards/keychron/q2/readme.md => keyboards/keychron/q2/readme.md +2 -2
@@ 8,11 8,11 @@ A customizable 65% keyboard.

Make example for this keyboard (after setting up your build environment):

  make keychron/q2/ansi:default
    make keychron/q2/ansi:default

Flashing example for this keyboard ([after setting up the bootloadHID flashing environment](https://docs.qmk.fm/#/flashing_bootloadhid))

  make keychron/q2/ansi:default:flash
    make keychron/q2/ansi:default:flash

**Reset Key**: Hold down the key located at *K00*, commonly programmed as *Esc* while plugging in the keyboard.