diff options
Diffstat (limited to 'keyboards/keychron')
49 files changed, 1193 insertions, 52 deletions
diff --git a/keyboards/keychron/q0/config.h b/keyboards/keychron/q0/config.h new file mode 100644 index 0000000000..40f506fe80 --- /dev/null +++ b/keyboards/keychron/q0/config.h @@ -0,0 +1,101 @@ +/* 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 + +/* key matrix size */ +#define MATRIX_ROWS 6 +#define MATRIX_COLS 4 + +/* key matrix pins */ +#define MATRIX_ROW_PINS { B5, B4, B3, A15, A14, A13 } +#define MATRIX_COL_PINS { A5, A6, A7, B0 } + +/* COL2ROW or ROW2COL */ +#define DIODE_DIRECTION ROW2COL + +/* Set 0 if debouncing isn't needed */ +#define DEBOUNCE 5 + +/* RGB Matrix Driver Configuration */ +#define DRIVER_COUNT 1 +#define DRIVER_ADDR_1 0b1110100 + +#define CONSTANT_CURRENT_STEP \ + { 0xFF, 0xFF, 0x70, 0xFF, 0xFF, 0x70, 0xFF, 0xFF, 0x70, 0xFF, 0xFF, 0x70 } + +/* NKRO */ +#define FORCE_NKRO + +/* turn off effects when suspended */ +#define RGB_DISABLE_WHEN_USB_SUSPENDED + +/* We have 2KB EEPROM size on STM32L432 */ +#define DYNAMIC_KEYMAP_EEPROM_MAX_ADDR 2047 + +/* EEPROM Driver Configuration */ +#define WEAR_LEVELING_LOGICAL_SIZE 2048 +#define WEAR_LEVELING_BACKING_SIZE (WEAR_LEVELING_LOGICAL_SIZE * 2) + +// RGB Matrix Animation modes. Explicitly enabled +// For full list of effects, see: +// https://docs.qmk.fm/#/feature_rgb_matrix?id=rgb-matrix-effects +// #define ENABLE_RGB_MATRIX_ALPHAS_MODS +// #define ENABLE_RGB_MATRIX_GRADIENT_UP_DOWN +// #define ENABLE_RGB_MATRIX_GRADIENT_LEFT_RIGHT +#define ENABLE_RGB_MATRIX_BREATHING +// #define ENABLE_RGB_MATRIX_BAND_SAT +// #define ENABLE_RGB_MATRIX_BAND_VAL +// #define ENABLE_RGB_MATRIX_BAND_PINWHEEL_SAT +// #define ENABLE_RGB_MATRIX_BAND_PINWHEEL_VAL +// #define ENABLE_RGB_MATRIX_BAND_SPIRAL_SAT +// #define ENABLE_RGB_MATRIX_BAND_SPIRAL_VAL +#define ENABLE_RGB_MATRIX_CYCLE_ALL +#define ENABLE_RGB_MATRIX_CYCLE_LEFT_RIGHT +#define ENABLE_RGB_MATRIX_CYCLE_UP_DOWN +#define ENABLE_RGB_MATRIX_RAINBOW_MOVING_CHEVRON +#define ENABLE_RGB_MATRIX_CYCLE_OUT_IN +#define ENABLE_RGB_MATRIX_CYCLE_OUT_IN_DUAL +#define ENABLE_RGB_MATRIX_CYCLE_PINWHEEL +#define ENABLE_RGB_MATRIX_CYCLE_SPIRAL +#define ENABLE_RGB_MATRIX_DUAL_BEACON +#define ENABLE_RGB_MATRIX_RAINBOW_BEACON +// #define ENABLE_RGB_MATRIX_RAINBOW_PINWHEELS +#define ENABLE_RGB_MATRIX_RAINDROPS +// #define ENABLE_RGB_MATRIX_JELLYBEAN_RAINDROPS +// #define ENABLE_RGB_MATRIX_HUE_BREATHING +// #define ENABLE_RGB_MATRIX_HUE_PENDULUM +// #define ENABLE_RGB_MATRIX_HUE_WAVE +// #define ENABLE_RGB_MATRIX_PIXEL_RAIN +// #define ENABLE_RGB_MATRIX_PIXEL_FLOW +// #define ENABLE_RGB_MATRIX_PIXEL_FRACTAL +// enabled only if RGB_MATRIX_FRAMEBUFFER_EFFECTS is defined +#define ENABLE_RGB_MATRIX_TYPING_HEATMAP +#define ENABLE_RGB_MATRIX_DIGITAL_RAIN +// enabled only of RGB_MATRIX_KEYPRESSES or RGB_MATRIX_KEYRELEASES is defined +#define ENABLE_RGB_MATRIX_SOLID_REACTIVE_SIMPLE +#define ENABLE_RGB_MATRIX_SOLID_REACTIVE +#define ENABLE_RGB_MATRIX_SOLID_REACTIVE_WIDE +#define ENABLE_RGB_MATRIX_SOLID_REACTIVE_MULTIWIDE +#define ENABLE_RGB_MATRIX_SOLID_REACTIVE_CROSS +#define ENABLE_RGB_MATRIX_SOLID_REACTIVE_MULTICROSS +#define ENABLE_RGB_MATRIX_SOLID_REACTIVE_NEXUS +#define ENABLE_RGB_MATRIX_SOLID_REACTIVE_MULTINEXUS +#define ENABLE_RGB_MATRIX_SPLASH +#define ENABLE_RGB_MATRIX_MULTISPLASH +#define ENABLE_RGB_MATRIX_SOLID_SPLASH +#define ENABLE_RGB_MATRIX_SOLID_MULTISPLASH +// #define RGB_MATRIX_KEYPRESSES
\ No newline at end of file diff --git a/keyboards/keychron/q0/halconf.h b/keyboards/keychron/q0/halconf.h new file mode 100644 index 0000000000..41bddcb279 --- /dev/null +++ b/keyboards/keychron/q0/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 <http://www.gnu.org/licenses/>. + */ + +#pragma once + +#define HAL_USE_I2C TRUE + +#include_next <halconf.h> diff --git a/keyboards/keychron/q0/mcuconf.h b/keyboards/keychron/q0/mcuconf.h new file mode 100644 index 0000000000..0ca8c64850 --- /dev/null +++ b/keyboards/keychron/q0/mcuconf.h @@ -0,0 +1,22 @@ +/* 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> + +#undef STM32_I2C_USE_I2C1 +#define STM32_I2C_USE_I2C1 TRUE diff --git a/keyboards/keychron/q0/q0.c b/keyboards/keychron/q0/q0.c new file mode 100644 index 0000000000..c43157ac68 --- /dev/null +++ b/keyboards/keychron/q0/q0.c @@ -0,0 +1,57 @@ +/* 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 "q0.h" + +#if defined(RGB_MATRIX_ENABLE) && defined(CAPS_LOCK_LED_INDEX) + +bool process_record_kb(uint16_t keycode, keyrecord_t *record) { + if (!process_record_user(keycode, record)) { + return false; + } + switch (keycode) { +# ifdef RGB_MATRIX_ENABLE + case RGB_TOG: + if (record->event.pressed) { + switch (rgb_matrix_get_flags()) { + case LED_FLAG_ALL: { + rgb_matrix_set_flags(LED_FLAG_NONE); + rgb_matrix_set_color_all(0, 0, 0); + } break; + default: { + rgb_matrix_set_flags(LED_FLAG_ALL); + } break; + } + } + return false; +# endif + } + return true; +} + +__attribute__((weak)) void rgb_matrix_indicators_advanced_user(uint8_t led_min, uint8_t led_max) { + // RGB_MATRIX_INDICATOR_SET_COLOR(index, red, green, blue); + + if (host_keyboard_led_state().caps_lock) { + RGB_MATRIX_INDICATOR_SET_COLOR(CAPS_LOCK_LED_INDEX, 255, 255, 255); + } else { + if (!rgb_matrix_get_flags()) { + RGB_MATRIX_INDICATOR_SET_COLOR(CAPS_LOCK_LED_INDEX, 0, 0, 0); + } + } +} + +#endif // NUM_LOCK_LED_INDEX diff --git a/keyboards/keychron/q0/q0.h b/keyboards/keychron/q0/q0.h new file mode 100644 index 0000000000..6eaa41e87c --- /dev/null +++ b/keyboards/keychron/q0/q0.h @@ -0,0 +1,23 @@ +/* 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 + +#include "quantum.h" + +#if defined(KEYBOARD_keychron_q0_rev_0130) +# include "rev_0130.h" +#endif diff --git a/keyboards/keychron/q0/readme.md b/keyboards/keychron/q0/readme.md new file mode 100644 index 0000000000..d0180d386e --- /dev/null +++ b/keyboards/keychron/q0/readme.md @@ -0,0 +1,19 @@ +# Keychron Q0 + +A customizable number keypad. + +* Keyboard Maintainer: [Keychron](https://github.com/keychron) +* Hardware Supported: Keychron Q0 +* Hardware Availability: [Keychron](https://www.keychron.com) + +Make example for this keyboard (after setting up your build environment): + + make keychron/q0/rev_0130:default + +Flashing example for this keyboard: + + make keychron/q0/rev_0130:default:flash + +**Reset Key**: Hold down the key located at *K00*, commonly programmed as *Esc* while plugging in the keyboard. + +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/q0/rev_0130/config.h b/keyboards/keychron/q0/rev_0130/config.h new file mode 100644 index 0000000000..e7fabed664 --- /dev/null +++ b/keyboards/keychron/q0/rev_0130/config.h @@ -0,0 +1,24 @@ +/* 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 + +/* RGB Matrix Configuration */ +#define DRIVER_1_LED_TOTAL 21 +#define DRIVER_LED_TOTAL DRIVER_1_LED_TOTAL + +/* Enable num-lock LED */ +#define NUM_LOCK_LED_INDEX 4 diff --git a/keyboards/keychron/q0/rev_0130/info.json b/keyboards/keychron/q0/rev_0130/info.json new file mode 100644 index 0000000000..d42a43ef66 --- /dev/null +++ b/keyboards/keychron/q0/rev_0130/info.json @@ -0,0 +1,43 @@ +{ + "keyboard_name": "Q0", + "manufacturer": "Keychron", + "url": "https://github.com/Keychron", + "maintainer": "lalalademaxiya1", + "usb": { + "vid": "0x3434", + "pid": "0x0130", + "device_version": "1.0.2" + }, + "layouts": { + "LAYOUT_numpad_6x4": { + "layout": [ + {"label":"Fn", "x":0, "y":0}, + {"label":"Esc", "x":1, "y":0}, + {"label":"Backspace", "x":2, "y":0}, + {"label":"Tab", "x":3, "y":0}, + + {"label":"Num Lock", "x":0, "y":1}, + {"label":"/", "x":1, "y":1}, + {"label":"*", "x":2, "y":1}, + {"label":"-", "x":3, "y":1}, + + {"label":"7", "x":0, "y":2}, + {"label":"8", "x":1, "y":2}, + {"label":"9", "x":2, "y":2}, + + {"label":"4", "x":0, "y":3}, + {"label":"5", "x":1, "y":3}, + {"label":"6", "x":2, "y":3}, + {"label":"+", "x":3, "y":2, "h":2}, + + {"label":"1", "x":0, "y":4}, + {"label":"2", "x":1, "y":4}, + {"label":"3", "x":2, "y":4}, + + {"label":"0", "x":0, "y":5, "w":2}, + {"label":".", "x":2, "y":5}, + {"label":"Enter", "x":3, "y":4, "h":2} + ] + } + } +}
\ No newline at end of file diff --git a/keyboards/keychron/q0/rev_0130/keymaps/default/keymap.c b/keyboards/keychron/q0/rev_0130/keymaps/default/keymap.c new file mode 100644 index 0000000000..6a05648074 --- /dev/null +++ b/keyboards/keychron/q0/rev_0130/keymaps/default/keymap.c @@ -0,0 +1,37 @@ +/* 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 QMK_KEYBOARD_H + +enum layers { _BASE, _FN1}; + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + [_BASE] = LAYOUT_numpad_6x4( + MO(_FN1), KC_ESC, KC_BSPACE, KC_TAB, + KC_NUMLOCK, KC_PSLS, KC_PAST, KC_PMNS, + KC_P7, KC_P8, KC_P9, + KC_P4, KC_P5, KC_P6, KC_PPLS, + KC_P1, KC_P2, KC_P3, + KC_P0, KC_PDOT, KC_PENT), + + [_FN1] = LAYOUT_numpad_6x4( + _______, KC_MUTE, KC_VOLD, KC_VOLU, + RGB_MOD, RGB_VAI, RGB_HUI, KC_DEL, + RGB_RMOD, RGB_VAD, RGB_HUD, + RGB_SAI, RGB_SPI, KC_MPRV, _______, + RGB_SAD, RGB_SPD, KC_MPLY, + RGB_TOG, KC_MNXT, _______) +}; diff --git a/keyboards/keychron/q0/rev_0130/keymaps/via/keymap.c b/keyboards/keychron/q0/rev_0130/keymaps/via/keymap.c new file mode 100644 index 0000000000..078ede4041 --- /dev/null +++ b/keyboards/keychron/q0/rev_0130/keymaps/via/keymap.c @@ -0,0 +1,53 @@ +/* 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 QMK_KEYBOARD_H + +enum layers { _BASE, _FN1, _RESERVED1, _RESERVED2 }; + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + [_BASE] = LAYOUT_numpad_6x4( + MO(_FN1), KC_ESC, KC_BSPACE, KC_TAB, + KC_NUMLOCK, KC_PSLS, KC_PAST, KC_PMNS, + KC_P7, KC_P8, KC_P9, + KC_P4, KC_P5, KC_P6, KC_PPLS, + KC_P1, KC_P2, KC_P3, + KC_P0, KC_PDOT, KC_PENT), + + [_FN1] = LAYOUT_numpad_6x4( + _______, KC_MUTE, KC_VOLD, KC_VOLU, + RGB_MOD, RGB_VAI, RGB_HUI, KC_DEL, + RGB_RMOD, RGB_VAD, RGB_HUD, + RGB_SAI, RGB_SPI, KC_MPRV, _______, + RGB_SAD, RGB_SPD, KC_MPLY, + RGB_TOG, KC_MNXT, _______), + + [_RESERVED1] = LAYOUT_numpad_6x4( + _______, _______, _______, _______, + _______, _______, _______, _______, + _______, _______, _______, + _______, _______, _______, _______, + _______, _______, _______, + _______, _______, _______), + + [_RESERVED2] = LAYOUT_numpad_6x4( + _______, _______, _______, _______, + _______, _______, _______, _______, + _______, _______, _______, + _______, _______, _______, _______, + _______, _______, _______, + _______, _______, _______) +}; diff --git a/keyboards/keychron/q0/rev_0130/keymaps/via/rules.mk b/keyboards/keychron/q0/rev_0130/keymaps/via/rules.mk new file mode 100644 index 0000000000..1e5b99807c --- /dev/null +++ b/keyboards/keychron/q0/rev_0130/keymaps/via/rules.mk @@ -0,0 +1 @@ +VIA_ENABLE = yes diff --git a/keyboards/keychron/q0/rev_0130/readme.md b/keyboards/keychron/q0/rev_0130/readme.md new file mode 100644 index 0000000000..a6db5bc015 --- /dev/null +++ b/keyboards/keychron/q0/rev_0130/readme.md @@ -0,0 +1 @@ +# The base variant of the Keychron Q0 diff --git a/keyboards/keychron/q0/rev_0130/rev_0130.c b/keyboards/keychron/q0/rev_0130/rev_0130.c new file mode 100644 index 0000000000..468e3cf04f --- /dev/null +++ b/keyboards/keychron/q0/rev_0130/rev_0130.c @@ -0,0 +1,88 @@ +/* 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" + +#ifdef RGB_MATRIX_ENABLE + +const ckled2001_led PROGMEM g_ckled2001_leds[DRIVER_LED_TOTAL] = { +/* Refer to CKLED manual for these locations + * driver + * | R location + * | | G location + * | | | B location + * | | | | */ + {0, F_5, D_5, E_5}, // 0 + {0, I_5, G_5, H_5}, // 1 + {0, L_5, J_5, K_5}, // 2 + {0, C_5, A_5, B_5}, // 3 + + {0, F_4, D_4, E_4}, // 4 + {0, I_4, G_4, H_4}, // 5 + {0, L_4, J_4, K_4}, // 6 + {0, C_4, A_4, B_4}, // 7 + + {0, F_6, D_6, E_6}, // 8 + {0, I_6, G_6, H_6}, // 9 + {0, L_6, J_6, K_6}, // 10 + + {0, F_3, D_3, E_3}, // 11 + {0, I_3, G_3, H_3}, // 12 + {0, L_3, J_3, K_3}, // 13 + {0, C_6, A_6, B_6}, // 14 + + {0, F_2, D_2, E_2}, // 15 + {0, I_2, G_2, H_2}, // 16 + {0, L_2, J_2, K_2}, // 17 + + {0, F_1, D_1, E_1}, // 18 + {0, L_1, J_1, K_1}, // 19 + {0, C_2, A_2, B_2}, // 20 +}; + +#define __ NO_LED + +led_config_t g_led_config = { + { + // Key Matrix to LED Index + { 0, 1, 2, 3 }, + { 4, 5, 6, 7 }, + { 8, 9, 10, 14 }, + { 11, 12, 13, __ }, + { 15, 16, 17, 20 }, + { 18, __, 19, __ } + }, + { + // LED Index to Physical Position + {0,0}, {74,0}, {150,0}, {224,0}, + {0,13}, {74,13}, {150,13}, {224,13}, + {0,26}, {74,26}, {150,26}, + {0,38}, {74,38}, {150,38}, {224,32}, + {0,51}, {74,51}, {150,51}, + {36,64}, {150,64}, {224,58}, + }, + { + // LED Index to Flag + 1, 1, 1, 1, + 9, 4, 4, 4, + 4, 4, 4, + 4, 4, 4, 4, + 4, 4, 4, + 4, 4, 1 + } +}; + +#endif // RGB_MATRIX_ENABLE diff --git a/keyboards/keychron/q0/rev_0130/rev_0130.h b/keyboards/keychron/q0/rev_0130/rev_0130.h new file mode 100644 index 0000000000..d66c880aa9 --- /dev/null +++ b/keyboards/keychron/q0/rev_0130/rev_0130.h @@ -0,0 +1,38 @@ +/* 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 + +#include "quantum.h" + +#define XXX KC_NO + +#define LAYOUT_numpad_6x4( \ + K00, K01, K02, K03, \ + K10, K11, K12, K13, \ + K20, K21, K22, \ + K30, K31, K32, K23, \ + K40, K41, K42, \ + K50, K52, K43 \ +) \ +{ \ + { K00, K01, K02, K03 }, \ + { K10, K11, K12, K13 }, \ + { K20, K21, K22, K23 }, \ + { K30, K31, K32, XXX }, \ + { K40, K41, K42, K43 }, \ + { K50, XXX, K52, XXX }, \ +} diff --git a/keyboards/keychron/q0/rev_0130/rules.mk b/keyboards/keychron/q0/rev_0130/rules.mk new file mode 100644 index 0000000000..5a04c755cd --- /dev/null +++ b/keyboards/keychron/q0/rev_0130/rules.mk @@ -0,0 +1,27 @@ +# MCU name +MCU = STM32L432 + +# Bootloader selection +BOOTLOADER = stm32-dfu + +# Build Options +# change yes to no to disable. +# +BOOTMAGIC_ENABLE = yes # Enable Bootmagic Lite +MOUSEKEY_ENABLE = yes # Mouse keys +EXTRAKEY_ENABLE = yes # Audio control and System control +CONSOLE_ENABLE = no # Console for debug +COMMAND_ENABLE = no # Commands for debug and configuration +NKRO_ENABLE = yes # Enable USB N-key Rollover +BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality +RGBLIGHT_ENABLE = no # Enable keyboard RGB underglow +AUDIO_ENABLE = no # Audio output +DIP_SWITCH_ENABLE = no +RGB_MATRIX_ENABLE = yes +RGB_MATRIX_DRIVER = CKLED2001 +LTO_ENABLE = yes +EEPROM_DRIVER = wear_leveling +WEAR_LEVELING_DRIVER = embedded_flash + +# Enter lower-power sleep mode when on the ChibiOS idle thread +OPT_DEFS += -DCORTEX_ENABLE_WFI_IDLE=TRUE diff --git a/keyboards/keychron/q1/config.h b/keyboards/keychron/q1/config.h index de69b9e929..cda8799a79 100644 --- a/keyboards/keychron/q1/config.h +++ b/keyboards/keychron/q1/config.h @@ -16,11 +16,6 @@ #pragma once -/* USB Device descriptor parameter */ -#define VENDOR_ID 0x3434 -#define MANUFACTURER Keychron -#define PRODUCT Keychron Q1 - /* key matrix size */ #define MATRIX_ROWS 6 #define MATRIX_COLS 15 diff --git a/keyboards/keychron/q1/rev_0100/config.h b/keyboards/keychron/q1/rev_0100/config.h index 435f386a59..1b8c65165c 100644 --- a/keyboards/keychron/q1/rev_0100/config.h +++ b/keyboards/keychron/q1/rev_0100/config.h @@ -16,11 +16,6 @@ #pragma once - -/* USB Device descriptor parameter */ -#define PRODUCT_ID 0x0100 -#define DEVICE_VER 0x0100 - /* key matrix pins */ #define MATRIX_ROW_PINS { D3, D2, B3, B2, B1, B0 } #define MATRIX_COL_PINS { D5, D4, D6, D7, B4, B5, B6, C6, C7, F7, F6, F5, F4, F1, F0 } diff --git a/keyboards/keychron/q1/rev_0100/info.json b/keyboards/keychron/q1/rev_0100/info.json index dba3320ba7..b708f15994 100644 --- a/keyboards/keychron/q1/rev_0100/info.json +++ b/keyboards/keychron/q1/rev_0100/info.json @@ -1,7 +1,13 @@ { - "keyboard_name": "Keychron Q1", + "keyboard_name": "Q1", + "manufacturer": "Keychron", "url": "https://github.com/Keychron", "maintainer": "lalalademaxiya1", + "usb": { + "vid": "0x3434", + "pid": "0x0100", + "device_version": "1.0.0" + }, "layouts": { "LAYOUT_ansi_82": { "layout": [{"label":"Esc", "x":0, "y":0}, diff --git a/keyboards/keychron/q1/rev_0100/keymaps/teimor/config.h b/keyboards/keychron/q1/rev_0100/keymaps/teimor/config.h new file mode 100644 index 0000000000..c3c10a1c2b --- /dev/null +++ b/keyboards/keychron/q1/rev_0100/keymaps/teimor/config.h @@ -0,0 +1,32 @@ +/* Copyright 2022 @ Teimor Epstein + * + * 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 + +#undef TAPPING_TERM +#define TAPPING_TERM 200 + +/* RGB Matrix Configuration */ +#ifdef RGB_MATRIX_ENABLE +# define RGB_DISABLE_WHEN_USB_SUSPENDED +# define MAC_LAYER_DEFAULT_COLOR RGB_CYAN +# define WIN_LAYER_DEFAULT_COLOR RGB_GREEN +# define CAPS_LOCK_INDICATOR_COLOR RGB_RED +# define CAPS_LOCK_INDICATOR_LIGHT_60 +# define FN_LAYER_TRANSPARENT_KEYS_OFF +# define RGB_MATRIX_STARTUP_MODE RGB_MATRIX_SOLID_COLOR // Sets the default mode, if none has been set +# define RGB_MATRIX_STARTUP_VAL RGB_MATRIX_MAXIMUM_BRIGHTNESS // Sets the default brightness value, if none has been set +#endif diff --git a/keyboards/keychron/q1/rev_0100/keymaps/teimor/keymap.c b/keyboards/keychron/q1/rev_0100/keymaps/teimor/keymap.c new file mode 100644 index 0000000000..3a0cddab7c --- /dev/null +++ b/keyboards/keychron/q1/rev_0100/keymaps/teimor/keymap.c @@ -0,0 +1,95 @@ +/* Copyright 2022 @ Teimor Epstein + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +#include QMK_KEYBOARD_H +#include "keymap_user.h" +#ifdef RGB_MATRIX_ENABLE +# include "rgb_matrix_user.h" +#endif + +// clang-format off + +enum custom_keycodes { + KC_MISSION_CONTROL = USER00, + KC_LAUNCHPAD, +}; + +#define KC_MCTL KC_MISSION_CONTROL +#define KC_LPAD KC_LAUNCHPAD +#define TG_NKRO MAGIC_TOGGLE_NKRO + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + [MAC_BASE] = LAYOUT_ansi_82( + 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_DEL, KC_HOME, + 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_END, + 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_PGUP, + KC_LGMAC, 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_PGDN, + 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_LALT, KC_LGUI, KC_SPC, KC_RGUI, KC_MACFN, KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT), + + [MAC_FN] = LAYOUT_ansi_82( + _______, KC_BRID, KC_BRIU, KC_MCTL, KC_LPAD, RGB_VAD, RGB_VAI, KC_MPRV, KC_MPLY, KC_MNXT, KC_MUTE, KC_VOLD, KC_VOLU, KC_MACPS, KC_INS, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + RGB_TOG, RGB_MOD, RGB_VAI, RGB_HUI, RGB_SAI, RGB_SPI, _______, _______, _______, _______, _______, _______, _______, QK_BOOT, _______, + KC_CAPS, RGB_RMOD, RGB_VAD, RGB_HUD, RGB_SAD, RGB_SPD, _______, _______, _______, KC_LMAC, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, TG_NKRO, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______), + + [WIN_BASE] = LAYOUT_ansi_82( + 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_DEL, KC_HOME, + 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_END, + 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_PGUP, + KC_LGWIN, 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_PGDN, + 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_LGUI, KC_LALT, KC_SPC, KC_RALT, KC_WINFN, KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT), + + [WIN_FN] = LAYOUT_ansi_82( + _______, KC_BRID, KC_BRIU, KC_TASK, KC_FLXP, RGB_VAD, RGB_VAI, KC_MPRV, KC_MPLY, KC_MNXT, KC_MUTE, KC_VOLD, KC_VOLU, KC_PSCR, KC_INS, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + RGB_TOG, RGB_MOD, RGB_VAI, RGB_HUI, RGB_SAI, RGB_SPI, _______, _______, _______, _______, _______, _______, _______, QK_BOOT, _______, + KC_CAPS, RGB_RMOD, RGB_VAD, RGB_HUD, RGB_SAD, RGB_SPD, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, TG_NKRO, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______) +}; + +// clang-format on + +void matrix_init_user(void) { +#ifdef RGB_MATRIX_ENABLE + rgb_matrix_init_user(); +#endif +} + +bool process_record_user(uint16_t keycode, keyrecord_t *record) { + switch (keycode) { + case KC_MISSION_CONTROL: + if (record->event.pressed) { + host_consumer_send(0x29F); + } else { + host_consumer_send(0); + } + return false; // Skip all further processing of this key + case KC_LAUNCHPAD: + if (record->event.pressed) { + host_consumer_send(0x2A0); + } else { + host_consumer_send(0); + } + return false; // Skip all further processing of this key + default: + return true; // Process all other keycodes normally + } +} diff --git a/keyboards/keychron/q1/rev_0100/keymaps/teimor/keymap_user.h b/keyboards/keychron/q1/rev_0100/keymaps/teimor/keymap_user.h new file mode 100644 index 0000000000..57ac5258c2 --- /dev/null +++ b/keyboards/keychron/q1/rev_0100/keymaps/teimor/keymap_user.h @@ -0,0 +1,48 @@ +/* Copyright 2022 @ Teimor Epstein + * + * 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 + +// clang-format off + +enum layers { + MAC_BASE, + MAC_FN, + WIN_BASE, + WIN_FN +}; + +// clang-format on + +// Tap dance enums +enum { + MAC_CAPS_LANGUAGE_CHANGE, + WIN_CAPS_LANGUAGE_CHANGE, +}; + +#ifdef TAP_DANCE_ENABLE +# define KC_LGMAC TD(MAC_CAPS_LANGUAGE_CHANGE) +# define KC_LGWIN TD(WIN_CAPS_LANGUAGE_CHANGE) +#else +# define KC_LGMAC KC_CAPS +# define KC_LGWIN KC_CAPS +#endif +#define KC_MACFN MO(MAC_FN) +#define KC_WINFN MO(WIN_FN) +#define KC_LMAC C(G(KC_Q)) +#define KC_MACPS G(S(KC_5)) +#define KC_TASK G(KC_TAB) +#define KC_FLXP G(KC_E) diff --git a/keyboards/keychron/q1/rev_0100/keymaps/teimor/readme.md b/keyboards/keychron/q1/rev_0100/keymaps/teimor/readme.md new file mode 100644 index 0000000000..9aa16f9a89 --- /dev/null +++ b/keyboards/keychron/q1/rev_0100/keymaps/teimor/readme.md @@ -0,0 +1,13 @@ +# teimor's Keychron Q1 keymap + +- Via Enabled. +- Tap dance enabled. +- On macOS, F3 opens Mission Control and F4 opens Launchpad without needing to configure shortcuts in System Preferences. +- RGB lighting turns off when the computer sleeps. +- The RGB lighting for keys that are not assigned turns off when the Fn layer is active +- 60% layout turns red to indicate when Caps Lock is on. +- Windows and macOS: A single tap will quickly change the language, and holding will trigger Caps Lock. (Using Tap Dance) +- RGB Matrix based on layout - macOS base layout will turn on cyan color, Windows base layout will turn on green color. +- `fn + N` will toggle NKRO, useful when using the keyboard on freebsd. +- `fn + L` on macOS will lock the system. +- `fn + del` will trigger screenshot on macOS and Windows. diff --git a/keyboards/keychron/q1/rev_0100/keymaps/teimor/rgb_matrix_user.c b/keyboards/keychron/q1/rev_0100/keymaps/teimor/rgb_matrix_user.c new file mode 100644 index 0000000000..77f1c1011b --- /dev/null +++ b/keyboards/keychron/q1/rev_0100/keymaps/teimor/rgb_matrix_user.c @@ -0,0 +1,91 @@ +/* Copyright 2022 @ Teimor Epstein + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +#include QMK_KEYBOARD_H +#include "rgb_matrix_user.h" +#include "keymap_user.h" + +keypos_t led_index_key_position[DRIVER_LED_TOTAL]; + +void rgb_matrix_init_user(void) { + for (uint8_t row = 0; row < MATRIX_ROWS; row++) { + for (uint8_t col = 0; col < MATRIX_COLS; col++) { + uint8_t led_index = g_led_config.matrix_co[row][col]; + if (led_index != NO_LED) { + led_index_key_position[led_index] = (keypos_t){.row = row, .col = col}; + } + } + } +} + +void rgb_matrix_indicators_advanced_user(uint8_t led_min, uint8_t led_max) { + uint8_t current_layer = get_highest_layer(layer_state | default_layer_state); + switch (current_layer) { + case MAC_BASE: + case WIN_BASE: +#if defined CAPS_LOCK_INDICATOR_COLOR && defined MAC_LAYER_DEFAULT_COLOR && defined WIN_LAYER_DEFAULT_COLOR + if (host_keyboard_led_state().caps_lock) { + rgb_matrix_set_color_by_keycode(led_min, led_max, current_layer, is_caps_lock_indicator, CAPS_LOCK_INDICATOR_COLOR); + } else if (current_layer == MAC_BASE) + rgb_matrix_set_color_all(MAC_LAYER_DEFAULT_COLOR); + else if (current_layer == WIN_BASE) + rgb_matrix_set_color_all(WIN_LAYER_DEFAULT_COLOR); +#endif + break; + case MAC_FN: + case WIN_FN: +#if defined MAC_LAYER_DEFAULT_COLOR && defined WIN_LAYER_DEFAULT_COLOR + if (current_layer == MAC_FN) { + rgb_matrix_set_color_by_keycode(led_min, led_max, current_layer, is_not_transparent, MAC_LAYER_DEFAULT_COLOR); + } else if (current_layer == WIN_FN) { + rgb_matrix_set_color_by_keycode(led_min, led_max, current_layer, is_not_transparent, WIN_LAYER_DEFAULT_COLOR); + } +#endif +#ifdef FN_LAYER_TRANSPARENT_KEYS_OFF + rgb_matrix_set_color_by_keycode(led_min, led_max, current_layer, is_transparent, RGB_OFF); +#endif + break; + } +} + +void rgb_matrix_set_color_by_keycode(uint8_t led_min, uint8_t led_max, uint8_t layer, bool (*is_keycode)(uint16_t), uint8_t red, uint8_t green, uint8_t blue) { + for (uint8_t i = led_min; i < led_max; i++) { + uint16_t keycode = keymap_key_to_keycode(layer, led_index_key_position[i]); + if ((*is_keycode)(keycode)) { + rgb_matrix_set_color(i, red, green, blue); + } +#if defined MAC_LAYER_DEFAULT_COLOR && defined WIN_LAYER_DEFAULT_COLOR + else { + if (layer == MAC_BASE) + rgb_matrix_set_color(i, MAC_LAYER_DEFAULT_COLOR); + else if (layer == WIN_BASE) + rgb_matrix_set_color(i, WIN_LAYER_DEFAULT_COLOR); + } +#endif + } +} + +bool is_caps_lock_indicator(uint16_t keycode) { + bool indicator = keycode == KC_CAPS || keycode == KC_LGMAC || keycode == KC_LGWIN; +#ifdef CAPS_LOCK_INDICATOR_LIGHT_60 + return (KC_A <= keycode && keycode <= KC_CAPS) || (KC_LEFT_CTRL <= keycode && keycode <= KC_RIGHT_GUI) || keycode == KC_MACFN || keycode == KC_WINFN || indicator; +#else + return indicator; +#endif +} + +bool is_transparent(uint16_t keycode) { return keycode == KC_TRNS; } +bool is_not_transparent(uint16_t keycode) { return keycode != KC_TRNS; } diff --git a/keyboards/keychron/q1/rev_0100/keymaps/teimor/rgb_matrix_user.h b/keyboards/keychron/q1/rev_0100/keymaps/teimor/rgb_matrix_user.h new file mode 100644 index 0000000000..5b53b5b8ec --- /dev/null +++ b/keyboards/keychron/q1/rev_0100/keymaps/teimor/rgb_matrix_user.h @@ -0,0 +1,25 @@ +/* Copyright 2022 @ Teimor Epstein + * + * 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 + +void rgb_matrix_init_user(void); + +void rgb_matrix_set_color_by_keycode(uint8_t led_min, uint8_t led_max, uint8_t layer, bool (*is_keycode)(uint16_t), uint8_t red, uint8_t green, uint8_t blue); + +bool is_caps_lock_indicator(uint16_t keycode); +bool is_transparent(uint16_t keycode); +bool is_not_transparent(uint16_t keycode); diff --git a/keyboards/keychron/q1/rev_0100/keymaps/teimor/rules.mk b/keyboards/keychron/q1/rev_0100/keymaps/teimor/rules.mk new file mode 100644 index 0000000000..bafb40484b --- /dev/null +++ b/keyboards/keychron/q1/rev_0100/keymaps/teimor/rules.mk @@ -0,0 +1,14 @@ +VIA_ENABLE = yes +MOUSEKEY_ENABLE = no +TAP_DANCE_ENABLE = yes + +ifeq ($(strip $(RGB_MATRIX_ENABLE)), yes) + SRC += rgb_matrix_user.c +endif + +ifeq ($(strip $(TAP_DANCE_ENABLE)), yes) + SRC += tap_dance_user.c + SRC += tap_dance_setup.c + SRC += tap_dance_mac_caps.c + SRC += tap_dance_win_caps.c +endif diff --git a/keyboards/keychron/q1/rev_0100/keymaps/teimor/tap_dance_mac_caps.c b/keyboards/keychron/q1/rev_0100/keymaps/teimor/tap_dance_mac_caps.c new file mode 100644 index 0000000000..d979820923 --- /dev/null +++ b/keyboards/keychron/q1/rev_0100/keymaps/teimor/tap_dance_mac_caps.c @@ -0,0 +1,50 @@ +/* Copyright 2021 @ Teimor Epstein + * + * 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/>. + */ + +/* macOS CapsLock language change */ +#include "tap_dance_mac_caps.h" + +static td_tap_t mac_caps_language_tap_state = {.is_press_action = true, .state = TD_NONE}; + +void mac_caps_language_finished(qk_tap_dance_state_t *state, void *user_data) { + mac_caps_language_tap_state.state = current_dance(state); + switch (mac_caps_language_tap_state.state) { + case TD_SINGLE_TAP: + register_code(KC_LCTL); + register_code(KC_SPACE); + break; + case TD_SINGLE_HOLD: + register_code(KC_CAPS_LOCK); + break; + default: + break; + } +} + +void mac_caps_language_reset(qk_tap_dance_state_t *state, void *user_data) { + switch (mac_caps_language_tap_state.state) { + case TD_SINGLE_TAP: + unregister_code(KC_SPACE); + unregister_code(KC_LCTL); + break; + case TD_SINGLE_HOLD: + unregister_code(KC_CAPS_LOCK); + break; + default: + break; + } + mac_caps_language_tap_state.state = TD_NONE; +} diff --git a/keyboards/keychron/q1/rev_0100/keymaps/teimor/tap_dance_mac_caps.h b/keyboards/keychron/q1/rev_0100/keymaps/teimor/tap_dance_mac_caps.h new file mode 100644 index 0000000000..a5f07a58a1 --- /dev/null +++ b/keyboards/keychron/q1/rev_0100/keymaps/teimor/tap_dance_mac_caps.h @@ -0,0 +1,23 @@ +/* Copyright 2021 @ Teimor Epstein + * + * 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/>. + */ + +/* macOS CapsLock language change */ +#pragma once + +#include "tap_dance_setup.h" + +void mac_caps_language_finished(qk_tap_dance_state_t *state, void *user_data); +void mac_caps_language_reset(qk_tap_dance_state_t *state, void *user_data); diff --git a/keyboards/keychron/q1/rev_0100/keymaps/teimor/tap_dance_setup.c b/keyboards/keychron/q1/rev_0100/keymaps/teimor/tap_dance_setup.c new file mode 100644 index 0000000000..6d879419bc --- /dev/null +++ b/keyboards/keychron/q1/rev_0100/keymaps/teimor/tap_dance_setup.c @@ -0,0 +1,49 @@ +/* Copyright 2022 @ Teimor Epstein + * + * 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 "tap_dance_setup.h" + +td_state_t current_dance(qk_tap_dance_state_t *state) { + if (state->count == 1) { + if (state->interrupted || !state->pressed) return TD_SINGLE_TAP; + /* Key has not been interrupted, but the key is still held. Means you w ant to send a 'HOLD'. */ + else + return TD_SINGLE_HOLD; + } else if (state->count == 2) { + /* TD_DOUBLE_SINGLE_TAP is to distinguish between typing "pepper", and actually wanting a double tap + action when hitting 'pp'. Suggested use case for this return value is when you want to send two + keystrokes of the key, and not the 'double tap' action/macro. */ + if (state->interrupted) + return TD_DOUBLE_SINGLE_TAP; + else if (state->pressed) + return TD_DOUBLE_HOLD; + else + return TD_DOUBLE_TAP; + } + + /* Assumes no one is trying to type the same letter three times (at least not quickly). + If your tap dance key is 'KC_W', and you want to type "www." quickly - then you will need to add + an exception here to return a 'TD_TRIPLE_SINGLE_TAP', and define that enum just like 'TD_DOUBLE_SINGLE_TAP' */ + if (state->count == 3) { + if (state->interrupted) + return TD_TRIPLE_SINGLE_TAP; + else if (state->pressed) + return TD_TRIPLE_HOLD; + else + return TD_TRIPLE_TAP; + + } else + return TD_UNKNOWN; +} diff --git a/keyboards/keychron/q1/rev_0100/keymaps/teimor/tap_dance_setup.h b/keyboards/keychron/q1/rev_0100/keymaps/teimor/tap_dance_setup.h new file mode 100644 index 0000000000..05160c77f5 --- /dev/null +++ b/keyboards/keychron/q1/rev_0100/keymaps/teimor/tap_dance_setup.h @@ -0,0 +1,38 @@ +/* Copyright 2022 @ Teimor Epstein + * + * 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 QMK_KEYBOARD_H + +typedef enum { + TD_NONE, + TD_UNKNOWN, + TD_SINGLE_TAP, + TD_SINGLE_HOLD, + TD_DOUBLE_TAP, + TD_DOUBLE_HOLD, + TD_DOUBLE_SINGLE_TAP, // Send two single taps + TD_TRIPLE_TAP, + TD_TRIPLE_HOLD, + TD_TRIPLE_SINGLE_TAP // Send three single tap +} td_state_t; + +typedef struct { + bool is_press_action; + td_state_t state; +} td_tap_t; + +td_state_t current_dance(qk_tap_dance_state_t *state); diff --git a/keyboards/keychron/q1/rev_0100/keymaps/teimor/tap_dance_user.c b/keyboards/keychron/q1/rev_0100/keymaps/teimor/tap_dance_user.c new file mode 100644 index 0000000000..1e9542d5ee --- /dev/null +++ b/keyboards/keychron/q1/rev_0100/keymaps/teimor/tap_dance_user.c @@ -0,0 +1,28 @@ +/* Copyright 2022 @ Teimor Epstein + * + * 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 "keymap_user.h" +#include "tap_dance_mac_caps.h" +#include "tap_dance_win_caps.h" + +// clang-format off + +qk_tap_dance_action_t tap_dance_actions[] = { + [MAC_CAPS_LANGUAGE_CHANGE] = ACTION_TAP_DANCE_FN_ADVANCED(NULL, mac_caps_language_finished, mac_caps_language_reset), + [WIN_CAPS_LANGUAGE_CHANGE] = ACTION_TAP_DANCE_FN_ADVANCED(NULL, win_caps_language_finished, win_caps_language_reset) +}; + +// clang-format on diff --git a/keyboards/keychron/q1/rev_0100/keymaps/teimor/tap_dance_win_caps.c b/keyboards/keychron/q1/rev_0100/keymaps/teimor/tap_dance_win_caps.c new file mode 100644 index 0000000000..fea72c5663 --- /dev/null +++ b/keyboards/keychron/q1/rev_0100/keymaps/teimor/tap_dance_win_caps.c @@ -0,0 +1,50 @@ +/* Copyright 2022 @ Teimor Epstein + * + * 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/>. + */ + +/* Windows CapsLock language change */ +#include "tap_dance_win_caps.h" + +static td_tap_t win_caps_language_tap_state = {.is_press_action = true, .state = TD_NONE}; + +void win_caps_language_finished(qk_tap_dance_state_t *state, void *user_data) { + win_caps_language_tap_state.state = current_dance(state); + switch (win_caps_language_tap_state.state) { + case TD_SINGLE_TAP: + register_code(KC_LGUI); + register_code(KC_SPACE); + break; + case TD_SINGLE_HOLD: + register_code(KC_CAPS_LOCK); + break; + default: + break; + } +} + +void win_caps_language_reset(qk_tap_dance_state_t *state, void *user_data) { + switch (win_caps_language_tap_state.state) { + case TD_SINGLE_TAP: + unregister_code(KC_SPACE); + unregister_code(KC_LGUI); + break; + case TD_SINGLE_HOLD: + unregister_code(KC_CAPS_LOCK); + break; + default: + break; + } + win_caps_language_tap_state.state = TD_NONE; +} diff --git a/keyboards/keychron/q1/rev_0100/keymaps/teimor/tap_dance_win_caps.h b/keyboards/keychron/q1/rev_0100/keymaps/teimor/tap_dance_win_caps.h new file mode 100644 index 0000000000..34b734ec89 --- /dev/null +++ b/keyboards/keychron/q1/rev_0100/keymaps/teimor/tap_dance_win_caps.h @@ -0,0 +1,23 @@ +/* Copyright 2022 @ Teimor Epstein + * + * 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/>. + */ + +/* Windows CapsLock language change */ +#pragma once + +#include "tap_dance_setup.h" + +void win_caps_language_finished(qk_tap_dance_state_t *state, void *user_data); +void win_caps_language_reset(qk_tap_dance_state_t *state, void *user_data); diff --git a/keyboards/keychron/q1/rev_0101/config.h b/keyboards/keychron/q1/rev_0101/config.h index c127a3630a..58d77477ca 100644 --- a/keyboards/keychron/q1/rev_0101/config.h +++ b/keyboards/keychron/q1/rev_0101/config.h @@ -16,10 +16,6 @@ #pragma once -/* USB Device descriptor parameter */ -#define PRODUCT_ID 0x0101 -#define DEVICE_VER 0x0100 - /* key matrix pins */ #define MATRIX_ROW_PINS { D3, D2, B3, B2, B1, B0 } #define MATRIX_COL_PINS { D5, D4, D6, D7, B4, B5, B6, C6, C7, F7, F6, F5, F4, F1, F0 } diff --git a/keyboards/keychron/q1/rev_0101/info.json b/keyboards/keychron/q1/rev_0101/info.json index 75fb2d04e8..b4e5d002b7 100644 --- a/keyboards/keychron/q1/rev_0101/info.json +++ b/keyboards/keychron/q1/rev_0101/info.json @@ -1,7 +1,13 @@ { - "keyboard_name": "Keychron Q1", + "keyboard_name": "Q1", + "manufacturer": "Keychron", "url": "https://github.com/Keychron", "maintainer": "lalalademaxiya1", + "usb": { + "vid": "0x3434", + "pid": "0x0101", + "device_version": "1.0.0" + }, "layouts": { "LAYOUT_ansi_82": { "layout": [ diff --git a/keyboards/keychron/q1/rev_0102/config.h b/keyboards/keychron/q1/rev_0102/config.h index a537ab4e0d..7aa0ae8662 100644 --- a/keyboards/keychron/q1/rev_0102/config.h +++ b/keyboards/keychron/q1/rev_0102/config.h @@ -16,11 +16,6 @@ #pragma once - -/* USB Device descriptor parameter */ -#define PRODUCT_ID 0x0102 -#define DEVICE_VER 0x0100 - /* key matrix pins */ #define MATRIX_ROW_PINS { D3, D2, B3, B2, B1, B0 } #define MATRIX_COL_PINS { D5, D4, D6, D7, B4, B5, B6, C6, C7, F7, F6, F5, F4, F1, F0 } diff --git a/keyboards/keychron/q1/rev_0102/info.json b/keyboards/keychron/q1/rev_0102/info.json index a71e0b24f0..9ee606b34e 100644 --- a/keyboards/keychron/q1/rev_0102/info.json +++ b/keyboards/keychron/q1/rev_0102/info.json @@ -1,7 +1,13 @@ { - "keyboard_name": "Keychron Q1", + "keyboard_name": "Q1", + "manufacturer": "Keychron", "url": "https://github.com/Keychron", "maintainer": "lalalademaxiya1", + "usb": { + "vid": "0x3434", + "pid": "0x0102", + "device_version": "1.0.0" + }, "layouts": { "LAYOUT_iso_83": { "layout": [ diff --git a/keyboards/keychron/q2/config.h b/keyboards/keychron/q2/config.h index d019bcee15..511cc4f5ac 100644 --- a/keyboards/keychron/q2/config.h +++ b/keyboards/keychron/q2/config.h @@ -16,11 +16,6 @@ #pragma once -/* USB Device descriptor parameter */ -#define VENDOR_ID 0x3434 -#define MANUFACTURER Keychron -#define PRODUCT Keychron Q2 - /* key matrix size */ #define MATRIX_ROWS 5 #define MATRIX_COLS 15 @@ -64,7 +59,8 @@ #define DYNAMIC_KEYMAP_EEPROM_MAX_ADDR 2047 /* EEPROM Driver Configuration */ -#define EXTERNAL_EEPROM_I2C_BASE_ADDRESS 0b10100010 +#define WEAR_LEVELING_LOGICAL_SIZE 2048 +#define WEAR_LEVELING_BACKING_SIZE (WEAR_LEVELING_LOGICAL_SIZE * 2) // RGB Matrix Animation modes. Explicitly enabled // For full list of effects, see: diff --git a/keyboards/keychron/q2/rev_0110/config.h b/keyboards/keychron/q2/rev_0110/config.h index e41857d9b2..f30b81b3af 100644 --- a/keyboards/keychron/q2/rev_0110/config.h +++ b/keyboards/keychron/q2/rev_0110/config.h @@ -16,10 +16,6 @@ #pragma once -/* USB Device descriptor parameter */ -#define PRODUCT_ID 0x0110 -#define DEVICE_VER 0x0100 - /* RGB Matrix Configuration */ #define DRIVER_1_LED_TOTAL 34 #define DRIVER_2_LED_TOTAL 33 diff --git a/keyboards/keychron/q2/rev_0110/info.json b/keyboards/keychron/q2/rev_0110/info.json index fb34a2427a..65e6c22519 100644 --- a/keyboards/keychron/q2/rev_0110/info.json +++ b/keyboards/keychron/q2/rev_0110/info.json @@ -1,7 +1,13 @@ { - "keyboard_name": "Keychron Q2", + "keyboard_name": "Q2", + "manufacturer": "Keychron", "url": "https://github.com/Keychron", "maintainer": "lalalademaxiya1", + "usb": { + "vid": "0x3434", + "pid": "0x0110", + "device_version": "1.0.0" + }, "layouts": { "LAYOUT_ansi_67": { "layout": [ diff --git a/keyboards/keychron/q2/rev_0110/rules.mk b/keyboards/keychron/q2/rev_0110/rules.mk index 30394028b3..38d48f0b27 100644 --- a/keyboards/keychron/q2/rev_0110/rules.mk +++ b/keyboards/keychron/q2/rev_0110/rules.mk @@ -20,7 +20,8 @@ ENCODER_ENABLE = no # Enable Encoder DIP_SWITCH_ENABLE = yes RGB_MATRIX_ENABLE = yes RGB_MATRIX_DRIVER = CKLED2001 -EEPROM_DRIVER = i2c +EEPROM_DRIVER = wear_leveling +WEAR_LEVELING_DRIVER = embedded_flash # Enter lower-power sleep mode when on the ChibiOS idle thread OPT_DEFS += -DCORTEX_ENABLE_WFI_IDLE=TRUE diff --git a/keyboards/keychron/q2/rev_0111/config.h b/keyboards/keychron/q2/rev_0111/config.h index 76cd5d0e78..249e589019 100644 --- a/keyboards/keychron/q2/rev_0111/config.h +++ b/keyboards/keychron/q2/rev_0111/config.h @@ -16,10 +16,6 @@ #pragma once -/* USB Device descriptor parameter */ -#define PRODUCT_ID 0x0111 -#define DEVICE_VER 0x0100 - /* RGB Matrix Configuration */ #define DRIVER_1_LED_TOTAL 34 #define DRIVER_2_LED_TOTAL 33 diff --git a/keyboards/keychron/q2/rev_0111/info.json b/keyboards/keychron/q2/rev_0111/info.json index f6ce1d9b27..875937baec 100644 --- a/keyboards/keychron/q2/rev_0111/info.json +++ b/keyboards/keychron/q2/rev_0111/info.json @@ -1,7 +1,13 @@ { - "keyboard_name": "Keychron Q2", + "keyboard_name": "Q2", + "manufacturer": "Keychron", "url": "https://github.com/Keychron", "maintainer": "lalalademaxiya1", + "usb": { + "vid": "0x3434", + "pid": "0x0111", + "device_version": "1.0.0" + }, "layouts": { "LAYOUT_ansi_67": { "layout": [ diff --git a/keyboards/keychron/q2/rev_0111/rules.mk b/keyboards/keychron/q2/rev_0111/rules.mk index a295f48e10..9332d29432 100644 --- a/keyboards/keychron/q2/rev_0111/rules.mk +++ b/keyboards/keychron/q2/rev_0111/rules.mk @@ -20,7 +20,8 @@ ENCODER_ENABLE = yes # Enable Encoder DIP_SWITCH_ENABLE = yes RGB_MATRIX_ENABLE = yes RGB_MATRIX_DRIVER = CKLED2001 -EEPROM_DRIVER = i2c +EEPROM_DRIVER = wear_leveling +WEAR_LEVELING_DRIVER = embedded_flash # Enter lower-power sleep mode when on the ChibiOS idle thread OPT_DEFS += -DCORTEX_ENABLE_WFI_IDLE=TRUE diff --git a/keyboards/keychron/q2/rev_0112/config.h b/keyboards/keychron/q2/rev_0112/config.h index 70a60fd026..4bab401a01 100644 --- a/keyboards/keychron/q2/rev_0112/config.h +++ b/keyboards/keychron/q2/rev_0112/config.h @@ -16,10 +16,6 @@ #pragma once -/* USB Device descriptor parameter */ -#define PRODUCT_ID 0x0112 -#define DEVICE_VER 0x0100 - /* RGB Matrix Configuration */ #define DRIVER_1_LED_TOTAL 34 #define DRIVER_2_LED_TOTAL 34 diff --git a/keyboards/keychron/q2/rev_0112/info.json b/keyboards/keychron/q2/rev_0112/info.json index 5f0d4ab249..3670c87688 100644 --- a/keyboards/keychron/q2/rev_0112/info.json +++ b/keyboards/keychron/q2/rev_0112/info.json @@ -1,7 +1,13 @@ { - "keyboard_name": "Keychron Q2", + "keyboard_name": "Q2", + "manufacturer": "Keychron", "url": "https://github.com/Keychron", "maintainer": "lalalademaxiya1", + "usb": { + "vid": "0x3434", + "pid": "0x0112", + "device_version": "1.0.0" + }, "layouts": { "LAYOUT_iso_68": { "layout": [ diff --git a/keyboards/keychron/q2/rev_0112/rules.mk b/keyboards/keychron/q2/rev_0112/rules.mk index 30394028b3..38d48f0b27 100644 --- a/keyboards/keychron/q2/rev_0112/rules.mk +++ b/keyboards/keychron/q2/rev_0112/rules.mk @@ -20,7 +20,8 @@ ENCODER_ENABLE = no # Enable Encoder DIP_SWITCH_ENABLE = yes RGB_MATRIX_ENABLE = yes RGB_MATRIX_DRIVER = CKLED2001 -EEPROM_DRIVER = i2c +EEPROM_DRIVER = wear_leveling +WEAR_LEVELING_DRIVER = embedded_flash # Enter lower-power sleep mode when on the ChibiOS idle thread OPT_DEFS += -DCORTEX_ENABLE_WFI_IDLE=TRUE diff --git a/keyboards/keychron/q2/rev_0113/config.h b/keyboards/keychron/q2/rev_0113/config.h index 486d3fd3b8..8f7fbef73a 100644 --- a/keyboards/keychron/q2/rev_0113/config.h +++ b/keyboards/keychron/q2/rev_0113/config.h @@ -16,10 +16,6 @@ #pragma once -/* USB Device descriptor parameter */ -#define PRODUCT_ID 0x0113 -#define DEVICE_VER 0x0100 - /* RGB Matrix Configuration */ #define DRIVER_1_LED_TOTAL 34 #define DRIVER_2_LED_TOTAL 34 diff --git a/keyboards/keychron/q2/rev_0113/info.json b/keyboards/keychron/q2/rev_0113/info.json index 151f42455d..297096aac3 100644 --- a/keyboards/keychron/q2/rev_0113/info.json +++ b/keyboards/keychron/q2/rev_0113/info.json @@ -1,7 +1,13 @@ { - "keyboard_name": "Keychron Q2", + "keyboard_name": "Q2", + "manufacturer": "Keychron", "url": "https://github.com/Keychron", "maintainer": "lalalademaxiya1", + "usb": { + "vid": "0x3434", + "pid": "0x0113", + "device_version": "1.0.0" + }, "layouts": { "LAYOUT_iso_68": { "layout": [ diff --git a/keyboards/keychron/q2/rev_0113/rules.mk b/keyboards/keychron/q2/rev_0113/rules.mk index a295f48e10..9332d29432 100644 --- a/keyboards/keychron/q2/rev_0113/rules.mk +++ b/keyboards/keychron/q2/rev_0113/rules.mk @@ -20,7 +20,8 @@ ENCODER_ENABLE = yes # Enable Encoder DIP_SWITCH_ENABLE = yes RGB_MATRIX_ENABLE = yes RGB_MATRIX_DRIVER = CKLED2001 -EEPROM_DRIVER = i2c +EEPROM_DRIVER = wear_leveling +WEAR_LEVELING_DRIVER = embedded_flash # Enter lower-power sleep mode when on the ChibiOS idle thread OPT_DEFS += -DCORTEX_ENABLE_WFI_IDLE=TRUE |