From bd248382173b44a28a76826120ca9d3ccd273f5c Mon Sep 17 00:00:00 2001 From: KeychronMacro Date: Tue, 19 Dec 2023 11:45:02 +0800 Subject: [PATCH] add x1_v2 --- keyboards/keychron/x1_v2/ansi/red/config.h | 41 ++++ keyboards/keychron/x1_v2/ansi/red/info.json | 124 ++++++++++ .../x1_v2/ansi/red/keymaps/default/keymap.c | 61 +++++ .../x1_v2/ansi/red/keymaps/keychron/keymap.c | 77 ++++++ .../x1_v2/ansi/red/keymaps/keychron/rules.mk | 3 + .../x1_v2/ansi/red/keymaps/via/keymap.c | 61 +++++ .../x1_v2/ansi/red/keymaps/via/rules.mk | 1 + keyboards/keychron/x1_v2/ansi/red/red.c | 119 +++++++++ keyboards/keychron/x1_v2/ansi/red/rules.mk | 1 + keyboards/keychron/x1_v2/config.h | 40 +++ keyboards/keychron/x1_v2/halconf.h | 21 ++ keyboards/keychron/x1_v2/info.json | 226 +++++++++++++++++ keyboards/keychron/x1_v2/iso/red/config.h | 41 ++++ keyboards/keychron/x1_v2/iso/red/info.json | 126 ++++++++++ .../x1_v2/iso/red/keymaps/default/keymap.c | 61 +++++ .../x1_v2/iso/red/keymaps/keychron/keymap.c | 77 ++++++ .../x1_v2/iso/red/keymaps/keychron/rules.mk | 3 + .../x1_v2/iso/red/keymaps/via/keymap.c | 61 +++++ .../x1_v2/iso/red/keymaps/via/rules.mk | 1 + keyboards/keychron/x1_v2/iso/red/red.c | 122 ++++++++++ keyboards/keychron/x1_v2/iso/red/rules.mk | 2 + keyboards/keychron/x1_v2/mcuconf.h | 53 ++++ keyboards/keychron/x1_v2/readme.md | 26 ++ .../x1_v2/via_json/x1_pro_ansi_red.json | 224 +++++++++++++++++ .../x1_v2/via_json/x1_pro_iso_red.json | 229 ++++++++++++++++++ keyboards/keychron/x1_v2/x1_v2--01.rar | Bin 0 -> 19642 bytes keyboards/keychron/x1_v2/x1_v2-20231123.rar | Bin 0 -> 19705 bytes keyboards/keychron/x1_v2/x1_v2.c | 86 +++++++ 28 files changed, 1887 insertions(+) create mode 100644 keyboards/keychron/x1_v2/ansi/red/config.h create mode 100644 keyboards/keychron/x1_v2/ansi/red/info.json create mode 100644 keyboards/keychron/x1_v2/ansi/red/keymaps/default/keymap.c create mode 100644 keyboards/keychron/x1_v2/ansi/red/keymaps/keychron/keymap.c create mode 100644 keyboards/keychron/x1_v2/ansi/red/keymaps/keychron/rules.mk create mode 100644 keyboards/keychron/x1_v2/ansi/red/keymaps/via/keymap.c create mode 100644 keyboards/keychron/x1_v2/ansi/red/keymaps/via/rules.mk create mode 100644 keyboards/keychron/x1_v2/ansi/red/red.c create mode 100644 keyboards/keychron/x1_v2/ansi/red/rules.mk create mode 100644 keyboards/keychron/x1_v2/config.h create mode 100644 keyboards/keychron/x1_v2/halconf.h create mode 100644 keyboards/keychron/x1_v2/info.json create mode 100644 keyboards/keychron/x1_v2/iso/red/config.h create mode 100644 keyboards/keychron/x1_v2/iso/red/info.json create mode 100644 keyboards/keychron/x1_v2/iso/red/keymaps/default/keymap.c create mode 100644 keyboards/keychron/x1_v2/iso/red/keymaps/keychron/keymap.c create mode 100644 keyboards/keychron/x1_v2/iso/red/keymaps/keychron/rules.mk create mode 100644 keyboards/keychron/x1_v2/iso/red/keymaps/via/keymap.c create mode 100644 keyboards/keychron/x1_v2/iso/red/keymaps/via/rules.mk create mode 100644 keyboards/keychron/x1_v2/iso/red/red.c create mode 100644 keyboards/keychron/x1_v2/iso/red/rules.mk create mode 100644 keyboards/keychron/x1_v2/mcuconf.h create mode 100644 keyboards/keychron/x1_v2/readme.md create mode 100644 keyboards/keychron/x1_v2/via_json/x1_pro_ansi_red.json create mode 100644 keyboards/keychron/x1_v2/via_json/x1_pro_iso_red.json create mode 100644 keyboards/keychron/x1_v2/x1_v2--01.rar create mode 100644 keyboards/keychron/x1_v2/x1_v2-20231123.rar create mode 100644 keyboards/keychron/x1_v2/x1_v2.c diff --git a/keyboards/keychron/x1_v2/ansi/red/config.h b/keyboards/keychron/x1_v2/ansi/red/config.h new file mode 100644 index 0000000000..10b68a44cf --- /dev/null +++ b/keyboards/keychron/x1_v2/ansi/red/config.h @@ -0,0 +1,41 @@ +/* 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 . + */ + +#pragma once + +#ifdef LED_MATRIX_ENABLE +/* RGB Matrix Driver Configuration */ +# define DRIVER_COUNT 1 +# define DRIVER_ADDR_1 0b1110100 + +/* RGB Matrix Configuration */ +# define LED_MATRIX_LED_COUNT 87 + +/* Scan phase of led driver set as MSKPHASE_9CHANNEL(defined as 0x03 in CKLED2001.h) */ +# define PHASE_CHANNEL MSKPHASE_9CHANNEL +# define CKLED2001_CURRENT_TUNE \ + { 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60 } + +/* turn off effects when suspended */ +# define LED_DISABLE_WHEN_USB_SUSPENDED + +// LED Matrix Animation modes. Explicitly enabled +// For full list of effects, see: +// https://docs.qmk.fm/#/feature_led_matrix?id=led-matrix-effects +// #if defined(LED_MATRIX_KEYPRESSES) || defined(LED_MATRIX_KEYRELEASES) +# define LED_MATRIX_KEYPRESSES +# define LED_MATRIX_KEYRELEASES +#endif diff --git a/keyboards/keychron/x1_v2/ansi/red/info.json b/keyboards/keychron/x1_v2/ansi/red/info.json new file mode 100644 index 0000000000..aaedd779db --- /dev/null +++ b/keyboards/keychron/x1_v2/ansi/red/info.json @@ -0,0 +1,124 @@ +{ + "usb": { + "pid": "0x0210", + "device_version": "1.0.0" + }, + "features": { + "led_matrix": true + }, + "led_matrix": { + "driver": "ckled2001", + "animations": { + "none": true, + "solid": true, + "breathing": true, + "band_pinwheel": true, + "band_spiral": true, + "cycle_left_right": true, + "cycle_up_down": true, + "cycle_out_in": true, + "dual_beacon": true, + "solid_reactive_simple": true, + "solid_reactive_multiwide": true, + "solid_reactive_multinexus": true, + "solid_splash": true, + "wave_left_right": true, + "wave_up_down": true, + "effect_max": true + }, + "layout": [ + {"matrix":[0, 0], "flags":1, "x":0, "y":0}, + {"matrix":[0, 1], "flags":1, "x":26, "y":0}, + {"matrix":[0, 2], "flags":1, "x":39, "y":0}, + {"matrix":[0, 3], "flags":1, "x":52, "y":0}, + {"matrix":[0, 4], "flags":1, "x":65, "y":0}, + {"matrix":[0, 5], "flags":1, "x":85, "y":0}, + {"matrix":[0, 6], "flags":1, "x":98, "y":0}, + {"matrix":[0, 7], "flags":1, "x":111, "y":0}, + {"matrix":[0, 8], "flags":1, "x":124, "y":0}, + {"matrix":[0, 9], "flags":1, "x":143, "y":0}, + {"matrix":[0, 10], "flags":1, "x":156, "y":0}, + {"matrix":[0, 11], "flags":1, "x":169, "y":0}, + {"matrix":[0, 12], "flags":1, "x":182, "y":0}, + {"matrix":[0, 14], "flags":1, "x":198, "y":0}, + {"matrix":[0, 15], "flags":1, "x":211, "y":0}, + {"matrix":[0, 16], "flags":1, "x":224, "y":0}, + + {"matrix":[1, 0], "flags":1, "x":0, "y":15}, + {"matrix":[1, 1], "flags":4, "x":15, "y":15}, + {"matrix":[1, 2], "flags":4, "x":26, "y":15}, + {"matrix":[1, 3], "flags":4, "x":39, "y":15}, + {"matrix":[1, 4], "flags":4, "x":52, "y":15}, + {"matrix":[1, 5], "flags":4, "x":65, "y":15}, + {"matrix":[1, 6], "flags":4, "x":78, "y":15}, + {"matrix":[1, 7], "flags":4, "x":91, "y":15}, + {"matrix":[1, 8], "flags":4, "x":104, "y":15}, + {"matrix":[1, 9], "flags":4, "x":117, "y":15}, + {"matrix":[1, 10], "flags":4, "x":130, "y":15}, + {"matrix":[1, 11], "flags":4, "x":143, "y":15}, + {"matrix":[1, 12], "flags":4, "x":156, "y":15}, + {"matrix":[1, 13], "flags":1, "x":176, "y":15}, + {"matrix":[1, 14], "flags":1, "x":198, "y":15}, + {"matrix":[1, 15], "flags":1, "x":211, "y":15}, + {"matrix":[1, 16], "flags":1, "x":224, "y":15}, + + {"matrix":[2, 0], "flags":1, "x":3, "y":27}, + {"matrix":[2, 1], "flags":4, "x":20, "y":27}, + {"matrix":[2, 2], "flags":4, "x":33, "y":27}, + {"matrix":[2, 3], "flags":4, "x":46, "y":27}, + {"matrix":[2, 4], "flags":4, "x":59, "y":27}, + {"matrix":[2, 5], "flags":4, "x":72, "y":27}, + {"matrix":[2, 6], "flags":4, "x":85, "y":27}, + {"matrix":[2, 7], "flags":4, "x":98, "y":27}, + {"matrix":[2, 8], "flags":4, "x":111, "y":27}, + {"matrix":[2, 9], "flags":4, "x":124, "y":27}, + {"matrix":[2, 10], "flags":4, "x":137, "y":27}, + {"matrix":[2, 11], "flags":4, "x":150, "y":27}, + {"matrix":[2, 12], "flags":4, "x":163, "y":27}, + {"matrix":[2, 13], "flags":1, "x":179, "y":27}, + {"matrix":[2, 14], "flags":1, "x":198, "y":27}, + {"matrix":[2, 15], "flags":1, "x":211, "y":27}, + {"matrix":[2, 16], "flags":1, "x":224, "y":27}, + + {"matrix":[3, 0], "flags":8, "x":5, "y":39}, + {"matrix":[3, 1], "flags":4, "x":23, "y":39}, + {"matrix":[3, 2], "flags":4, "x":36, "y":39}, + {"matrix":[3, 3], "flags":4, "x":49, "y":39}, + {"matrix":[3, 4], "flags":4, "x":62, "y":39}, + {"matrix":[3, 5], "flags":4, "x":75, "y":39}, + {"matrix":[3, 6], "flags":4, "x":88, "y":39}, + {"matrix":[3, 7], "flags":4, "x":101, "y":39}, + {"matrix":[3, 8], "flags":4, "x":114, "y":39}, + {"matrix":[3, 9], "flags":4, "x":127, "y":39}, + {"matrix":[3, 10], "flags":4, "x":140, "y":39}, + {"matrix":[3, 11], "flags":4, "x":153, "y":39}, + {"matrix":[3, 13], "flags":1, "x":174, "y":39}, + + {"matrix":[4, 0], "flags":1, "x":8, "y":52}, + {"matrix":[4, 2], "flags":4, "x":29, "y":52}, + {"matrix":[4, 3], "flags":4, "x":42, "y":52}, + {"matrix":[4, 4], "flags":4, "x":55, "y":52}, + {"matrix":[4, 5], "flags":4, "x":68, "y":52}, + {"matrix":[4, 6], "flags":4, "x":82, "y":52}, + {"matrix":[4, 7], "flags":4, "x":95, "y":52}, + {"matrix":[4, 8], "flags":4, "x":108, "y":52}, + {"matrix":[4, 9], "flags":4, "x":121, "y":52}, + {"matrix":[4, 10], "flags":4, "x":134, "y":52}, + {"matrix":[4, 11], "flags":4, "x":147, "y":52}, + {"matrix":[4, 13], "flags":1, "x":171, "y":52}, + {"matrix":[4, 15], "flags":1, "x":211, "y":52}, + + {"matrix":[5, 0], "flags":1, "x":2, "y":64}, + {"matrix":[5, 1], "flags":1, "x":18, "y":64}, + {"matrix":[5, 2], "flags":1, "x":34, "y":64}, + {"matrix":[5, 6], "flags":4, "x":83, "y":64}, + {"matrix":[5, 10], "flags":1, "x":132, "y":64}, + {"matrix":[5, 11], "flags":1, "x":148, "y":64}, + {"matrix":[5, 12], "flags":1, "x":165, "y":64}, + {"matrix":[5, 13], "flags":1, "x":181, "y":64}, + {"matrix":[5, 14], "flags":1, "x":198, "y":64}, + {"matrix":[5, 15], "flags":1, "x":211, "y":64}, + {"matrix":[5, 16], "flags":1, "x":224, "y":64} + ] + } +} diff --git a/keyboards/keychron/x1_v2/ansi/red/keymaps/default/keymap.c b/keyboards/keychron/x1_v2/ansi/red/keymaps/default/keymap.c new file mode 100644 index 0000000000..54ab994339 --- /dev/null +++ b/keyboards/keychron/x1_v2/ansi/red/keymaps/default/keymap.c @@ -0,0 +1,61 @@ +/* Copyright 2023 @ Keychron (https://www.keychron.com) + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#include QMK_KEYBOARD_H + +enum layers{ + WIN_BASE, + WIN_FN, + WIN_L2, + WIN_L3, +}; + +#define KC_TASK LGUI(KC_TAB) +#define KC_FLXP LGUI(KC_E) + +// clang-format off +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + [WIN_BASE] = LAYOUT_tkl_ansi( + KC_ESC, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_PSCR, KC_SCRL, KC_PAUS, + KC_GRV, 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_INS, KC_HOME, KC_PGUP, + 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_DEL, KC_END, KC_PGDN, + 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_UP, + KC_LCTL, KC_LWIN, KC_LALT, KC_SPC, KC_RALT, MO(WIN_FN), KC_APP, KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT), + + [WIN_FN] = LAYOUT_tkl_ansi( + _______, KC_BRID, KC_BRIU, KC_TASK, KC_FLXP, BL_DOWN, BL_UP, KC_MPRV, KC_MPLY, KC_MNXT, KC_MUTE, KC_VOLD, KC_VOLU, KC_PSCR, _______, BL_STEP, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + BL_TOGG, BL_STEP, BL_UP, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, BL_DOWN, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, NK_TOGG, _______, _______, _______, _______, _______, _______, + _______, GU_TOGG, _______, _______, _______, _______, _______, _______, _______, _______, _______), + + [WIN_L2] = LAYOUT_tkl_ansi( + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______), + [WIN_L3] = LAYOUT_tkl_ansi( + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______), +}; diff --git a/keyboards/keychron/x1_v2/ansi/red/keymaps/keychron/keymap.c b/keyboards/keychron/x1_v2/ansi/red/keymaps/keychron/keymap.c new file mode 100644 index 0000000000..b6f9bef78f --- /dev/null +++ b/keyboards/keychron/x1_v2/ansi/red/keymaps/keychron/keymap.c @@ -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 . + */ + +#include QMK_KEYBOARD_H +#include "keychron_common.h" +#include "keychron_ft_common.h" + +enum layers { + WIN_BASE, + WIN_FN, + WIN_L2, + WIN_L3, +}; + +// clang-format off +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + [WIN_BASE] = LAYOUT_tkl_ansi( + KC_ESC, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_PSCR, KC_SCRL, KC_PAUS, + KC_GRV, 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_INS, KC_HOME, KC_PGUP, + 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_DEL, KC_END, KC_PGDN, + 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_UP, + KC_LCTL, KC_LWIN, KC_LALT, KC_SPC, KC_RALT, MO(WIN_FN), KC_APP, KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT), + + [WIN_FN] = LAYOUT_tkl_ansi( + _______, KC_BRID, KC_BRIU, KC_TASK, KC_FLXP, BL_DOWN, BL_UP, KC_MPRV, KC_MPLY, KC_MNXT, KC_MUTE, KC_VOLD, KC_VOLU, KC_PSCR, KC_CRTA, BL_STEP, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + BL_TOGG, BL_STEP, BL_UP, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, BL_DOWN, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, NK_TOGG, _______, _______, _______, _______, _______, _______, + _______, GU_TOGG, _______, _______, _______, _______, _______, _______, _______, _______, _______), + + [WIN_L2] = LAYOUT_tkl_ansi( + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______), + [WIN_L3] = LAYOUT_tkl_ansi( + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______), +}; + +// clang-format on + +void housekeeping_task_user(void) { + housekeeping_task_keychron(); + housekeeping_task_keychron_ft(); +} + +bool process_record_user(uint16_t keycode, keyrecord_t *record) { + if (!process_record_keychron(keycode, record)) { + return false; + } + if (!process_record_keychron_ft(keycode, record)) { + return false; + } + return true; +} diff --git a/keyboards/keychron/x1_v2/ansi/red/keymaps/keychron/rules.mk b/keyboards/keychron/x1_v2/ansi/red/keymaps/keychron/rules.mk new file mode 100644 index 0000000000..3c9fcc5c98 --- /dev/null +++ b/keyboards/keychron/x1_v2/ansi/red/keymaps/keychron/rules.mk @@ -0,0 +1,3 @@ +VIA_ENABLE = yes + +include keyboards/keychron/common/common.mk diff --git a/keyboards/keychron/x1_v2/ansi/red/keymaps/via/keymap.c b/keyboards/keychron/x1_v2/ansi/red/keymaps/via/keymap.c new file mode 100644 index 0000000000..ff90375c5a --- /dev/null +++ b/keyboards/keychron/x1_v2/ansi/red/keymaps/via/keymap.c @@ -0,0 +1,61 @@ +/* Copyright 2023 @ Keychron (https://www.keychron.com) + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#include QMK_KEYBOARD_H + +enum layers { + WIN_BASE, + WIN_FN, + WIN_L2, + WIN_L3, +}; + +#define KC_TASK LGUI(KC_TAB) +#define KC_FLXP LGUI(KC_E) + +// clang-format off +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + [WIN_BASE] = LAYOUT_tkl_ansi( + KC_ESC, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_PSCR, KC_SCRL, KC_PAUS, + KC_GRV, 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_INS, KC_HOME, KC_PGUP, + 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_DEL, KC_END, KC_PGDN, + 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_UP, + KC_LCTL, KC_LWIN, KC_LALT, KC_SPC, KC_RALT, MO(WIN_FN), KC_APP, KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT), + + [WIN_FN] = LAYOUT_tkl_ansi( + _______, KC_BRID, KC_BRIU, KC_TASK, KC_FLXP, BL_DOWN, BL_UP, KC_MPRV, KC_MPLY, KC_MNXT, KC_MUTE, KC_VOLD, KC_VOLU, KC_PSCR, _______, BL_STEP, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + BL_TOGG, BL_STEP, BL_UP, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, BL_DOWN, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, NK_TOGG, _______, _______, _______, _______, _______, _______, + _______, GU_TOGG, _______, _______, _______, _______, _______, _______, _______, _______, _______), + + [WIN_L2] = LAYOUT_tkl_ansi( + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______), + [WIN_L3] = LAYOUT_tkl_ansi( + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______), +}; \ No newline at end of file diff --git a/keyboards/keychron/x1_v2/ansi/red/keymaps/via/rules.mk b/keyboards/keychron/x1_v2/ansi/red/keymaps/via/rules.mk new file mode 100644 index 0000000000..1e5b99807c --- /dev/null +++ b/keyboards/keychron/x1_v2/ansi/red/keymaps/via/rules.mk @@ -0,0 +1 @@ +VIA_ENABLE = yes diff --git a/keyboards/keychron/x1_v2/ansi/red/red.c b/keyboards/keychron/x1_v2/ansi/red/red.c new file mode 100644 index 0000000000..1c0ef4fade --- /dev/null +++ b/keyboards/keychron/x1_v2/ansi/red/red.c @@ -0,0 +1,119 @@ +/* Copyright 2023 @ Keychron (https://www.keychron.com) + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#include "quantum.h" + +#ifdef LED_MATRIX_ENABLE +// clang-format off +const ckled2001_led PROGMEM g_ckled2001_leds[LED_MATRIX_LED_COUNT] = { +/* Refer to CKLED2001 manual for these locations + * driver + * | LED address + * | | */ + {0, A_16}, + {0, A_15}, + {0, A_14}, + {0, A_13}, + {0, A_12}, + {0, A_11}, + {0, A_10}, + {0, A_9 }, + {0, A_8 }, + {0, A_7 }, + {0, A_6 }, + {0, A_5 }, + {0, A_4 }, + {0, A_2 }, + {0, A_1 }, + {0, G_1 }, + + {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, B_2 }, + {0, B_1 }, + {0, H_1 }, + + {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, C_2 }, + {0, C_1 }, + {0, G_6 }, + + {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, E_1 }, + + {0, F_16}, + {0, F_15}, + {0, F_14}, + {0, F_10}, + {0, F_6 }, + {0, F_5 }, + {0, F_4 }, + {0, F_3 }, + {0, F_2 }, + {0, F_1 }, + {0, G_13}, +}; +#endif diff --git a/keyboards/keychron/x1_v2/ansi/red/rules.mk b/keyboards/keychron/x1_v2/ansi/red/rules.mk new file mode 100644 index 0000000000..6e7633bfe0 --- /dev/null +++ b/keyboards/keychron/x1_v2/ansi/red/rules.mk @@ -0,0 +1 @@ +# This file intentionally left blank diff --git a/keyboards/keychron/x1_v2/config.h b/keyboards/keychron/x1_v2/config.h new file mode 100644 index 0000000000..b64209b152 --- /dev/null +++ b/keyboards/keychron/x1_v2/config.h @@ -0,0 +1,40 @@ +/* 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 . + */ + +#pragma once + +/* I2C Driver Configuration */ +#define I2C1_CLOCK_SPEED 400000 +#define I2C1_DUTY_CYCLE FAST_DUTY_CYCLE_2 + +/* EEPROM Driver Configuration */ +//#define WEAR_LEVELING_LOGICAL_SIZE 2048 +//#define WEAR_LEVELING_BACKING_SIZE (WEAR_LEVELING_LOGICAL_SIZE * 2) +#define EXTERNAL_EEPROM_BYTE_COUNT 2048 +#define EXTERNAL_EEPROM_PAGE_SIZE 64 +#define EXTERNAL_EEPROM_WRITE_TIME 3//5 + +/* Winlock indicator */ +#define LED_WIN_LOCK_PIN C10 +#define LED_WIN_LOCK_PIN_ON_STATE 1 + +/* User used eeprom */ +#define EECONFIG_USER_DATA_SIZE 1 + +/* Factory test keys */ +#define FN_KEY1 MO(1) + +#define I2C1_OPMODE OPMODE_I2C diff --git a/keyboards/keychron/x1_v2/halconf.h b/keyboards/keychron/x1_v2/halconf.h new file mode 100644 index 0000000000..41bddcb279 --- /dev/null +++ b/keyboards/keychron/x1_v2/halconf.h @@ -0,0 +1,21 @@ +/* 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 . + */ + +#pragma once + +#define HAL_USE_I2C TRUE + +#include_next diff --git a/keyboards/keychron/x1_v2/info.json b/keyboards/keychron/x1_v2/info.json new file mode 100644 index 0000000000..9a48de47c4 --- /dev/null +++ b/keyboards/keychron/x1_v2/info.json @@ -0,0 +1,226 @@ +{ + "keyboard_name": "Lemokey X1", + "manufacturer": "Keychron", + "url": "https://github.com/Keychron", + "maintainer": "lalalademaxiya1", + "processor": "WB32F3G71", + "bootloader": "wb32-dfu", + "usb": { + "vid": "0x362D" + }, + "matrix_pins": { + "cols": ["A0", "A1", "A2", "A3", "C0", "C1", "C2", "C3", "A8", "C12", "B9", "C6", "C7", "C4", "C5", "A15", "B10"], + "rows": ["B0", "B1", "B8", "B3", "B4", "B5"] + }, + "diode_direction": "COL2ROW", + "indicators": { + "caps_lock": "C9", + "scroll_lock": "C11" + }, + "features": { + "bootmagic": true, + "command": false, + "console": false, + "extrakey": true, + "mousekey": true, + "nkro": true + }, + "community_layouts": [ + "tkl_ansi" + ], + "layouts": { + "LAYOUT_tkl_ansi": { + "layout": [ + {"matrix":[0,0], "x":0, "y":0}, + {"matrix":[0,1], "x":2, "y":0}, + {"matrix":[0,2], "x":3, "y":0}, + {"matrix":[0,3], "x":4, "y":0}, + {"matrix":[0,4], "x":5, "y":0}, + {"matrix":[0,5], "x":6.5, "y":0}, + {"matrix":[0,6], "x":7.5, "y":0}, + {"matrix":[0,7], "x":8.5, "y":0}, + {"matrix":[0,8], "x":9.5, "y":0}, + {"matrix":[0,9], "x":11, "y":0}, + {"matrix":[0,10], "x":12, "y":0}, + {"matrix":[0,11], "x":13, "y":0}, + {"matrix":[0,12], "x":14, "y":0}, + {"matrix":[0,14], "x":15.25, "y":0}, + {"matrix":[0,15], "x":16.25, "y":0}, + {"matrix":[0,16], "x":17.25, "y":0}, + + {"matrix":[1,0], "x":0, "y":1.25}, + {"matrix":[1,1], "x":1, "y":1.25}, + {"matrix":[1,2], "x":2, "y":1.25}, + {"matrix":[1,3], "x":3, "y":1.25}, + {"matrix":[1,4], "x":4, "y":1.25}, + {"matrix":[1,5], "x":5, "y":1.25}, + {"matrix":[1,6], "x":6, "y":1.25}, + {"matrix":[1,7], "x":7, "y":1.25}, + {"matrix":[1,8], "x":8, "y":1.25}, + {"matrix":[1,9], "x":9, "y":1.25}, + {"matrix":[1,10], "x":10, "y":1.25}, + {"matrix":[1,11], "x":11, "y":1.25}, + {"matrix":[1,12], "x":12, "y":1.25}, + {"matrix":[1,13], "x":13, "y":1.25, "w":2}, + {"matrix":[1,14], "x":15.25, "y":1.25}, + {"matrix":[1,15], "x":16.25, "y":1.25}, + {"matrix":[1,16], "x":17.25, "y":1.25}, + + {"matrix":[2,0], "x":0, "y":2.25, "w":1.5}, + {"matrix":[2,1], "x":1.5, "y":2.25}, + {"matrix":[2,2], "x":2.5, "y":2.25}, + {"matrix":[2,3], "x":3.5, "y":2.25}, + {"matrix":[2,4], "x":4.5, "y":2.25}, + {"matrix":[2,5], "x":5.5, "y":2.25}, + {"matrix":[2,6], "x":6.5, "y":2.25}, + {"matrix":[2,7], "x":7.5, "y":2.25}, + {"matrix":[2,8], "x":8.5, "y":2.25}, + {"matrix":[2,9], "x":9.5, "y":2.25}, + {"matrix":[2,10], "x":10.5, "y":2.25}, + {"matrix":[2,11], "x":11.5, "y":2.25}, + {"matrix":[2,12], "x":12.5, "y":2.25}, + {"matrix":[2,13], "x":13.5, "y":2.25, "w":1.5}, + {"matrix":[2,14], "x":15.25, "y":2.25}, + {"matrix":[2,15], "x":16.25, "y":2.25}, + {"matrix":[2,16], "x":17.25, "y":2.25}, + + {"matrix":[3,0], "x":0, "y":3.25, "w":1.75}, + {"matrix":[3,1], "x":1.75, "y":3.25}, + {"matrix":[3,2], "x":2.75, "y":3.25}, + {"matrix":[3,3], "x":3.75, "y":3.25}, + {"matrix":[3,4], "x":4.75, "y":3.25}, + {"matrix":[3,5], "x":5.75, "y":3.25}, + {"matrix":[3,6], "x":6.75, "y":3.25}, + {"matrix":[3,7], "x":7.75, "y":3.25}, + {"matrix":[3,8], "x":8.75, "y":3.25}, + {"matrix":[3,9], "x":9.75, "y":3.25}, + {"matrix":[3,10], "x":10.75, "y":3.25}, + {"matrix":[3,11], "x":11.75, "y":3.25}, + {"matrix":[3,13], "x":12.75, "y":3.25, "w":2.25}, + + {"matrix":[4,0], "x":0, "y":4.25, "w":2.25}, + {"matrix":[4,2], "x":2.25, "y":4.25}, + {"matrix":[4,3], "x":3.25, "y":4.25}, + {"matrix":[4,4], "x":4.25, "y":4.25}, + {"matrix":[4,5], "x":5.25, "y":4.25}, + {"matrix":[4,6], "x":6.25, "y":4.25}, + {"matrix":[4,7], "x":7.25, "y":4.25}, + {"matrix":[4,8], "x":8.25, "y":4.25}, + {"matrix":[4,9], "x":9.25, "y":4.25}, + {"matrix":[4,10], "x":10.25, "y":4.25}, + {"matrix":[4,11], "x":11.25, "y":4.25}, + {"matrix":[4,13], "x":12.25, "y":4.25, "w":2.75}, + {"matrix":[4,15], "x":16.25, "y":4.25}, + + {"matrix":[5,0], "x":0, "y":5.25, "w":1.25}, + {"matrix":[5,1], "x":1.25, "y":5.25, "w":1.25}, + {"matrix":[5,2], "x":2.5, "y":5.25, "w":1.25}, + {"matrix":[5,6], "x":3.75, "y":5.25, "w":6.25}, + {"matrix":[5,10], "x":10, "y":5.25, "w":1.25}, + {"matrix":[5,11], "x":11.25, "y":5.25, "w":1.25}, + {"matrix":[5,12], "x":12.5, "y":5.25, "w":1.25}, + {"matrix":[5,13], "x":13.75, "y":5.25, "w":1.25}, + {"matrix":[5,14], "x":15.25, "y":5.25}, + {"matrix":[5,15], "x":16.25, "y":5.25}, + {"matrix":[5,16], "x":17.25, "y":5.25} + ] + }, + "LAYOUT_tkl_iso": { + "layout": [ + {"matrix":[0,0], "x":0, "y":0}, + {"matrix":[0,1], "x":2, "y":0}, + {"matrix":[0,2], "x":3, "y":0}, + {"matrix":[0,3], "x":4, "y":0}, + {"matrix":[0,4], "x":5, "y":0}, + {"matrix":[0,5], "x":6.5, "y":0}, + {"matrix":[0,6], "x":7.5, "y":0}, + {"matrix":[0,7], "x":8.5, "y":0}, + {"matrix":[0,8], "x":9.5, "y":0}, + {"matrix":[0,9], "x":11, "y":0}, + {"matrix":[0,10], "x":12, "y":0}, + {"matrix":[0,11], "x":13, "y":0}, + {"matrix":[0,12], "x":14, "y":0}, + {"matrix":[0,14], "x":15.25, "y":0}, + {"matrix":[0,15], "x":16.25, "y":0}, + {"matrix":[0,16], "x":17.25, "y":0}, + + {"matrix":[1,0], "x":0, "y":1.25}, + {"matrix":[1,1], "x":1, "y":1.25}, + {"matrix":[1,2], "x":2, "y":1.25}, + {"matrix":[1,3], "x":3, "y":1.25}, + {"matrix":[1,4], "x":4, "y":1.25}, + {"matrix":[1,5], "x":5, "y":1.25}, + {"matrix":[1,6], "x":6, "y":1.25}, + {"matrix":[1,7], "x":7, "y":1.25}, + {"matrix":[1,8], "x":8, "y":1.25}, + {"matrix":[1,9], "x":9, "y":1.25}, + {"matrix":[1,10], "x":10, "y":1.25}, + {"matrix":[1,11], "x":11, "y":1.25}, + {"matrix":[1,12], "x":12, "y":1.25}, + {"matrix":[1,13], "x":13, "y":1.25, "w":2}, + {"matrix":[1,14], "x":15.25, "y":1.25}, + {"matrix":[1,15], "x":16.25, "y":1.25}, + {"matrix":[1,16], "x":17.25, "y":1.25}, + + {"matrix":[2,0], "x":0, "y":2.25, "w":1.5}, + {"matrix":[2,1], "x":1.5, "y":2.25}, + {"matrix":[2,2], "x":2.5, "y":2.25}, + {"matrix":[2,3], "x":3.5, "y":2.25}, + {"matrix":[2,4], "x":4.5, "y":2.25}, + {"matrix":[2,5], "x":5.5, "y":2.25}, + {"matrix":[2,6], "x":6.5, "y":2.25}, + {"matrix":[2,7], "x":7.5, "y":2.25}, + {"matrix":[2,8], "x":8.5, "y":2.25}, + {"matrix":[2,9], "x":9.5, "y":2.25}, + {"matrix":[2,10], "x":10.5, "y":2.25}, + {"matrix":[2,11], "x":11.5, "y":2.25}, + {"matrix":[2,12], "x":12.5, "y":2.25}, + {"matrix":[2,14], "x":15.25, "y":2.25}, + {"matrix":[2,15], "x":16.25, "y":2.25}, + {"matrix":[2,16], "x":17.25, "y":2.25}, + + {"matrix":[3,0], "x":0, "y":3.25, "w":1.75}, + {"matrix":[3,1], "x":1.75, "y":3.25}, + {"matrix":[3,2], "x":2.75, "y":3.25}, + {"matrix":[3,3], "x":3.75, "y":3.25}, + {"matrix":[3,4], "x":4.75, "y":3.25}, + {"matrix":[3,5], "x":5.75, "y":3.25}, + {"matrix":[3,6], "x":6.75, "y":3.25}, + {"matrix":[3,7], "x":7.75, "y":3.25}, + {"matrix":[3,8], "x":8.75, "y":3.25}, + {"matrix":[3,9], "x":9.75, "y":3.25}, + {"matrix":[3,10], "x":10.75, "y":3.25}, + {"matrix":[3,11], "x":11.75, "y":3.25}, + {"matrix":[2,13], "x":12.75, "y":3.25}, + {"matrix":[3,13], "x":13.75, "y":2.25,"w":1.25,"h":2}, + + {"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}, + {"matrix":[4,3], "x":3.25, "y":4.25}, + {"matrix":[4,4], "x":4.25, "y":4.25}, + {"matrix":[4,5], "x":5.25, "y":4.25}, + {"matrix":[4,6], "x":6.25, "y":4.25}, + {"matrix":[4,7], "x":7.25, "y":4.25}, + {"matrix":[4,8], "x":8.25, "y":4.25}, + {"matrix":[4,9], "x":9.25, "y":4.25}, + {"matrix":[4,10], "x":10.25, "y":4.25}, + {"matrix":[4,11], "x":11.25, "y":4.25}, + {"matrix":[4,13], "x":12.25, "y":4.25, "w":2.75}, + {"matrix":[4,15], "x":16.25, "y":4.25}, + + {"matrix":[5,0], "x":0, "y":5.25, "w":1.25}, + {"matrix":[5,1], "x":1.25, "y":5.25, "w":1.25}, + {"matrix":[5,2], "x":2.5, "y":5.25, "w":1.25}, + {"matrix":[5,6], "x":3.75, "y":5.25, "w":6.25}, + {"matrix":[5,10], "x":10, "y":5.25, "w":1.25}, + {"matrix":[5,11], "x":11.25, "y":5.25, "w":1.25}, + {"matrix":[5,12], "x":12.5, "y":5.25, "w":1.25}, + {"matrix":[5,13], "x":13.75, "y":5.25, "w":1.25}, + {"matrix":[5,14], "x":15.25, "y":5.25}, + {"matrix":[5,15], "x":16.25, "y":5.25}, + {"matrix":[5,16], "x":17.25, "y":5.25} + ] + } + } +} diff --git a/keyboards/keychron/x1_v2/iso/red/config.h b/keyboards/keychron/x1_v2/iso/red/config.h new file mode 100644 index 0000000000..8f4ac72325 --- /dev/null +++ b/keyboards/keychron/x1_v2/iso/red/config.h @@ -0,0 +1,41 @@ +/* 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 . + */ + +#pragma once + +#ifdef LED_MATRIX_ENABLE +/* RGB Matrix Driver Configuration */ +# define DRIVER_COUNT 1 +# define DRIVER_ADDR_1 0b1110100 + +/* RGB Matrix Configuration */ +# define LED_MATRIX_LED_COUNT 88 + +/* Scan phase of led driver set as MSKPHASE_9CHANNEL(defined as 0x03 in CKLED2001.h) */ +# define PHASE_CHANNEL MSKPHASE_9CHANNEL +# define CKLED2001_CURRENT_TUNE \ + { 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60 } + +/* turn off effects when suspended */ +# define LED_DISABLE_WHEN_USB_SUSPENDED + +// LED Matrix Animation modes. Explicitly enabled +// For full list of effects, see: +// https://docs.qmk.fm/#/feature_led_matrix?id=led-matrix-effects +// #if defined(LED_MATRIX_KEYPRESSES) || defined(LED_MATRIX_KEYRELEASES) +# define LED_MATRIX_KEYPRESSES +# define LED_MATRIX_KEYRELEASES +#endif diff --git a/keyboards/keychron/x1_v2/iso/red/info.json b/keyboards/keychron/x1_v2/iso/red/info.json new file mode 100644 index 0000000000..b672dfcdc9 --- /dev/null +++ b/keyboards/keychron/x1_v2/iso/red/info.json @@ -0,0 +1,126 @@ +{ + "usb": { + "pid": "0x0211", + "device_version": "1.0.0" + }, + "features": { + "led_matrix": true + }, + "led_matrix": { + "driver": "ckled2001", + "animations": { + "none": true, + "solid": true, + "breathing": true, + "band_pinwheel": true, + "band_spiral": true, + "cycle_left_right": true, + "cycle_up_down": true, + "cycle_out_in": true, + "dual_beacon": true, + "solid_reactive_simple": true, + "solid_reactive_multiwide": true, + "solid_reactive_multinexus": true, + "solid_splash": true, + "wave_left_right": true, + "wave_up_down": true, + "effect_max": true + }, + "layout": [ + {"matrix":[0, 0], "flags":1, "x":0, "y":0}, + {"matrix":[0, 1], "flags":1, "x":26, "y":0}, + {"matrix":[0, 2], "flags":1, "x":39, "y":0}, + {"matrix":[0, 3], "flags":1, "x":52, "y":0}, + {"matrix":[0, 4], "flags":1, "x":65, "y":0}, + {"matrix":[0, 5], "flags":1, "x":85, "y":0}, + {"matrix":[0, 6], "flags":1, "x":98, "y":0}, + {"matrix":[0, 7], "flags":1, "x":111, "y":0}, + {"matrix":[0, 8], "flags":1, "x":124, "y":0}, + {"matrix":[0, 9], "flags":1, "x":143, "y":0}, + {"matrix":[0, 10], "flags":1, "x":156, "y":0}, + {"matrix":[0, 11], "flags":1, "x":169, "y":0}, + {"matrix":[0, 12], "flags":1, "x":182, "y":0}, + {"matrix":[0, 14], "flags":1, "x":198, "y":0}, + {"matrix":[0, 15], "flags":1, "x":211, "y":0}, + {"matrix":[0, 16], "flags":1, "x":224, "y":0}, + + {"matrix":[1, 0], "flags":1, "x":0, "y":15}, + {"matrix":[1, 1], "flags":4, "x":15, "y":15}, + {"matrix":[1, 2], "flags":4, "x":26, "y":15}, + {"matrix":[1, 3], "flags":4, "x":39, "y":15}, + {"matrix":[1, 4], "flags":4, "x":52, "y":15}, + {"matrix":[1, 5], "flags":4, "x":65, "y":15}, + {"matrix":[1, 6], "flags":4, "x":78, "y":15}, + {"matrix":[1, 7], "flags":4, "x":91, "y":15}, + {"matrix":[1, 8], "flags":4, "x":104, "y":15}, + {"matrix":[1, 9], "flags":4, "x":117, "y":15}, + {"matrix":[1, 10], "flags":4, "x":130, "y":15}, + {"matrix":[1, 11], "flags":4, "x":143, "y":15}, + {"matrix":[1, 12], "flags":4, "x":156, "y":15}, + {"matrix":[1, 13], "flags":1, "x":176, "y":15}, + {"matrix":[1, 14], "flags":1, "x":198, "y":15}, + {"matrix":[1, 15], "flags":1, "x":211, "y":15}, + {"matrix":[1, 16], "flags":1, "x":224, "y":15}, + + {"matrix":[2, 0], "flags":1, "x":3, "y":27}, + {"matrix":[2, 1], "flags":4, "x":20, "y":27}, + {"matrix":[2, 2], "flags":4, "x":33, "y":27}, + {"matrix":[2, 3], "flags":4, "x":46, "y":27}, + {"matrix":[2, 4], "flags":4, "x":59, "y":27}, + {"matrix":[2, 5], "flags":4, "x":72, "y":27}, + {"matrix":[2, 6], "flags":4, "x":85, "y":27}, + {"matrix":[2, 7], "flags":4, "x":98, "y":27}, + {"matrix":[2, 8], "flags":4, "x":111, "y":27}, + {"matrix":[2, 9], "flags":4, "x":124, "y":27}, + {"matrix":[2, 10], "flags":4, "x":137, "y":27}, + {"matrix":[2, 11], "flags":4, "x":150, "y":27}, + {"matrix":[2, 12], "flags":4, "x":163, "y":27}, + //{"matrix":[2, 13], "flags":1, "x":179, "y":27}, + {"matrix":[2, 14], "flags":1, "x":198, "y":27}, + {"matrix":[2, 15], "flags":1, "x":211, "y":27}, + {"matrix":[2, 16], "flags":1, "x":224, "y":27}, + + {"matrix":[3, 0], "flags":8, "x":5, "y":39}, + {"matrix":[3, 1], "flags":4, "x":23, "y":39}, + {"matrix":[3, 2], "flags":4, "x":36, "y":39}, + {"matrix":[3, 3], "flags":4, "x":49, "y":39}, + {"matrix":[3, 4], "flags":4, "x":62, "y":39}, + {"matrix":[3, 5], "flags":4, "x":75, "y":39}, + {"matrix":[3, 6], "flags":4, "x":88, "y":39}, + {"matrix":[3, 7], "flags":4, "x":101, "y":39}, + {"matrix":[3, 8], "flags":4, "x":114, "y":39}, + {"matrix":[3, 9], "flags":4, "x":127, "y":39}, + {"matrix":[3, 10], "flags":4, "x":140, "y":39}, + {"matrix":[3, 11], "flags":4, "x":153, "y":39}, + {"matrix":[2, 13], "flags":1, "x":167, "y":39},// + {"matrix":[3, 13], "flags":1, "x":182, "y":34},// + + {"matrix":[4, 0], "flags":1, "x":1, "y":52}, + {"matrix":[4, 1], "flags":1, "x":15, "y":52}, + {"matrix":[4, 2], "flags":4, "x":29, "y":52}, + {"matrix":[4, 3], "flags":4, "x":42, "y":52}, + {"matrix":[4, 4], "flags":4, "x":55, "y":52}, + {"matrix":[4, 5], "flags":4, "x":68, "y":52}, + {"matrix":[4, 6], "flags":4, "x":82, "y":52}, + {"matrix":[4, 7], "flags":4, "x":95, "y":52}, + {"matrix":[4, 8], "flags":4, "x":108, "y":52}, + {"matrix":[4, 9], "flags":4, "x":121, "y":52}, + {"matrix":[4, 10], "flags":4, "x":134, "y":52}, + {"matrix":[4, 11], "flags":4, "x":147, "y":52}, + {"matrix":[4, 13], "flags":1, "x":171, "y":52}, + {"matrix":[4, 15], "flags":1, "x":211, "y":52}, + + {"matrix":[5, 0], "flags":1, "x":2, "y":64}, + {"matrix":[5, 1], "flags":1, "x":18, "y":64}, + {"matrix":[5, 2], "flags":1, "x":34, "y":64}, + {"matrix":[5, 6], "flags":4, "x":83, "y":64}, + {"matrix":[5, 10], "flags":1, "x":132, "y":64}, + {"matrix":[5, 11], "flags":1, "x":148, "y":64}, + {"matrix":[5, 12], "flags":1, "x":165, "y":64}, + {"matrix":[5, 13], "flags":1, "x":181, "y":64}, + {"matrix":[5, 14], "flags":1, "x":198, "y":64}, + {"matrix":[5, 15], "flags":1, "x":211, "y":64}, + {"matrix":[5, 16], "flags":1, "x":224, "y":64} + ] + } +} diff --git a/keyboards/keychron/x1_v2/iso/red/keymaps/default/keymap.c b/keyboards/keychron/x1_v2/iso/red/keymaps/default/keymap.c new file mode 100644 index 0000000000..778869ec02 --- /dev/null +++ b/keyboards/keychron/x1_v2/iso/red/keymaps/default/keymap.c @@ -0,0 +1,61 @@ +/* Copyright 2023 @ Keychron (https://www.keychron.com) + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#include QMK_KEYBOARD_H + +enum layers{ + WIN_BASE, + WIN_FN, + WIN_L2, + WIN_L3, +}; + +#define KC_TASK LGUI(KC_TAB) +#define KC_FLXP LGUI(KC_E) + +// clang-format off +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + [WIN_BASE] = LAYOUT_tkl_iso( + KC_ESC, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_PSCR, KC_SCRL, KC_PAUS, + KC_GRV, 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_INS, KC_HOME, KC_PGUP, + 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_END, KC_PGDN, + 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_LSFT, KC_NUBS, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_UP, + KC_LCTL, KC_LWIN, KC_LALT, KC_SPC, KC_RALT, MO(WIN_FN), KC_APP, KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT), + + [WIN_FN] = LAYOUT_tkl_iso( + _______, KC_BRID, KC_BRIU, KC_TASK, KC_FLXP, BL_DOWN, BL_UP, KC_MPRV, KC_MPLY, KC_MNXT, KC_MUTE, KC_VOLD, KC_VOLU, KC_PSCR, _______, BL_STEP, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + BL_TOGG, BL_STEP, BL_UP, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, BL_DOWN, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, NK_TOGG, _______, _______, _______, _______, _______, _______, + _______, GU_TOGG, _______, _______, _______, _______, _______, _______, _______, _______, _______), + + [WIN_L2] = LAYOUT_tkl_iso( + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______), + [WIN_L3] = LAYOUT_tkl_iso( + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______), +}; diff --git a/keyboards/keychron/x1_v2/iso/red/keymaps/keychron/keymap.c b/keyboards/keychron/x1_v2/iso/red/keymaps/keychron/keymap.c new file mode 100644 index 0000000000..96d7c18b8f --- /dev/null +++ b/keyboards/keychron/x1_v2/iso/red/keymaps/keychron/keymap.c @@ -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 . + */ + +#include QMK_KEYBOARD_H +#include "keychron_common.h" +#include "keychron_ft_common.h" + +enum layers { + WIN_BASE, + WIN_FN, + WIN_L2, + WIN_L3, +}; + +// clang-format off +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + [WIN_BASE] = LAYOUT_tkl_iso( + KC_ESC, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_PSCR, KC_SCRL, KC_PAUS, + KC_GRV, 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_INS, KC_HOME, KC_PGUP, + 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_END, KC_PGDN, + 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_LSFT, KC_NUBS, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_UP, + KC_LCTL, KC_LWIN, KC_LALT, KC_SPC, KC_RALT, MO(WIN_FN), KC_APP, KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT), + + [WIN_FN] = LAYOUT_tkl_iso( + _______, KC_BRID, KC_BRIU, KC_TASK, KC_FLXP, BL_DOWN, BL_UP, KC_MPRV, KC_MPLY, KC_MNXT, KC_MUTE, KC_VOLD, KC_VOLU, KC_PSCR, _______, BL_STEP, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + BL_TOGG, BL_STEP, BL_UP, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, BL_DOWN, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, NK_TOGG, _______, _______, _______, _______, _______, _______, + _______, GU_TOGG, _______, _______, _______, _______, _______, _______, _______, _______, _______), + + [WIN_L2] = LAYOUT_tkl_iso( + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______), + [WIN_L3] = LAYOUT_tkl_iso( + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______), +}; + +// clang-format on + +void housekeeping_task_user(void) { + housekeeping_task_keychron(); + housekeeping_task_keychron_ft(); +} + +bool process_record_user(uint16_t keycode, keyrecord_t *record) { + if (!process_record_keychron(keycode, record)) { + return false; + } + if (!process_record_keychron_ft(keycode, record)) { + return false; + } + return true; +} diff --git a/keyboards/keychron/x1_v2/iso/red/keymaps/keychron/rules.mk b/keyboards/keychron/x1_v2/iso/red/keymaps/keychron/rules.mk new file mode 100644 index 0000000000..3c9fcc5c98 --- /dev/null +++ b/keyboards/keychron/x1_v2/iso/red/keymaps/keychron/rules.mk @@ -0,0 +1,3 @@ +VIA_ENABLE = yes + +include keyboards/keychron/common/common.mk diff --git a/keyboards/keychron/x1_v2/iso/red/keymaps/via/keymap.c b/keyboards/keychron/x1_v2/iso/red/keymaps/via/keymap.c new file mode 100644 index 0000000000..31f4e949d2 --- /dev/null +++ b/keyboards/keychron/x1_v2/iso/red/keymaps/via/keymap.c @@ -0,0 +1,61 @@ +/* Copyright 2023 @ Keychron (https://www.keychron.com) + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#include QMK_KEYBOARD_H + +enum layers { + WIN_BASE, + WIN_FN, + WIN_L2, + WIN_L3, +}; + +#define KC_TASK LGUI(KC_TAB) +#define KC_FLXP LGUI(KC_E) + +// clang-format off +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + [WIN_BASE] = LAYOUT_tkl_iso( + KC_ESC, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_PSCR, KC_SCRL, KC_PAUS, + KC_GRV, 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_INS, KC_HOME, KC_PGUP, + 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_END, KC_PGDN, + 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_LSFT, KC_NUBS, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_UP, + KC_LCTL, KC_LWIN, KC_LALT, KC_SPC, KC_RALT, MO(WIN_FN), KC_APP, KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT), + + [WIN_FN] = LAYOUT_tkl_iso( + _______, KC_BRID, KC_BRIU, KC_TASK, KC_FLXP, BL_DOWN, BL_UP, KC_MPRV, KC_MPLY, KC_MNXT, KC_MUTE, KC_VOLD, KC_VOLU, KC_PSCR, _______, BL_STEP, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + BL_TOGG, BL_STEP, BL_UP, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, BL_DOWN, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, NK_TOGG, _______, _______, _______, _______, _______, _______, + _______, GU_TOGG, _______, _______, _______, _______, _______, _______, _______, _______, _______), + + [WIN_L2] = LAYOUT_tkl_iso( + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______), + [WIN_L3] = LAYOUT_tkl_iso( + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______), +}; \ No newline at end of file diff --git a/keyboards/keychron/x1_v2/iso/red/keymaps/via/rules.mk b/keyboards/keychron/x1_v2/iso/red/keymaps/via/rules.mk new file mode 100644 index 0000000000..1e5b99807c --- /dev/null +++ b/keyboards/keychron/x1_v2/iso/red/keymaps/via/rules.mk @@ -0,0 +1 @@ +VIA_ENABLE = yes diff --git a/keyboards/keychron/x1_v2/iso/red/red.c b/keyboards/keychron/x1_v2/iso/red/red.c new file mode 100644 index 0000000000..89e6746f71 --- /dev/null +++ b/keyboards/keychron/x1_v2/iso/red/red.c @@ -0,0 +1,122 @@ +/* Copyright 2023 @ Keychron (https://www.keychron.com) + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#include "quantum.h" + +#ifdef LED_MATRIX_ENABLE +// clang-format off +const ckled2001_led PROGMEM g_ckled2001_leds[LED_MATRIX_LED_COUNT] = { +/* Refer to CKLED2001 manual for these locations + * driver + * | LED address + * | | */ + {0, A_16}, + {0, A_15}, + {0, A_14}, + {0, A_13}, + {0, A_12}, + {0, A_11}, + {0, A_10}, + {0, A_9 }, + {0, A_8 }, + {0, A_7 }, + {0, A_6 }, + {0, A_5 }, + {0, A_4 }, + {0, A_2 }, + {0, A_1 }, + {0, G_1 }, + + {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, B_2 }, + {0, B_1 }, + {0, H_1 }, + + {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, C_2 }, + {0, C_1 }, + {0, G_6 }, + + {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, C_3 },// + {0, D_3 }, + + {0, E_16}, + {0, E_15}, + {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, E_1 }, + + {0, F_16}, + {0, F_15}, + {0, F_14}, + {0, F_10}, + {0, F_6 }, + {0, F_5 }, + {0, F_4 }, + {0, F_3 }, + {0, F_2 }, + {0, F_1 }, + {0, G_13}, +}; +#endif diff --git a/keyboards/keychron/x1_v2/iso/red/rules.mk b/keyboards/keychron/x1_v2/iso/red/rules.mk new file mode 100644 index 0000000000..72b4057010 --- /dev/null +++ b/keyboards/keychron/x1_v2/iso/red/rules.mk @@ -0,0 +1,2 @@ +# This file intentionally left blank +EEPROM_DRIVER = i2c \ No newline at end of file diff --git a/keyboards/keychron/x1_v2/mcuconf.h b/keyboards/keychron/x1_v2/mcuconf.h new file mode 100644 index 0000000000..d9abfaf799 --- /dev/null +++ b/keyboards/keychron/x1_v2/mcuconf.h @@ -0,0 +1,53 @@ +/* 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 . + */ + +#pragma once + +#include_next + +#undef STM32_HSECLK +#define STM32_HSECLK 16000000U + +#undef STM32_PLLM_VALUE +#define STM32_PLLM_VALUE 8 +#undef STM32_PLLN_VALUE +#define STM32_PLLN_VALUE 168 +#undef STM32_PLLP_VALUE +#define STM32_PLLP_VALUE 4 +#undef STM32_PLLQ_VALUE +#define STM32_PLLQ_VALUE 7 + +/* +#undef STM32_PLLDIV_VALUE +#define STM32_PLLDIV_VALUE 2 +#undef STM32_PLLMUL_VALUE +#define STM32_PLLMUL_VALUE 16 +#undef STM32_USBPRE +#define STM32_USBPRE STM32_USBPRE_DIV1P5 +*/ + +#undef WB32_PLLDIV_VALUE +#define WB32_PLLDIV_VALUE 2 + +#undef WB32_PLLMUL_VALUE +#define WB32_PLLMUL_VALUE 16 + +#undef WB32_USBPRE +#define WB32_USBPRE WB32_USBPRE_DIV2 + + +#undef WB32_I2C_USE_I2C1 +#define WB32_I2C_USE_I2C1 TRUE diff --git a/keyboards/keychron/x1_v2/readme.md b/keyboards/keychron/x1_v2/readme.md new file mode 100644 index 0000000000..2dc1ce1c56 --- /dev/null +++ b/keyboards/keychron/x1_v2/readme.md @@ -0,0 +1,26 @@ +# Lemokey X1 + +![Lemokey X1]() + +A customizable 80% TKL keyboard. + +* Keyboard Maintainer: [Keychron](https://github.com/keychron) +* Hardware Supported: Lemokey X1 +* Hardware Availability: [Keychron](https://www.keychron.com) + +Make example for this keyboard (after setting up your build environment): + + make keychron/x1/ansi/red:default + +Flashing example for this keyboard: + + make keychron/x1/ansi/red:default:flash + +## bootloader + +Enter the bootloader in two ways: + +* **Bootmagic reset**: Hold down the key located at *K00*, commonly programmed as *Esc* while plugging in the keyboard. +* **Physical reset button**: Briefly press the RESET button under the spacebar. + +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). diff --git a/keyboards/keychron/x1_v2/via_json/x1_pro_ansi_red.json b/keyboards/keychron/x1_v2/via_json/x1_pro_ansi_red.json new file mode 100644 index 0000000000..13b3d7bf77 --- /dev/null +++ b/keyboards/keychron/x1_v2/via_json/x1_pro_ansi_red.json @@ -0,0 +1,224 @@ +{ + "name": "Lemokey X1 ANSI Red", + "vendorId": "0x362D", + "productId": "0x0210", + "keycodes": ["qmk_lighting"], + "customKeycodes": [ + {"name": "Mission Control","title": "Mission Control in macOS","shortName": "MCtrl"}, + {"name": "Launch Pad","title": "Launch Pad in macOS","shortName": "LPad"}, + {"name": "Left Option","title": "Left Option in macOS","shortName": "LOpt"}, + {"name": "Right Option","title": "Right Option in macOS","shortName": "ROpt"}, + {"name": "Left Cmd","title": "Left Command in macOS","shortName": "LCmd"}, + {"name": "Right Cmd","title": "Right Command in macOS","shortName": "RCmd"}, + {"name": "Siri","title": "Siri in macOS","shortName": "Siri"}, + {"name": "Task View","title": "Task View in windows","shortName": "Task"}, + {"name": "File Explorer","title": "File Explorer in windows","shortName": "File"}, + {"name": "Screen Shot","title": "Screenshot in macOS","shortName": "SShot"}, + {"name": "Cortana","title": "Cortana in windows","shortName": "Cortana"} + ], + "matrix": {"rows": 6, "cols": 17}, + "layouts": { + "keymap": [ + [ + { + "c": "#777777" + }, + "0,0", + { + "x": 1, + "c": "#cccccc" + }, + "0,1", + "0,2", + "0,3", + "0,4", + { + "x": 0.5, + "c": "#aaaaaa" + }, + "0,5", + "0,6", + "0,7", + "0,8", + { + "x": 0.5, + "c": "#cccccc" + }, + "0,9", + "0,10", + "0,11", + "0,12", + { + "x": 0.25, + "c": "#aaaaaa" + }, + "0,14", + "0,15", + "0,16" + ], + [ + { + "y": 0.25 + }, + "1,0", + { + "c": "#cccccc" + }, + "1,1", + "1,2", + "1,3", + "1,4", + "1,5", + "1,6", + "1,7", + "1,8", + "1,9", + "1,10", + "1,11", + "1,12", + { + "c": "#aaaaaa", + "w": 2 + }, + "1,13", + { + "x": 0.25 + }, + "1,14", + "1,15", + "1,16" + ], + [ + { + "w": 1.5 + }, + "2,0", + { + "c": "#cccccc" + }, + "2,1", + "2,2", + "2,3", + "2,4", + "2,5", + "2,6", + "2,7", + "2,8", + "2,9", + "2,10", + "2,11", + "2,12", + { + "c": "#aaaaaa", + "w": 1.5 + }, + "2,13", + { + "x": 0.25 + }, + "2,14", + "2,15", + "2,16" + ], + [ + { + "w": 1.75 + }, + "3,0", + { + "c": "#cccccc" + }, + "3,1", + "3,2", + "3,3", + "3,4", + "3,5", + "3,6", + "3,7", + "3,8", + "3,9", + "3,10", + "3,11", + { + "c": "#777777", + "w": 2.25 + }, + "3,13" + ], + [ + { + "c": "#aaaaaa", + "w": 2.25 + }, + "4,0", + { + "c": "#cccccc" + }, + "4,2", + "4,3", + "4,4", + "4,5", + "4,6", + "4,7", + "4,8", + "4,9", + "4,10", + "4,11", + { + "c": "#aaaaaa", + "w": 2.75 + }, + "4,13", + { + "x": 1.25, + "c": "#777777" + }, + "4,15" + ], + [ + { + "c": "#aaaaaa", + "w": 1.25 + }, + "5,0", + { + "w": 1.25 + }, + "5,1", + { + "w": 1.25 + }, + "5,2", + { + "c": "#cccccc", + "w": 6.25 + }, + "5,6", + { + "c": "#aaaaaa", + "w": 1.25 + }, + "5,10", + { + "w": 1.25 + }, + "5,11", + { + "w": 1.25 + }, + "5,12", + { + "w": 1.25 + }, + "5,13", + { + "x": 0.25, + "c": "#777777" + }, + "5,14", + "5,15", + "5,16" + ] + ] + } +} diff --git a/keyboards/keychron/x1_v2/via_json/x1_pro_iso_red.json b/keyboards/keychron/x1_v2/via_json/x1_pro_iso_red.json new file mode 100644 index 0000000000..bcdb3157ba --- /dev/null +++ b/keyboards/keychron/x1_v2/via_json/x1_pro_iso_red.json @@ -0,0 +1,229 @@ +{ + "name": "Lemokey X1 ISO Red", + "vendorId": "0x362D", + "productId": "0x0211", + "keycodes": ["qmk_lighting"], + "customKeycodes": [ + {"name": "Mission Control","title": "Mission Control in macOS","shortName": "MCtrl"}, + {"name": "Launch Pad","title": "Launch Pad in macOS","shortName": "LPad"}, + {"name": "Left Option","title": "Left Option in macOS","shortName": "LOpt"}, + {"name": "Right Option","title": "Right Option in macOS","shortName": "ROpt"}, + {"name": "Left Cmd","title": "Left Command in macOS","shortName": "LCmd"}, + {"name": "Right Cmd","title": "Right Command in macOS","shortName": "RCmd"}, + {"name": "Siri","title": "Siri in macOS","shortName": "Siri"}, + {"name": "Task View","title": "Task View in windows","shortName": "Task"}, + {"name": "File Explorer","title": "File Explorer in windows","shortName": "File"}, + {"name": "Screen Shot","title": "Screenshot in macOS","shortName": "SShot"}, + {"name": "Cortana","title": "Cortana in windows","shortName": "Cortana"} + ], + "matrix": {"rows": 6, "cols": 17}, + "layouts": { + "keymap": [ + [ + { + "c": "#777777" + }, + "0,0", + { + "x": 1, + "c": "#cccccc" + }, + "0,1", + "0,2", + "0,3", + "0,4", + { + "x": 0.5, + "c": "#aaaaaa" + }, + "0,5", + "0,6", + "0,7", + "0,8", + { + "x": 0.5, + "c": "#cccccc" + }, + "0,9", + "0,10", + "0,11", + "0,12", + { + "x": 0.25, + "c": "#aaaaaa" + }, + "0,14", + "0,15", + "0,16" + ], + [ + { + "y": 0.25 + }, + "1,0", + { + "c": "#cccccc" + }, + "1,1", + "1,2", + "1,3", + "1,4", + "1,5", + "1,6", + "1,7", + "1,8", + "1,9", + "1,10", + "1,11", + "1,12", + { + "c": "#aaaaaa", + "w": 2 + }, + "1,13", + { + "x": 0.25 + }, + "1,14", + "1,15", + "1,16" + ], + [ + { + "w": 1.5 + }, + "2,0", + { + "c": "#cccccc" + }, + "2,1", + "2,2", + "2,3", + "2,4", + "2,5", + "2,6", + "2,7", + "2,8", + "2,9", + "2,10", + "2,11", + "2,12", + { + "x": 0.25, + "c": "#777777", + "w": 1.25, + "h": 2, + "w2": 1.5, + "h2": 1, + "x2": -0.25 + }, + "3,13", + { + "x": 0.25, + "c": "#aaaaaa" + }, + "2,14", + "2,15", + "2,16" + ], + [ + { + "w": 1.75 + }, + "3,0", + { + "c": "#cccccc" + }, + "3,1", + "3,2", + "3,3", + "3,4", + "3,5", + "3,6", + "3,7", + "3,8", + "3,9", + "3,10", + "3,11", + { + "c": "#aaaaaa" + }, + "2,13" + ], + [ + { + "w": 1.25 + }, + "4,0", + "4,1", + { + "c": "#cccccc" + }, + "4,2", + "4,3", + "4,4", + "4,5", + "4,6", + "4,7", + "4,8", + "4,9", + "4,10", + "4,11", + { + "c": "#aaaaaa", + "w": 2.75 + }, + "4,13", + { + "x": 1.25, + "c": "#777777" + }, + "4,15" + ], + [ + { + "c": "#aaaaaa", + "w": 1.25 + }, + "5,0", + { + "w": 1.25 + }, + "5,1", + { + "w": 1.25 + }, + "5,2", + { + "c": "#cccccc", + "w": 6.25 + }, + "5,6", + { + "c": "#aaaaaa", + "w": 1.25 + }, + "5,10", + { + "w": 1.25 + }, + "5,11", + { + "w": 1.25 + }, + "5,12", + { + "w": 1.25 + }, + "5,13", + { + "x": 0.25, + "c": "#777777" + }, + "5,14", + "5,15", + "5,16" + ] + ] + } +} diff --git a/keyboards/keychron/x1_v2/x1_v2--01.rar b/keyboards/keychron/x1_v2/x1_v2--01.rar new file mode 100644 index 0000000000000000000000000000000000000000..c7aea7daea0dff90737741efd9a68480026b48a6 GIT binary patch literal 19642 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 literal 0 HcmV?d00001 diff --git a/keyboards/keychron/x1_v2/x1_v2-20231123.rar b/keyboards/keychron/x1_v2/x1_v2-20231123.rar new file mode 100644 index 0000000000000000000000000000000000000000..5633d7c4cd891656171264411847ce428a5642a0 GIT binary patch literal 19705 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 HfH?jEF}6K= literal 0 HcmV?d00001 diff --git a/keyboards/keychron/x1_v2/x1_v2.c b/keyboards/keychron/x1_v2/x1_v2.c new file mode 100644 index 0000000000..a78270d14b --- /dev/null +++ b/keyboards/keychron/x1_v2/x1_v2.c @@ -0,0 +1,86 @@ +/* Copyright 2023 @ Keychron (https://www.keychron.com) + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#include "quantum.h" + +static uint8_t win_lock_state = 0; + +#define SET_LED_WIN_LOCK_ON writePin(LED_WIN_LOCK_PIN, LED_WIN_LOCK_PIN_ON_STATE) +#define SET_LED_WIN_LOCK_OFF writePin(LED_WIN_LOCK_PIN, !LED_WIN_LOCK_PIN_ON_STATE) + +void keyboard_post_init_user(void) { + // Customise these values to desired behaviour + debug_enable=true; + debug_matrix=true; + //debug_keyboard=true; + //debug_mouse=true; +} + +static void set_led_win_lock_state(void) { + if (win_lock_state) { + SET_LED_WIN_LOCK_ON; + } else { + SET_LED_WIN_LOCK_OFF; + } +} + +void eeconfig_init_kb(void) { +#if (EECONFIG_KB_DATA_SIZE) == 0 + // Reset Keyboard EEPROM value to blank, rather than to a set value + eeconfig_update_kb(0); +#endif + keymap_config.raw = eeconfig_read_keymap(); + keymap_config.nkro = 1; + eeconfig_update_keymap(keymap_config.raw); + + win_lock_state = 0; + eeconfig_update_user_datablock(&win_lock_state); + + eeconfig_init_user(); +} + +void keyboard_post_init_kb(void) { + setPinOutputPushPull(LED_WIN_LOCK_PIN); + eeconfig_read_user_datablock(&win_lock_state); + + keyboard_post_init_user(); +} + +void housekeeping_task_kb() { + set_led_win_lock_state(); +} + +bool process_record_kb(uint16_t keycode, keyrecord_t *record) { + if (!process_record_user(keycode, record)) { + return false; + } + switch (keycode) { + case GU_TOGG: + if (record->event.pressed) { + win_lock_state = !win_lock_state; + eeconfig_update_user_datablock(&win_lock_state); + } + return true; + default: + return true; + } +} + +void suspend_power_down_kb(void) { + SET_LED_WIN_LOCK_OFF; + + suspend_power_down_user(); +}