Merge pull request #141 from lalalademaxiya1/keychron-q2_pro

Update Q2 Pro
This commit is contained in:
lokher 2023-07-10 15:51:39 +08:00 committed by GitHub
commit 8ff8ad4c05
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
21 changed files with 1166 additions and 171 deletions

View file

@ -38,7 +38,6 @@ const ckled2001_led g_ckled2001_leds[RGB_MATRIX_LED_COUNT] = {
{0, C_5, A_5, B_5},
{0, C_4, A_4, B_4},
{0, C_3, A_3, B_3},
{0, C_1, A_1, B_1},
{0, F_16, D_16, E_16},
{0, F_15, D_15, E_15},
@ -94,35 +93,6 @@ const ckled2001_led g_ckled2001_leds[RGB_MATRIX_LED_COUNT] = {
{1, F_4, D_4, E_4},
{1, F_3, D_3, E_3},
{1, F_2, D_2, E_2},
{1, F_1, D_1, E_1}
};
#define __ NO_LED
led_config_t g_led_config = {
{
// Key Matrix to LED Index
{ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, __, 14 },
{ 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, __, 29 },
{ 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, __, 42, __, 43 },
{ 44, __, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, __, 55, 56, __ },
{ 57, 58, 59, __, __, __, 60, __, __, __, 61, 62, 63, 64, 65, 66 }
},
{
// LED Index to Physical Position
{0, 3}, {14, 3}, {29, 3}, {43, 3}, {58, 3}, {73, 3}, {87, 3}, {102, 3}, {117, 3}, {131, 3}, {146, 3}, {161, 3}, {175, 3}, {197, 3}, {223, 3},
{3,17}, {21,17}, {36,17}, {51,17}, {65,17}, {80,17}, {95,17}, {109, 17}, {124, 17}, {139, 17}, {153, 17}, {168, 17}, {183, 17}, {201, 17}, {223, 17},
{5,32}, {25,32}, {40,32}, {54,32}, {69,32}, {84,32}, {98,32}, {113, 32}, {128, 32}, {142, 32}, {157, 32}, {172, 32}, {195, 32}, {223, 32},
{9,47}, {32,47}, {47,47}, {62,47}, {76,47}, {91,47}, {106, 47}, {120, 47}, {135, 47}, {150, 47}, {164, 47}, {185, 47}, {209, 47},
{1,62}, {20,62}, {38,62}, {93,62}, {146, 62}, {161, 62}, {176, 62}, {194, 62}, {209, 62}, {223, 62}
},
{
// RGB LED Index to Flag
1, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 1, 1,
1, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 1,
8, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 1, 1,
1, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 1, 1,
1, 1, 1, 4, 1, 1, 1, 1, 1, 1
}
{1, F_1, D_1, E_1},
};
#endif

View file

@ -24,7 +24,9 @@
# define DRIVER_COUNT 2
# define DRIVER_ADDR_1 0b1110111
# define DRIVER_ADDR_2 0b1110100
# define DRIVER_1_LED_TOTAL 30
/* RGB Matrix Configuration */
# define DRIVER_1_LED_TOTAL 29
# define DRIVER_2_LED_TOTAL 37
# define RGB_MATRIX_LED_COUNT (DRIVER_1_LED_TOTAL + DRIVER_2_LED_TOTAL)
@ -37,22 +39,17 @@
/* Turn off backllit if brightness value is low */
# define RGB_MATRIX_BRIGHTNESS_TURN_OFF_VAL 48
# define CAPS_LOCK_INDEX 30
# define LOW_BAT_IND_INDEX 60
// RGB Matrix Animation modes. Explicitly enabled
// For full list of effects, see:
// https://docs.qmk.fm/#/feature_rgb_matrix?id=rgb-matrix-effects
/* Indication led index */
# define CAPS_LOCK_INDEX 29
# define LOW_BAT_IND_INDEX 59
# define RGB_MATRIX_KEYPRESSES
# define RGB_MATRIX_FRAMEBUFFER_EFFECTS
/* Scan phase of led driver set as MSKPHASE_9CHANNEL(defined as 0x03 in CKLED2001.h) */
/* Use the first 9 channels of led driver */
# define PHASE_CHANNEL MSKPHASE_9CHANNEL
/* Set LED driver current */
# define CKLED2001_CURRENT_TUNE \
{ 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30 }
{ 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40 }
#endif

View file

@ -20,7 +20,6 @@
{"matrix":[0,11], "x":11, "y":0.25},
{"matrix":[0,12], "x":12, "y":0.25},
{"matrix":[0,13], "x":13, "y":0.25, "w":2},
{"matrix":[0,15], "x":15.25, "y":0},
{"matrix":[1,0], "x":0, "y":1.25, "w":1.5},
@ -80,5 +79,79 @@
{"matrix":[4,15], "x":15.25, "y":4.5}
]
}
},
"rgb_matrix": {
"layout": [
{"matrix":[0, 0], "flags":1, "x":0, "y":3},
{"matrix":[0, 1], "flags":1, "x":14, "y":3},
{"matrix":[0, 2], "flags":4, "x":29, "y":3},
{"matrix":[0, 3], "flags":4, "x":43, "y":3},
{"matrix":[0, 4], "flags":4, "x":58, "y":3},
{"matrix":[0, 5], "flags":4, "x":73, "y":3},
{"matrix":[0, 6], "flags":4, "x":87, "y":3},
{"matrix":[0, 7], "flags":4, "x":102, "y":3},
{"matrix":[0, 8], "flags":4, "x":117, "y":3},
{"matrix":[0, 9], "flags":4, "x":131, "y":3},
{"matrix":[0, 10], "flags":4, "x":146, "y":3},
{"matrix":[0, 11], "flags":4, "x":161, "y":3},
{"matrix":[0, 12], "flags":4, "x":175, "y":3},
{"matrix":[0, 13], "flags":1, "x":197, "y":3},
{"matrix":[1, 0], "flags":1, "x":3, "y":17},
{"matrix":[1, 1], "flags":8, "x":21, "y":17},
{"matrix":[1, 2], "flags":8, "x":36, "y":17},
{"matrix":[1, 3], "flags":8, "x":51, "y":17},
{"matrix":[1, 4], "flags":4, "x":65, "y":17},
{"matrix":[1, 5], "flags":4, "x":80, "y":17},
{"matrix":[1, 6], "flags":4, "x":95, "y":17},
{"matrix":[1, 7], "flags":4, "x":109, "y":17},
{"matrix":[1, 8], "flags":4, "x":124, "y":17},
{"matrix":[1, 9], "flags":4, "x":139, "y":17},
{"matrix":[1, 10], "flags":4, "x":153, "y":17},
{"matrix":[1, 11], "flags":4, "x":168, "y":17},
{"matrix":[1, 12], "flags":4, "x":183, "y":17},
{"matrix":[1, 13], "flags":1, "x":201, "y":17},
{"matrix":[1, 15], "flags":1, "x":223, "y":17},
{"matrix":[2, 0], "flags":8, "x":5, "y":32},
{"matrix":[2, 1], "flags":4, "x":25, "y":32},
{"matrix":[2, 2], "flags":4, "x":40, "y":32},
{"matrix":[2, 3], "flags":4, "x":54, "y":32},
{"matrix":[2, 4], "flags":4, "x":69, "y":32},
{"matrix":[2, 5], "flags":4, "x":84, "y":32},
{"matrix":[2, 6], "flags":4, "x":98, "y":32},
{"matrix":[2, 7], "flags":4, "x":113, "y":32},
{"matrix":[2, 8], "flags":4, "x":128, "y":32},
{"matrix":[2, 9], "flags":4, "x":142, "y":32},
{"matrix":[2, 10], "flags":4, "x":157, "y":32},
{"matrix":[2, 11], "flags":4, "x":172, "y":32},
{"matrix":[2, 13], "flags":1, "x":195, "y":32},
{"matrix":[2, 15], "flags":1, "x":223, "y":32},
{"matrix":[3, 0], "flags":1, "x":9, "y":47},
{"matrix":[3, 2], "flags":4, "x":32, "y":47},
{"matrix":[3, 3], "flags":4, "x":47, "y":47},
{"matrix":[3, 4], "flags":4, "x":62, "y":47},
{"matrix":[3, 5], "flags":4, "x":76, "y":47},
{"matrix":[3, 6], "flags":4, "x":91, "y":47},
{"matrix":[3, 7], "flags":4, "x":106, "y":47},
{"matrix":[3, 8], "flags":4, "x":120, "y":47},
{"matrix":[3, 9], "flags":4, "x":135, "y":47},
{"matrix":[3, 10], "flags":4, "x":150, "y":47},
{"matrix":[3, 11], "flags":4, "x":164, "y":47},
{"matrix":[3, 13], "flags":1, "x":185, "y":47},
{"matrix":[3, 14], "flags":1, "x":209, "y":49},
{"matrix":[4, 0], "flags":1, "x":1, "y":62},
{"matrix":[4, 1], "flags":1, "x":20, "y":62},
{"matrix":[4, 2], "flags":1, "x":38, "y":62},
{"matrix":[4, 6], "flags":4, "x":93, "y":62},
{"matrix":[4, 10], "flags":1, "x":146, "y":62},
{"matrix":[4, 11], "flags":1, "x":161, "y":62},
{"matrix":[4, 12], "flags":1, "x":176, "y":62},
{"matrix":[4, 13], "flags":1, "x":194, "y":64},
{"matrix":[4, 14], "flags":1, "x":209, "y":64},
{"matrix":[4, 15], "flags":1, "x":223, "y":64}
]
}
}

View file

@ -16,15 +16,15 @@
#include QMK_KEYBOARD_H
// clang-format off
enum layers{
MAC_BASE,
WIN_BASE,
MAC_FN1,
WIN_FN1,
FN2
enum layers {
MAC_BASE,
WIN_BASE,
MAC_FN1,
WIN_FN1,
FN2,
};
// clang-format off
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
[MAC_BASE] = LAYOUT_ansi_knob_67(
KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, KC_MUTE,
@ -62,10 +62,8 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______),
};
// clang-format on
#if defined(ENCODER_MAP_ENABLE)
const uint16_t PROGMEM encoder_map[][1][2] = {
const uint16_t PROGMEM encoder_map[][NUM_ENCODERS][2] = {
[MAC_BASE] = {ENCODER_CCW_CW(KC_VOLD, KC_VOLU) },
[WIN_BASE] = {ENCODER_CCW_CW(KC_VOLD, KC_VOLU) },
[MAC_FN1] = {ENCODER_CCW_CW(RGB_VAD, RGB_VAI) },

View file

@ -16,15 +16,15 @@
#include QMK_KEYBOARD_H
// clang-format off
enum layers{
MAC_BASE,
WIN_BASE,
MAC_FN1,
WIN_FN1,
FN2
enum layers {
MAC_BASE,
WIN_BASE,
MAC_FN1,
WIN_FN1,
FN2,
};
// clang-format off
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
[MAC_BASE] = LAYOUT_ansi_knob_67(
KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, KC_MUTE,
@ -62,10 +62,8 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______),
};
// clang-format on
#if defined(ENCODER_MAP_ENABLE)
const uint16_t PROGMEM encoder_map[][1][2] = {
const uint16_t PROGMEM encoder_map[][NUM_ENCODERS][2] = {
[MAC_BASE] = {ENCODER_CCW_CW(KC_VOLD, KC_VOLU) },
[WIN_BASE] = {ENCODER_CCW_CW(KC_VOLD, KC_VOLU) },
[MAC_FN1] = {ENCODER_CCW_CW(RGB_VAD, RGB_VAI) },

View file

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

View file

@ -18,7 +18,6 @@
/* turn off effects when suspended */
#define RGB_DISABLE_WHEN_USB_SUSPENDED
#define LED_DISABLE_WHEN_USB_SUSPENDED
/* DIP switch */
#define DIP_SWITCH_PINS \
@ -78,5 +77,8 @@
#define FEE_DENSITY_BYTES FEE_PAGE_SIZE
#define DYNAMIC_KEYMAP_EEPROM_MAX_ADDR 2047
/* Old default behavior of mod-taps */
#define HOLD_ON_OTHER_KEY_PRESS
/* Factory test keys */
#define FN_KEY2 MO(4)

View file

@ -14,9 +14,9 @@
"extrakey": true,
"nkro": true,
"dip_switch": true,
"raw": true,
"encoder": true,
"rgb_matrix": true
"rgb_matrix": true,
"raw": true
},
"diode_direction": "ROW2COL",
"matrix_size": {
@ -34,6 +34,9 @@
{"pin_a": "A10", "pin_b": "A0", "resolution": 4}
]
},
"dynamic_keymap": {
"layer_count": 5
},
"rgb_matrix": {
"driver": "CKLED2001",
"animations": {

View file

@ -0,0 +1,55 @@
/* Copyright 2023 @ Keychron (https://www.keychron.com)
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#pragma once
/* Encoder Configuration */
#define ENCODER_DEFAULT_POS 0x3
#ifdef RGB_MATRIX_ENABLE
/* RGB Matrix Driver Configuration */
# define DRIVER_COUNT 2
# define DRIVER_ADDR_1 0b1110111
# define DRIVER_ADDR_2 0b1110100
/* RGB Matrix Configuration */
# define DRIVER_1_LED_TOTAL 29
# define DRIVER_2_LED_TOTAL 38
# define RGB_MATRIX_LED_COUNT (DRIVER_1_LED_TOTAL + DRIVER_2_LED_TOTAL)
/* Set to infinit, which is use in USB mode by default */
# define RGB_MATRIX_TIMEOUT RGB_MATRIX_TIMEOUT_INFINITE
/* Allow to shutdown driver to save power */
# define RGB_MATRIX_DRIVER_SHUTDOWN_ENABLE
/* Turn off backllit if brightness value is low */
# define RGB_MATRIX_BRIGHTNESS_TURN_OFF_VAL 48
/* Indication led index */
# define CAPS_LOCK_INDEX 28
# define LOW_BAT_IND_INDEX 60
# define RGB_MATRIX_KEYPRESSES
# define RGB_MATRIX_FRAMEBUFFER_EFFECTS
/* Use the first 9 channels of led driver */
# define PHASE_CHANNEL MSKPHASE_9CHANNEL
/* Set LED driver current */
# define CKLED2001_CURRENT_TUNE \
{ 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40 }
#endif

View file

@ -0,0 +1,160 @@
{
"usb": {
"pid": "0x0621",
"device_version": "1.0.0"
},
"layouts": {
"LAYOUT_iso_68": {
"layout": [
{"matrix":[0,0], "x":0, "y":0.25},
{"matrix":[0,1], "x":1, "y":0.25},
{"matrix":[0,2], "x":2, "y":0.25},
{"matrix":[0,3], "x":3, "y":0.25},
{"matrix":[0,4], "x":4, "y":0.25},
{"matrix":[0,5], "x":5, "y":0.25},
{"matrix":[0,6], "x":6, "y":0.25},
{"matrix":[0,7], "x":7, "y":0.25},
{"matrix":[0,8], "x":8, "y":0.25},
{"matrix":[0,9], "x":9, "y":0.25},
{"matrix":[0,10], "x":10, "y":0.25},
{"matrix":[0,11], "x":11, "y":0.25},
{"matrix":[0,12], "x":12, "y":0.25},
{"matrix":[0,13], "x":13, "y":0.25, "w":2},
{"matrix":[0,15], "x":15.25, "y":0},
{"matrix":[1,0], "x":0, "y":1.25, "w":1.5},
{"matrix":[1,1], "x":1.5, "y":1.25},
{"matrix":[1,2], "x":2.5, "y":1.25},
{"matrix":[1,3], "x":3.5, "y":1.25},
{"matrix":[1,4], "x":4.5, "y":1.25},
{"matrix":[1,5], "x":5.5, "y":1.25},
{"matrix":[1,6], "x":6.5, "y":1.25},
{"matrix":[1,7], "x":7.5, "y":1.25},
{"matrix":[1,8], "x":8.5, "y":1.25},
{"matrix":[1,9], "x":9.5, "y":1.25},
{"matrix":[1,10], "x":10.5, "y":1.25},
{"matrix":[1,11], "x":11.5, "y":1.25},
{"matrix":[1,12], "x":12.5, "y":1.25},
{"matrix":[1,15], "x":15.25, "y":1.25},
{"matrix":[2,0], "x":0, "y":2.25, "w":1.75},
{"matrix":[2,1], "x":1.75, "y":2.25},
{"matrix":[2,2], "x":2.75, "y":2.25},
{"matrix":[2,3], "x":3.75, "y":2.25},
{"matrix":[2,4], "x":4.75, "y":2.25},
{"matrix":[2,5], "x":5.75, "y":2.25},
{"matrix":[2,6], "x":6.75, "y":2.25},
{"matrix":[2,7], "x":7.75, "y":2.25},
{"matrix":[2,8], "x":8.75, "y":2.25},
{"matrix":[2,9], "x":9.75, "y":2.25},
{"matrix":[2,10], "x":10.75, "y":2.25},
{"matrix":[2,11], "x":11.75, "y":2.25},
{"matrix":[2,13], "x":12.75, "y":2.25},
{"matrix":[1,13], "x":13.75, "y":1.25, "w":1.25, "h":2},
{"matrix":[2,15], "x":15.25, "y":2.25},
{"matrix":[3,0], "x":0, "y":3.25, "w":1.25},
{"matrix":[3,1], "x":1.25, "y":3.25},
{"matrix":[3,2], "x":2.25, "y":3.25},
{"matrix":[3,3], "x":3.25, "y":3.25},
{"matrix":[3,4], "x":4.25, "y":3.25},
{"matrix":[3,5], "x":5.25, "y":3.25},
{"matrix":[3,6], "x":6.25, "y":3.25},
{"matrix":[3,7], "x":7.25, "y":3.25},
{"matrix":[3,8], "x":8.25, "y":3.25},
{"matrix":[3,9], "x":9.25, "y":3.25},
{"matrix":[3,10], "x":10.25, "y":3.25},
{"matrix":[3,11], "x":11.25, "y":3.25},
{"matrix":[3,13], "x":12.25, "y":3.25, "w":1.75},
{"matrix":[3,14], "x":14.25, "y":3.5},
{"matrix":[4,0], "x":0, "y":4.25, "w":1.24},
{"matrix":[4,1], "x":1.24, "y":4.25, "w":1.25},
{"matrix":[4,2], "x":2.49, "y":4.25, "w":1.25},
{"matrix":[4,6], "x":3.74, "y":4.25, "w":6.25},
{"matrix":[4,10], "x":9.99, "y":4.25},
{"matrix":[4,11], "x":10.99, "y":4.25},
{"matrix":[4,12], "x":11.99, "y":4.25},
{"matrix":[4,13], "x":13.25, "y":4.5},
{"matrix":[4,14], "x":14.25, "y":4.5},
{"matrix":[4,15], "x":15.25, "y":4.5}
]
}
},
"rgb_matrix": {
"layout": [
{"matrix":[0, 0], "flags":1, "x":0, "y":4},
{"matrix":[0, 1], "flags":4, "x":15, "y":4},
{"matrix":[0, 2], "flags":4, "x":29, "y":4},
{"matrix":[0, 3], "flags":4, "x":44, "y":4},
{"matrix":[0, 4], "flags":4, "x":59, "y":4},
{"matrix":[0, 5], "flags":4, "x":73, "y":4},
{"matrix":[0, 6], "flags":4, "x":88, "y":4},
{"matrix":[0, 7], "flags":4, "x":103, "y":4},
{"matrix":[0, 8], "flags":4, "x":117, "y":4},
{"matrix":[0, 9], "flags":4, "x":132, "y":4},
{"matrix":[0, 10], "flags":4, "x":146, "y":4},
{"matrix":[0, 11], "flags":4, "x":161, "y":4},
{"matrix":[0, 12], "flags":4, "x":176, "y":4},
{"matrix":[0, 13], "flags":1, "x":198, "y":4},
{"matrix":[1, 0], "flags":1, "x":4, "y":15},
{"matrix":[1, 1], "flags":8, "x":22, "y":15},
{"matrix":[1, 2], "flags":8, "x":37, "y":15},
{"matrix":[1, 3], "flags":8, "x":51, "y":15},
{"matrix":[1, 4], "flags":4, "x":66, "y":15},
{"matrix":[1, 5], "flags":4, "x":81, "y":15},
{"matrix":[1, 6], "flags":4, "x":95, "y":15},
{"matrix":[1, 7], "flags":4, "x":110, "y":15},
{"matrix":[1, 8], "flags":4, "x":125, "y":15},
{"matrix":[1, 9], "flags":4, "x":139, "y":15},
{"matrix":[1, 10], "flags":4, "x":154, "y":15},
{"matrix":[1, 11], "flags":4, "x":168, "y":15},
{"matrix":[1, 12], "flags":4, "x":183, "y":15},
{"matrix":[1, 15], "flags":1, "x":224, "y":15},
{"matrix":[2, 0], "flags":8, "x":5, "y":30},
{"matrix":[2, 1], "flags":4, "x":26, "y":30},
{"matrix":[2, 2], "flags":4, "x":40, "y":30},
{"matrix":[2, 3], "flags":4, "x":55, "y":30},
{"matrix":[2, 4], "flags":4, "x":70, "y":30},
{"matrix":[2, 5], "flags":4, "x":84, "y":30},
{"matrix":[2, 6], "flags":4, "x":99, "y":30},
{"matrix":[2, 7], "flags":4, "x":114, "y":30},
{"matrix":[2, 8], "flags":4, "x":128, "y":30},
{"matrix":[2, 9], "flags":4, "x":143, "y":30},
{"matrix":[2, 10], "flags":4, "x":158, "y":30},
{"matrix":[2, 11], "flags":4, "x":172, "y":30},
{"matrix":[2, 13], "flags":1, "x":187, "y":30},
{"matrix":[1, 13], "flags":1, "x":207, "y":25},
{"matrix":[2, 15], "flags":1, "x":224, "y":30},
{"matrix":[3, 0], "flags":1, "x":2, "y":45},
{"matrix":[3, 1], "flags":1, "x":18, "y":45},
{"matrix":[3, 2], "flags":4, "x":33, "y":45},
{"matrix":[3, 3], "flags":4, "x":48, "y":45},
{"matrix":[3, 4], "flags":4, "x":62, "y":45},
{"matrix":[3, 5], "flags":4, "x":77, "y":45},
{"matrix":[3, 6], "flags":4, "x":92, "y":45},
{"matrix":[3, 7], "flags":4, "x":106, "y":45},
{"matrix":[3, 8], "flags":4, "x":121, "y":45},
{"matrix":[3, 9], "flags":4, "x":136, "y":45},
{"matrix":[3, 10], "flags":4, "x":150, "y":45},
{"matrix":[3, 11], "flags":4, "x":165, "y":45},
{"matrix":[3, 13], "flags":1, "x":185, "y":45},
{"matrix":[3, 14], "flags":1, "x":209, "y":49},
{"matrix":[4, 0], "flags":1, "x":2, "y":60},
{"matrix":[4, 1], "flags":1, "x":20, "y":60},
{"matrix":[4, 2], "flags":1, "x":38, "y":60},
{"matrix":[4, 6], "flags":4, "x":94, "y":60},
{"matrix":[4, 10], "flags":1, "x":147, "y":60},
{"matrix":[4, 11], "flags":1, "x":161, "y":60},
{"matrix":[4, 12], "flags":1, "x":176, "y":60},
{"matrix":[4, 13], "flags":1, "x":195, "y":64},
{"matrix":[4, 14], "flags":1, "x":209, "y":64},
{"matrix":[4, 15], "flags":1, "x":224, "y":64}
]
}
}

View file

@ -0,0 +1,99 @@
/* Copyright 2023 @ Keychron (https://www.keychron.com)
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include "quantum.h"
#ifdef RGB_MATRIX_ENABLE
const ckled2001_led g_ckled2001_leds[RGB_MATRIX_LED_COUNT] = {
/* Refer to CKLED2001 manual for these locations
* driver
* | R location
* | | G location
* | | | B location
* | | | | */
{0, C_16, A_16, B_16},
{0, C_15, A_15, B_15},
{0, C_14, A_14, B_14},
{0, C_13, A_13, B_13},
{0, C_12, A_12, B_12},
{0, C_11, A_11, B_11},
{0, C_10, A_10, B_10},
{0, C_9, A_9, B_9},
{0, C_8, A_8, B_8},
{0, C_7, A_7, B_7},
{0, C_6, A_6, B_6},
{0, C_5, A_5, B_5},
{0, C_4, A_4, B_4},
{0, C_3, A_3, B_3},
{0, F_16, D_16, E_16},
{0, F_15, D_15, E_15},
{0, F_14, D_14, E_14},
{0, F_13, D_13, E_13},
{0, F_12, D_12, E_12},
{0, F_11, D_11, E_11},
{0, F_10, D_10, E_10},
{0, F_9, D_9, E_9},
{0, F_8, D_8, E_8},
{0, F_7, D_7, E_7},
{0, F_6, D_6, E_6},
{0, F_5, D_5, E_5},
{0, F_4, D_4, E_4},
{0, F_1, D_1, E_1},
{1, C_16, A_16, B_16},
{1, C_15, A_15, B_15},
{1, C_14, A_14, B_14},
{1, C_13, A_13, B_13},
{1, C_12, A_12, B_12},
{1, C_11, A_11, B_11},
{1, C_10, A_10, B_10},
{1, C_9, A_9, B_9},
{1, C_8, A_8, B_8},
{1, C_7, A_7, B_7},
{1, C_6, A_6, B_6},
{1, C_5, A_5, B_5},
{1, C_3, A_3, B_3},
{0, F_3, D_3, E_3},
{1, C_1, A_1, B_1},
{1, I_16, G_16, H_16},
{1, I_15, G_15, H_15},
{1, I_14, G_14, H_14},
{1, I_13, G_13, H_13},
{1, I_12, G_12, H_12},
{1, I_11, G_11, H_11},
{1, I_10, G_10, H_10},
{1, I_9, G_9, H_9},
{1, I_8, G_8, H_8},
{1, I_7, G_7, H_7},
{1, I_6, G_6, H_6},
{1, I_5, G_5, H_5},
{1, I_3, G_3, H_3},
{1, I_2, G_2, H_2},
{1, F_16, D_16, E_16},
{1, F_15, D_15, E_15},
{1, F_14, D_14, E_14},
{1, F_10, D_10, E_10},
{1, F_6, D_6, E_6},
{1, F_5, D_5, E_5},
{1, F_4, D_4, E_4},
{1, F_3, D_3, E_3},
{1, F_2, D_2, E_2},
{1, F_1, D_1, E_1}
};
#endif

View file

@ -0,0 +1,73 @@
/* Copyright 2023 @ Keychron (https://www.keychron.com)
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include QMK_KEYBOARD_H
enum layers{
MAC_BASE,
WIN_BASE,
MAC_FN1,
WIN_FN1,
FN2,
};
// clang-format off
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
[MAC_BASE] = LAYOUT_iso_68(
KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, KC_MUTE,
KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_DEL,
KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_NUHS, KC_ENT, KC_HOME,
KC_LSFT, KC_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_LOPTN, KC_LCMMD, KC_SPC, KC_RCMMD,MO(MAC_FN1),MO(FN2), KC_LEFT, KC_DOWN, KC_RGHT),
[WIN_BASE] = LAYOUT_iso_68(
KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, KC_MUTE,
KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_DEL,
KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_NUHS, KC_ENT, KC_HOME,
KC_LSFT, KC_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_LGUI, KC_LALT, KC_SPC, KC_RALT, MO(WIN_FN1),MO(FN2), KC_LEFT, KC_DOWN, KC_RGHT),
[MAC_FN1] = LAYOUT_iso_68(
KC_GRV, KC_BRID, KC_BRIU, KC_MCTL, KC_LPAD, RGB_VAD, RGB_VAI, KC_MPRV, KC_MPLY, KC_MNXT, KC_MUTE, KC_VOLD, KC_VOLU, _______, RGB_TOG,
_______, BT_HST1, BT_HST2, BT_HST3, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
RGB_TOG, RGB_MOD, RGB_VAI, RGB_HUI, RGB_SAI, RGB_SPI, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, RGB_RMOD, RGB_VAD, RGB_HUD, RGB_SAD, RGB_SPD, NK_TOGG, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______),
[WIN_FN1] = LAYOUT_iso_68(
KC_GRV, KC_BRID, KC_BRIU, KC_TASK, KC_FILE, RGB_VAD, RGB_VAI, KC_MPRV, KC_MPLY, KC_MNXT, KC_MUTE, KC_VOLD, KC_VOLU, _______, RGB_TOG,
_______, BT_HST1, BT_HST2, BT_HST3, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
RGB_TOG, RGB_MOD, RGB_VAI, RGB_HUI, RGB_SAI, RGB_SPI, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, RGB_RMOD, RGB_VAD, RGB_HUD, RGB_SAD, RGB_SPD, NK_TOGG, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______),
[FN2] = LAYOUT_iso_68(
KC_TILD, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, BAT_LVL, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______),
};
#if defined(ENCODER_MAP_ENABLE)
const uint16_t PROGMEM encoder_map[NUM_ENCODERS][][2] = {
[MAC_BASE] = {ENCODER_CCW_CW(KC_VOLD, KC_VOLU) },
[WIN_BASE] = {ENCODER_CCW_CW(KC_VOLD, KC_VOLU) },
[MAC_FN1] = {ENCODER_CCW_CW(RGB_VAD, RGB_VAI) },
[WIN_FN1] = {ENCODER_CCW_CW(RGB_VAD, RGB_VAI) },
[FN2] = {ENCODER_CCW_CW(_______, _______) }
};
#endif // ENCODER_MAP_ENABLE

View file

@ -0,0 +1 @@
ENCODER_MAP_ENABLE = yes

View file

@ -0,0 +1,73 @@
/* Copyright 2023 @ Keychron (https://www.keychron.com)
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include QMK_KEYBOARD_H
enum layers{
MAC_BASE,
WIN_BASE,
MAC_FN1,
WIN_FN1,
FN2,
};
// clang-format off
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
[MAC_BASE] = LAYOUT_iso_68(
KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, KC_MUTE,
KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_DEL,
KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_NUHS, KC_ENT, KC_HOME,
KC_LSFT, KC_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_LOPTN, KC_LCMMD, KC_SPC, KC_RCMMD,MO(MAC_FN1),MO(FN2), KC_LEFT, KC_DOWN, KC_RGHT),
[WIN_BASE] = LAYOUT_iso_68(
KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, KC_MUTE,
KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_DEL,
KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_NUHS, KC_ENT, KC_HOME,
KC_LSFT, KC_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_LGUI, KC_LALT, KC_SPC, KC_RALT, MO(WIN_FN1),MO(FN2), KC_LEFT, KC_DOWN, KC_RGHT),
[MAC_FN1] = LAYOUT_iso_68(
KC_GRV, KC_BRID, KC_BRIU, KC_MCTL, KC_LPAD, RGB_VAD, RGB_VAI, KC_MPRV, KC_MPLY, KC_MNXT, KC_MUTE, KC_VOLD, KC_VOLU, _______, RGB_TOG,
_______, BT_HST1, BT_HST2, BT_HST3, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
RGB_TOG, RGB_MOD, RGB_VAI, RGB_HUI, RGB_SAI, RGB_SPI, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, RGB_RMOD, RGB_VAD, RGB_HUD, RGB_SAD, RGB_SPD, NK_TOGG, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______),
[WIN_FN1] = LAYOUT_iso_68(
KC_GRV, KC_BRID, KC_BRIU, KC_TASK, KC_FILE, RGB_VAD, RGB_VAI, KC_MPRV, KC_MPLY, KC_MNXT, KC_MUTE, KC_VOLD, KC_VOLU, _______, RGB_TOG,
_______, BT_HST1, BT_HST2, BT_HST3, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
RGB_TOG, RGB_MOD, RGB_VAI, RGB_HUI, RGB_SAI, RGB_SPI, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, RGB_RMOD, RGB_VAD, RGB_HUD, RGB_SAD, RGB_SPD, NK_TOGG, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______),
[FN2] = LAYOUT_iso_68(
KC_TILD, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, BAT_LVL, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______),
};
#if defined(ENCODER_MAP_ENABLE)
const uint16_t PROGMEM encoder_map[][NUM_ENCODERS][2] = {
[MAC_BASE] = {ENCODER_CCW_CW(KC_VOLD, KC_VOLU) },
[WIN_BASE] = {ENCODER_CCW_CW(KC_VOLD, KC_VOLU) },
[MAC_FN1] = {ENCODER_CCW_CW(RGB_VAD, RGB_VAI) },
[WIN_FN1] = {ENCODER_CCW_CW(RGB_VAD, RGB_VAI) },
[FN2] = {ENCODER_CCW_CW(_______, _______) }
};
#endif // ENCODER_MAP_ENABLE

View file

@ -0,0 +1,2 @@
VIA_ENABLE = yes
ENCODER_MAP_ENABLE = yes

View file

@ -0,0 +1 @@
# This file intentionally blank

View file

@ -20,29 +20,11 @@
#define HC595_SHCP A1
#define HC595_DS A7
#define DIRECT_COL_NUM 0
pin_t row_pins[MATRIX_ROWS] = MATRIX_ROW_PINS;
pin_t col_pins[MATRIX_COLS] = MATRIX_COL_PINS;
static inline void setPinOutput_writeLow(pin_t pin) {
ATOMIC_BLOCK_FORCEON {
setPinOutput(pin);
writePinLow(pin);
}
}
static inline void setPinOutput_writeHigh(pin_t pin) {
ATOMIC_BLOCK_FORCEON {
setPinOutput(pin);
writePinHigh(pin);
}
}
static inline void setPinInput_high(pin_t pin) {
ATOMIC_BLOCK_FORCEON {
setPinInputHigh(pin);
}
}
static inline uint8_t readMatrixPin(pin_t pin) {
if (pin != NO_PIN) {
return readPin(pin);
@ -51,6 +33,16 @@ static inline uint8_t readMatrixPin(pin_t pin) {
}
}
static inline void setPinOutput_writeLow(pin_t pin) {
setPinOutput(pin);
writePinLow(pin);
}
static inline void setPinOutput_writeHigh(pin_t pin) {
setPinOutput(pin);
writePinHigh(pin);
}
static inline void HC595_delay(uint16_t n) {
while (n-- > 0) {
asm volatile("nop" ::: "memory");
@ -58,112 +50,98 @@ static inline void HC595_delay(uint16_t n) {
}
static void HC595_output(uint16_t data) {
ATOMIC_BLOCK_FORCEON {
for (uint8_t i = 0; i < MATRIX_COLS; i++) {
if (data & 0x1) {
writePinHigh(HC595_DS);
} else {
writePinLow(HC595_DS);
}
uint8_t i;
uint8_t n = 1;
data = data >> 1;
writePinHigh(HC595_SHCP);
HC595_delay(1);
writePinLow(HC595_SHCP);
HC595_delay(1);
}
writePinHigh(HC595_STCP);
HC595_delay(1);
writePinLow(HC595_STCP);
HC595_delay(1);
}
}
static void HC595_output_oneBit(uint8_t data) {
ATOMIC_BLOCK_FORCEON {
for (i = 1; i < (MATRIX_COLS - DIRECT_COL_NUM); i++) {
writePinLow(HC595_SHCP);
if (data & 0x1) {
writePinHigh(HC595_DS);
} else {
writePinLow(HC595_DS);
}
HC595_delay(n);
writePinHigh(HC595_SHCP);
HC595_delay(1);
writePinLow(HC595_SHCP);
HC595_delay(1);
HC595_delay(n);
writePinHigh(HC595_STCP);
HC595_delay(1);
writePinLow(HC595_STCP);
HC595_delay(1);
data = data >> 1;
}
writePinLow(HC595_STCP);
HC595_delay(n);
writePinHigh(HC595_STCP);
}
static bool select_col(uint8_t col) {
pin_t pin = col_pins[col];
static void HC595_output_bit(uint8_t data) {
uint8_t n = 1;
if (pin != NO_PIN) {
setPinOutput_writeLow(pin);
return true;
writePinLow(HC595_SHCP);
if (data & 0x1) {
writePinHigh(HC595_DS);
} else {
if (col == 0) {
HC595_output_oneBit(0x00);
}
return true;
writePinLow(HC595_DS);
}
HC595_delay(n);
writePinHigh(HC595_SHCP);
HC595_delay(n);
writePinLow(HC595_STCP);
HC595_delay(n);
writePinHigh(HC595_STCP);
}
static void select_col(uint8_t col) {
if (col < DIRECT_COL_NUM) {
setPinOutput_writeLow(col_pins[col]);
} else {
if (col == DIRECT_COL_NUM) {
HC595_output_bit(0x00);
}
}
return false;
}
static void unselect_col(uint8_t col) {
pin_t pin = col_pins[col];
if (pin != NO_PIN) {
if (col < DIRECT_COL_NUM) {
#ifdef MATRIX_UNSELECT_DRIVE_HIGH
setPinOutput_writeHigh(pin);
setPinOutput_writeHigh(col_pins[col]);
#else
setPinInput_high(pin);
setPinInputHigh(col_pins[col]);
#endif
} else {
HC595_output_oneBit(0x01);
HC595_output_bit(0x01);
}
}
static void unselect_cols(void) {
for (uint8_t x = 0; x < MATRIX_COLS; x++) {
pin_t pin = col_pins[x];
if (pin != NO_PIN) {
if (x < DIRECT_COL_NUM) {
#ifdef MATRIX_UNSELECT_DRIVE_HIGH
setPinOutput_writeHigh(pin);
setPinOutput_writeHigh(col_pins[x]);
#else
setPinInput_high(pin);
setPinInputHigh(col_pins[x]);
#endif
} else {
if (x == 0) HC595_output(0xFFFF);
if (x == DIRECT_COL_NUM) HC595_output(0xFFFF);
break;
}
}
}
void select_all_cols(void) {
for (uint8_t x = 0; x < MATRIX_COLS; x++) {
pin_t pin = col_pins[x];
if (pin != NO_PIN) {
setPinOutput_writeLow(pin);
if (x < DIRECT_COL_NUM) {
setPinOutput_writeLow(col_pins[x]);
} else {
if (x == 0) HC595_output(0x0000);
if (x == DIRECT_COL_NUM) HC595_output(0x0000);
break;
}
}
}
static void matrix_read_rows_on_col(matrix_row_t current_matrix[], uint8_t current_col, matrix_row_t row_shifter) {
bool key_pressed = false;
// Select col
if (!select_col(current_col)) { // select col
return; // skip NO_PIN col
}
matrix_output_select_delay();
select_col(current_col); // select col
HC595_delay(200);
// For each row...
for (uint8_t row_index = 0; row_index < MATRIX_ROWS; row_index++) {
@ -171,7 +149,6 @@ static void matrix_read_rows_on_col(matrix_row_t current_matrix[], uint8_t curre
if (readMatrixPin(row_pins[row_index]) == 0) {
// Pin LO, set col bit
current_matrix[row_index] |= row_shifter;
key_pressed = true;
} else {
// Pin HI, clear col bit
current_matrix[row_index] &= ~row_shifter;
@ -180,7 +157,7 @@ static void matrix_read_rows_on_col(matrix_row_t current_matrix[], uint8_t curre
// Unselect col
unselect_col(current_col);
matrix_output_unselect_delay(current_col, key_pressed); // wait for all Row signals to go HIGH
HC595_delay(200); // wait for all Row signals to go HIGH
}
void matrix_init_custom(void) {
@ -190,7 +167,7 @@ void matrix_init_custom(void) {
for (uint8_t x = 0; x < MATRIX_ROWS; x++) {
if (row_pins[x] != NO_PIN) {
setPinInput_high(row_pins[x]);
setPinInputHigh(row_pins[x]);
}
}

View file

@ -34,8 +34,9 @@ typedef struct PACKED {
uint8_t keycode[3];
} key_combination_t;
static uint32_t siri_timer_buffer = 0;
static uint8_t mac_keycode[4] = {KC_LOPT, KC_ROPT, KC_LCMD, KC_RCMD};
static uint32_t factory_timer_buffer = 0;
static uint32_t siri_timer_buffer = 0;
static uint8_t mac_keycode[4] = {KC_LOPT, KC_ROPT, KC_LCMD, KC_RCMD};
key_combination_t key_comb_list[4] = {
{2, {KC_LWIN, KC_TAB}}, // Task (win)
@ -133,10 +134,9 @@ bool process_record_kb(uint16_t keycode, keyrecord_t *record) {
return true;
}
#ifdef KC_BLUETOOTH_ENABLE
static void encoder0_pad_cb(void *param) {
(void)param;
encoder_inerrupt_read(0);
#if defined(KC_BLUETOOTH_ENABLE) && defined(ENCODER_ENABLE)
static void encoder_pad_cb(void *param) {
encoder_inerrupt_read((uint32_t)param & 0XFF);
}
#endif
@ -145,7 +145,8 @@ void keyboard_post_init_kb(void) {
#ifdef KC_BLUETOOTH_ENABLE
/* Currently we don't use this reset pin */
palSetLineMode(CKBT51_RESET_PIN, PAL_MODE_UNCONNECTED);
palSetLineMode(CKBT51_RESET_PIN, PAL_MODE_OUTPUT_PUSHPULL);
palWriteLine(CKBT51_RESET_PIN, PAL_HIGH);
/* IMPORTANT: DO NOT enable internal pull-up resistor
* as there is an external pull-down resistor.
@ -155,20 +156,32 @@ void keyboard_post_init_kb(void) {
ckbt51_init(false);
bluetooth_init();
# ifdef ENCODER_ENABLE
pin_t encoders_pad_a[NUM_ENCODERS] = ENCODERS_PAD_A;
pin_t encoders_pad_b[NUM_ENCODERS] = ENCODERS_PAD_B;
for (uint8_t i = 0; i < NUM_ENCODERS; i++) {
for (uint32_t i = 0; i < NUM_ENCODERS; i++) {
palEnableLineEvent(encoders_pad_a[i], PAL_EVENT_MODE_BOTH_EDGES);
palEnableLineEvent(encoders_pad_b[i], PAL_EVENT_MODE_BOTH_EDGES);
palSetLineCallback(encoders_pad_a[i], encoder0_pad_cb, NULL);
palSetLineCallback(encoders_pad_b[i], encoder0_pad_cb, NULL);
palSetLineCallback(encoders_pad_a[i], encoder_pad_cb, (void *)i);
palSetLineCallback(encoders_pad_b[i], encoder_pad_cb, (void *)i);
}
# endif
#endif
keyboard_post_init_user();
}
void matrix_scan_kb(void) {
if (factory_timer_buffer && timer_elapsed32(factory_timer_buffer) > 2000) {
factory_timer_buffer = 0;
if (bt_factory_reset) {
bt_factory_reset = false;
palWriteLine(CKBT51_RESET_PIN, PAL_LOW);
wait_ms(5);
palWriteLine(CKBT51_RESET_PIN, PAL_HIGH);
}
}
if (siri_timer_buffer && sync_timer_elapsed32(siri_timer_buffer) > 500) {
siri_timer_buffer = 0;
unregister_code(KC_LGUI);
@ -184,7 +197,6 @@ void matrix_scan_kb(void) {
#ifdef KC_BLUETOOTH_ENABLE
static void ckbt51_param_init(void) {
/* Set bluetooth device name */
// ckbt51_set_local_name(STR(PRODUCT));
ckbt51_set_local_name(PRODUCT);
/* Set bluetooth parameters */
module_param_t param = {.event_mode = 0x02,
@ -201,8 +213,8 @@ static void ckbt51_param_init(void) {
void bluetooth_enter_disconnected_kb(uint8_t host_idx) {
if (bt_factory_reset) {
bt_factory_reset = false;
ckbt51_param_init();
factory_timer_buffer = timer_read32();
}
/* CKBT51 bluetooth module boot time is slower, it enters disconnected after boot,
so we place initialization here. */
@ -297,7 +309,3 @@ void raw_hid_receive(uint8_t *data, uint8_t length) {
}
}
#endif
void restart_usb_driver(USBDriver *usbp) {
(void)usbp;
}

View file

@ -1,20 +1,22 @@
# Keychron Q2 Pro
![Keychron Q2 Pro]()
![Keychron Q2 Pro](https://i.imgur.com/sRf98x5.jpg)
A customizable 60% keyboard.
* Keyboard Maintainer: [Keychron](https://github.com/keychron)
* Hardware Supported: Keychron Q2 Pro
* Hardware Availability: [Keychron Q2 Pro]()
* Hardware Availability: [Keychron Q2 Pro QMK/VIA Wireless Custom Mechanical Keyboard](https://www.keychron.com/products/keychron-q2-pro-qmk-via-wireless-custom-mechanical-keyboard)
Make example for this keyboard (after setting up your build environment):
make keychron/q2_pro/ansi_encoder:default
make keychron/q2_pro/iso_encoder:default
Flashing example for this keyboard:
make keychron/q2_pro/ansi_encoder:default:flash
make keychron/q2_pro/iso_encoder:default:flash
**Reset Key**: Connect the USB cable, toggle mode switch to "Off", hold down the *Esc* key or reset button underneath space bar, then toggle then switch to "Cable".

View file

@ -0,0 +1,250 @@
{
"name": "Keychron Q2 Pro ANSI Knob",
"vendorId": "0x3434",
"productId": "0x0620",
"keycodes": ["qmk_lighting"],
"menus": [
{
"label": "Lighting",
"content": [
{
"label": "Backlight",
"content": [
{
"label": "Brightness",
"type": "range",
"options": [0, 255],
"content": ["id_qmk_rgb_matrix_brightness", 3, 1]
},
{
"label": "Effect",
"type": "dropdown",
"content": ["id_qmk_rgb_matrix_effect", 3, 2],
"options": [
["None", 0],
["Solid Color", 1],
["Breathing", 2],
["Band Spiral Val", 3],
["Cycle All", 4],
["Cycle Left Right", 5],
["Cycle Up Down", 6],
["Rainbow Moving Chevron", 7],
["Cycle Out In", 8],
["Cycle Out In Dual", 9],
["Cycle Pinwheel", 10],
["Cycle Spiral", 11],
["Dual Beacon", 12],
["Rainbow Beacon", 13],
["Jellybean Raindrops", 14],
["Pixel Rain", 15],
["Typing Heatmap", 16],
["Digital Rain", 17],
["Reactive Simple", 18],
["Reactive Multiwide", 19],
["Reactive Multinexus", 20],
["Splash", 21],
["Solid Splash", 22]
]
},
{
"showIf": "{id_qmk_rgb_matrix_effect} > 1",
"label": "Effect Speed",
"type": "range",
"options": [0, 255],
"content": ["id_qmk_rgb_matrix_effect_speed", 3, 3]
},
{
"showIf": "{id_qmk_rgb_matrix_effect} != 0 && ( {id_qmk_rgb_matrix_effect} < 4 || {id_qmk_rgb_matrix_effect} == 18 || ({id_qmk_rgb_matrix_effect} > 17 && {id_qmk_rgb_matrix_effect} != 21) ) ",
"label": "Color",
"type": "color",
"content": ["id_qmk_rgb_matrix_color", 3, 4]
}
]
}
]
}
],
"customKeycodes": [
{"name": "Left Option", "title": "Left Option", "shortName": "LOpt"},
{"name": "Right Option", "title": "Right Option", "shortName": "ROpt"},
{"name": "Left Cmd", "title": "Left Command", "shortName": "LCmd"},
{"name": "Right Cmd", "title": "Right Command", "shortName": "RCmd"},
{"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"},
{"name": "Siri", "title": "Siri in macOS", "shortName": "Siri"},
{"name": "Bluetooth Host 1", "title": "Bluetooth Host 1", "shortName": "BTH1"},
{"name": "Bluetooth Host 2", "title": "Bluetooth Host 2", "shortName": "BTH2"},
{"name": "Bluetooth Host 3", "title": "Bluetooth Host 3", "shortName": "BTH3"},
{"name": "Battery Level", "title": "Show battery level", "shortName": "Batt"}
],
"matrix": {"rows": 5, "cols": 16},
"layouts": {
"keymap": [
[
{
"x": 15.25,
"c": "#aaaaaa"
},
"0,15\n\n\n\n\n\n\n\n\ne0"
],
[
{
"y": -0.75,
"c": "#777777"
},
"0,0\nESC",
{
"c": "#cccccc"
},
"0,1",
"0,2",
"0,3",
"0,4",
"0,5",
"0,6",
"0,7",
"0,8",
"0,9",
"0,10",
"0,11",
"0,12",
{
"c": "#aaaaaa",
"w": 2
},
"0,13"
],
[
{
"w": 1.5
},
"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": 1.5
},
"1,13",
{
"x": 0.25
},
"1,15"
],
[
{
"w": 1.75
},
"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",
{
"c": "#777777",
"w": 2.25
},
"2,13",
{
"x": 0.25,
"c": "#aaaaaa"
},
"2,15"
],
[
{
"w": 2.25
},
"3,0",
{
"c": "#cccccc"
},
"3,2",
"3,3",
"3,4",
"3,5",
"3,6",
"3,7",
"3,8",
"3,9",
"3,10",
"3,11",
{
"c": "#aaaaaa",
"w": 1.75
},
"3,13"
],
[
{
"y": -0.75,
"x": 14.25,
"c": "#777777"
},
"3,14"
],
[
{
"y": -0.25,
"c": "#aaaaaa",
"w": 1.24
},
"4,0",
{
"w": 1.25
},
"4,1",
{
"w": 1.25
},
"4,2",
{
"c": "#cccccc",
"w": 6.25
},
"4,6",
{
"c": "#aaaaaa"
},
"4,10",
"4,11",
"4,12"
],
[
{
"y": -0.75,
"x": 13.25,
"c": "#777777"
},
"4,13",
"4,14",
"4,15"
]
]
}
}

View file

@ -0,0 +1,254 @@
{
"name": "Keychron Q2 Pro ISO Knob",
"vendorId": "0x3434",
"productId": "0x0621",
"keycodes": ["qmk_lighting"],
"menus": [
{
"label": "Lighting",
"content": [
{
"label": "Backlight",
"content": [
{
"label": "Brightness",
"type": "range",
"options": [0, 255],
"content": ["id_qmk_rgb_matrix_brightness", 3, 1]
},
{
"label": "Effect",
"type": "dropdown",
"content": ["id_qmk_rgb_matrix_effect", 3, 2],
"options": [
["None", 0],
["Solid Color", 1],
["Breathing", 2],
["Band Spiral Val", 3],
["Cycle All", 4],
["Cycle Left Right", 5],
["Cycle Up Down", 6],
["Rainbow Moving Chevron", 7],
["Cycle Out In", 8],
["Cycle Out In Dual", 9],
["Cycle Pinwheel", 10],
["Cycle Spiral", 11],
["Dual Beacon", 12],
["Rainbow Beacon", 13],
["Jellybean Raindrops", 14],
["Pixel Rain", 15],
["Typing Heatmap", 16],
["Digital Rain", 17],
["Reactive Simple", 18],
["Reactive Multiwide", 19],
["Reactive Multinexus", 20],
["Splash", 21],
["Solid Splash", 22]
]
},
{
"showIf": "{id_qmk_rgb_matrix_effect} > 1",
"label": "Effect Speed",
"type": "range",
"options": [0, 255],
"content": ["id_qmk_rgb_matrix_effect_speed", 3, 3]
},
{
"showIf": "{id_qmk_rgb_matrix_effect} != 0 && ( {id_qmk_rgb_matrix_effect} < 4 || {id_qmk_rgb_matrix_effect} == 18 || ({id_qmk_rgb_matrix_effect} > 17 && {id_qmk_rgb_matrix_effect} != 21) ) ",
"label": "Color",
"type": "color",
"content": ["id_qmk_rgb_matrix_color", 3, 4]
}
]
}
]
}
],
"customKeycodes": [
{"name": "Left Option", "title": "Left Option", "shortName": "LOpt"},
{"name": "Right Option", "title": "Right Option", "shortName": "ROpt"},
{"name": "Left Cmd", "title": "Left Command", "shortName": "LCmd"},
{"name": "Right Cmd", "title": "Right Command", "shortName": "RCmd"},
{"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"},
{"name": "Siri", "title": "Siri in macOS", "shortName": "Siri"},
{"name": "Bluetooth Host 1", "title": "Bluetooth Host 1", "shortName": "BTH1"},
{"name": "Bluetooth Host 2", "title": "Bluetooth Host 2", "shortName": "BTH2"},
{"name": "Bluetooth Host 3", "title": "Bluetooth Host 3", "shortName": "BTH3"},
{"name": "Battery Level", "title": "Show battery level", "shortName": "Batt"}
],
"matrix": {"rows": 5, "cols": 16},
"layouts": {
"keymap": [
[
{
"x": 15.25,
"c": "#aaaaaa"
},
"0,15\n\n\n\n\n\n\n\n\ne0"
],
[
{
"y": -0.75,
"c": "#777777"
},
"0,0\nESC",
{
"c": "#cccccc"
},
"0,1",
"0,2",
"0,3",
"0,4",
"0,5",
"0,6",
"0,7",
"0,8",
"0,9",
"0,10",
"0,11",
"0,12",
{
"c": "#aaaaaa",
"w": 2
},
"0,13"
],
[
{
"w": 1.5
},
"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",
{
"x": 0.25,
"c": "#aaaaaa",
"w": 1.25,
"h": 2,
"w2": 1.5,
"h2": 1,
"x2": -0.25
},
"1,13",
{
"x": 0.25
},
"1,15"
],
[
{
"w": 1.75
},
"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",
{
"c": "#aaaaaa"
},
"2,13",
{
"x": 1.5
},
"2,15"
],
[
{
"w": 1.25
},
"3,0",
"3,1",
{
"c": "#cccccc"
},
"3,2",
"3,3",
"3,4",
"3,5",
"3,6",
"3,7",
"3,8",
"3,9",
"3,10",
"3,11",
{
"c": "#aaaaaa",
"w": 1.75
},
"3,13"
],
[
{
"y": -0.75,
"x": 14.25,
"c": "#777777"
},
"3,14"
],
[
{
"y": -0.25,
"c": "#aaaaaa",
"w": 1.24
},
"4,0",
{
"w": 1.25
},
"4,1",
{
"w": 1.25
},
"4,2",
{
"c": "#cccccc",
"w": 6.25
},
"4,6",
{
"c": "#aaaaaa"
},
"4,10",
"4,11",
"4,12"
],
[
{
"y": -0.75,
"x": 13.25,
"c": "#777777"
},
"4,13",
"4,14",
"4,15"
]
]
}
}