Add k12 pro

This commit is contained in:
lalalademaxiya1 2023-06-10 09:00:19 +08:00
parent 3d895c8b25
commit b1a59b2e92
21 changed files with 1390 additions and 0 deletions

View file

@ -0,0 +1,99 @@
/* Copyright 2021 @ 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
#ifdef RGB_MATRIX_ENABLE
/* RGB Matrix driver configuration */
# define DRIVER_COUNT 1
# define DRIVER_ADDR_1 0b1110100
# define DRIVER_1_LED_COUNT 61
# define RGB_MATRIX_LED_COUNT DRIVER_1_LED_COUNT
/* Set to infinit, which is use in USB mode by default
*/
# define RGB_MATRIX_TIMEOUT RGB_MATRIX_TIMEOUT_INFINITE
/* Allow shutdown of led driver to save power */
# define RGB_MATRIX_DRIVER_SHUTDOWN_ENABLE
/* Turn off backlight on low brightness to save power */
# define RGB_MATRIX_BRIGHTNESS_TURN_OFF_VAL 32
# define DIM_CAPS_LOCK
# define CAPS_LOCK_INDEX 28
# define LOW_BAT_IND_INDEX 56
/* RGB Matrix Animation modes. Explicitly enabled
* For full list of effects, see:
* https://docs.qmk.fm/#/feature_rgb_matrix?id=rgb-matrix-effects
*/
# define RGB_MATRIX_KEYPRESSES
# define RGB_MATRIX_FRAMEBUFFER_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
/* Set LED driver current */
# define CKLED2001_CURRENT_TUNE \
{ 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28 }
#endif

View file

@ -0,0 +1,85 @@
{
"keyboard_name": "Keychron K12 Pro",
"manufacturer": "Keychron",
"url": "https://github.com/Keychron",
"maintainer": "lalalademaxiya1",
"usb": {
"vid": "0x3434",
"pid": "0x02C0",
"device_version": "1.0.0"
},
"matrix_pins": {
"cols": [null, null, null, null, null, null, null, null, null, null, null, null, null, null ],
"rows": ["B4", "B3", "A15", "A14", "A13"]
},
"diode_direction": "ROW2COL",
"processor": "STM32L432",
"bootloader": "stm32-dfu",
"layouts": {
"LAYOUT_ansi_61": {
"layout": [
{"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},
{"matrix":[0,4], "x":4, "y":0},
{"matrix":[0,5], "x":5, "y":0},
{"matrix":[0,6], "x":6, "y":0},
{"matrix":[0,7], "x":7, "y":0},
{"matrix":[0,8], "x":8, "y":0},
{"matrix":[0,9], "x":9, "y":0},
{"matrix":[0,10], "x":10, "y":0},
{"matrix":[0,11], "x":11, "y":0},
{"matrix":[0,12], "x":12, "y":0},
{"matrix":[0,13], "x":13, "y":0, "w":2},
{"matrix":[1,0], "x":0, "y":1, "w":1.5},
{"matrix":[1,1], "x":1.5, "y":1},
{"matrix":[1,2], "x":2.5, "y":1},
{"matrix":[1,3], "x":3.5, "y":1},
{"matrix":[1,4], "x":4.5, "y":1},
{"matrix":[1,5], "x":5.5, "y":1},
{"matrix":[1,6], "x":6.5, "y":1},
{"matrix":[1,7], "x":7.5, "y":1},
{"matrix":[1,8], "x":8.5, "y":1},
{"matrix":[1,9], "x":9.5, "y":1},
{"matrix":[1,10], "x":10.5, "y":1},
{"matrix":[1,11], "x":11.5, "y":1},
{"matrix":[1,12], "x":12.5, "y":1},
{"matrix":[1,13], "x":13.5, "y":1, "w":1.5},
{"matrix":[2,0], "x":0, "y":2, "w":1.75},
{"matrix":[2,1], "x":1.75, "y":2},
{"matrix":[2,2], "x":2.75, "y":2},
{"matrix":[2,3], "x":3.75, "y":2},
{"matrix":[2,4], "x":4.75, "y":2},
{"matrix":[2,5], "x":5.75, "y":2},
{"matrix":[2,6], "x":6.75, "y":2},
{"matrix":[2,7], "x":7.75, "y":2},
{"matrix":[2,8], "x":8.75, "y":2},
{"matrix":[2,9], "x":9.75, "y":2},
{"matrix":[2,10], "x":10.75, "y":2},
{"matrix":[2,11], "x":11.75, "y":2},
{"matrix":[2,13], "x":12.75, "y":2, "w":2.25},
{"matrix":[3,0], "x":0, "y":3, "w":2.25},
{"matrix":[3,2], "x":2.25, "y":3},
{"matrix":[3,3], "x":3.25, "y":3},
{"matrix":[3,4], "x":4.25, "y":3},
{"matrix":[3,5], "x":5.25, "y":3},
{"matrix":[3,6], "x":6.25, "y":3},
{"matrix":[3,7], "x":7.25, "y":3},
{"matrix":[3,8], "x":8.25, "y":3},
{"matrix":[3,9], "x":9.25, "y":3},
{"matrix":[3,10], "x":10.25, "y":3},
{"matrix":[3,11], "x":11.25, "y":3},
{"matrix":[3,13], "x":12.25, "y":3, "w":2.75},
{"matrix":[4,0], "x":0, "y":4, "w":1.25},
{"matrix":[4,1], "x":1.25, "y":4, "w":1.25},
{"matrix":[4,2], "x":2.5, "y":4, "w":1.25},
{"matrix":[4,6], "x":3.75, "y":4, "w":6.25},
{"matrix":[4,10], "x":10, "y":4, "w":1.25},
{"matrix":[4,11], "x":11.25, "y":4, "w":1.25},
{"matrix":[4,12], "x":12.5, "y":4, "w":1.25},
{"matrix":[4,13], "x":13.75, "y":4, "w":1.25}
]
}
}
}

View file

@ -0,0 +1,63 @@
/* 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,
MAC_FN1,
WIN_FN1,
FN2
};
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
[MAC_BASE] = LAYOUT_ansi_61(
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_BSPC,
KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS,
KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT,
KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT,
KC_LCTL, KC_LOPTN, KC_LCMMD, KC_SPC, KC_RCMMD,MO(MAC_FN1),MO(FN2), KC_RCTL),
[WIN_BASE] = LAYOUT_ansi_61(
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_BSPC,
KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS,
KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT,
KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT,
KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, MO(WIN_FN1),MO(FN2), KC_RCTL),
[MAC_FN1] = LAYOUT_ansi_61(
KC_GRV, KC_BRID, KC_BRIU, KC_MCTL, KC_LNPD, RGB_VAD, RGB_VAI, KC_MPRV, KC_MPLY, KC_MNXT, KC_MUTE, KC_VOLD, KC_VOLU, RGB_MOD,
_______, BT_HST1, BT_HST2, BT_HST3, _______, _______, _______, _______, _______, _______, KC_INS, KC_PGUP, KC_HOME, _______,
RGB_TOG, RGB_MOD, RGB_VAI, RGB_HUI, RGB_SAI, RGB_SPI, _______, _______, KC_UP, KC_SNAP, KC_PGDN, KC_END, _______,
_______, RGB_RMOD, RGB_VAD, RGB_HUD, RGB_SAD, RGB_SPD, NK_TOGG, KC_LEFT, KC_DOWN, KC_RIGHT, KC_DEL, _______,
_______, _______, _______, _______, _______, _______, _______, _______),
[WIN_FN1] = LAYOUT_ansi_61(
KC_GRV, KC_BRID, KC_BRIU, KC_TASK, KC_FILE, RGB_VAD, RGB_VAI, KC_MPRV, KC_MPLY, KC_MNXT, KC_MUTE, KC_VOLD, KC_VOLU, RGB_MOD,
_______, BT_HST1, BT_HST2, BT_HST3, _______, _______, _______, _______, KC_APP, KC_SCRL, KC_INS, KC_PGUP, KC_HOME, _______,
RGB_TOG, RGB_MOD, RGB_VAI, RGB_HUI, RGB_SAI, RGB_SPI, _______, _______, KC_UP, KC_PSCR, KC_PGDN, KC_END, _______,
_______, RGB_RMOD, RGB_VAD, RGB_HUD, RGB_SAD, RGB_SPD, NK_TOGG, KC_LEFT, KC_DOWN, KC_RIGHT, KC_DEL, _______,
_______, _______, _______, _______, _______, _______, _______, _______),
[FN2] = LAYOUT_ansi_61(
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, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, BAT_LVL, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______),
};

View file

@ -0,0 +1,63 @@
/* Copyright 2021 @ 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,
MAC_FN1,
WIN_FN1,
FN2
};
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
[MAC_BASE] = LAYOUT_ansi_61(
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_BSPC,
KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS,
KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT,
KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT,
KC_LCTL, KC_LOPTN, KC_LCMMD, KC_SPC, KC_RCMMD,MO(MAC_FN1),MO(FN2), KC_RCTL),
[WIN_BASE] = LAYOUT_ansi_61(
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_BSPC,
KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS,
KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT,
KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT,
KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, MO(WIN_FN1),MO(FN2), KC_RCTL),
[MAC_FN1] = LAYOUT_ansi_61(
KC_GRV, KC_BRID, KC_BRIU, KC_MCTL, KC_LNPD, RGB_VAD, RGB_VAI, KC_MPRV, KC_MPLY, KC_MNXT, KC_MUTE, KC_VOLD, KC_VOLU, RGB_MOD,
_______, BT_HST1, BT_HST2, BT_HST3, _______, _______, _______, _______, _______, _______, KC_INS, KC_PGUP, KC_HOME, _______,
RGB_TOG, RGB_MOD, RGB_VAI, RGB_HUI, RGB_SAI, RGB_SPI, _______, _______, KC_UP, KC_SNAP, KC_PGDN, KC_END, _______,
_______, RGB_RMOD, RGB_VAD, RGB_HUD, RGB_SAD, RGB_SPD, NK_TOGG, KC_LEFT, KC_DOWN, KC_RIGHT, KC_DEL, _______,
_______, _______, _______, _______, _______, _______, _______, _______),
[WIN_FN1] = LAYOUT_ansi_61(
KC_GRV, KC_BRID, KC_BRIU, KC_TASK, KC_FILE, RGB_VAD, RGB_VAI, KC_MPRV, KC_MPLY, KC_MNXT, KC_MUTE, KC_VOLD, KC_VOLU, RGB_MOD,
_______, BT_HST1, BT_HST2, BT_HST3, _______, _______, _______, _______, KC_APP, KC_SCRL, KC_INS, KC_PGUP, KC_HOME, _______,
RGB_TOG, RGB_MOD, RGB_VAI, RGB_HUI, RGB_SAI, RGB_SPI, _______, _______, KC_UP, KC_PSCR, KC_PGDN, KC_END, _______,
_______, RGB_RMOD, RGB_VAD, RGB_HUD, RGB_SAD, RGB_SPD, NK_TOGG, KC_LEFT, KC_DOWN, KC_RIGHT, KC_DEL, _______,
_______, _______, _______, _______, _______, _______, _______, _______),
[FN2] = LAYOUT_ansi_61(
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, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, BAT_LVL, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______),
};

View file

@ -0,0 +1,2 @@
VIA_ENABLE = yes
OPT_DEFS += -DDYNAMIC_KEYMAP_LAYER_COUNT=5

View file

@ -0,0 +1,123 @@
/* Copyright 2021 @ 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"
// clang-format off
#ifdef RGB_MATRIX_ENABLE
const ckled2001_led g_ckled2001_leds[RGB_MATRIX_LED_COUNT] = {
/* Refer to CKLED2001 manual for these locations
* driver
* | R location
* | | G location
* | | | B location
* | | | | */
{0, I_16, G_16, H_16},
{0, I_15, G_15, H_15},
{0, I_14, G_14, H_14},
{0, I_13, G_13, H_13},
{0, I_12, G_12, H_12},
{0, I_11, G_11, H_11},
{0, I_10, G_10, H_10},
{0, I_9, G_9, H_9},
{0, I_8, G_8, H_8},
{0, I_7, G_7, H_7},
{0, I_6, G_6, H_6},
{0, I_5, G_5, H_5},
{0, I_4, G_4, H_4},
{0, I_3, G_3, H_3},
{0, F_16, D_16, E_16},
{0, F_15, D_15, E_15},
{0, F_14, D_14, E_14},
{0, F_13, D_13, E_13},
{0, F_12, D_12, E_12},
{0, F_11, D_11, E_11},
{0, F_10, D_10, E_10},
{0, F_9, D_9, E_9},
{0, F_8, D_8, E_8},
{0, F_7, D_7, E_7},
{0, F_6, D_6, E_6},
{0, F_5, D_5, E_5},
{0, F_4, D_4, E_4},
{0, F_3, D_3, E_3},
{0, C_16, A_16, B_16},
{0, C_15, A_15, B_15},
{0, C_14, A_14, B_14},
{0, C_13, A_13, B_13},
{0, C_12, A_12, B_12},
{0, C_11, A_11, B_11},
{0, C_10, A_10, B_10},
{0, C_9, A_9, B_9},
{0, C_8, A_8, B_8},
{0, C_7, A_7, B_7},
{0, C_6, A_6, B_6},
{0, C_5, A_5, B_5},
{0, C_3, A_3, B_3},
{0, L_16, J_16, K_16},
{0, L_14, J_14, K_14},
{0, L_13, J_13, K_13},
{0, L_12, J_12, K_12},
{0, L_11, J_11, K_11},
{0, L_10, J_10, K_10},
{0, L_9, J_9, K_9},
{0, L_8, J_8, K_8},
{0, L_7, J_7, K_7},
{0, L_6, J_6, K_6},
{0, L_5, J_5, K_5},
{0, L_3, J_3, K_3},
{0, C_1, A_1, B_1},
{0, C_2, A_2, B_2},
{0, L_1, J_1, K_1},
{0, L_2, J_2, K_2},
{0, F_1, D_1, E_1},
{0, F_2, D_2, E_2},
{0, I_1, G_1, H_1},
{0, I_2, G_2, H_2}
};
#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 },
{ 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27 },
{ 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, __, 40 },
{ 41, __, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, __, 52 },
{ 53, 54, 55, __, __, __, 56, __, __, __, 57, 58, 59, 60 }
},
{
// LED Index to Physical Position
{0,0}, {16,0}, {32,0}, {48,0}, {65,0}, {81,0}, {97,0}, {113,0}, {129,0}, {145,0}, {161,0}, {178,0}, {194,0}, {218,0},
{4,16}, {24,16}, {40,16}, {57,16}, {73,16}, {89,16}, {105,16}, {121,16}, {137,16}, {153,16}, {170,16}, {186,16}, {202,16}, {222,16},
{6,32}, {28,32}, {44,32}, {61,32}, {77,32}, {93,32}, {109,32}, {125,32}, {141,32}, {157,32}, {174,32}, {190,32}, {216,32},
{10,48}, {36,48}, {52,48}, {69,48}, {85,48}, {101,48}, {117,48}, {133,48}, {149,48}, {165,48}, {182,48}, {212,48},
{2,64}, {22,64}, {42,64}, {103,64}, {163,64}, {184,64}, {204,64}, {224,64},
},
{
// RGB LED Index to Flag
1, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 1,
1, 8, 8, 8, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
8, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 1,
1, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 1,
1, 1, 1, 4, 1, 4, 4, 1,
}
};
#endif

View file

@ -0,0 +1,2 @@
RGB_MATRIX_ENABLE = yes
RGB_MATRIX_DRIVER = CKLED2001

View file

@ -0,0 +1,74 @@
/* Copyright 2021 @ 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
#ifdef LED_MATRIX_ENABLE
/* LED matrix driver configuration */
# define DRIVER_COUNT 1
# define DRIVER_ADDR_1 0b1110100
# define LED_MATRIX_LED_COUNT 61
/* Set to infinit, which is use in USB mode by default */
# define LED_MATRIX_TIMEOUT LED_MATRIX_TIMEOUT_INFINITE
/* Allow shutdown of led driver to save power */
# define LED_MATRIX_DRIVER_SHUTDOWN_ENABLE
/* Turn off backlight on low brightness to save power */
# define LED_MATRIX_BRIGHTNESS_TURN_OFF_VAL 32
# define DIM_CAPS_LOCK
# define CAPS_LOCK_INDEX 28
# define LOW_BAT_IND_INDEX 56
/* LED Matrix Animation modes. Explicitly enabled
* For full list of effects, see:
* https://docs.qmk.fm/#/feature_led_matrix?id=led-matrix-effects
*/
# define LED_MATRIX_KEYPRESSES
# define ENABLE_LED_MATRIX_NONE
# define ENABLE_LED_MATRIX_SOLID
//# define ENABLE_LED_MATRIX_ALPHAS_MODS
# define ENABLE_LED_MATRIX_BREATHING
//# define ENABLE_LED_MATRIX_BAND
# define ENABLE_LED_MATRIX_BAND_PINWHEEL
# define ENABLE_LED_MATRIX_BAND_SPIRAL
# define ENABLE_LED_MATRIX_CYCLE_LEFT_RIGHT
# define ENABLE_LED_MATRIX_CYCLE_UP_DOWN
# define ENABLE_LED_MATRIX_CYCLE_OUT_IN
# define ENABLE_LED_MATRIX_DUAL_BEACON
# define ENABLE_LED_MATRIX_SOLID_REACTIVE_SIMPLE
//# define ENABLE_LED_MATRIX_SOLID_REACTIVE_WIDE
# define ENABLE_LED_MATRIX_SOLID_REACTIVE_MULTIWIDE
//# define ENABLE_LED_MATRIX_SOLID_REACTIVE_CROSS
//# define ENABLE_LED_MATRIX_SOLID_REACTIVE_MULTICROSS
//# define ENABLE_LED_MATRIX_SOLID_REACTIVE_NEXUS
# define ENABLE_LED_MATRIX_SOLID_REACTIVE_MULTINEXUS
# define ENABLE_LED_MATRIX_SOLID_SPLASH
//# define ENABLE_LED_MATRIX_SOLID_MULTISPLASH
# define ENABLE_LED_MATRIX_WAVE_LEFT_RIGHT
# define ENABLE_LED_MATRIX_WAVE_UP_DOWN
# define ENABLE_LED_MATRIX_EFFECT_MAX
/* Use first 6 channels of LED driver */
# define PHASE_CHANNEL MSKPHASE_6CHANNEL
/* Set LED driver current */
# define CKLED2001_CURRENT_TUNE { 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28 }
#endif

View file

@ -0,0 +1,85 @@
{
"keyboard_name": "Keychron K12 Pro",
"manufacturer": "Keychron",
"url": "https://github.com/Keychron",
"maintainer": "lalalademaxiya1",
"usb": {
"vid": "0x3434",
"pid": "0x02C3",
"device_version": "1.0.0"
},
"matrix_pins": {
"cols": [null, null, null, null, null, null, null, null, null, null, null, null, null, null ],
"rows": ["B4", "B3", "A15", "A14", "A13"]
},
"diode_direction": "ROW2COL",
"processor": "STM32L432",
"bootloader": "stm32-dfu",
"layouts": {
"LAYOUT_ansi_61": {
"layout": [
{"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},
{"matrix":[0,4], "x":4, "y":0},
{"matrix":[0,5], "x":5, "y":0},
{"matrix":[0,6], "x":6, "y":0},
{"matrix":[0,7], "x":7, "y":0},
{"matrix":[0,8], "x":8, "y":0},
{"matrix":[0,9], "x":9, "y":0},
{"matrix":[0,10], "x":10, "y":0},
{"matrix":[0,11], "x":11, "y":0},
{"matrix":[0,12], "x":12, "y":0},
{"matrix":[0,13], "x":13, "y":0, "w":2},
{"matrix":[1,0], "x":0, "y":1, "w":1.5},
{"matrix":[1,1], "x":1.5, "y":1},
{"matrix":[1,2], "x":2.5, "y":1},
{"matrix":[1,3], "x":3.5, "y":1},
{"matrix":[1,4], "x":4.5, "y":1},
{"matrix":[1,5], "x":5.5, "y":1},
{"matrix":[1,6], "x":6.5, "y":1},
{"matrix":[1,7], "x":7.5, "y":1},
{"matrix":[1,8], "x":8.5, "y":1},
{"matrix":[1,9], "x":9.5, "y":1},
{"matrix":[1,10], "x":10.5, "y":1},
{"matrix":[1,11], "x":11.5, "y":1},
{"matrix":[1,12], "x":12.5, "y":1},
{"matrix":[1,13], "x":13.5, "y":1, "w":1.5},
{"matrix":[2,0], "x":0, "y":2, "w":1.75},
{"matrix":[2,1], "x":1.75, "y":2},
{"matrix":[2,2], "x":2.75, "y":2},
{"matrix":[2,3], "x":3.75, "y":2},
{"matrix":[2,4], "x":4.75, "y":2},
{"matrix":[2,5], "x":5.75, "y":2},
{"matrix":[2,6], "x":6.75, "y":2},
{"matrix":[2,7], "x":7.75, "y":2},
{"matrix":[2,8], "x":8.75, "y":2},
{"matrix":[2,9], "x":9.75, "y":2},
{"matrix":[2,10], "x":10.75, "y":2},
{"matrix":[2,11], "x":11.75, "y":2},
{"matrix":[2,13], "x":12.75, "y":2, "w":2.25},
{"matrix":[3,0], "x":0, "y":3, "w":2.25},
{"matrix":[3,2], "x":2.25, "y":3},
{"matrix":[3,3], "x":3.25, "y":3},
{"matrix":[3,4], "x":4.25, "y":3},
{"matrix":[3,5], "x":5.25, "y":3},
{"matrix":[3,6], "x":6.25, "y":3},
{"matrix":[3,7], "x":7.25, "y":3},
{"matrix":[3,8], "x":8.25, "y":3},
{"matrix":[3,9], "x":9.25, "y":3},
{"matrix":[3,10], "x":10.25, "y":3},
{"matrix":[3,11], "x":11.25, "y":3},
{"matrix":[3,13], "x":12.25, "y":3, "w":2.75},
{"matrix":[4,0], "x":0, "y":4, "w":1.25},
{"matrix":[4,1], "x":1.25, "y":4, "w":1.25},
{"matrix":[4,2], "x":2.5, "y":4, "w":1.25},
{"matrix":[4,6], "x":3.75, "y":4, "w":6.25},
{"matrix":[4,10], "x":10, "y":4, "w":1.25},
{"matrix":[4,11], "x":11.25, "y":4, "w":1.25},
{"matrix":[4,12], "x":12.5, "y":4, "w":1.25},
{"matrix":[4,13], "x":13.75, "y":4, "w":1.25}
]
}
}
}

View file

@ -0,0 +1,63 @@
/* Copyright 2021 @ 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,
MAC_FN1,
WIN_FN1,
FN2
};
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
[MAC_BASE] = LAYOUT_ansi_61(
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_BSPC,
KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS,
KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT,
KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT,
KC_LCTL, KC_LOPTN, KC_LCMMD, KC_SPC, KC_RCMMD,MO(MAC_FN1),MO(FN2), KC_RCTL),
[WIN_BASE] = LAYOUT_ansi_61(
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_BSPC,
KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS,
KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT,
KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT,
KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, MO(WIN_FN1),MO(FN2), KC_RCTL),
[MAC_FN1] = LAYOUT_ansi_61(
KC_GRV, KC_BRID, KC_BRIU, KC_MCTL, KC_LNPD, BL_DOWN, BL_UP, KC_MPRV, KC_MPLY, KC_MNXT, KC_MUTE, KC_VOLD, KC_VOLU, BL_STEP,
_______, BT_HST1, BT_HST2, BT_HST3, _______, _______, _______, _______, _______, _______, KC_INS, KC_PGUP, KC_HOME, _______,
BL_TOGG, BL_STEP, BL_UP, _______, _______, _______, _______, _______, KC_UP, KC_SNAP, KC_PGDN, KC_END, _______,
_______, _______, BL_DOWN, _______, _______, _______, NK_TOGG, KC_LEFT, KC_DOWN, KC_RIGHT, KC_DEL, _______,
_______, _______, _______, _______, _______, _______, _______, _______),
[WIN_FN1] = LAYOUT_ansi_61(
KC_GRV, KC_BRID, KC_BRIU, KC_TASK, KC_FILE, BL_DOWN, BL_UP, KC_MPRV, KC_MPLY, KC_MNXT, KC_MUTE, KC_VOLD, KC_VOLU, BL_STEP,
_______, BT_HST1, BT_HST2, BT_HST3, _______, _______, _______, _______, KC_APP, KC_SCRL, KC_INS, KC_PGUP, KC_HOME, _______,
BL_TOGG, BL_STEP, BL_UP, _______, _______, _______, _______, _______, KC_UP, KC_PSCR, KC_PGDN, KC_END, _______,
_______, _______, BL_DOWN, _______, _______, _______, NK_TOGG, KC_LEFT, KC_DOWN, KC_RIGHT, KC_DEL, _______,
_______, _______, _______, _______, _______, _______, _______, _______),
[FN2] = LAYOUT_ansi_61(
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, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, BAT_LVL, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______),
};

View file

@ -0,0 +1,63 @@
/* Copyright 2021 @ 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,
MAC_FN1,
WIN_FN1,
FN2
};
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
[MAC_BASE] = LAYOUT_ansi_61(
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_BSPC,
KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS,
KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT,
KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT,
KC_LCTL, KC_LOPTN, KC_LCMMD, KC_SPC, KC_RCMMD,MO(MAC_FN1),MO(FN2), KC_RCTL),
[WIN_BASE] = LAYOUT_ansi_61(
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_BSPC,
KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS,
KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT,
KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT,
KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, MO(WIN_FN1),MO(FN2), KC_RCTL),
[MAC_FN1] = LAYOUT_ansi_61(
KC_GRV, KC_BRID, KC_BRIU, KC_MCTL, KC_LNPD, BL_DOWN, BL_UP, KC_MPRV, KC_MPLY, KC_MNXT, KC_MUTE, KC_VOLD, KC_VOLU, BL_STEP,
_______, BT_HST1, BT_HST2, BT_HST3, _______, _______, _______, _______, _______, _______, KC_INS, KC_PGUP, KC_HOME, _______,
BL_TOGG, BL_STEP, BL_UP, _______, _______, _______, _______, _______, KC_UP, KC_SNAP, KC_PGDN, KC_END, _______,
_______, _______, BL_DOWN, _______, _______, _______, NK_TOGG, KC_LEFT, KC_DOWN, KC_RIGHT, KC_DEL, _______,
_______, _______, _______, _______, _______, _______, _______, _______),
[WIN_FN1] = LAYOUT_ansi_61(
KC_GRV, KC_BRID, KC_BRIU, KC_TASK, KC_FILE, BL_DOWN, BL_UP, KC_MPRV, KC_MPLY, KC_MNXT, KC_MUTE, KC_VOLD, KC_VOLU, BL_STEP,
_______, BT_HST1, BT_HST2, BT_HST3, _______, _______, _______, _______, KC_APP, KC_SCRL, KC_INS, KC_PGUP, KC_HOME, _______,
BL_TOGG, BL_STEP, BL_UP, _______, _______, _______, _______, _______, KC_UP, KC_PSCR, KC_PGDN, KC_END, _______,
_______, _______, BL_DOWN, _______, _______, _______, NK_TOGG, KC_LEFT, KC_DOWN, KC_RIGHT, KC_DEL, _______,
_______, _______, _______, _______, _______, _______, _______, _______),
[FN2] = LAYOUT_ansi_61(
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, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, BAT_LVL, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______),
};

View file

@ -0,0 +1,2 @@
VIA_ENABLE = yes
OPT_DEFS += -DDYNAMIC_KEYMAP_LAYER_COUNT=5

View file

@ -0,0 +1,2 @@
LED_MATRIX_ENABLE = yes
LED_MATRIX_DRIVER = CKLED2001

View file

@ -0,0 +1,121 @@
/* 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 <http://www.gnu.org/licenses/>.
*/
#include "quantum.h"
// clang-format off
#ifdef LED_MATRIX_ENABLE
const ckled2001_led g_ckled2001_leds[LED_MATRIX_LED_COUNT] = {
/* Refer to CKLED2001 manual for these locations
* driver
* | LED address
* | | */
{0, B_16},
{0, B_15},
{0, B_14},
{0, B_13},
{0, B_12},
{0, B_11},
{0, B_10},
{0, B_9},
{0, B_8},
{0, B_7},
{0, B_6},
{0, B_5},
{0, B_4},
{0, B_3},
{0, C_16},
{0, C_15},
{0, C_14},
{0, C_13},
{0, C_12},
{0, C_11},
{0, C_10},
{0, C_9},
{0, C_8},
{0, C_7},
{0, C_6},
{0, C_5},
{0, C_4},
{0, C_3},
{0, D_16},
{0, D_15},
{0, D_14},
{0, D_13},
{0, D_12},
{0, D_11},
{0, D_10},
{0, D_9},
{0, D_8},
{0, D_7},
{0, D_6},
{0, D_5},
{0, D_3},
{0, E_16},
{0, E_14},
{0, E_13},
{0, E_12},
{0, E_11},
{0, E_10},
{0, E_9},
{0, E_8},
{0, E_7},
{0, E_6},
{0, E_5},
{0, E_3},
{0, F_16},
{0, F_15},
{0, F_14},
{0, F_10},
{0, F_6},
{0, F_5},
{0, F_4},
{0, F_3},
};
#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 },
{ 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27 },
{ 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, __, 40 },
{ 41, __, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, __, 52 },
{ 53, 54, 55, __, __, __, 56, __, __, __, 57, 58, 59, 60 }
},
{
// LED Index to Physical Position
{0,0}, {16,0}, {32,0}, {48,0}, {65,0}, {81,0}, {97,0}, {113,0}, {129,0}, {145,0}, {161,0}, {178,0}, {194,0}, {218,0},
{4,16}, {24,16}, {40,16}, {57,16}, {73,16}, {89,16}, {105,16}, {121,16}, {137,16}, {153,16}, {170,16}, {186,16}, {202,16}, {222,16},
{6,32}, {28,32}, {44,32}, {61,32}, {77,32}, {93,32}, {109,32}, {125,32}, {141,32}, {157,32}, {174,32}, {190,32}, {216,32},
{10,48}, {36,48}, {52,48}, {69,48}, {85,48}, {101,48}, {117,48}, {133,48}, {149,48}, {165,48}, {182,48}, {212,48},
{2,64}, {22,64}, {42,64}, {103,64}, {163,64}, {184,64}, {204,64}, {224,64},
},
{
// RGB LED Index to Flag
1, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 1,
1, 8, 8, 8, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
8, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 1,
1, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 1,
1, 1, 1, 4, 1, 4, 4, 1,
}
};
#endif

View file

@ -0,0 +1,92 @@
/* 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 <http://www.gnu.org/licenses/>.
*/
#pragma once
/* Turn off effects when suspended */
#define RGB_DISABLE_WHEN_USB_SUSPENDED
#define LED_DISABLE_WHEN_USB_SUSPENDED
/* Set 0 if debouncing isn't needed */
#define DEBOUNCE 5
/* DIP switch for Mac/win OS switch */
#define DIP_SWITCH_PINS \
{ A8 }
/* Caps lock LED Pin */
#define LED_CAPS_LOCK_PIN A0
#define LED_PIN_ON_STATE 1
/* Increase I2C speed to 1000 KHz */
#define I2C1_TIMINGR_PRESC 0U
#define I2C1_TIMINGR_SCLDEL 3U
#define I2C1_TIMINGR_SDADEL 0U
#define I2C1_TIMINGR_SCLH 15U
#define I2C1_TIMINGR_SCLL 51U
#ifdef KC_BLUETOOTH_ENABLE
/* Hardware configuration */
# define USB_BT_MODE_SELECT_PIN A10
# define CKBT51_RESET_PIN A9
# define CKBT51_INT_INPUT_PIN A5
# define BLUETOOTH_INT_INPUT_PIN A6
# define USB_POWER_SENSE_PIN B1
# define USB_POWER_CONNECTED_LEVEL 0
# define BAT_LOW_LED_PIN A4
# define BAT_LOW_LED_PIN_ON_STATE 1
# define HOST_DEVICES_COUNT 3
# if defined(RGB_MATRIX_ENABLE) || defined(LED_MATRIX_ENABLE)
# define LED_DRIVER_SHUTDOWN_PIN C14
# define HOST_LED_MATRIX_LIST \
{ 15, 16, 17 }
# define BAT_LEVEL_LED_LIST \
{ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }
/* Backlit disable timeout when keyboard is disconnected(unit: second) */
# define DISCONNECTED_BACKLIGHT_DISABLE_TIMEOUT 40
/* Backlit disable timeout when keyboard is connected(unit: second) */
# define CONNECTED_BACKLIGHT_DISABLE_TIMEOUT 600
# endif
/* Keep USB connection in blueooth mode */
# define KEEP_USB_CONNECTION_IN_BLUETOOTH_MODE
/* Enable bluetooth NKRO */
# define BLUETOOTH_NKRO_ENABLE
/* Raw hid command for factory test and bluetooth DFU */
# define RAW_HID_CMD 0xAA ... 0xAB
#else
/* Raw hid command for factory test */
# define RAW_HID_CMD 0xAB
#endif
/* Emulated EEPROM configuration */
#define FEE_DENSITY_BYTES FEE_PAGE_SIZE
#define DYNAMIC_KEYMAP_EEPROM_MAX_ADDR 2047
/* Factory test keys */
#define FN_KEY1 MO(4)

View file

@ -0,0 +1,27 @@
/* Copyright 2020 QMK
*
* 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
#define HAL_USE_I2C TRUE
#ifdef KC_BLUETOOTH_ENABLE
# define PAL_USE_CALLBACKS TRUE
# define HAL_USE_SERIAL TRUE
# define HAL_USE_RTC TRUE
#endif
#include_next <halconf.h>

View file

@ -0,0 +1,301 @@
/* 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 "k12_pro.h"
#ifdef KC_BLUETOOTH_ENABLE
# include "ckbt51.h"
# include "bluetooth.h"
# include "indicator.h"
# include "transport.h"
# include "battery.h"
# include "bat_level_animation.h"
# include "lpm.h"
#endif
#ifdef ENABLE_FACTORY_TEST
# include "factory_test.h"
#endif
#define POWER_ON_LED_DURATION 3000
typedef struct PACKED {
uint8_t len;
uint8_t keycode[3];
} key_combination_t;
static uint32_t power_on_indicator_timer_buffer;
static uint32_t siri_timer_buffer = 0;
static uint8_t mac_keycode[4] = {KC_LOPT, KC_ROPT, KC_LCMD, KC_RCMD};
key_combination_t key_comb_list[4] = {
{2, {KC_LWIN, KC_TAB}}, // Task (win)
{2, {KC_LWIN, KC_E}}, // Files (win)
{3, {KC_LSFT, KC_LGUI, KC_4}}, // Snapshot (mac)
{2, {KC_LWIN, KC_C}} // Cortana (win)
};
#ifdef KC_BLUETOOTH_ENABLE
bool firstDisconnect = true;
bool bt_factory_reset = false;
static virtual_timer_t pairing_key_timer;
extern uint8_t g_pwm_buffer[DRIVER_COUNT][192];
static void pairing_key_timer_cb(void *arg) {
bluetooth_pairing_ex(*(uint8_t *)arg, NULL);
}
#endif
bool dip_switch_update_kb(uint8_t index, bool active) {
if (index == 0) {
default_layer_set(1UL << (active ? 1 : 0));
}
dip_switch_update_user(index, active);
return true;
}
#ifdef KC_BLUETOOTH_ENABLE
bool process_record_kb_bt(uint16_t keycode, keyrecord_t *record) {
#else
bool process_record_kb(uint16_t keycode, keyrecord_t *record) {
#endif
static uint8_t host_idx = 0;
switch (keycode) {
case KC_LOPTN:
case KC_ROPTN:
case KC_LCMMD:
case KC_RCMMD:
if (record->event.pressed) {
register_code(mac_keycode[keycode - KC_LOPTN]);
} else {
unregister_code(mac_keycode[keycode - KC_LOPTN]);
}
return false; // Skip all further processing of this key)
case KC_MCTL:
/* Mission Control */
host_consumer_send(record->event.pressed ? 0x29F : 0);
return false; // Skip all further processing of this key
case KC_LNPD:
/* Lanuchpad */
host_consumer_send(record->event.pressed ? 0x2A0 : 0);
return false; // Skip all further processing of this key
case KC_TASK:
case KC_FILE:
case KC_SNAP:
case KC_CTANA:
if (record->event.pressed) {
for (uint8_t i = 0; i < key_comb_list[keycode - KC_TASK].len; i++)
register_code(key_comb_list[keycode - KC_TASK].keycode[i]);
} else {
for (uint8_t i = 0; i < key_comb_list[keycode - KC_TASK].len; i++)
unregister_code(key_comb_list[keycode - KC_TASK].keycode[i]);
}
return false; // Skip all further processing of this key
case KC_SIRI:
if (record->event.pressed && siri_timer_buffer == 0) {
register_code(KC_LGUI);
register_code(KC_SPACE);
siri_timer_buffer = sync_timer_read32() | 1;
}
return false; // Skip all further processing of this key
#ifdef KC_BLUETOOTH_ENABLE
case BT_HST1 ... BT_HST3:
if (get_transport() == TRANSPORT_BLUETOOTH) {
if (record->event.pressed) {
host_idx = keycode - BT_HST1 + 1;
chVTSet(&pairing_key_timer, TIME_MS2I(2000), (vtfunc_t)pairing_key_timer_cb, &host_idx);
bluetooth_connect_ex(host_idx, 0);
} else {
host_idx = 0;
chVTReset(&pairing_key_timer);
}
}
break;
case BAT_LVL:
if (get_transport() == TRANSPORT_BLUETOOTH && !usb_power_connected()) {
bat_level_animation_start(battery_get_percentage());
}
break;
#endif
default:
#ifdef FACTORY_RESET_CHECK
FACTORY_RESET_CHECK(keycode, record);
#endif
break;
}
return true;
}
void keyboard_post_init_kb(void) {
dip_switch_read(true);
#ifdef KC_BLUETOOTH_ENABLE
/* Currently we don't use this reset pin */
palSetLineMode(CKBT51_RESET_PIN, PAL_MODE_UNCONNECTED);
/* IMPORTANT: DO NOT enable internal pull-up resistor
* as there is an external pull-down resistor.
*/
palSetLineMode(USB_BT_MODE_SELECT_PIN, PAL_MODE_INPUT);
ckbt51_init(false);
bluetooth_init();
# endif
power_on_indicator_timer_buffer = sync_timer_read32() | 1;
writePin(BAT_LOW_LED_PIN, BAT_LOW_LED_PIN_ON_STATE);
keyboard_post_init_user();
}
void matrix_scan_kb(void) {
if (power_on_indicator_timer_buffer) {
if (sync_timer_elapsed32(power_on_indicator_timer_buffer) > POWER_ON_LED_DURATION) {
power_on_indicator_timer_buffer = 0;
writePin(BAT_LOW_LED_PIN, !BAT_LOW_LED_PIN_ON_STATE);
} else {
writePin(BAT_LOW_LED_PIN, BAT_LOW_LED_PIN_ON_STATE);
}
}
if (siri_timer_buffer && sync_timer_elapsed32(siri_timer_buffer) > 500) {
siri_timer_buffer = 0;
unregister_code(KC_LGUI);
unregister_code(KC_SPACE);
}
#ifdef FACTORY_RESET_TASK
FACTORY_RESET_TASK();
# endif
matrix_scan_user();
}
#ifdef KC_BLUETOOTH_ENABLE
static void ckbt51_param_init(void) {
/* Set bluetooth device name */
// ckbt51_set_local_name(STR(PRODUCT));
ckbt51_set_local_name(PRODUCT);
/* Set bluetooth parameters */
module_param_t param = {.event_mode = 0x02,
.connected_idle_timeout = 7200,
.pairing_timeout = 180,
.pairing_mode = 0,
.reconnect_timeout = 5,
.report_rate = 90,
.vendor_id_source = 1,
.verndor_id = 0, // Must be 0x3434
.product_id = PRODUCT_ID};
ckbt51_set_param(&param);
}
void bluetooth_enter_disconnected_kb(uint8_t host_idx) {
if (bt_factory_reset) {
bt_factory_reset = false;
ckbt51_param_init();
}
/* CKBT51 bluetooth module boot time is slower, it enters disconnected after boot,
so we place initialization here. */
if (firstDisconnect && sync_timer_read32() < 1000 && get_transport() == TRANSPORT_BLUETOOTH) {
ckbt51_param_init();
bluetooth_connect();
firstDisconnect = false;
}
}
void ckbt51_default_ack_handler(uint8_t *data, uint8_t len) {
if (data[1] == 0x45) {
module_param_t param = {.event_mode = 0x02,
.connected_idle_timeout = 7200,
.pairing_timeout = 180,
.pairing_mode = 0,
.reconnect_timeout = 5,
.report_rate = 90,
.vendor_id_source = 1,
.verndor_id = 0, // Must be 0x3434
.product_id = PRODUCT_ID};
ckbt51_set_param(&param);
}
}
void bluetooth_pre_task(void) {
static uint8_t mode = 1;
if (readPin(USB_BT_MODE_SELECT_PIN) != mode) {
if (readPin(USB_BT_MODE_SELECT_PIN) != mode) {
mode = readPin(USB_BT_MODE_SELECT_PIN);
set_transport(mode == 0 ? TRANSPORT_BLUETOOTH : TRANSPORT_USB);
}
}
}
#endif
void battery_calculte_voltage(uint16_t value) {
uint16_t voltage = ((uint32_t)value) * 2246 / 1000;
#ifdef LED_MATRIX_ENABLE
if (led_matrix_is_enabled()) {
uint32_t totalBuf = 0;
for (uint8_t i = 0; i < DRIVER_COUNT; i++)
for (uint8_t j = 0; j < 192; j++)
totalBuf += g_pwm_buffer[i][j];
/* We assumpt it is linear relationship*/
voltage += (30 * totalBuf / LED_MATRIX_LED_COUNT / 255);
}
#endif
#ifdef RGB_MATRIX_ENABLE
if (rgb_matrix_is_enabled()) {
uint32_t totalBuf = 0;
for (uint8_t i = 0; i < DRIVER_COUNT; i++)
for (uint8_t j = 0; j < 192; j++)
totalBuf += g_pwm_buffer[i][j];
/* We assumpt it is linear relationship*/
uint32_t compensation = 60 * totalBuf / RGB_MATRIX_LED_COUNT / 255 / 3;
voltage += compensation;
}
#endif
battery_set_voltage(voltage);
}
bool via_command_kb(uint8_t *data, uint8_t length) {
switch (data[0]) {
#ifdef KC_BLUETOOTH_ENABLE
case 0xAA:
ckbt51_dfu_rx(data, length);
break;
#endif
#ifdef ENABLE_FACTORY_TEST
case 0xAB:
factory_test_rx(data, length);
break;
#endif
default:
return false;
}
return true;
}
#if !defined(VIA_ENABLE)
void raw_hid_receive(uint8_t *data, uint8_t length) {
switch (data[0]) {
case RAW_HID_CMD:
via_command_kb(data, length);
break;
}
}
#endif

View file

@ -0,0 +1,52 @@
/* 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
#include "quantum.h"
#ifdef VIA_ENABLE
# include "via.h"
#endif
#define ___ KC_NO
#ifdef VIA_ENABLE
# define USER_START USER00
#else
# define USER_START SAFE_RANGE
#endif
// clang-format off
enum {
KC_LOPTN = USER_START,
KC_ROPTN,
KC_LCMMD,
KC_RCMMD,
KC_MCTL,
KC_LNPD,
KC_TASK,
KC_FILE,
KC_SNAP,
KC_CTANA,
KC_SIRI,
#ifdef KC_BLUETOOTH_ENABLE
BT_HST1,
BT_HST2,
BT_HST3,
#endif
BAT_LVL,
NEW_SAFE_RANGE,
};

View file

@ -0,0 +1,37 @@
/* Copyright 2020 QMK
*
* 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
#include_next <mcuconf.h>
/* Set HCLK to 48 MHz as tradeoff of USB lowest clockand and
* lower power comsumption for bluetooth. Will use dynamic
* clock when STM32L4 is supported in ChibiOS */
#undef STM32_PLLM_VALUE
#define STM32_PLLM_VALUE 2
#undef STM32_PLLN_VALUE
#define STM32_PLLN_VALUE 12
#undef STM32_I2C_USE_I2C1
#define STM32_I2C_USE_I2C1 TRUE
#ifdef KC_BLUETOOTH_ENABLE
# undef STM32_SERIAL_USE_USART2
# define STM32_SERIAL_USE_USART2 TRUE
#endif

View file

@ -0,0 +1,23 @@
# Keychron K12 Pro
![Keychron K6 Pro]()
A customizable 60% keyboard.
* Keyboard Maintainer: [Keychron](https://github.com/keychron)
* Hardware Supported: Keychron K12 Pro
* Hardware Availability:
Make example for this keyboard (after setting up your build environment):
make keychron/k12_pro/ansi/rgb:default
make keychron/k12_pro/ansi/white:default
Flashing example for this keyboard:
make keychron/k12_pro/ansi/rgb:default:flash
make keychron/k12_pro/ansi/white:default:flash
**Reset Key**: Connect the USB cable, toggle mode switch to "Off", hold down the *Esc* key or reset button underneath space bar, then toggle then switch to "Cable".
See the [build environment setup](https://docs.qmk.fm/#/getting_started_build_tools) and the [make instructions](https://docs.qmk.fm/#/getting_started_make_guide) for more information. Brand new to QMK? Start with our [Complete Newbs Guide](https://docs.qmk.fm/#/newbs).

View file

@ -0,0 +1,11 @@
# Enter lower-power sleep mode when on the ChibiOS idle thread
OPT_DEFS += -DCORTEX_ENABLE_WFI_IDLE=TRUE
OPT_DEFS += -DNO_USB_STARTUP_CHECK -DENABLE_FACTORY_TEST
OPT_DEFS += -DKC_BLUETOOTH_ENABLE
CUSTOM_MATRIX = lite
VPATH += keyboards/keychron/common
SRC += matrix.c
include keyboards/keychron/bluetooth/bluetooth.mk