Add version iso for keychron q10

This commit is contained in:
lalalademaxiya1
2022-08-15 12:57:46 +08:00
parent 8f2426b7e3
commit 610ec8a726
10 changed files with 851 additions and 1 deletions

View File

@@ -18,6 +18,8 @@
#include "quantum.h"
#if defined(KEYBOARD_keychron_q10_q10_ansi_stm32l432_ec11)
#if defined(KEYBOARD_keychron_q10_q10_ansi_stm32l432_ec11)
# include "q10_ansi_stm32l432_ec11.h"
#elif defined(KEYBOARD_keychron_q10_q10_iso_stm32l432_ec12)
# include "q10_iso_stm32l432_ec12.h"
#endif

View File

@@ -0,0 +1,35 @@
/* 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
/* USB Device descriptor parameter */
#define PRODUCT_ID 0x01a1
#define DEVICE_VER 0x0101
/* RGB Matrix Configuration */
#define DRIVER_1_LED_TOTAL 47
#define DRIVER_2_LED_TOTAL 41
#define DRIVER_LED_TOTAL (DRIVER_1_LED_TOTAL + DRIVER_2_LED_TOTAL)
/* Encoder Configuration */
#define ENCODERS_PAD_A { A10 }
#define ENCODERS_PAD_B { A8 }
#define ENCODER_RESOLUTION 4
#define ENCODER_DEFAULT_POS 0x3
/* Enable caps-lock LED */
#define CAPS_LOCK_LED_INDEX 48

View File

@@ -0,0 +1,205 @@
{
"keyboard_name": "Keychron Q10",
"url": "https://github.com/Keychron",
"maintainer": "lalalademaxiya1",
"layouts": {
"LAYOUT_ansi_89": {
"layout": [
{"label":"Mute", "x":0.25, "y":0},
{"label":"Esc", "x":1.75, "y":0},
{"label":"F1", "x":3, "y":0},
{"label":"F2", "x":4, "y":0},
{"label":"F3", "x":5, "y":0},
{"label":"F4", "x":6, "y":0},
{"label":"F5", "x":7.25, "y":0},
{"label":"F6", "x":8.25, "y":0},
{"label":"F7", "x":11, "y":0},
{"label":"F8", "x":12, "y":0},
{"label":"F9", "x":13.25, "y":0},
{"label":"F10", "x":14.25, "y":0},
{"label":"F11", "x":15.25, "y":0},
{"label":"F12", "x":16.25, "y":0},
{"label":"Print", "x":17.5, "y":0},
{"label":"Delete", "x":18.75, "y":0},
{"label":"Light", "x":0.75, "y":1.25},
{"label":"`~", "x":2.25, "y":1.25},
{"label":"1!", "x":3.25, "y":1.25},
{"label":"2@", "x":4.25, "y":1.25},
{"label":"3#", "x":5.25, "y":1.25},
{"label":"4$", "x":6.25, "y":1.25},
{"label":"5%", "x":7.25, "y":1.25},
{"label":"6^", "x":8.25, "y":1.25},
{"label":"7&", "x":10.5, "y":1.25},
{"label":"8*", "x":11.5, "y":1.25},
{"label":"9(", "x":12.5, "y":1.25},
{"label":"0)", "x":13.5, "y":1.25},
{"label":"-_", "x":14.5, "y":1.25},
{"label":"=+", "x":15.5, "y":1.25},
{"label":"Backspace", "x":16.5, "y":1.25, "w":2},
{"label":"PgDn", "x":18.75, "y":1.25},
{"label":"1!", "x":0.5, "y":2.25},
{"label":"Tab", "x":1.75, "y":2.25, "w":1.5},
{"label":"Q", "x":3.25, "y":2.25},
{"label":"W", "x":4.5, "y":2.25},
{"label":"E", "x":5.5, "y":2.25},
{"label":"R", "x":6.5, "y":2.25},
{"label":"T", "x":7.5, "y":2.25},
{"label":"Y", "x":10, "y":2.25},
{"label":"U", "x":11, "y":2.25},
{"label":"I", "x":12, "y":2.25},
{"label":"O", "x":13, "y":2.25},
{"label":"P", "x":14, "y":2.25},
{"label":"[{", "x":15.25, "y":2.25},
{"label":"]}", "x":16.25, "y":2.25},
{"label":"\\|", "x":17.25, "y":2.25, "w":1.5},
{"label":"PgUp", "x":19, "y":2.25},
{"label":"2@", "x":0.25, "y":3.25},
{"label":"Caps Lock", "x":1.5, "y":3.25, "w":1.75},
{"label":"A", "x":3.25, "y":3.25},
{"label":"S", "x":4.5, "y":3.25},
{"label":"D", "x":5.5, "y":3.25},
{"label":"F", "x":6.5, "y":3.25},
{"label":"G", "x":7.5, "y":3.25},
{"label":"H", "x":10.25, "y":3.25},
{"label":"J", "x":11.25, "y":3.25},
{"label":"K", "x":12.25, "y":3.25},
{"label":"L", "x":13.25, "y":3.25},
{"label":";:", "x":14.75, "y":3.25},
{"label":"'\"", "x":15.75, "y":3.25},
{"label":"Enter", "x":16.75, "y":3.25, "w":2.25},
{"label":"Home", "x":19.25, "y":3.25},
{"label":"3#", "x":0, "y":4.25},
{"label":"Shift", "x":1.5, "y":4.25, "w":2.25},
{"label":"Z", "x":3.5, "y":4.25},
{"label":"X", "x":4.75, "y":4.25},
{"label":"C", "x":5.75, "y":4.25},
{"label":"V", "x":6.75, "y":4.25},
{"label":"B", "x":7.75, "y":4.25},
{"label":"B", "x":9.5, "y":4.25},
{"label":"N", "x":10.5, "y":4.25},
{"label":"M", "x":11.5, "y":4.25},
{"label":",<", "x":12.5, "y":4.25},
{"label":".>", "x":13.5, "y":4.25},
{"label":"/?", "x":15.25, "y":4.25},
{"label":"Shift", "x":16.25, "y":4.25, "w":1.75},
{"label":"Up", "x":18.25, "y":4.5},
{"label":"4$", "x":0, "y":5.25},
{"label":"Ctrl", "x":1.25, "y":5.25, "w":1.25},
{"label":"Win", "x":2.5, "y":5.25, "w":1.25},
{"label":"Alt", "x":4.75, "y":5.25, "w":1.25},
{"label":"Space", "x":6, "y":5.25, "w":2.25},
{"label":"Fn1", "x":8.25, "y":5.25},
{"label":"Space", "x":9.5, "y":5.25, "w":2.75},
{"label":"Alt", "x":12.25, "y":5.25},
{"label":"Left", "x":17.25, "y":5.5},
{"label":"Down", "x":18.25, "y":5.5},
{"label":"Right", "x":19.25, "y":5.5}
]
},
"LAYOUT_all": {
"layout": [
{"label":"CCW", "x":0.15, "y":0, "w":0.6, "h":0.5},
{"label":"Mute", "x":0.25, "y":0.5},
{"label":"CW", "x":0.75, "y":0, "w":0.6, "h":0.5},
{"label":"Esc", "x":1.75, "y":0.5},
{"label":"F1", "x":3, "y":0.5},
{"label":"F2", "x":4, "y":0.5},
{"label":"F3", "x":5, "y":0.5},
{"label":"F4", "x":6, "y":0.5},
{"label":"F5", "x":7.25, "y":0.5},
{"label":"F6", "x":8.25, "y":0.5},
{"label":"F7", "x":11, "y":0.5},
{"label":"F8", "x":12, "y":0.5},
{"label":"F9", "x":13.25, "y":0.5},
{"label":"F10", "x":14.25, "y":0.5},
{"label":"F11", "x":15.25, "y":0.5},
{"label":"F12", "x":16.25, "y":0.5},
{"label":"Print", "x":17.5, "y":0.5},
{"label":"Delete", "x":18.75, "y":0.5},
{"label":"M1", "x":0.75, "y":1.75},
{"label":"`~", "x":2.25, "y":1.75},
{"label":"1!", "x":3.25, "y":1.75},
{"label":"2@", "x":4.25, "y":1.65},
{"label":"3#", "x":5.25, "y":1.75},
{"label":"4$", "x":6.25, "y":1.75},
{"label":"5%", "x":7.25, "y":1.75},
{"label":"6^", "x":8.25, "y":1.75},
{"label":"7&", "x":10.5, "y":1.75},
{"label":"8*", "x":11.5, "y":1.75},
{"label":"9(", "x":12.5, "y":1.75},
{"label":"0)", "x":13.5, "y":1.75},
{"label":"-_", "x":14.5, "y":1.65},
{"label":"=+", "x":15.5, "y":1.75},
{"label":"Backspace", "x":16.5, "y":1.75, "w":2},
{"label":"PgDn", "x":18.75, "y":1.75},
{"label":"M2", "x":0.5, "y":2.75},
{"label":"Tab", "x":1.75, "y":2.75, "w":1.5},
{"label":"Q", "x":3.25, "y":2.75},
{"label":"W", "x":4.5, "y":2.75},
{"label":"E", "x":5.5, "y":2.75},
{"label":"R", "x":6.5, "y":2.75},
{"label":"T", "x":7.5, "y":2.75},
{"label":"Y", "x":10, "y":2.75},
{"label":"U", "x":11, "y":2.75},
{"label":"I", "x":12, "y":2.75},
{"label":"O", "x":13, "y":2.75},
{"label":"P", "x":14, "y":2.75},
{"label":"[{", "x":15.25, "y":2.75},
{"label":"]}", "x":16.25, "y":2.75},
{"label":"\\|", "x":17.25, "y":2.75, "w":1.5},
{"label":"PgUp", "x":19, "y":2.75},
{"label":"M3", "x":0.25, "y":3.75},
{"label":"Caps Lock", "x":1.5, "y":3.75, "w":1.75},
{"label":"A", "x":3.25, "y":3.75},
{"label":"S", "x":4.5, "y":3.75},
{"label":"D", "x":5.5, "y":3.75},
{"label":"F", "x":6.5, "y":3.75},
{"label":"G", "x":7.5, "y":3.75},
{"label":"H", "x":10.25, "y":3.75},
{"label":"J", "x":11.25, "y":3.75},
{"label":"K", "x":12.25, "y":3.75},
{"label":"L", "x":13.25, "y":3.75},
{"label":";:", "x":14.75, "y":3.75},
{"label":"'\"", "x":15.75, "y":3.75},
{"label":"Enter", "x":16.75, "y":3.75, "w":2.25},
{"label":"Home", "x":19.25, "y":3.75},
{"label":"M4", "x":0, "y":4.75},
{"label":"Shift", "x":1.5, "y":4.25, "w":2.25},
{"label":"Z", "x":3.5, "y":4.75},
{"label":"X", "x":4.75, "y":4.75},
{"label":"C", "x":5.75, "y":4.75},
{"label":"V", "x":6.75, "y":4.75},
{"label":"B", "x":7.75, "y":4.75},
{"label":"B", "x":9.5, "y":4.75},
{"label":"N", "x":10.5, "y":4.75},
{"label":"M", "x":11.5, "y":4.75},
{"label":",<", "x":12.5, "y":4.75},
{"label":".>", "x":13.5, "y":4.75},
{"label":"/?", "x":15.25, "y":4.75},
{"label":"Shift", "x":16.25, "y":4.75, "w":1.75},
{"label":"Up", "x":18.25, "y":5.0},
{"label":"M5", "x":0, "y":5.75},
{"label":"Ctrl", "x":1.25, "y":5.75, "w":1.25},
{"label":"Win", "x":2.5, "y":5.75, "w":1.25},
{"label":"Alt", "x":4.75, "y":5.75, "w":1.25},
{"label":"Space", "x":6, "y":5.75, "w":2.25},
{"label":"Fn1", "x":8.25, "y":5.75},
{"label":"Space", "x":9.5, "y":5.75, "w":2.75},
{"label":"Alt", "x":12.25, "y":5.75},
{"label":"Left", "x":17.25, "y":6.0},
{"label":"Down", "x":18.25, "y":6.0},
{"label":"Right", "x":19.25, "y":6.0}
]
}
}
}

View File

@@ -0,0 +1,137 @@
/* 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
// clang-format off
enum layers{
MAC_BASE,
MAC_FN,
WIN_BASE,
WIN_FN
};
enum custom_keycodes {
KC_MISSION_CONTROL = SAFE_RANGE,
KC_LAUNCHPAD,
KC_LOPTN,
KC_ROPTN,
KC_LCMMD,
KC_RCMMD,
KC_TASK_VIEW,
KC_FILE_EXPLORER,
KC_SCREEN_SHOT
};
typedef struct PACKED {
uint8_t len;
uint8_t keycode[3];
} key_combination_t;
key_combination_t key_comb_list[3] = {
{2, {KC_LWIN, KC_TAB}},
{2, {KC_LWIN, KC_E}},
{3, {KC_LSFT, KC_LCMD, KC_4}}
};
#define KC_MCTL KC_MISSION_CONTROL
#define KC_LPAD KC_LAUNCHPAD
#define KC_TASK KC_TASK_VIEW
#define KC_FLXP KC_FILE_EXPLORER
#define KC_SNAP KC_SCREEN_SHOT
static uint8_t mac_keycode[4] = { KC_LOPT, KC_ROPT, KC_LCMD, KC_RCMD };
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
[MAC_BASE] = LAYOUT_ansi_89(
KC_MUTE, KC_ESC, 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_SNAP, KC_DEL,
_______, 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_PGUP,
_______, KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, KC_PGDN,
_______, KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, KC_HOME,
_______, KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_UP,
_______, KC_LCTL, KC_LOPTN, KC_LCMMD, KC_SPC, MO(MAC_FN), KC_SPC, KC_RCMMD, KC_LEFT, KC_DOWN, KC_RGHT),
[MAC_FN] = LAYOUT_ansi_89(
_______, _______, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, RGB_TOG, RGB_MOD, RGB_VAI, RGB_HUI, RGB_SAI, RGB_SPI, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, RGB_RMOD, RGB_VAD, RGB_HUD, RGB_SAD, RGB_SPD, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, NK_TOGG, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______),
[WIN_BASE] = LAYOUT_ansi_89(
KC_MUTE, KC_ESC, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_PSCR, KC_DEL,
_______, 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_PGUP,
_______, KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, KC_PGDN,
_______, KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, KC_HOME,
_______, KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_UP,
_______, KC_LCTL, KC_LCMD, KC_LALT, KC_SPC, MO(WIN_FN), KC_SPC, KC_RALT, KC_LEFT, KC_DOWN, KC_RGHT),
[WIN_FN] = LAYOUT_ansi_89(
_______, _______, KC_BRID, KC_BRIU, KC_TASK, KC_FLXP, RGB_VAD, RGB_VAI, KC_MPRV, KC_MPLY, KC_MNXT, KC_MUTE, KC_VOLD, KC_VOLU, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, RGB_TOG, RGB_MOD, RGB_VAI, RGB_HUI, RGB_SAI, RGB_SPI, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, RGB_RMOD, RGB_VAD, RGB_HUD, RGB_SAD, RGB_SPD, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, NK_TOGG, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______),
};
// clang-format on
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
case KC_LOPTN:
case KC_ROPTN:
case KC_LCMMD:
case KC_RCMMD:
if (record->event.pressed) {
register_code(mac_keycode[keycode - KC_LOPTN]);
} else {
unregister_code(mac_keycode[keycode - KC_LOPTN]);
}
return false; // Skip all further processing of this key
case KC_TASK:
case KC_FLXP:
case KC_SNAP:
if (record->event.pressed) {
for (uint8_t i = 0; i < key_comb_list[keycode - KC_TASK].len; i++) {
register_code(key_comb_list[keycode - KC_TASK].keycode[i]);
}
} else {
for (uint8_t i = 0; i < key_comb_list[keycode - KC_TASK].len; i++) {
unregister_code(key_comb_list[keycode - KC_TASK].keycode[i]);
}
}
return false; // Skip all further processing of this key
default:
return true; // Process all other keycodes normally
}
}

View File

@@ -0,0 +1,182 @@
/* 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
// clang-format off
enum layers{
MAC_BASE,
MAC_FN,
WIN_BASE,
WIN_FN
};
enum custom_keycodes {
KC_MISSION_CONTROL = USER00,
KC_LAUNCHPAD,
KC_LOPTN,
KC_ROPTN,
KC_LCMMD,
KC_RCMMD,
KC_TASK_VIEW,
KC_FILE_EXPLORER,
KC_SCREEN_SHOT
};
#define KC_MCTL KC_MISSION_CONTROL
#define KC_LPAD KC_LAUNCHPAD
#define KC_TASK KC_TASK_VIEW
#define KC_FLXP KC_FILE_EXPLORER
#define KC_SNAP KC_SCREEN_SHOT
typedef struct PACKED {
uint8_t len;
uint8_t keycode[3];
} key_combination_t;
key_combination_t key_comb_list[3] = {
{2, {KC_LWIN, KC_TAB}},
{2, {KC_LWIN, KC_E}},
{3, {KC_LSFT, KC_LCMD, KC_4}}
};
static uint8_t mac_keycode[4] = { KC_LOPT, KC_ROPT, KC_LCMD, KC_RCMD };
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
[MAC_BASE] = LAYOUT_all(
KC_VOLD, KC_VOLU,
KC_MUTE, KC_ESC, 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_SNAP, KC_DEL,
MACRO01, 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_PGUP,
MACRO02, 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_PGDN,
MACRO03, KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, KC_HOME,
MACRO04, KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_UP,
MACRO05, KC_LCTL, KC_LOPTN, KC_LCMMD, KC_SPC, MO(MAC_FN), KC_SPC, KC_RCMMD, KC_LEFT, KC_DOWN, KC_RGHT),
[MAC_FN] = LAYOUT_all(
RGB_VAD, RGB_VAI,
RGB_TOG, _______, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, RGB_TOG, RGB_MOD, RGB_VAI, RGB_HUI, RGB_SAI, RGB_SPI, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, RGB_RMOD, RGB_VAD, RGB_HUD, RGB_SAD, RGB_SPD, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, NK_TOGG, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______),
[WIN_BASE] = LAYOUT_all(
KC_VOLD, KC_VOLU,
KC_MUTE, KC_ESC, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_PSCR, KC_DEL,
MACRO01, 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_PGUP,
MACRO02, 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_PGDN,
MACRO03, KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, KC_HOME,
MACRO04, KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_UP,
MACRO05, KC_LCTL, KC_LCMD, KC_LALT, KC_SPC, MO(WIN_FN), KC_SPC, KC_RALT, KC_LEFT, KC_DOWN, KC_RGHT),
[WIN_FN] = LAYOUT_all(
RGB_VAD, RGB_VAI,
RGB_TOG, _______, KC_BRID, KC_BRIU, KC_TASK, KC_FLXP, RGB_VAD, RGB_VAI, KC_MPRV, KC_MPLY, KC_MNXT, KC_MUTE, KC_VOLD, KC_VOLU, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, RGB_TOG, RGB_MOD, RGB_VAI, RGB_HUI, RGB_SAI, RGB_SPI, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, RGB_RMOD, RGB_VAD, RGB_HUD, RGB_SAD, RGB_SPD, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, NK_TOGG, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______),
};
// clang-format on
#if defined(VIA_ENABLE) && defined(ENCODER_ENABLE)
#define ENCODERS 1
static uint8_t encoder_state[ENCODERS] = {0};
static keypos_t encoder_cw[ENCODERS] = {{ 11, 5 }};
static keypos_t encoder_ccw[ENCODERS] = {{ 10, 5 }};
void encoder_action_unregister(void) {
for (int index = 0; index < ENCODERS; ++index) {
if (encoder_state[index]) {
keyevent_t encoder_event = (keyevent_t) {
.key = encoder_state[index] >> 1 ? encoder_cw[index] : encoder_ccw[index],
.pressed = false,
.time = (timer_read() | 1)
};
encoder_state[index] = 0;
action_exec(encoder_event);
}
}
}
void encoder_action_register(uint8_t index, bool clockwise) {
keyevent_t encoder_event = (keyevent_t) {
.key = clockwise ? encoder_cw[index] : encoder_ccw[index],
.pressed = true,
.time = (timer_read() | 1)
};
encoder_state[index] = (clockwise ^ 1) | (clockwise << 1);
action_exec(encoder_event);
}
void matrix_scan_user(void) {
encoder_action_unregister();
}
bool encoder_update_user(uint8_t index, bool clockwise) {
encoder_action_register(index, clockwise);
return false;
};
#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
case KC_LOPTN:
case KC_ROPTN:
case KC_LCMMD:
case KC_RCMMD:
if (record->event.pressed) {
register_code(mac_keycode[keycode - KC_LOPTN]);
} else {
unregister_code(mac_keycode[keycode - KC_LOPTN]);
}
return false; // Skip all further processing of this key
case KC_TASK:
case KC_FLXP:
if (record->event.pressed) {
for (uint8_t i = 0; i < key_comb_list[keycode - KC_TASK].len; i++) {
register_code(key_comb_list[keycode - KC_TASK].keycode[i]);
}
} else {
for (uint8_t i = 0; i < key_comb_list[keycode - KC_TASK].len; i++) {
unregister_code(key_comb_list[keycode - KC_TASK].keycode[i]);
}
}
return false; // Skip all further processing of this key
default:
return true; // Process all other keycodes normally
}
}

View File

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

View File

@@ -0,0 +1,193 @@
/* 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
// clang-format off
const ckled2001_led PROGMEM g_ckled2001_leds[DRIVER_LED_TOTAL] = {
/* Refer to IS31 manual for these locations
* driver
* | R location
* | | G location
* | | | B location
* | | | | */
{0, C_2, A_2, B_2}, // ESC
{0, C_3, A_3, B_3}, // F1
{0, C_4, A_4, B_4}, // F2
{0, C_5, A_5, B_5}, // F3
{0, C_6, A_6, B_6}, // F4
{0, C_7, A_7, B_7}, // F5
{0, C_8, A_8, B_8}, // F6
{0, C_9, A_9, B_9}, // F7
{0, C_10, A_10, B_10}, // F8
{0, C_11, A_11, B_11}, // F9
{0, C_12, A_12, B_12}, // F10
{0, C_13, A_13, B_13}, // F11
{0, C_14, A_14, B_14}, // F12
{0, C_15, A_15, B_15}, // INS
{0, C_16, A_16, B_16}, // DEL
{0, I_1, G_1, H_1}, // M1
{0, I_2, G_2, H_2}, // `~
{0, I_3, G_3, H_3}, // 1!
{0, I_4, G_4, H_4}, // 2@
{0, I_5, G_5, H_5}, // 3#
{0, I_6, G_6, H_6}, // 4$
{0, I_7, G_7, H_7}, // 5%
{0, I_8, G_8, H_8}, // 6^
{0, I_9, G_9, H_9}, // 7&
{0, I_10, G_10, H_10}, // 8*
{0, I_11, G_11, H_11}, // 9(
{0, I_12, G_12, H_12}, // 0)
{0, I_13, G_13, H_13}, // -_
{0, I_14, G_14, H_14}, // =+
{0, I_15, G_15, H_15}, // BackSpace
{0, I_16, G_16, H_16}, // PgUp
{0, F_1, D_1, E_1}, // M2
{0, F_2, D_2, E_2}, // TAB
{0, F_3, D_3, E_3}, // Q
{0, F_4, D_4, E_4}, // W
{0, F_5, D_5, E_5}, // E
{0, F_6, D_6, E_6}, // R
{0, F_7, D_7, E_7}, // T
{0, F_8, D_8, E_8}, // Y
{0, F_9, D_9, E_9}, // U
{0, F_10, D_10, E_10}, // I
{0, F_11, D_11, E_11}, // O
{0, F_12, D_12, E_12}, // P
{0, F_13, D_13, E_13}, // [
{0, F_14, D_14, E_14}, // ]
{0, F_15, D_15, E_15}, // |
{0, F_16, D_16, E_16}, // PgDn
{1, C_16, A_16, B_16}, // M3
{1, C_15, A_15, B_15}, // CapsLock
{1, C_14, A_14, B_14}, // A
{1, C_13, A_13, B_13}, // S
{1, C_12, A_12, B_12}, // D
{1, C_11, A_11, B_11}, // F
{1, C_10, A_10, B_10}, // G
{1, C_8, A_8, B_8}, // H
{1, C_7, A_7, B_7}, // J
{1, C_6, A_6, B_6}, // K
{1, C_5, A_5, B_5}, // L
{1, C_4, A_4, B_4}, // ;
{1, C_3, A_3, B_3}, // '
{1, C_2, A_2, B_2}, // Enter
{1, C_1, A_1, B_1}, // Home
{1, I_16, G_16, H_16}, // M4
{1, I_15, G_15, H_15}, // Shift_L
{1, I_13, G_13, H_13}, // Z
{1, I_12, G_12, H_12}, // X
{1, I_11, G_11, H_11}, // C
{1, I_10, G_10, H_10}, // V
{1, I_9, G_9, H_9}, // B
{1, I_8, G_8, H_8}, // B
{1, I_7, G_7, H_7}, // N
{1, I_6, G_6, H_6}, // M
{1, I_5, G_5, H_5}, // ,
{1, I_4, G_4, H_4}, // .
{1, I_3, G_3, H_3}, // ?
{1, I_2, G_2, H_2}, // Shift_R
{1, I_1, G_1, H_1}, // Up
{1, F_16, D_16, E_16}, // M5
{1, F_15, D_15, E_15}, // Ctrl_L
{1, F_14, D_14, E_14}, // Win_L
{1, F_13, D_13, E_13}, // Alt_L
{1, F_12, D_12, E_12}, // Space
{1, F_9, D_9, E_9}, // Fn
{1, F_8, D_8, E_8}, // Space
{1, F_7, D_7, E_7}, // Alt_R
{1, F_3, D_3, E_3}, // Left
{1, F_2, D_2, E_2}, // Down
{1, F_1, D_1, E_1}, // Right
};
#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, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76 },
{ 77, 78, 79, 80, 81, __, __, 82, 83, 84, __, __, __, 85, 86, 87 },
},
{
// LED Index to Physical Position
{19,0}, {34,0}, {46,0}, {60,1}, {72,3}, {87,6}, {99,8}, {120,8}, {132,6}, {147,3}, {159,1}, {173,0}, {185,0}, {201,1}, {219,1},
{5,14}, {24,14}, {36,14}, {48,13}, {62,15}, {74,17}, {86,20}, {98,22}, {115,22}, {127,20}, {139,17}, {151,15}, {165,13}, {177,14}, {195,14}, {220,13},
{4,24}, {24,24}, {40,24}, {53,24}, {65,27}, {77,29}, {89,31}, {112,33}, {124,31}, {136,29}, {148,27}, {160,24}, {174,24}, {186,24}, {201,24}, {222,25},
{2,34}, {23,34}, {40,34}, {54,35}, {66,37}, {78,39}, {90,42}, {118,43}, {130,40}, {142,38}, {154,36}, {167,35}, {179,35}, {199,35}, {224,36},
{0,45}, {24,45}, {44,45}, {57,46}, {69,48}, {81,51}, {93,53}, {111,54}, {123,52}, {135,50}, {147,48}, {159,46}, {173,45}, {190,45}, {210,47},
{0,55}, {18,55}, {33,55}, {56,57}, {77,61}, {97,64}, {124,63}, {147,59}, {198,58}, {210,58}, {222,58},
},
{
// RGB LED Index to Flag
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 1, 1,
1, 1, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 1,
1, 9, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 1, 1,
1, 1, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 1, 1,
1, 1, 1, 1, 4, 1, 4, 1, 1, 1, 1,
}
};
// clang-format on
#endif
#ifdef ENCODER_ENABLE
bool encoder_update_kb(uint8_t index, bool clockwise) {
if (!encoder_update_user(index, clockwise)) { return false; }
if (index == 0) {
if (clockwise) {
tap_code_delay(KC_VOLU, TAP_CODE_DELAY);
} else {
tap_code_delay(KC_VOLD, TAP_CODE_DELAY);
}
}
return true;
}
# if defined(PAL_USE_CALLBACKS)
void encoder0_pad_cb(void *param) {
(void)param;
encoder_insert_state(0);
}
void keyboard_post_init_kb(void) {
pin_t encoders_pad_a[] = ENCODERS_PAD_A;
pin_t encoders_pad_b[] = ENCODERS_PAD_B;
palEnableLineEvent(encoders_pad_a[0], PAL_EVENT_MODE_BOTH_EDGES);
palEnableLineEvent(encoders_pad_b[0], PAL_EVENT_MODE_BOTH_EDGES);
palSetLineCallback(encoders_pad_a[0], encoder0_pad_cb, NULL);
palSetLineCallback(encoders_pad_b[0], encoder0_pad_cb, NULL);
}
# endif // ENCODER_ENABLE
#endif // PAL_USE_CALLBACKS

View File

@@ -0,0 +1,55 @@
/* Copyright 2021 @ Keychron (https://www.keychron.com)
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#pragma once
#include "quantum.h"
#define XXX KC_NO
// clang-format off
#define LAYOUT_all( \
K5A, K5B, \
K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B, K0C, K0D, K0E, K0F, \
K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B, K1C, K1D, K1E, K1F, \
K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B, K2C, K2D, K2F, \
K30, K31, K32, K33, K34, K35, K36, K38, K39, K3A, K3B, K3C, K3D, K2E, K3E, K3F, \
K40, K41, K42, K41, K43, K44, K45, K46, K47, K48, K49, K4A, K4B, K4C, K4D, K4E, K4F, \
K50, K51, K52, K53, K54, K57, K58, K59, K5D, K5E, K5F \
) { \
{ K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B, K0C, K0D, K0E, K0F }, \
{ K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B, K1C, K1D, K1E, K1F }, \
{ K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B, K2C, K2D, K2E, K2F }, \
{ K30, K31, K32, K33, K34, K35, K36, XXX, K38, K39, K3A, K3B, K3C, K3D, K3E, K3F }, \
{ K40, K41, XXX, K43, K44, K45, K46, K47, K48, K49, K4A, K4B, K4C, K4D, K4E, K4F }, \
{ K50, K51, K52, K53, K54, XXX, XXX, K57, K58, K59, K5A, K5B, XXX, K5D, K5E, K5F } \
}
#define LAYOUT_ansi_89( \
K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B, K0C, K0D, K0E, K0F, \
K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B, K1C, K1D, K1E, K1F, \
K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B, K2C, K2D, K2E, K2F, \
K30, K31, K32, K33, K34, K35, K36, K38, K39, K3A, K3B, K3C, K3D, K3E, K3F, \
K40, K41, K43, K44, K45, K46, K47, K48, K49, K4A, K4B, K4C, K4D, K4E, K4F, \
K50, K51, K52, K53, K54, K57, K58, K59, K5D, K5E, K5F \
) { \
{ K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B, K0C, K0D, K0E, K0F }, \
{ K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B, K1C, K1D, K1E, K1F }, \
{ K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B, K2C, K2D, K2E, K2F }, \
{ K30, K31, K32, K33, K34, K35, K36, XXX, K38, K39, K3A, K3B, K3C, K3D, K3E, K3F }, \
{ K40, K41, XXX, K43, K44, K45, K46, K47, K48, K49, K4A, K4B, K4C, K4D, K4E, K4F }, \
{ K50, K51, K52, K53, K54, XXX, XXX, K57, K58, K59, XXX, XXX, XXX, K5D, K5E, K5F } \
}

View File

@@ -0,0 +1,5 @@
# The ANSI variant of the Keychron Q10
- Enable EC11 rotary encoder.
- Turn colckwise to increase volume and turn anti-colckwise to decrease volume.
- Press top left key pushbutton to mute.

View File

@@ -0,0 +1,35 @@
# 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
ENCODER_ENABLE = yes # Enable Encoder
ENCODER_MAP_ENABLE = no
DIP_SWITCH_ENABLE = yes
RGB_MATRIX_ENABLE = yes
RGB_MATRIX_DRIVER = CKLED2001
RAW_ENABLE = yes
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
# custom matrix setup
CUSTOM_MATRIX = lite
SRC += matrix.c ./../factory/major/test.c