From 0b812c9dc0d2badb47f05f966f540ffe2f22edfe Mon Sep 17 00:00:00 2001 From: lokher Date: Wed, 31 Jan 2024 18:25:41 +0800 Subject: [PATCH] Add Q5/Q6/Q8/K5/K7/V5 Max --- keyboards/keychron/k1_max/ansi/rgb/config.h | 2 +- keyboards/keychron/k1_max/config.h | 3 - keyboards/keychron/k1_max/info.json | 3 + keyboards/keychron/k1_max/k1_max.c | 10 +- keyboards/keychron/k1_max/mcuconf.h | 36 +- keyboards/keychron/k3_max/ansi/rgb/config.h | 8 +- .../k3_max/ansi/rgb/keymaps/default/keymap.c | 3 +- .../k3_max/ansi/rgb/keymaps/via/keymap.c | 5 +- keyboards/keychron/k3_max/ansi/rgb/rgb.c | 14 +- keyboards/keychron/k3_max/ansi/white/config.h | 6 +- .../ansi/white/keymaps/default/keymap.c | 3 +- .../k3_max/ansi/white/keymaps/via/keymap.c | 3 +- keyboards/keychron/k3_max/ansi/white/white.c | 17 +- keyboards/keychron/k3_max/board.h | 2 +- keyboards/keychron/k3_max/config.h | 5 +- keyboards/keychron/k3_max/halconf.h | 2 +- keyboards/keychron/k3_max/info.json | 8 +- keyboards/keychron/k3_max/iso/rgb/config.h | 11 +- .../k3_max/iso/rgb/keymaps/default/keymap.c | 2 +- .../k3_max/iso/rgb/keymaps/via/keymap.c | 2 +- keyboards/keychron/k3_max/iso/rgb/rgb.c | 18 +- keyboards/keychron/k3_max/iso/white/config.h | 6 +- keyboards/keychron/k3_max/iso/white/info.json | 2 +- .../k3_max/iso/white/keymaps/default/keymap.c | 2 +- .../k3_max/iso/white/keymaps/via/keymap.c | 2 +- keyboards/keychron/k3_max/iso/white/white.c | 2 +- keyboards/keychron/k3_max/jis/rgb/config.h | 22 +- .../k3_max/jis/rgb/keymaps/default/keymap.c | 2 +- .../k3_max/jis/rgb/keymaps/via/keymap.c | 2 +- keyboards/keychron/k3_max/jis/rgb/rgb.c | 10 +- keyboards/keychron/k3_max/jis/white/config.h | 6 +- keyboards/keychron/k3_max/jis/white/info.json | 2 +- .../k3_max/jis/white/keymaps/default/keymap.c | 2 +- .../k3_max/jis/white/keymaps/via/keymap.c | 2 +- keyboards/keychron/k3_max/jis/white/white.c | 8 +- keyboards/keychron/k3_max/k3_max.c | 12 +- keyboards/keychron/k3_max/mcuconf.h | 36 +- keyboards/keychron/k3_max/readme.md | 2 +- keyboards/keychron/k5_max/ansi/rgb/config.h | 55 +++ keyboards/keychron/k5_max/ansi/rgb/info.json | 36 ++ .../k5_max/ansi/rgb/keymaps/default/keymap.c | 68 ++++ .../k5_max/ansi/rgb/keymaps/via/keymap.c | 68 ++++ .../k5_max/ansi/rgb/keymaps/via/rules.mk | 1 + keyboards/keychron/k5_max/ansi/rgb/rgb.c | 174 +++++++++ keyboards/keychron/k5_max/ansi/rgb/rules.mk | 1 + keyboards/keychron/k5_max/ansi/white/config.h | 52 +++ .../keychron/k5_max/ansi/white/info.json | 30 ++ .../ansi/white/keymaps/default/keymap.c | 68 ++++ .../k5_max/ansi/white/keymaps/via/keymap.c | 68 ++++ .../k5_max/ansi/white/keymaps/via/rules.mk | 1 + keyboards/keychron/k5_max/ansi/white/rules.mk | 1 + keyboards/keychron/k5_max/ansi/white/white.c | 172 +++++++++ keyboards/keychron/k5_max/board.h | 226 +++++++++++ keyboards/keychron/k5_max/config.h | 93 +++++ keyboards/keychron/k5_max/halconf.h | 31 ++ keyboards/keychron/k5_max/info.json | 154 ++++++++ keyboards/keychron/k5_max/k5_max.c | 100 +++++ keyboards/keychron/k5_max/mcuconf.h | 37 ++ keyboards/keychron/k5_max/readme.md | 23 ++ keyboards/keychron/k5_max/rules.mk | 4 + .../k5_max/via_json/k5_max_ansi_rgb.json | 342 +++++++++++++++++ .../k5_max/via_json/k5_max_ansi_white.json | 281 ++++++++++++++ keyboards/keychron/k7_max/ansi/rgb/config.h | 57 +++ keyboards/keychron/k7_max/ansi/rgb/info.json | 36 ++ .../k7_max/ansi/rgb/keymaps/default/keymap.c | 72 ++++ .../k7_max/ansi/rgb/keymaps/via/keymap.c | 72 ++++ .../k7_max/ansi/rgb/keymaps/via/rules.mk | 1 + keyboards/keychron/k7_max/ansi/rgb/rgb.c | 130 +++++++ keyboards/keychron/k7_max/ansi/rgb/rules.mk | 1 + keyboards/keychron/k7_max/ansi/white/config.h | 54 +++ .../keychron/k7_max/ansi/white/info.json | 30 ++ .../ansi/white/keymaps/default/keymap.c | 72 ++++ .../k7_max/ansi/white/keymaps/via/keymap.c | 72 ++++ .../k7_max/ansi/white/keymaps/via/rules.mk | 1 + keyboards/keychron/k7_max/ansi/white/rules.mk | 1 + keyboards/keychron/k7_max/ansi/white/white.c | 128 +++++++ keyboards/keychron/k7_max/board.h | 226 +++++++++++ keyboards/keychron/k7_max/config.h | 83 +++++ keyboards/keychron/k7_max/halconf.h | 31 ++ keyboards/keychron/k7_max/info.json | 117 ++++++ keyboards/keychron/k7_max/k7_max.c | 83 +++++ keyboards/keychron/k7_max/mcuconf.h | 37 ++ keyboards/keychron/k7_max/readme.md | 23 ++ keyboards/keychron/k7_max/rules.mk | 4 + .../k7_max/via_json/k7_max_ansi_rgb_v1.0.json | 240 ++++++++++++ .../via_json/k7_max_ansi_white_v1.0.json | 179 +++++++++ .../k7_max/via_json/k7_max_iso_rgb_v1.0.json | 279 ++++++++++++++ .../via_json/k7_max_iso_white_v1.0.json | 218 +++++++++++ .../k7_max/via_json/k7_max_jis_rgb_v1.0.json | 267 +++++++++++++ .../via_json/k7_max_jis_white_v1.0.json | 205 ++++++++++ .../q2_max/ansi_encoder/keymaps/via/keymap.c | 2 +- keyboards/keychron/q3_max/q3_max.c | 10 +- .../q5_max/ansi_encoder/ansi_encoder.c | 168 +++++++++ .../keychron/q5_max/ansi_encoder/config.h | 54 +++ .../keychron/q5_max/ansi_encoder/info.json | 119 ++++++ .../ansi_encoder/keymaps/default/keymap.c | 74 ++++ .../q5_max/ansi_encoder/keymaps/via/keymap.c | 74 ++++ .../q5_max/ansi_encoder/keymaps/via/rules.mk | 1 + .../keychron/q5_max/ansi_encoder/rules.mk | 1 + keyboards/keychron/q5_max/board.h | 226 +++++++++++ keyboards/keychron/q5_max/config.h | 81 ++++ keyboards/keychron/q5_max/halconf.h | 31 ++ keyboards/keychron/q5_max/info.json | 77 ++++ keyboards/keychron/q5_max/mcuconf.h | 37 ++ keyboards/keychron/q5_max/q5_max.c | 62 ++++ keyboards/keychron/q5_max/readme.md | 21 ++ keyboards/keychron/q5_max/rules.mk | 4 + .../q5_max/via_json/q5_max_ansi_encoder.json | 339 +++++++++++++++++ .../q6_max/ansi_encoder/ansi_encoder.c | 175 +++++++++ .../keychron/q6_max/ansi_encoder/config.h | 54 +++ .../keychron/q6_max/ansi_encoder/info.json | 126 +++++++ .../ansi_encoder/keymaps/default/keymap.c | 74 ++++ .../q6_max/ansi_encoder/keymaps/via/keymap.c | 74 ++++ .../q6_max/ansi_encoder/keymaps/via/rules.mk | 1 + .../keychron/q6_max/ansi_encoder/rules.mk | 1 + keyboards/keychron/q6_max/board.h | 226 +++++++++++ keyboards/keychron/q6_max/config.h | 84 +++++ keyboards/keychron/q6_max/halconf.h | 31 ++ keyboards/keychron/q6_max/info.json | 77 ++++ keyboards/keychron/q6_max/mcuconf.h | 37 ++ keyboards/keychron/q6_max/q6_max.c | 84 +++++ keyboards/keychron/q6_max/readme.md | 21 ++ keyboards/keychron/q6_max/rules.mk | 4 + .../q6_max/via_json/q6_max_ansi_encoder.json | 349 +++++++++++++++++ .../q8_max/ansi_encoder/ansi_encoder.c | 131 +++++++ .../keychron/q8_max/ansi_encoder/config.h | 56 +++ .../keychron/q8_max/ansi_encoder/info.json | 85 +++++ .../ansi_encoder/keymaps/default/keymap.c | 82 ++++ .../q8_max/ansi_encoder/keymaps/via/keymap.c | 82 ++++ .../q8_max/ansi_encoder/keymaps/via/rules.mk | 1 + .../keychron/q8_max/ansi_encoder/rules.mk | 1 + keyboards/keychron/q8_max/board.h | 226 +++++++++++ keyboards/keychron/q8_max/config.h | 81 ++++ keyboards/keychron/q8_max/halconf.h | 31 ++ keyboards/keychron/q8_max/info.json | 80 ++++ keyboards/keychron/q8_max/mcuconf.h | 37 ++ keyboards/keychron/q8_max/q8_max.c | 61 +++ keyboards/keychron/q8_max/readme.md | 21 ++ keyboards/keychron/q8_max/rules.mk | 4 + .../q8_max/via_json/q8_max_ansi_encoder.json | 351 ++++++++++++++++++ .../keychron/v1_max/ansi_encoder/config.h | 2 +- .../v1_max/ansi_encoder/keymaps/via/keymap.c | 2 +- keyboards/keychron/v1_max/v1_max.c | 10 +- keyboards/keychron/v2_max/v2_max.c | 3 +- .../v5_max/ansi_encoder/ansi_encoder.c | 165 ++++++++ .../keychron/v5_max/ansi_encoder/config.h | 65 ++++ .../keychron/v5_max/ansi_encoder/info.json | 127 +++++++ .../ansi_encoder/keymaps/default/keymap.c | 74 ++++ .../v5_max/ansi_encoder/keymaps/via/keymap.c | 74 ++++ .../v5_max/ansi_encoder/keymaps/via/rules.mk | 1 + .../keychron/v5_max/ansi_encoder/rules.mk | 1 + keyboards/keychron/v5_max/board.h | 226 +++++++++++ keyboards/keychron/v5_max/config.h | 77 ++++ keyboards/keychron/v5_max/halconf.h | 31 ++ keyboards/keychron/v5_max/info.json | 67 ++++ keyboards/keychron/v5_max/mcuconf.h | 37 ++ keyboards/keychron/v5_max/readme.md | 21 ++ keyboards/keychron/v5_max/rules.mk | 4 + keyboards/keychron/v5_max/v5_max.c | 85 +++++ .../v5_max/via_json/v5_ansi_encoder.json | 321 ++++++++++++++++ 160 files changed, 10423 insertions(+), 187 deletions(-) create mode 100644 keyboards/keychron/k5_max/ansi/rgb/config.h create mode 100644 keyboards/keychron/k5_max/ansi/rgb/info.json create mode 100644 keyboards/keychron/k5_max/ansi/rgb/keymaps/default/keymap.c create mode 100644 keyboards/keychron/k5_max/ansi/rgb/keymaps/via/keymap.c create mode 100644 keyboards/keychron/k5_max/ansi/rgb/keymaps/via/rules.mk create mode 100644 keyboards/keychron/k5_max/ansi/rgb/rgb.c create mode 100644 keyboards/keychron/k5_max/ansi/rgb/rules.mk create mode 100644 keyboards/keychron/k5_max/ansi/white/config.h create mode 100644 keyboards/keychron/k5_max/ansi/white/info.json create mode 100644 keyboards/keychron/k5_max/ansi/white/keymaps/default/keymap.c create mode 100644 keyboards/keychron/k5_max/ansi/white/keymaps/via/keymap.c create mode 100644 keyboards/keychron/k5_max/ansi/white/keymaps/via/rules.mk create mode 100644 keyboards/keychron/k5_max/ansi/white/rules.mk create mode 100644 keyboards/keychron/k5_max/ansi/white/white.c create mode 100644 keyboards/keychron/k5_max/board.h create mode 100644 keyboards/keychron/k5_max/config.h create mode 100644 keyboards/keychron/k5_max/halconf.h create mode 100644 keyboards/keychron/k5_max/info.json create mode 100644 keyboards/keychron/k5_max/k5_max.c create mode 100644 keyboards/keychron/k5_max/mcuconf.h create mode 100644 keyboards/keychron/k5_max/readme.md create mode 100644 keyboards/keychron/k5_max/rules.mk create mode 100644 keyboards/keychron/k5_max/via_json/k5_max_ansi_rgb.json create mode 100644 keyboards/keychron/k5_max/via_json/k5_max_ansi_white.json create mode 100644 keyboards/keychron/k7_max/ansi/rgb/config.h create mode 100644 keyboards/keychron/k7_max/ansi/rgb/info.json create mode 100644 keyboards/keychron/k7_max/ansi/rgb/keymaps/default/keymap.c create mode 100644 keyboards/keychron/k7_max/ansi/rgb/keymaps/via/keymap.c create mode 100644 keyboards/keychron/k7_max/ansi/rgb/keymaps/via/rules.mk create mode 100644 keyboards/keychron/k7_max/ansi/rgb/rgb.c create mode 100644 keyboards/keychron/k7_max/ansi/rgb/rules.mk create mode 100644 keyboards/keychron/k7_max/ansi/white/config.h create mode 100644 keyboards/keychron/k7_max/ansi/white/info.json create mode 100644 keyboards/keychron/k7_max/ansi/white/keymaps/default/keymap.c create mode 100644 keyboards/keychron/k7_max/ansi/white/keymaps/via/keymap.c create mode 100644 keyboards/keychron/k7_max/ansi/white/keymaps/via/rules.mk create mode 100644 keyboards/keychron/k7_max/ansi/white/rules.mk create mode 100644 keyboards/keychron/k7_max/ansi/white/white.c create mode 100644 keyboards/keychron/k7_max/board.h create mode 100644 keyboards/keychron/k7_max/config.h create mode 100644 keyboards/keychron/k7_max/halconf.h create mode 100644 keyboards/keychron/k7_max/info.json create mode 100644 keyboards/keychron/k7_max/k7_max.c create mode 100644 keyboards/keychron/k7_max/mcuconf.h create mode 100644 keyboards/keychron/k7_max/readme.md create mode 100644 keyboards/keychron/k7_max/rules.mk create mode 100644 keyboards/keychron/k7_max/via_json/k7_max_ansi_rgb_v1.0.json create mode 100644 keyboards/keychron/k7_max/via_json/k7_max_ansi_white_v1.0.json create mode 100644 keyboards/keychron/k7_max/via_json/k7_max_iso_rgb_v1.0.json create mode 100644 keyboards/keychron/k7_max/via_json/k7_max_iso_white_v1.0.json create mode 100644 keyboards/keychron/k7_max/via_json/k7_max_jis_rgb_v1.0.json create mode 100644 keyboards/keychron/k7_max/via_json/k7_max_jis_white_v1.0.json create mode 100644 keyboards/keychron/q5_max/ansi_encoder/ansi_encoder.c create mode 100644 keyboards/keychron/q5_max/ansi_encoder/config.h create mode 100644 keyboards/keychron/q5_max/ansi_encoder/info.json create mode 100644 keyboards/keychron/q5_max/ansi_encoder/keymaps/default/keymap.c create mode 100644 keyboards/keychron/q5_max/ansi_encoder/keymaps/via/keymap.c create mode 100644 keyboards/keychron/q5_max/ansi_encoder/keymaps/via/rules.mk create mode 100644 keyboards/keychron/q5_max/ansi_encoder/rules.mk create mode 100644 keyboards/keychron/q5_max/board.h create mode 100644 keyboards/keychron/q5_max/config.h create mode 100644 keyboards/keychron/q5_max/halconf.h create mode 100644 keyboards/keychron/q5_max/info.json create mode 100644 keyboards/keychron/q5_max/mcuconf.h create mode 100644 keyboards/keychron/q5_max/q5_max.c create mode 100644 keyboards/keychron/q5_max/readme.md create mode 100644 keyboards/keychron/q5_max/rules.mk create mode 100644 keyboards/keychron/q5_max/via_json/q5_max_ansi_encoder.json create mode 100644 keyboards/keychron/q6_max/ansi_encoder/ansi_encoder.c create mode 100644 keyboards/keychron/q6_max/ansi_encoder/config.h create mode 100644 keyboards/keychron/q6_max/ansi_encoder/info.json create mode 100644 keyboards/keychron/q6_max/ansi_encoder/keymaps/default/keymap.c create mode 100644 keyboards/keychron/q6_max/ansi_encoder/keymaps/via/keymap.c create mode 100644 keyboards/keychron/q6_max/ansi_encoder/keymaps/via/rules.mk create mode 100644 keyboards/keychron/q6_max/ansi_encoder/rules.mk create mode 100644 keyboards/keychron/q6_max/board.h create mode 100644 keyboards/keychron/q6_max/config.h create mode 100644 keyboards/keychron/q6_max/halconf.h create mode 100644 keyboards/keychron/q6_max/info.json create mode 100644 keyboards/keychron/q6_max/mcuconf.h create mode 100644 keyboards/keychron/q6_max/q6_max.c create mode 100644 keyboards/keychron/q6_max/readme.md create mode 100644 keyboards/keychron/q6_max/rules.mk create mode 100644 keyboards/keychron/q6_max/via_json/q6_max_ansi_encoder.json create mode 100644 keyboards/keychron/q8_max/ansi_encoder/ansi_encoder.c create mode 100644 keyboards/keychron/q8_max/ansi_encoder/config.h create mode 100644 keyboards/keychron/q8_max/ansi_encoder/info.json create mode 100644 keyboards/keychron/q8_max/ansi_encoder/keymaps/default/keymap.c create mode 100644 keyboards/keychron/q8_max/ansi_encoder/keymaps/via/keymap.c create mode 100644 keyboards/keychron/q8_max/ansi_encoder/keymaps/via/rules.mk create mode 100644 keyboards/keychron/q8_max/ansi_encoder/rules.mk create mode 100644 keyboards/keychron/q8_max/board.h create mode 100644 keyboards/keychron/q8_max/config.h create mode 100644 keyboards/keychron/q8_max/halconf.h create mode 100644 keyboards/keychron/q8_max/info.json create mode 100644 keyboards/keychron/q8_max/mcuconf.h create mode 100644 keyboards/keychron/q8_max/q8_max.c create mode 100644 keyboards/keychron/q8_max/readme.md create mode 100644 keyboards/keychron/q8_max/rules.mk create mode 100644 keyboards/keychron/q8_max/via_json/q8_max_ansi_encoder.json create mode 100644 keyboards/keychron/v5_max/ansi_encoder/ansi_encoder.c create mode 100644 keyboards/keychron/v5_max/ansi_encoder/config.h create mode 100644 keyboards/keychron/v5_max/ansi_encoder/info.json create mode 100644 keyboards/keychron/v5_max/ansi_encoder/keymaps/default/keymap.c create mode 100644 keyboards/keychron/v5_max/ansi_encoder/keymaps/via/keymap.c create mode 100644 keyboards/keychron/v5_max/ansi_encoder/keymaps/via/rules.mk create mode 100644 keyboards/keychron/v5_max/ansi_encoder/rules.mk create mode 100644 keyboards/keychron/v5_max/board.h create mode 100644 keyboards/keychron/v5_max/config.h create mode 100644 keyboards/keychron/v5_max/halconf.h create mode 100644 keyboards/keychron/v5_max/info.json create mode 100644 keyboards/keychron/v5_max/mcuconf.h create mode 100644 keyboards/keychron/v5_max/readme.md create mode 100644 keyboards/keychron/v5_max/rules.mk create mode 100644 keyboards/keychron/v5_max/v5_max.c create mode 100644 keyboards/keychron/v5_max/via_json/v5_ansi_encoder.json diff --git a/keyboards/keychron/k1_max/ansi/rgb/config.h b/keyboards/keychron/k1_max/ansi/rgb/config.h index 78dbf3e8fe..9ffcca59a1 100644 --- a/keyboards/keychron/k1_max/ansi/rgb/config.h +++ b/keyboards/keychron/k1_max/ansi/rgb/config.h @@ -31,7 +31,7 @@ # define SPI_DRIVER SPID1 /* Scan phase of led driver set as MSKPHASE_9CHANNEL(defined as 0x03 in snled27351.h) */ -# define PHASE_CHANNEL MSKPHASE_12CHANNEL +# define SNLED27351_PHASE_CHANNEL MSKPHASE_12CHANNEL /* Set LED driver current */ # define SNLED27351_CURRENT_TUNE \ diff --git a/keyboards/keychron/k1_max/config.h b/keyboards/keychron/k1_max/config.h index 8c22378370..deece1b850 100644 --- a/keyboards/keychron/k1_max/config.h +++ b/keyboards/keychron/k1_max/config.h @@ -16,9 +16,6 @@ #pragma once -/* DIP switch for Mac/win OS switch */ -#define DIP_SWITCH_PINS \ - { B14 } /* Caps lock LED */ #define LED_CAPS_LOCK_PIN A13 #define LED_PIN_ON_STATE 1 diff --git a/keyboards/keychron/k1_max/info.json b/keyboards/keychron/k1_max/info.json index 0650d0b591..2e762efe52 100644 --- a/keyboards/keychron/k1_max/info.json +++ b/keyboards/keychron/k1_max/info.json @@ -22,6 +22,9 @@ "rows": ["C12", "D2", "B3", "B4", "B5", "B6"] }, "diode_direction": "ROW2COL", + "dip_switch": { + "pins": ["B14"] + }, "eeprom": { "wear_leveling": { "driver": "embedded_flash", diff --git a/keyboards/keychron/k1_max/k1_max.c b/keyboards/keychron/k1_max/k1_max.c index 90e90b1cdd..4c35dd0bc4 100644 --- a/keyboards/keychron/k1_max/k1_max.c +++ b/keyboards/keychron/k1_max/k1_max.c @@ -36,10 +36,6 @@ pin_t bt_led_pins[] = BT_HOST_LED_PIN_LIST; pin_t p24g_led_pins[] = P24G_HOST_LED_PIN_LIST; #endif -#ifdef KEYCHRON_CALLBACK_ENABLE -bool keychron_task_kb(void); -#endif - bool dip_switch_update_kb(uint8_t index, bool active) { if (index == 0) { default_layer_set(1UL << (active ? 0 : 2)); @@ -63,11 +59,7 @@ void keyboard_post_init_kb(void) { #ifdef ENCODER_ENABLE encoder_cb_init(); #endif -#ifdef KEYCHRON_CALLBACK_ENABLE - factory_test_init(); - register_record_process(process_record_keychron_kb, false); - register_keychron_task(keychron_task_kb, false); -#endif + keyboard_post_init_user(); } diff --git a/keyboards/keychron/k1_max/mcuconf.h b/keyboards/keychron/k1_max/mcuconf.h index f14f6ac32a..89294ee64b 100644 --- a/keyboards/keychron/k1_max/mcuconf.h +++ b/keyboards/keychron/k1_max/mcuconf.h @@ -1,51 +1,37 @@ -/* Copyright 2022 QMK +/* Copyright 2024 @ Keychron (https://www.keychron.com) * - * This program is free software: you can redistribute it and/or modify + * 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 + * 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 . + * along with this program.If not, see < http://www.gnu.org/licenses/>. */ - #pragma once #include_next #undef STM32_HSECLK -#define STM32_HSECLK 16000000 +#define STM32_HSECLK 16000000 #undef STM32_PLLM_VALUE -#define STM32_PLLM_VALUE 8 +#define STM32_PLLM_VALUE 8 #undef STM32_PLLN_VALUE -#define STM32_PLLN_VALUE 96 +#define STM32_PLLN_VALUE 96 #undef STM32_PLLP_VALUE -#define STM32_PLLP_VALUE 4 // HCLK 48MHz, MCU current = 14 mA -//#define STM32_PLLP_VALUE 6 // HCLK 32MHz, MCU current = 10 mA +#define STM32_PLLP_VALUE 4 #undef STM32_PLLQ_VALUE -#define STM32_PLLQ_VALUE 4 - -#undef STM32_I2C_USE_I2C1 -#define STM32_I2C_USE_I2C1 TRUE - -#ifdef LK_WIRELESS_ENABLE -# undef STM32_SPI_USE_SPI1 -# define STM32_SPI_USE_SPI1 TRUE - -# undef STM32_ADC_USE_ADC1 -# define STM32_ADC_USE_ADC1 TRUE -#endif - -# undef STM32_SPI_USE_SPI1 -# define STM32_SPI_USE_SPI1 TRUE +#define STM32_PLLQ_VALUE 4 +#undef STM32_SPI_USE_SPI1 +#define STM32_SPI_USE_SPI1 TRUE diff --git a/keyboards/keychron/k3_max/ansi/rgb/config.h b/keyboards/keychron/k3_max/ansi/rgb/config.h index ad52a2eedc..ddf6d9733a 100644 --- a/keyboards/keychron/k3_max/ansi/rgb/config.h +++ b/keyboards/keychron/k3_max/ansi/rgb/config.h @@ -1,4 +1,4 @@ -/* Copyright 2023 @ Keychron (https://www.keychron.com) +/* Copyright 2024 @ 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 @@ -19,9 +19,7 @@ #ifdef RGB_MATRIX_ENABLE /* RGB Matrix driver configuration */ # define DRIVER_COUNT 2 -# define DRIVER_1_LED_COUNT 46 -# define DRIVER_2_LED_COUNT 38 -# define RGB_MATRIX_LED_COUNT (DRIVER_1_LED_COUNT + DRIVER_2_LED_COUNT) +# define RGB_MATRIX_LED_COUNT 84 # define SPI_SCK_PIN A5 # define SPI_MISO_PIN A6 @@ -33,7 +31,7 @@ # define SPI_DRIVER SPID1 /* Scan phase of led driver set as MSKPHASE_9CHANNEL(defined as 0x03 in snled27351.h) */ -# define PHASE_CHANNEL MSKPHASE_9CHANNEL +# define SNLED27351_PHASE_CHANNEL MSKPHASE_9CHANNEL /* Set LED driver current */ # define SNLED27351_CURRENT_TUNE \ diff --git a/keyboards/keychron/k3_max/ansi/rgb/keymaps/default/keymap.c b/keyboards/keychron/k3_max/ansi/rgb/keymaps/default/keymap.c index 19c33c6277..90031ad893 100644 --- a/keyboards/keychron/k3_max/ansi/rgb/keymaps/default/keymap.c +++ b/keyboards/keychron/k3_max/ansi/rgb/keymaps/default/keymap.c @@ -1,4 +1,4 @@ -/* Copyright 2023 @ Keychron (https://www.keychron.com) +/* Copyright 2024 @ 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 @@ -23,6 +23,7 @@ enum layers { WIN_BASE, WIN_FN, }; + // clang-format off const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [MAC_BASE] = LAYOUT_ansi_84( diff --git a/keyboards/keychron/k3_max/ansi/rgb/keymaps/via/keymap.c b/keyboards/keychron/k3_max/ansi/rgb/keymaps/via/keymap.c index 35e3980783..90031ad893 100644 --- a/keyboards/keychron/k3_max/ansi/rgb/keymaps/via/keymap.c +++ b/keyboards/keychron/k3_max/ansi/rgb/keymaps/via/keymap.c @@ -1,4 +1,4 @@ -/* Copyright 2023 @ Keychron (https://www.keychron.com) +/* Copyright 2024 @ 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 @@ -23,6 +23,7 @@ enum layers { WIN_BASE, WIN_FN, }; + // clang-format off const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [MAC_BASE] = LAYOUT_ansi_84( @@ -55,7 +56,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { RGB_TOG, RGB_MOD, RGB_VAI, RGB_HUI, RGB_SAI, RGB_SPI, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, RGB_RMOD, RGB_VAD, RGB_HUD, RGB_SAD, RGB_SPD, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, BAT_LVL, NK_TOGG, _______, _______, _______, _______, _______, _______, _______, - _______, _______, _______, _______, _______, _______, _______, _______, _______, _______), + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______) }; // clang-format on diff --git a/keyboards/keychron/k3_max/ansi/rgb/rgb.c b/keyboards/keychron/k3_max/ansi/rgb/rgb.c index 2d651cd90e..a1bd731e2f 100644 --- a/keyboards/keychron/k3_max/ansi/rgb/rgb.c +++ b/keyboards/keychron/k3_max/ansi/rgb/rgb.c @@ -1,4 +1,4 @@ -/* Copyright 2023 @ Keychron (https://www.keychron.com) +/* Copyright 2024 @ 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 @@ -121,12 +121,12 @@ const snled27351_led_t g_snled27351_leds[RGB_MATRIX_LED_COUNT] = { 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 } + { 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 } }, { // LED Index to Physical Position diff --git a/keyboards/keychron/k3_max/ansi/white/config.h b/keyboards/keychron/k3_max/ansi/white/config.h index 57338c0079..5fae7460ee 100644 --- a/keyboards/keychron/k3_max/ansi/white/config.h +++ b/keyboards/keychron/k3_max/ansi/white/config.h @@ -1,4 +1,4 @@ -/* Copyright 2023 @ Keychron (https://www.keychron.com) +/* Copyright 2024 @ 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 @@ -31,7 +31,7 @@ # define SPI_DRIVER SPID1 /* Use first 6 channels of LED driver */ -# define PHASE_CHANNEL MSKPHASE_6CHANNEL +# define SNLED27351_PHASE_CHANNEL MSKPHASE_6CHANNEL /* Set LED driver current */ # define SNLED27351_CURRENT_TUNE \ @@ -44,7 +44,7 @@ /* Turn off backlight on low brightness to save power */ # define LED_MATRIX_BRIGHTNESS_TURN_OFF_VAL 48 -/* Caps lock indicating led */ +/* Indications */ # define DIM_CAPS_LOCK # define CAPS_LOCK_INDEX 46 # define LOW_BAT_IND_INDEX \ diff --git a/keyboards/keychron/k3_max/ansi/white/keymaps/default/keymap.c b/keyboards/keychron/k3_max/ansi/white/keymaps/default/keymap.c index 22a7e57cf4..257cc8c28b 100644 --- a/keyboards/keychron/k3_max/ansi/white/keymaps/default/keymap.c +++ b/keyboards/keychron/k3_max/ansi/white/keymaps/default/keymap.c @@ -1,4 +1,4 @@ -/* Copyright 2023 @ Keychron (https://www.keychron.com) +/* Copyright 2024 @ 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 @@ -23,6 +23,7 @@ enum layers { WIN_BASE, WIN_FN, }; + // clang-format off const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [MAC_BASE] = LAYOUT_ansi_84( diff --git a/keyboards/keychron/k3_max/ansi/white/keymaps/via/keymap.c b/keyboards/keychron/k3_max/ansi/white/keymaps/via/keymap.c index 22a7e57cf4..257cc8c28b 100644 --- a/keyboards/keychron/k3_max/ansi/white/keymaps/via/keymap.c +++ b/keyboards/keychron/k3_max/ansi/white/keymaps/via/keymap.c @@ -1,4 +1,4 @@ -/* Copyright 2023 @ Keychron (https://www.keychron.com) +/* Copyright 2024 @ 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 @@ -23,6 +23,7 @@ enum layers { WIN_BASE, WIN_FN, }; + // clang-format off const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [MAC_BASE] = LAYOUT_ansi_84( diff --git a/keyboards/keychron/k3_max/ansi/white/white.c b/keyboards/keychron/k3_max/ansi/white/white.c index d2c6b0ce55..f13137819e 100644 --- a/keyboards/keychron/k3_max/ansi/white/white.c +++ b/keyboards/keychron/k3_max/ansi/white/white.c @@ -1,4 +1,4 @@ -/* Copyright 2023 @ Keychron (https://www.keychron.com) +/* Copyright 2024 @ 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 @@ -119,14 +119,14 @@ const snled27351_led_t g_snled27351_leds[LED_MATRIX_LED_COUNT] = { 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 } + { 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 } }, - { + { // LED Index to Physical Position {0, 0}, {14, 0}, {29, 0}, {44, 0}, {59, 0}, {74, 0}, { 89, 0}, {104, 0}, {119, 0}, {134, 0}, {149, 0}, {164, 0}, {179, 0}, {194, 0}, {209, 0}, {223, 0}, {0,12}, {14,12}, {29,12}, {44,12}, {59,12}, {74,12}, { 89, 12}, {104, 12}, {119, 12}, {134, 12}, {149, 12}, {164, 12}, {179, 12}, {201, 12}, {223, 12}, @@ -145,4 +145,5 @@ led_config_t g_led_config = { 4, 4, 4, 4, 4, 4, 4, 4, 4, 4 } }; + #endif diff --git a/keyboards/keychron/k3_max/board.h b/keyboards/keychron/k3_max/board.h index 6d4d1f1b02..54fba748bf 100644 --- a/keyboards/keychron/k3_max/board.h +++ b/keyboards/keychron/k3_max/board.h @@ -1,4 +1,4 @@ -/* Copyright 2023 @ Keychron (https://www.keychron.com) +/* Copyright 2024 @ 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 diff --git a/keyboards/keychron/k3_max/config.h b/keyboards/keychron/k3_max/config.h index 675dd0b835..d85e80e503 100644 --- a/keyboards/keychron/k3_max/config.h +++ b/keyboards/keychron/k3_max/config.h @@ -1,4 +1,4 @@ -/* Copyright 2023 @ Keychron (https://www.keychron.com) +/* Copyright 2024 @ 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 @@ -16,9 +16,6 @@ #pragma once -/* DIP switch for Mac/win OS switch */ -#define DIP_SWITCH_PINS \ - { B14 } /* Caps lock LED */ #define LED_CAPS_LOCK_PIN A13 #define LED_PIN_ON_STATE 1 diff --git a/keyboards/keychron/k3_max/halconf.h b/keyboards/keychron/k3_max/halconf.h index b1ed75e0b8..37bcc7c47b 100644 --- a/keyboards/keychron/k3_max/halconf.h +++ b/keyboards/keychron/k3_max/halconf.h @@ -1,4 +1,4 @@ -/* Copyright 2023 @ Keychron (https://www.keychron.com) +/* Copyright 2024 @ 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 diff --git a/keyboards/keychron/k3_max/info.json b/keyboards/keychron/k3_max/info.json index 67f25b02bf..d5c1b1c231 100644 --- a/keyboards/keychron/k3_max/info.json +++ b/keyboards/keychron/k3_max/info.json @@ -22,6 +22,9 @@ "rows": ["C12", "D2", "B3", "B4", "B5", "B6"] }, "diode_direction": "ROW2COL", + "dip_switch": { + "pins": ["B14"] + }, "eeprom": { "wear_leveling": { "driver": "embedded_flash", @@ -122,7 +125,7 @@ {"matrix":[5,14], "x":14, "y":5}, {"matrix":[5,15], "x":15, "y":5} ] - }, + } "LAYOUT_iso_85": { "layout": [ {"matrix":[0, 0], "x":0, "y":0}, @@ -216,7 +219,7 @@ {"matrix":[5,14], "x":14, "y":5}, {"matrix":[5,15], "x":15, "y":5} ] - }, + } "LAYOUT_jis_87": { "layout": [ {"matrix": [0, 0], "x": 0, "y": 0}, @@ -314,4 +317,5 @@ ] } } + } diff --git a/keyboards/keychron/k3_max/iso/rgb/config.h b/keyboards/keychron/k3_max/iso/rgb/config.h index 62e216d313..89953553ef 100644 --- a/keyboards/keychron/k3_max/iso/rgb/config.h +++ b/keyboards/keychron/k3_max/iso/rgb/config.h @@ -1,4 +1,4 @@ -/* Copyright 2023 @ Keychron (https://www.keychron.com) +/* Copyright 2024 @ 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 @@ -19,9 +19,7 @@ #ifdef RGB_MATRIX_ENABLE /* RGB Matrix driver configuration */ # define DRIVER_COUNT 2 -# define DRIVER_1_LED_COUNT 46 -# define DRIVER_2_LED_COUNT 39 -# define RGB_MATRIX_LED_COUNT (DRIVER_1_LED_COUNT + DRIVER_2_LED_COUNT) +# define RGB_MATRIX_LED_COUNT 85 # define SPI_SCK_PIN A5 # define SPI_MISO_PIN A6 @@ -33,7 +31,7 @@ # define SPI_DRIVER SPID1 /* Scan phase of led driver set as MSKPHASE_9CHANNEL(defined as 0x03 in snled27351.h) */ -# define PHASE_CHANNEL MSKPHASE_9CHANNEL +# define SNLED27351_PHASE_CHANNEL MSKPHASE_9CHANNEL /* Set LED driver current */ # define SNLED27351_CURRENT_TUNE \ @@ -47,12 +45,11 @@ /* Turn off backlight on low brightness to save power */ # define RGB_MATRIX_BRIGHTNESS_TURN_OFF_VAL 48 -/* Caps lock indicating led */ +/* Indications */ # define DIM_CAPS_LOCK # define CAPS_LOCK_INDEX 46 # define LOW_BAT_IND_INDEX { 78 } - # define RGB_MATRIX_KEYPRESSES # define RGB_MATRIX_FRAMEBUFFER_EFFECTS diff --git a/keyboards/keychron/k3_max/iso/rgb/keymaps/default/keymap.c b/keyboards/keychron/k3_max/iso/rgb/keymaps/default/keymap.c index 61a0229fc4..a7399aadf9 100644 --- a/keyboards/keychron/k3_max/iso/rgb/keymaps/default/keymap.c +++ b/keyboards/keychron/k3_max/iso/rgb/keymaps/default/keymap.c @@ -1,4 +1,4 @@ -/* Copyright 2023 @ Keychron (https://www.keychron.com) +/* Copyright 2024 @ 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 diff --git a/keyboards/keychron/k3_max/iso/rgb/keymaps/via/keymap.c b/keyboards/keychron/k3_max/iso/rgb/keymaps/via/keymap.c index 61a0229fc4..a7399aadf9 100644 --- a/keyboards/keychron/k3_max/iso/rgb/keymaps/via/keymap.c +++ b/keyboards/keychron/k3_max/iso/rgb/keymaps/via/keymap.c @@ -1,4 +1,4 @@ -/* Copyright 2023 @ Keychron (https://www.keychron.com) +/* Copyright 2024 @ 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 diff --git a/keyboards/keychron/k3_max/iso/rgb/rgb.c b/keyboards/keychron/k3_max/iso/rgb/rgb.c index d5445d70c7..140f2dd4be 100644 --- a/keyboards/keychron/k3_max/iso/rgb/rgb.c +++ b/keyboards/keychron/k3_max/iso/rgb/rgb.c @@ -1,4 +1,4 @@ -/* Copyright 2023 @ Keychron (https://www.keychron.com) +/* Copyright 2024 @ 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 @@ -118,20 +118,16 @@ const snled27351_led_t g_snled27351_leds[RGB_MATRIX_LED_COUNT] = { }; -#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 } + { 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, NO_LED, 30 }, + { 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, NO_LED, 45 }, + { 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, NO_LED, 58, NO_LED, 59 }, + { 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, NO_LED, 72, 73, 74 }, + { 75, 76, 77, NO_LED, NO_LED, NO_LED, 78, NO_LED, NO_LED, NO_LED, 79, 80, 81, 82, 83, 84 } }, { - // LED Index to Physical Position {0, 0}, {14, 0}, {29, 0}, {44, 0}, {59, 0}, {74, 0}, { 89, 0}, {104, 0}, {119, 0}, {134, 0}, {149, 0}, {164, 0}, {179, 0}, {194, 0}, {209, 0}, {223, 0}, {0,12}, {14,12}, {29,12}, {44,12}, {59,12}, {74,12}, { 89, 12}, {104, 12}, {119, 12}, {134, 12}, {149, 12}, {164, 12}, {179, 12}, {201, 12}, {223, 12}, {3,25}, {22,25}, {37,25}, {52,25}, {67,25}, {82,25}, { 97, 25}, {112, 25}, {126, 25}, {141, 25}, {156, 25}, {171, 25}, {186, 25}, {205, 32}, {223, 25}, @@ -140,13 +136,13 @@ led_config_t g_led_config = { {1,64}, {20,64}, {39,64}, { 95, 64}, {149, 64}, {164, 64}, {179, 64}, {194, 64}, {209, 64}, {223, 64} }, { - // RGB LED Index to Flag 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4 + } }; #endif diff --git a/keyboards/keychron/k3_max/iso/white/config.h b/keyboards/keychron/k3_max/iso/white/config.h index d5d44b0d68..9534b91b3a 100644 --- a/keyboards/keychron/k3_max/iso/white/config.h +++ b/keyboards/keychron/k3_max/iso/white/config.h @@ -1,4 +1,4 @@ -/* Copyright 2023 @ Keychron (https://www.keychron.com) +/* Copyright 2024 @ 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 @@ -31,7 +31,7 @@ # define SPI_DRIVER SPID1 /* Use first 6 channels of LED driver */ -# define PHASE_CHANNEL MSKPHASE_6CHANNEL +# define SNLED27351_PHASE_CHANNEL MSKPHASE_6CHANNEL /* Set LED driver current */ # define SNLED27351_CURRENT_TUNE \ @@ -44,7 +44,7 @@ /* Turn off backlight on low brightness to save power */ # define LED_MATRIX_BRIGHTNESS_TURN_OFF_VAL 48 -/* Caps lock indicating led */ +/* Indications */ # define DIM_CAPS_LOCK # define CAPS_LOCK_INDEX 46 # define LOW_BAT_IND_INDEX \ diff --git a/keyboards/keychron/k3_max/iso/white/info.json b/keyboards/keychron/k3_max/iso/white/info.json index 2a77437518..1e6992fdb9 100644 --- a/keyboards/keychron/k3_max/iso/white/info.json +++ b/keyboards/keychron/k3_max/iso/white/info.json @@ -24,7 +24,7 @@ "solid_reactive_multinexus": true, "solid_splash": true, "wave_left_right": true, - "wave_up_down": true, + "wave_up_down": true } } } diff --git a/keyboards/keychron/k3_max/iso/white/keymaps/default/keymap.c b/keyboards/keychron/k3_max/iso/white/keymaps/default/keymap.c index 5354017816..1636379951 100644 --- a/keyboards/keychron/k3_max/iso/white/keymaps/default/keymap.c +++ b/keyboards/keychron/k3_max/iso/white/keymaps/default/keymap.c @@ -1,4 +1,4 @@ -/* Copyright 2023 @ Keychron (https://www.keychron.com) +/* Copyright 2024 @ 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 diff --git a/keyboards/keychron/k3_max/iso/white/keymaps/via/keymap.c b/keyboards/keychron/k3_max/iso/white/keymaps/via/keymap.c index 5354017816..1636379951 100644 --- a/keyboards/keychron/k3_max/iso/white/keymaps/via/keymap.c +++ b/keyboards/keychron/k3_max/iso/white/keymaps/via/keymap.c @@ -1,4 +1,4 @@ -/* Copyright 2023 @ Keychron (https://www.keychron.com) +/* Copyright 2024 @ 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 diff --git a/keyboards/keychron/k3_max/iso/white/white.c b/keyboards/keychron/k3_max/iso/white/white.c index cb415573f0..d6a77d733e 100644 --- a/keyboards/keychron/k3_max/iso/white/white.c +++ b/keyboards/keychron/k3_max/iso/white/white.c @@ -1,4 +1,4 @@ -/* Copyright 2023 @ Keychron (https://www.keychron.com) +/* Copyright 2024 @ 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 diff --git a/keyboards/keychron/k3_max/jis/rgb/config.h b/keyboards/keychron/k3_max/jis/rgb/config.h index c06176fbb2..012bab0f5f 100644 --- a/keyboards/keychron/k3_max/jis/rgb/config.h +++ b/keyboards/keychron/k3_max/jis/rgb/config.h @@ -1,4 +1,4 @@ -/* Copyright 2023 @ Keychron (https://www.keychron.com) +/* Copyright 2024 @ 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 @@ -21,18 +21,17 @@ # define DRIVER_COUNT 2 # define RGB_MATRIX_LED_COUNT 87 -# define SPI_SCK_PIN A5 -# define SPI_MISO_PIN A6 -# define SPI_MOSI_PIN A7 - -# define DRIVER_CS_PINS \ - { B8, B9 } -# define SNLED23751_SPI_DIVISOR 16 -# define SPI_DRIVER SPID1 +# define SPI_SCK_PIN A5 +# define SPI_MISO_PIN A6 +# define SPI_MOSI_PIN A7 +# define DRIVER_CS_PINS \ + { B8, B9 } +# define SNLED23751_SPI_DIVISOR 16 +# define SPI_DRIVER SPID1 /* Scan phase of led driver set as MSKPHASE_9CHANNEL(defined as 0x03 in snled27351.h) */ -# define PHASE_CHANNEL MSKPHASE_9CHANNEL +# define SNLED27351_PHASE_CHANNEL MSKPHASE_9CHANNEL /* Set LED driver current */ # define SNLED27351_CURRENT_TUNE \ @@ -46,12 +45,11 @@ /* Turn off backlight on low brightness to save power */ # define RGB_MATRIX_BRIGHTNESS_TURN_OFF_VAL 48 -/* Caps lock indicating led */ +/* Indications */ # define DIM_CAPS_LOCK # define CAPS_LOCK_INDEX 47 # define LOW_BAT_IND_INDEX { 79 } - # define RGB_MATRIX_KEYPRESSES # define RGB_MATRIX_FRAMEBUFFER_EFFECTS diff --git a/keyboards/keychron/k3_max/jis/rgb/keymaps/default/keymap.c b/keyboards/keychron/k3_max/jis/rgb/keymaps/default/keymap.c index 36c874c832..3ab889ba23 100644 --- a/keyboards/keychron/k3_max/jis/rgb/keymaps/default/keymap.c +++ b/keyboards/keychron/k3_max/jis/rgb/keymaps/default/keymap.c @@ -1,4 +1,4 @@ -/* Copyright 2023 @ Keychron (https://www.keychron.com) +/* Copyright 2024 @ 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 diff --git a/keyboards/keychron/k3_max/jis/rgb/keymaps/via/keymap.c b/keyboards/keychron/k3_max/jis/rgb/keymaps/via/keymap.c index 36c874c832..3ab889ba23 100644 --- a/keyboards/keychron/k3_max/jis/rgb/keymaps/via/keymap.c +++ b/keyboards/keychron/k3_max/jis/rgb/keymaps/via/keymap.c @@ -1,4 +1,4 @@ -/* Copyright 2023 @ Keychron (https://www.keychron.com) +/* Copyright 2024 @ 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 diff --git a/keyboards/keychron/k3_max/jis/rgb/rgb.c b/keyboards/keychron/k3_max/jis/rgb/rgb.c index 91a00a901d..73128745d1 100644 --- a/keyboards/keychron/k3_max/jis/rgb/rgb.c +++ b/keyboards/keychron/k3_max/jis/rgb/rgb.c @@ -1,17 +1,17 @@ -/* Copyright 2023 @ Keychron (https://www.keychron.com) +/* Copyright 2024 @ Keychron (https://www.keychron.com) * - * This program is free software : you can redistribute it and /or modify + * 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 + * 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/>. + * along with this program. If not, see . */ #include "quantum.h" @@ -19,7 +19,7 @@ // clang-format off #ifdef RGB_MATRIX_ENABLE -const snled27351_led_t g_snled27351_leds[RGB_MATRIX_LED_COUNT] = { +const snled27351_led_t g_snled27351_leds[RGB_MATRIX_LED_COUNT] = { /* Refer to SNLED27351 manual for these locations * driver * | R location diff --git a/keyboards/keychron/k3_max/jis/white/config.h b/keyboards/keychron/k3_max/jis/white/config.h index b40b4c0cc9..650bbc11e2 100644 --- a/keyboards/keychron/k3_max/jis/white/config.h +++ b/keyboards/keychron/k3_max/jis/white/config.h @@ -1,4 +1,4 @@ -/* Copyright 2023 @ Keychron (https://www.keychron.com) +/* Copyright 2024 @ 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 @@ -31,7 +31,7 @@ # define SPI_DRIVER SPID1 /* Use first 6 channels of LED driver */ -# define PHASE_CHANNEL MSKPHASE_6CHANNEL +# define SNLED27351_PHASE_CHANNEL MSKPHASE_6CHANNEL /* Set LED driver current */ # define SNLED27351_CURRENT_TUNE \ @@ -44,7 +44,7 @@ /* Turn off backlight on low brightness to save power */ # define LED_MATRIX_BRIGHTNESS_TURN_OFF_VAL 48 -/* Caps lock indicating led */ +/* Indications */ # define DIM_CAPS_LOCK # define CAPS_LOCK_INDEX 47 # define LOW_BAT_IND_INDEX \ diff --git a/keyboards/keychron/k3_max/jis/white/info.json b/keyboards/keychron/k3_max/jis/white/info.json index cf59a540ea..1c8d686314 100644 --- a/keyboards/keychron/k3_max/jis/white/info.json +++ b/keyboards/keychron/k3_max/jis/white/info.json @@ -24,7 +24,7 @@ "solid_reactive_multinexus": true, "solid_splash": true, "wave_left_right": true, - "wave_up_down": true, + "wave_up_down": true } } } diff --git a/keyboards/keychron/k3_max/jis/white/keymaps/default/keymap.c b/keyboards/keychron/k3_max/jis/white/keymaps/default/keymap.c index 08b43e1bea..cbbbbe1673 100644 --- a/keyboards/keychron/k3_max/jis/white/keymaps/default/keymap.c +++ b/keyboards/keychron/k3_max/jis/white/keymaps/default/keymap.c @@ -1,4 +1,4 @@ -/* Copyright 2023 @ Keychron (https://www.keychron.com) +/* Copyright 2024 @ 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 diff --git a/keyboards/keychron/k3_max/jis/white/keymaps/via/keymap.c b/keyboards/keychron/k3_max/jis/white/keymaps/via/keymap.c index 08b43e1bea..cbbbbe1673 100644 --- a/keyboards/keychron/k3_max/jis/white/keymaps/via/keymap.c +++ b/keyboards/keychron/k3_max/jis/white/keymaps/via/keymap.c @@ -1,4 +1,4 @@ -/* Copyright 2023 @ Keychron (https://www.keychron.com) +/* Copyright 2024 @ 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 diff --git a/keyboards/keychron/k3_max/jis/white/white.c b/keyboards/keychron/k3_max/jis/white/white.c index eed8cd68c0..13e9adb3d6 100644 --- a/keyboards/keychron/k3_max/jis/white/white.c +++ b/keyboards/keychron/k3_max/jis/white/white.c @@ -1,17 +1,17 @@ -/* Copyright 2023 @ Keychron (https://www.keychron.com) +/* Copyright 2024 @ Keychron (https://www.keychron.com) * - * This program is free software : you can redistribute it and /or modify + * 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 + * 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/>. + * along with this program. If not, see . */ #include "quantum.h" diff --git a/keyboards/keychron/k3_max/k3_max.c b/keyboards/keychron/k3_max/k3_max.c index 34e168f2d9..a4f3a14d01 100644 --- a/keyboards/keychron/k3_max/k3_max.c +++ b/keyboards/keychron/k3_max/k3_max.c @@ -1,4 +1,4 @@ -/* Copyright 2023 @ Keychron (https://www.keychron.com) +/* Copyright 2024 @ 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 @@ -23,6 +23,7 @@ #ifdef LK_WIRELESS_ENABLE # include "lkbt51.h" # include "wireless.h" +# include "transport.h" # include "keychron_wireless_common.h" # include "battery.h" #endif @@ -30,9 +31,6 @@ #define POWER_ON_LED_DURATION 3000 static uint32_t power_on_indicator_timer; -#ifdef KEYCHRON_CALLBACK_ENABLE -bool keychron_task_kb(void); -#endif bool dip_switch_update_kb(uint8_t index, bool active) { if (index == 0) { @@ -56,11 +54,7 @@ void keyboard_post_init_kb(void) { #ifdef ENCODER_ENABLE encoder_cb_init(); #endif -#ifdef KEYCHRON_CALLBACK_ENABLE - factory_test_init(); - register_record_process(process_record_keychron_kb, false); - register_keychron_task(keychron_task_kb, false); -#endif + keyboard_post_init_user(); } diff --git a/keyboards/keychron/k3_max/mcuconf.h b/keyboards/keychron/k3_max/mcuconf.h index f14f6ac32a..89294ee64b 100644 --- a/keyboards/keychron/k3_max/mcuconf.h +++ b/keyboards/keychron/k3_max/mcuconf.h @@ -1,51 +1,37 @@ -/* Copyright 2022 QMK +/* Copyright 2024 @ Keychron (https://www.keychron.com) * - * This program is free software: you can redistribute it and/or modify + * 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 + * 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 . + * along with this program.If not, see < http://www.gnu.org/licenses/>. */ - #pragma once #include_next #undef STM32_HSECLK -#define STM32_HSECLK 16000000 +#define STM32_HSECLK 16000000 #undef STM32_PLLM_VALUE -#define STM32_PLLM_VALUE 8 +#define STM32_PLLM_VALUE 8 #undef STM32_PLLN_VALUE -#define STM32_PLLN_VALUE 96 +#define STM32_PLLN_VALUE 96 #undef STM32_PLLP_VALUE -#define STM32_PLLP_VALUE 4 // HCLK 48MHz, MCU current = 14 mA -//#define STM32_PLLP_VALUE 6 // HCLK 32MHz, MCU current = 10 mA +#define STM32_PLLP_VALUE 4 #undef STM32_PLLQ_VALUE -#define STM32_PLLQ_VALUE 4 - -#undef STM32_I2C_USE_I2C1 -#define STM32_I2C_USE_I2C1 TRUE - -#ifdef LK_WIRELESS_ENABLE -# undef STM32_SPI_USE_SPI1 -# define STM32_SPI_USE_SPI1 TRUE - -# undef STM32_ADC_USE_ADC1 -# define STM32_ADC_USE_ADC1 TRUE -#endif - -# undef STM32_SPI_USE_SPI1 -# define STM32_SPI_USE_SPI1 TRUE +#define STM32_PLLQ_VALUE 4 +#undef STM32_SPI_USE_SPI1 +#define STM32_SPI_USE_SPI1 TRUE diff --git a/keyboards/keychron/k3_max/readme.md b/keyboards/keychron/k3_max/readme.md index 222cb47b64..136dff5a91 100644 --- a/keyboards/keychron/k3_max/readme.md +++ b/keyboards/keychron/k3_max/readme.md @@ -18,6 +18,6 @@ Flashing example for this keyboard: make keychron/k3_max/ansi/rgb:default:flash make keychron/k3_max/ansi/white:default:flash -**Reset Key**: Toggle mode switch to "Cable", hold down the *Esc* key or reset button underneath space bar while connecting the USB cable, +**Reset Key**: Disconnect the USB cable, toggle mode switch to "Cable", hold down the *Esc* key or reset button underneath space bar, then connect the USB cable. See the [build environment setup](https://docs.qmk.fm/#/getting_started_build_tools) and the [make instructions](https://docs.qmk.fm/#/getting_started_make_guide) for more information. Brand new to QMK? Start with our [Complete Newbs Guide](https://docs.qmk.fm/#/newbs). diff --git a/keyboards/keychron/k5_max/ansi/rgb/config.h b/keyboards/keychron/k5_max/ansi/rgb/config.h new file mode 100644 index 0000000000..85e913346a --- /dev/null +++ b/keyboards/keychron/k5_max/ansi/rgb/config.h @@ -0,0 +1,55 @@ +/* Copyright 2024 @ Keychron (https://www.keychron.com) + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#pragma once + +#ifdef RGB_MATRIX_ENABLE +/* RGB Matrix driver configuration */ +# define DRIVER_COUNT 2 +# define RGB_MATRIX_LED_COUNT 108 + +# define SPI_SCK_PIN A5 +# define SPI_MISO_PIN A6 +# define SPI_MOSI_PIN A7 + +# define DRIVER_CS_PINS \ + { B8, B9 } +# define SNLED23751_SPI_DIVISOR 16 +# define SPI_DRIVER SPID1 + +/* Scan phase of led driver set as MSKPHASE_9CHANNEL(defined as 0x03 in snled27351.h) */ +# define PHASE_CHANNEL MSKPHASE_12CHANNEL + +/* Set LED driver current */ +# define SNLED27351_CURRENT_TUNE \ + { 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12 } + +/* Set to infinit, which is use in USB mode by default */ +# define RGB_MATRIX_TIMEOUT RGB_MATRIX_TIMEOUT_INFINITE + +/* Allow shutdown of led driver to save power */ +# define RGB_MATRIX_DRIVER_SHUTDOWN_ENABLE +/* Turn off backlight on low brightness to save power */ +# define RGB_MATRIX_BRIGHTNESS_TURN_OFF_VAL 48 + +/* Indications */ +# define LOW_BAT_IND_INDEX \ + { 98 } + +# define RGB_MATRIX_KEYPRESSES +# define RGB_MATRIX_FRAMEBUFFER_EFFECTS + +#endif diff --git a/keyboards/keychron/k5_max/ansi/rgb/info.json b/keyboards/keychron/k5_max/ansi/rgb/info.json new file mode 100644 index 0000000000..9ace101719 --- /dev/null +++ b/keyboards/keychron/k5_max/ansi/rgb/info.json @@ -0,0 +1,36 @@ +{ + "usb": { + "pid": "0x0A50", + "device_version": "1.0.0" + }, + "features": { + "rgb_matrix": true + }, + "rgb_matrix": { + "driver": "snled27351_spi", + "sleep": true, + "animations": { + "band_spiral_val": true, + "breathing": true, + "cycle_all": true, + "cycle_left_right": true, + "cycle_out_in": true, + "cycle_out_in_dual": true, + "cycle_pinwheel": true, + "cycle_spiral": true, + "cycle_up_down": true, + "digital_rain": true, + "dual_beacon": true, + "jellybean_raindrops": true, + "pixel_rain": true, + "rainbow_beacon": true, + "rainbow_moving_chevron": true, + "solid_reactive_multinexus": true, + "solid_reactive_multiwide": true, + "solid_reactive_simple": true, + "solid_splash": true, + "splash": true, + "typing_heatmap": true + } + } +} diff --git a/keyboards/keychron/k5_max/ansi/rgb/keymaps/default/keymap.c b/keyboards/keychron/k5_max/ansi/rgb/keymaps/default/keymap.c new file mode 100644 index 0000000000..d14b8b1c6d --- /dev/null +++ b/keyboards/keychron/k5_max/ansi/rgb/keymaps/default/keymap.c @@ -0,0 +1,68 @@ +/* Copyright 2024 @ Keychron (https://www.keychron.com) + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#include QMK_KEYBOARD_H +#include "keychron_common.h" + +enum layers { + MAC_BASE, + MAC_FN, + WIN_BASE, + WIN_FN, +}; + +// clang-format off +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + [MAC_BASE] = LAYOUT_108_ansi( + KC_ESC, KC_BRID, KC_BRIU, KC_MCTRL, KC_LNPAD, RGB_VAD, RGB_VAI, KC_MPRV, KC_MPLY, KC_MNXT, KC_MUTE, KC_VOLD, KC_VOLU, KC_SNAP, KC_SIRI, RGB_MOD, KC_F13, KC_F14, KC_F15, KC_F16, + KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, KC_INS, KC_HOME, KC_PGUP, KC_NUM, KC_PSLS, KC_PAST, KC_PMNS, + KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, KC_DEL, KC_END, KC_PGDN, KC_P7, KC_P8, KC_P9, + 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_P4, KC_P5, KC_P6, KC_PPLS, + 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_P1, KC_P2, KC_P3, + KC_LCTL, KC_LOPTN, KC_LCMMD, KC_SPC, KC_RCMMD, KC_ROPTN,MO(MAC_FN),KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT, KC_P0, KC_PDOT, KC_PENT), + + [MAC_FN] = LAYOUT_108_ansi( + _______, 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, _______, _______, _______, _______, + _______, BT_HST1, BT_HST2, BT_HST3, P2P4G, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + RGB_TOG, RGB_MOD, RGB_VAI, RGB_HUI, RGB_SAI, RGB_SPI, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, RGB_RMOD, RGB_VAD, RGB_HUD, RGB_SAD, RGB_SPD, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, BAT_LVL, NK_TOGG, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______), + + [WIN_BASE] = LAYOUT_108_ansi( + KC_ESC, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_PSCR, KC_CTANA, RGB_MOD, _______, _______, _______, _______, + KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, KC_INS, KC_HOME, KC_PGUP, KC_NUM, KC_PSLS, KC_PAST, KC_PMNS, + KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, KC_DEL, KC_END, KC_PGDN, KC_P7, KC_P8, KC_P9, + 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_P4, KC_P5, KC_P6, KC_PPLS, + 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_P1, KC_P2, KC_P3, + KC_LCTL, KC_LWIN, KC_LALT, KC_SPC, KC_RALT, KC_RWIN, MO(WIN_FN),KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT, KC_P0, KC_PDOT, KC_PENT), + + [WIN_FN] = LAYOUT_108_ansi( + _______, 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, P2P4G, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + RGB_TOG, RGB_MOD, RGB_VAI, RGB_HUI, RGB_SAI, RGB_SPI, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, RGB_RMOD, RGB_VAD, RGB_HUD, RGB_SAD, RGB_SPD, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, BAT_LVL, NK_TOGG, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______), +}; + +// clang-format on +bool process_record_user(uint16_t keycode, keyrecord_t *record) { + if (!process_record_keychron_common(keycode, record)) { + return false; + } + return true; +} diff --git a/keyboards/keychron/k5_max/ansi/rgb/keymaps/via/keymap.c b/keyboards/keychron/k5_max/ansi/rgb/keymaps/via/keymap.c new file mode 100644 index 0000000000..d14b8b1c6d --- /dev/null +++ b/keyboards/keychron/k5_max/ansi/rgb/keymaps/via/keymap.c @@ -0,0 +1,68 @@ +/* Copyright 2024 @ Keychron (https://www.keychron.com) + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#include QMK_KEYBOARD_H +#include "keychron_common.h" + +enum layers { + MAC_BASE, + MAC_FN, + WIN_BASE, + WIN_FN, +}; + +// clang-format off +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + [MAC_BASE] = LAYOUT_108_ansi( + KC_ESC, KC_BRID, KC_BRIU, KC_MCTRL, KC_LNPAD, RGB_VAD, RGB_VAI, KC_MPRV, KC_MPLY, KC_MNXT, KC_MUTE, KC_VOLD, KC_VOLU, KC_SNAP, KC_SIRI, RGB_MOD, KC_F13, KC_F14, KC_F15, KC_F16, + KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, KC_INS, KC_HOME, KC_PGUP, KC_NUM, KC_PSLS, KC_PAST, KC_PMNS, + KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, KC_DEL, KC_END, KC_PGDN, KC_P7, KC_P8, KC_P9, + 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_P4, KC_P5, KC_P6, KC_PPLS, + 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_P1, KC_P2, KC_P3, + KC_LCTL, KC_LOPTN, KC_LCMMD, KC_SPC, KC_RCMMD, KC_ROPTN,MO(MAC_FN),KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT, KC_P0, KC_PDOT, KC_PENT), + + [MAC_FN] = LAYOUT_108_ansi( + _______, 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, _______, _______, _______, _______, + _______, BT_HST1, BT_HST2, BT_HST3, P2P4G, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + RGB_TOG, RGB_MOD, RGB_VAI, RGB_HUI, RGB_SAI, RGB_SPI, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, RGB_RMOD, RGB_VAD, RGB_HUD, RGB_SAD, RGB_SPD, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, BAT_LVL, NK_TOGG, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______), + + [WIN_BASE] = LAYOUT_108_ansi( + KC_ESC, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_PSCR, KC_CTANA, RGB_MOD, _______, _______, _______, _______, + KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, KC_INS, KC_HOME, KC_PGUP, KC_NUM, KC_PSLS, KC_PAST, KC_PMNS, + KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, KC_DEL, KC_END, KC_PGDN, KC_P7, KC_P8, KC_P9, + 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_P4, KC_P5, KC_P6, KC_PPLS, + 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_P1, KC_P2, KC_P3, + KC_LCTL, KC_LWIN, KC_LALT, KC_SPC, KC_RALT, KC_RWIN, MO(WIN_FN),KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT, KC_P0, KC_PDOT, KC_PENT), + + [WIN_FN] = LAYOUT_108_ansi( + _______, 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, P2P4G, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + RGB_TOG, RGB_MOD, RGB_VAI, RGB_HUI, RGB_SAI, RGB_SPI, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, RGB_RMOD, RGB_VAD, RGB_HUD, RGB_SAD, RGB_SPD, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, BAT_LVL, NK_TOGG, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______), +}; + +// clang-format on +bool process_record_user(uint16_t keycode, keyrecord_t *record) { + if (!process_record_keychron_common(keycode, record)) { + return false; + } + return true; +} diff --git a/keyboards/keychron/k5_max/ansi/rgb/keymaps/via/rules.mk b/keyboards/keychron/k5_max/ansi/rgb/keymaps/via/rules.mk new file mode 100644 index 0000000000..1e5b99807c --- /dev/null +++ b/keyboards/keychron/k5_max/ansi/rgb/keymaps/via/rules.mk @@ -0,0 +1 @@ +VIA_ENABLE = yes diff --git a/keyboards/keychron/k5_max/ansi/rgb/rgb.c b/keyboards/keychron/k5_max/ansi/rgb/rgb.c new file mode 100644 index 0000000000..5d95d6ec86 --- /dev/null +++ b/keyboards/keychron/k5_max/ansi/rgb/rgb.c @@ -0,0 +1,174 @@ +/* Copyright 2024 @ Keychron (https://www.keychron.com) + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#include "quantum.h" + +// clang-format off +#ifdef RGB_MATRIX_ENABLE +const snled27351_led_t g_snled27351_leds[RGB_MATRIX_LED_COUNT] = { +/* Refer to SNLED27351 manual for these locations + * driver + * | R location + * | | G location + * | | | B location + * | | | | */ + {0, G_1, I_1, H_1}, + {0, G_2, I_2, H_2}, + {0, G_3, I_3, H_3}, + {0, G_4, I_4, H_4}, + {0, G_5, I_5, H_5}, + {0, G_6, I_6, H_6}, + {0, G_7, I_7, H_7}, + {0, G_8, I_8, H_8}, + {0, G_9, I_9, H_9}, + {0, G_10, I_10, H_10}, + {0, G_11, I_11, H_11}, + {0, G_12, I_12, H_12}, + {0, G_13, I_13, H_13}, + {0, G_15, I_15, H_15}, + {0, G_16, I_16, H_16}, + {0, G_14, I_14, H_14}, + {1, G_13, I_13, H_13}, + {1, G_15, I_15, H_15}, + {1, G_16, I_16, H_16}, + {1, A_15, C_15, B_15}, + + {0, D_1, F_1, E_1}, + {0, D_2, F_2, E_2}, + {0, D_3, F_3, E_3}, + {0, D_4, F_4, E_4}, + {0, D_5, F_5, E_5}, + {0, D_6, F_6, E_6}, + {0, D_7, F_7, E_7}, + {0, D_8, F_8, E_8}, + {0, D_9, F_9, E_9}, + {0, D_10, F_10, E_10}, + {0, D_11, F_11, E_11}, + {0, D_12, F_12, E_12}, + {0, D_13, F_13, E_13}, + {0, D_14, F_14, E_14}, + {0, D_15, F_15, E_15}, + {0, D_16, F_16, E_16}, + {0, J_7, L_7, K_7}, + {0, J_8, L_8, K_8}, + {0, J_9, L_9, K_9}, + {0, J_10, L_10, K_10}, + {0, J_11, L_11, K_11}, + + {0, C_1, A_1, B_1}, + {0, C_2, A_2, B_2}, + {0, C_3, A_3, B_3}, + {0, C_4, A_4, B_4}, + {0, C_5, A_5, B_5}, + {0, C_6, A_6, B_6}, + {0, C_7, A_7, B_7}, + {0, C_8, A_8, B_8}, + {0, C_9, A_9, B_9}, + {0, C_10, A_10, B_10}, + {0, C_11, A_11, B_11}, + {0, C_12, A_12, B_12}, + {0, C_13, A_13, B_13}, + {0, C_14, A_14, B_14}, + {0, C_15, A_15, B_15}, + {0, C_16, A_16, B_16}, + {0, J_12, L_12, K_12}, + {0, J_13, L_13, K_13}, + {0, J_14, L_14, K_14}, + {0, J_15, L_15, K_15}, + {0, J_16, L_16, K_16}, + + {1, G_1, I_1, H_1}, + {1, G_2, I_2, H_2}, + {1, G_3, I_3, H_3}, + {1, G_4, I_4, H_4}, + {1, G_5, I_5, H_5}, + {1, G_6, I_6, H_6}, + {1, G_7, I_7, H_7}, + {1, G_8, I_8, H_8}, + {1, G_9, I_9, H_9}, + {1, G_10, I_10, H_10}, + {1, G_11, I_11, H_11}, + {1, G_12, I_12, H_12}, + {1, G_14, I_14, H_14}, + {1, J_7, L_7, K_7}, + {1, J_8, L_8, K_8}, + {1, J_9, L_9, K_9}, + + {1, A_1, C_1, B_1}, + {1, A_3, C_3, B_3}, + {1, A_4, C_4, B_4}, + {1, A_5, C_5, B_5}, + {1, A_6, C_6, B_6}, + {1, A_7, C_7, B_7}, + {1, A_8, C_8, B_8}, + {1, A_9, C_9, B_9}, + {1, A_10, C_10, B_10}, + {1, A_11, C_11, B_11}, + {1, A_12, C_12, B_12}, + {1, A_14, C_14, B_14}, + {1, A_16, C_16, B_16}, + {1, J_10, L_10, K_10}, + {1, J_11, L_11, K_11}, + {1, J_12, L_12, K_12}, + {1, J_13, L_13, K_13}, + + {1, D_1, F_1, E_1}, + {1, D_2, F_2, E_2}, + {1, D_3, F_3, E_3}, + {1, D_7, F_7, E_7}, + {1, D_11, F_11, E_11}, + {1, D_12, F_12, E_12}, + {1, D_13, F_13, E_13}, + {1, D_14, F_14, E_14}, + {1, D_15, F_15, E_15}, + {1, D_16, F_16, E_16}, + {1, J_14, L_14, K_14}, + {1, J_15, L_15, K_15}, + {1, J_16, L_16, K_16}, +}; + +#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, 88, __, 89, __, 90, __, 91, 92, 93, 94 }, + { 95, 96, 97, __, __, __, 98, __, __, __, 99, 100, 101, 102, 103, 104, 105, 106, __, 107, __ }, + }, + { + // LED Index to Physical Position + {0, 0}, {21, 0}, {32, 0}, {42, 0}, {53, 0}, {69, 0}, {79, 0}, {90, 0}, {100, 0}, {116, 0}, {127, 0}, {137, 0}, {148, 0}, {160, 0}, {170, 0}, {181, 0}, {192, 0}, {203, 0}, {213, 0}, {224, 0}, + {0,14}, {11,14}, {21,14}, {32,14}, {42,14}, {53,14}, {63,14}, {74,14}, { 84,14}, { 95,14}, {106,14}, {116,14}, {127,14}, {143,14}, {160,14}, {170,14}, {181,14}, {192,14}, {203,14}, {213,14}, {224,14}, + {3,26}, {16,26}, {26,26}, {37,26}, {48,26}, {58,26}, {69,26}, {79,26}, { 90,26}, {100,26}, {111,26}, {121,26}, {132,26}, {145,26}, {160,26}, {170,26}, {181,26}, {192,26}, {203,26}, {213,26}, {224,33}, + {4,39}, {19,39}, {29,39}, {40,39}, {50,39}, {61,39}, {71,39}, {82,39}, { 92,39}, {103,39}, {114,39}, {124,39}, {141,39}, {192,39}, {203,39}, {213,39}, + {7,51}, {24,51}, {34,51}, {45,51}, {55,51}, {66,51}, {77,51}, { 87,51}, { 98,51}, {108,51}, {119,51}, {139,51}, {170,51}, {192,51}, {203,51}, {213,51}, {224,58}, + {1,64}, {15,64}, {28,64}, {67,64}, {107,64}, {120,64}, {133,64}, {147,64}, {160,64}, {170,64}, {181,64}, {198,64}, {213,64}, + }, + { + // RGB LED Index to Flag + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + } +}; +#endif diff --git a/keyboards/keychron/k5_max/ansi/rgb/rules.mk b/keyboards/keychron/k5_max/ansi/rgb/rules.mk new file mode 100644 index 0000000000..6e7633bfe0 --- /dev/null +++ b/keyboards/keychron/k5_max/ansi/rgb/rules.mk @@ -0,0 +1 @@ +# This file intentionally left blank diff --git a/keyboards/keychron/k5_max/ansi/white/config.h b/keyboards/keychron/k5_max/ansi/white/config.h new file mode 100644 index 0000000000..e40f43ff89 --- /dev/null +++ b/keyboards/keychron/k5_max/ansi/white/config.h @@ -0,0 +1,52 @@ +/* Copyright 2024 @ Keychron (https://www.keychron.com) + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#pragma once + +#ifdef LED_MATRIX_ENABLE +/* LED matrix driver configuration */ +# define DRIVER_COUNT 1 +# define LED_MATRIX_LED_COUNT 108 + +# define SPI_SCK_PIN A5 +# define SPI_MISO_PIN A6 +# define SPI_MOSI_PIN A7 + +# define DRIVER_CS_PINS \ + { B9 } +# define SNLED23751_SPI_DIVISOR 16 +# define SPI_DRIVER SPID1 + +/* Use first 6 channels of LED driver */ +# define SNLED27351_PHASE_CHANNEL MSKPHASE_8CHANNEL + +/* Set LED driver current */ +# define SNLED27351_CURRENT_TUNE \ + { 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20 } + +/* Set to infinit, which is use in USB mode by default */ +# define LED_MATRIX_TIMEOUT LED_MATRIX_TIMEOUT_INFINITE +/* Allow shutdown of led driver to save power */ +# define LED_MATRIX_DRIVER_SHUTDOWN_ENABLE +/* Turn off backlight on low brightness to save power */ +# define LED_MATRIX_BRIGHTNESS_TURN_OFF_VAL 48 + +/* Indications */ +# define LOW_BAT_IND_INDEX \ + { 98 } + +# define LED_MATRIX_KEYPRESSES +#endif diff --git a/keyboards/keychron/k5_max/ansi/white/info.json b/keyboards/keychron/k5_max/ansi/white/info.json new file mode 100644 index 0000000000..e031f22b73 --- /dev/null +++ b/keyboards/keychron/k5_max/ansi/white/info.json @@ -0,0 +1,30 @@ +{ + "usb": { + "pid": "0x0A53", + "device_version": "1.0.0" + }, + "features": { + "led_matrix": true + }, + "led_matrix": { + "driver": "snled27351_spi", + "sleep": true, + "animations": { + "none": true, + "solid": true, + "breathing": true, + "band_pinwheel": true, + "band_spiral": true, + "cycle_left_right": true, + "cycle_up_down": true, + "cycle_out_in": true, + "dual_beacon": true, + "solid_reactive_simple": true, + "solid_reactive_multiwide": true, + "solid_reactive_multinexus": true, + "solid_splash": true, + "wave_left_right": true, + "wave_up_down": true + } + } +} diff --git a/keyboards/keychron/k5_max/ansi/white/keymaps/default/keymap.c b/keyboards/keychron/k5_max/ansi/white/keymaps/default/keymap.c new file mode 100644 index 0000000000..2ea0c3daef --- /dev/null +++ b/keyboards/keychron/k5_max/ansi/white/keymaps/default/keymap.c @@ -0,0 +1,68 @@ +/* Copyright 2024 @ Keychron (https://www.keychron.com) + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#include QMK_KEYBOARD_H +#include "keychron_common.h" + +enum layers { + MAC_BASE, + MAC_FN, + WIN_BASE, + WIN_FN, +}; + +// clang-format off +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + [MAC_BASE] = LAYOUT_108_ansi( + KC_ESC, KC_BRID, KC_BRIU, KC_MCTRL, KC_LNPAD, BL_DOWN, BL_UP, KC_MPRV, KC_MPLY, KC_MNXT, KC_MUTE, KC_VOLD, KC_VOLU, KC_SNAP, KC_SIRI, BL_STEP, KC_F13, KC_F14, KC_F15, KC_F16, + KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, KC_INS, KC_HOME, KC_PGUP, KC_NUM, KC_PSLS, KC_PAST, KC_PMNS, + KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, KC_DEL, KC_END, KC_PGDN, KC_P7, KC_P8, KC_P9, + 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_P4, KC_P5, KC_P6, KC_PPLS, + 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_P1, KC_P2, KC_P3, + KC_LCTL, KC_LOPTN, KC_LCMMD, KC_SPC, KC_RCMMD, KC_ROPTN,MO(MAC_FN),KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT, KC_P0, KC_PDOT, KC_PENT), + + [MAC_FN] = LAYOUT_108_ansi( + _______, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, _______, _______, BL_TOGG, _______, _______, _______, _______, + _______, BT_HST1, BT_HST2, BT_HST3, P2P4G, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + BL_TOGG, BL_STEP, BL_UP, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, BL_DOWN, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, BAT_LVL, NK_TOGG, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______), + + [WIN_BASE] = LAYOUT_108_ansi( + KC_ESC, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_PSCR, KC_CTANA, BL_STEP, _______, _______, _______, _______, + KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, KC_INS, KC_HOME, KC_PGUP, KC_NUM, KC_PSLS, KC_PAST, KC_PMNS, + KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, KC_DEL, KC_END, KC_PGDN, KC_P7, KC_P8, KC_P9, + 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_P4, KC_P5, KC_P6, KC_PPLS, + 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_P1, KC_P2, KC_P3, + KC_LCTL, KC_LWIN, KC_LALT, KC_SPC, KC_RALT, KC_RWIN, MO(WIN_FN),KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT, KC_P0, KC_PDOT, KC_PENT), + + [WIN_FN] = LAYOUT_108_ansi( + _______, KC_BRID, KC_BRIU, KC_TASK, KC_FILE, BL_DOWN, BL_UP, KC_MPRV, KC_MPLY, KC_MNXT, KC_MUTE, KC_VOLD, KC_VOLU, _______, _______, BL_TOGG, _______, _______, _______, _______, + _______, BT_HST1, BT_HST2, BT_HST3, P2P4G, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + BL_TOGG, BL_STEP, BL_UP, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, BL_DOWN, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, BAT_LVL, NK_TOGG, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______), +}; + +// clang-format on +bool process_record_user(uint16_t keycode, keyrecord_t *record) { + if (!process_record_keychron_common(keycode, record)) { + return false; + } + return true; +} diff --git a/keyboards/keychron/k5_max/ansi/white/keymaps/via/keymap.c b/keyboards/keychron/k5_max/ansi/white/keymaps/via/keymap.c new file mode 100644 index 0000000000..2ea0c3daef --- /dev/null +++ b/keyboards/keychron/k5_max/ansi/white/keymaps/via/keymap.c @@ -0,0 +1,68 @@ +/* Copyright 2024 @ Keychron (https://www.keychron.com) + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#include QMK_KEYBOARD_H +#include "keychron_common.h" + +enum layers { + MAC_BASE, + MAC_FN, + WIN_BASE, + WIN_FN, +}; + +// clang-format off +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + [MAC_BASE] = LAYOUT_108_ansi( + KC_ESC, KC_BRID, KC_BRIU, KC_MCTRL, KC_LNPAD, BL_DOWN, BL_UP, KC_MPRV, KC_MPLY, KC_MNXT, KC_MUTE, KC_VOLD, KC_VOLU, KC_SNAP, KC_SIRI, BL_STEP, KC_F13, KC_F14, KC_F15, KC_F16, + KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, KC_INS, KC_HOME, KC_PGUP, KC_NUM, KC_PSLS, KC_PAST, KC_PMNS, + KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, KC_DEL, KC_END, KC_PGDN, KC_P7, KC_P8, KC_P9, + 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_P4, KC_P5, KC_P6, KC_PPLS, + 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_P1, KC_P2, KC_P3, + KC_LCTL, KC_LOPTN, KC_LCMMD, KC_SPC, KC_RCMMD, KC_ROPTN,MO(MAC_FN),KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT, KC_P0, KC_PDOT, KC_PENT), + + [MAC_FN] = LAYOUT_108_ansi( + _______, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, _______, _______, BL_TOGG, _______, _______, _______, _______, + _______, BT_HST1, BT_HST2, BT_HST3, P2P4G, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + BL_TOGG, BL_STEP, BL_UP, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, BL_DOWN, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, BAT_LVL, NK_TOGG, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______), + + [WIN_BASE] = LAYOUT_108_ansi( + KC_ESC, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_PSCR, KC_CTANA, BL_STEP, _______, _______, _______, _______, + KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, KC_INS, KC_HOME, KC_PGUP, KC_NUM, KC_PSLS, KC_PAST, KC_PMNS, + KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, KC_DEL, KC_END, KC_PGDN, KC_P7, KC_P8, KC_P9, + 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_P4, KC_P5, KC_P6, KC_PPLS, + 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_P1, KC_P2, KC_P3, + KC_LCTL, KC_LWIN, KC_LALT, KC_SPC, KC_RALT, KC_RWIN, MO(WIN_FN),KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT, KC_P0, KC_PDOT, KC_PENT), + + [WIN_FN] = LAYOUT_108_ansi( + _______, KC_BRID, KC_BRIU, KC_TASK, KC_FILE, BL_DOWN, BL_UP, KC_MPRV, KC_MPLY, KC_MNXT, KC_MUTE, KC_VOLD, KC_VOLU, _______, _______, BL_TOGG, _______, _______, _______, _______, + _______, BT_HST1, BT_HST2, BT_HST3, P2P4G, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + BL_TOGG, BL_STEP, BL_UP, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, BL_DOWN, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, BAT_LVL, NK_TOGG, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______), +}; + +// clang-format on +bool process_record_user(uint16_t keycode, keyrecord_t *record) { + if (!process_record_keychron_common(keycode, record)) { + return false; + } + return true; +} diff --git a/keyboards/keychron/k5_max/ansi/white/keymaps/via/rules.mk b/keyboards/keychron/k5_max/ansi/white/keymaps/via/rules.mk new file mode 100644 index 0000000000..1e5b99807c --- /dev/null +++ b/keyboards/keychron/k5_max/ansi/white/keymaps/via/rules.mk @@ -0,0 +1 @@ +VIA_ENABLE = yes diff --git a/keyboards/keychron/k5_max/ansi/white/rules.mk b/keyboards/keychron/k5_max/ansi/white/rules.mk new file mode 100644 index 0000000000..6e7633bfe0 --- /dev/null +++ b/keyboards/keychron/k5_max/ansi/white/rules.mk @@ -0,0 +1 @@ +# This file intentionally left blank diff --git a/keyboards/keychron/k5_max/ansi/white/white.c b/keyboards/keychron/k5_max/ansi/white/white.c new file mode 100644 index 0000000000..b3bf4e2c25 --- /dev/null +++ b/keyboards/keychron/k5_max/ansi/white/white.c @@ -0,0 +1,172 @@ +/* Copyright 2024 @ Keychron (https://www.keychron.com) + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#include "quantum.h" + +// clang-format off +#ifdef LED_MATRIX_ENABLE +const snled27351_led_t g_snled27351_leds[LED_MATRIX_LED_COUNT] = { +/* Refer to SNLED27351 manual for these locations + * driver + * | LED address + * | | */ + {0, F_1}, + {0, F_2}, + {0, F_3}, + {0, F_4}, + {0, F_5}, + {0, F_6}, + {0, F_7}, + {0, F_8}, + {0, F_9}, + {0, F_10}, + {0, F_11}, + {0, F_12}, + {0, F_13}, + {0, F_15}, + {0, F_16}, + {0, F_14}, + {0, H_7}, + {0, H_8}, + {0, H_9}, + {0, H_10}, + + {0, E_1}, + {0, E_2}, + {0, E_3}, + {0, E_4}, + {0, E_5}, + {0, E_6}, + {0, E_7}, + {0, E_8}, + {0, E_9}, + {0, E_10}, + {0, E_11}, + {0, E_12}, + {0, E_13}, + {0, E_14}, + {0, E_15}, + {0, E_16}, + {0, G_7}, + {0, G_8}, + {0, G_9}, + {0, G_10}, + {0, G_11}, + + {0, D_1}, + {0, D_2}, + {0, D_3}, + {0, D_4}, + {0, D_5}, + {0, D_6}, + {0, D_7}, + {0, D_8}, + {0, D_9}, + {0, D_10}, + {0, D_11}, + {0, D_12}, + {0, D_13}, + {0, D_14}, + {0, D_15}, + {0, D_16}, + {0, G_12}, + {0, G_13}, + {0, G_14}, + {0, G_15}, + {0, G_16}, + + {0, C_1}, + {0, C_2}, + {0, C_3}, + {0, C_4}, + {0, C_5}, + {0, C_6}, + {0, C_7}, + {0, C_8}, + {0, C_9}, + {0, C_10}, + {0, C_11}, + {0, C_12}, + {0, C_14}, + {0, C_13}, + {0, C_15}, + {0, C_16}, + + {0, B_1}, + {0, B_3}, + {0, B_4}, + {0, B_5}, + {0, B_6}, + {0, B_7}, + {0, B_8}, + {0, B_9}, + {0, B_10}, + {0, B_11}, + {0, B_12}, + {0, B_14}, + {0, B_16}, + {0, B_13}, + {0, H_11}, + {0, H_12}, + {0, H_13}, + + {0, A_1}, + {0, A_2}, + {0, A_3}, + {0, A_7}, + {0, A_11}, + {0, A_12}, + {0, A_13}, + {0, A_14}, + {0, A_15}, + {0, A_16}, + {0, H_14}, + {0, H_15}, + {0, H_16}, +}; + +#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, 88, __, 89, __, 90, __, 91, 92, 93, 94 }, + { 95, 96, 97, __, __, __, 98, __, __, __, 99, 100, 101, 102, 103, 104, 105, 106, __, 107, __ }, + }, + { + // LED Index to Physical Position + {0, 0}, {21, 0}, {32, 0}, {42, 0}, {53, 0}, {69, 0}, {79, 0}, {90, 0}, {100, 0}, {116, 0}, {127, 0}, {137, 0}, {148, 0}, {160, 0}, {170, 0}, {181, 0}, {192, 0}, {203, 0}, {213, 0}, {224, 0}, + {0,14}, {11,14}, {21,14}, {32,14}, {42,14}, {53,14}, {63,14}, {74,14}, { 84,14}, { 95,14}, {106,14}, {116,14}, {127,14}, {143,14}, {160,14}, {170,14}, {181,14}, {192,14}, {203,14}, {213,14}, {224,14}, + {3,26}, {16,26}, {26,26}, {37,26}, {48,26}, {58,26}, {69,26}, {79,26}, { 90,26}, {100,26}, {111,26}, {121,26}, {132,26}, {145,26}, {160,26}, {170,26}, {181,26}, {192,26}, {203,26}, {213,26}, {224,33}, + {4,39}, {19,39}, {29,39}, {40,39}, {50,39}, {61,39}, {71,39}, {82,39}, { 92,39}, {103,39}, {114,39}, {124,39}, {141,39}, {192,39}, {203,39}, {213,39}, + {7,51}, {24,51}, {34,51}, {45,51}, {55,51}, {66,51}, {77,51}, { 87,51}, { 98,51}, {108,51}, {119,51}, {139,51}, {170,51}, {192,51}, {203,51}, {213,51}, {224,58}, + {1,64}, {15,64}, {28,64}, {67,64}, {107,64}, {120,64}, {133,64}, {147,64}, {160,64}, {170,64}, {181,64}, {198,64}, {213,64}, + }, + { + // RGB LED Index to Flag + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + } +}; +#endif diff --git a/keyboards/keychron/k5_max/board.h b/keyboards/keychron/k5_max/board.h new file mode 100644 index 0000000000..b200f82d61 --- /dev/null +++ b/keyboards/keychron/k5_max/board.h @@ -0,0 +1,226 @@ +/* Copyright 2024 @ Keychron (https://www.keychron.com) + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#pragma once + +#include_next + +// clang-format off + +/* Set GPIOA_SWDIO to INPUT and NOT FLOATING */ +#undef VAL_GPIOA_MODER +#define VAL_GPIOA_MODER (PIN_MODE_INPUT(GPIOA_BUTTON) | \ + PIN_MODE_INPUT(GPIOA_PIN1) | \ + PIN_MODE_INPUT(GPIOA_PIN2) | \ + PIN_MODE_INPUT(GPIOA_PIN3) | \ + PIN_MODE_ALTERNATE(GPIOA_CS43L22_LRCK) |\ + PIN_MODE_ALTERNATE(GPIOA_L3GD20_SCL) | \ + PIN_MODE_ALTERNATE(GPIOA_L3GD20_SD0) | \ + PIN_MODE_ALTERNATE(GPIOA_L3GD20_SDI) | \ + PIN_MODE_INPUT(GPIOA_PIN8) | \ + PIN_MODE_INPUT(GPIOA_VBUS_FS) | \ + PIN_MODE_ALTERNATE(GPIOA_OTG_FS_ID) | \ + PIN_MODE_ALTERNATE(GPIOA_OTG_FS_DM) | \ + PIN_MODE_ALTERNATE(GPIOA_OTG_FS_DP) | \ + PIN_MODE_INPUT(GPIOA_SWDIO) | \ + PIN_MODE_INPUT(GPIOA_SWCLK) | \ + PIN_MODE_INPUT(GPIOA_PIN15)) + +#undef VAL_GPIOA_PUPDR +#define VAL_GPIOA_PUPDR (PIN_PUPDR_FLOATING(GPIOA_BUTTON) | \ + PIN_PUPDR_PULLUP(GPIOA_PIN1) | \ + PIN_PUPDR_PULLUP(GPIOA_PIN2) | \ + PIN_PUPDR_PULLUP(GPIOA_PIN3) | \ + PIN_PUPDR_FLOATING(GPIOA_CS43L22_LRCK) |\ + PIN_PUPDR_FLOATING(GPIOA_L3GD20_SCL) | \ + PIN_PUPDR_PULLUP(GPIOA_L3GD20_SD0) | \ + PIN_PUPDR_PULLUP(GPIOA_L3GD20_SDI) | \ + PIN_PUPDR_PULLUP(GPIOA_PIN8) | \ + PIN_PUPDR_FLOATING(GPIOA_VBUS_FS) | \ + PIN_PUPDR_FLOATING(GPIOA_OTG_FS_ID) | \ + PIN_PUPDR_FLOATING(GPIOA_OTG_FS_DM) | \ + PIN_PUPDR_FLOATING(GPIOA_OTG_FS_DP) | \ + PIN_PUPDR_PULLDOWN(GPIOA_SWDIO) | \ + PIN_PUPDR_PULLUP(GPIOA_SWCLK) | \ + PIN_PUPDR_PULLUP(GPIOA_PIN15)) + +#undef VAL_GPIOB_MODER +#define VAL_GPIOB_MODER (PIN_MODE_INPUT(GPIOB_PIN0) | \ + PIN_MODE_INPUT(GPIOB_PIN1) | \ + PIN_MODE_INPUT(GPIOB_PIN2) | \ + PIN_MODE_INPUT(GPIOB_SWO) | \ + PIN_MODE_INPUT(GPIOB_PIN4) | \ + PIN_MODE_INPUT(GPIOB_PIN5) | \ + PIN_MODE_INPUT(GPIOB_LSM303DLHC_SCL) | \ + PIN_MODE_INPUT(GPIOB_PIN7) | \ + PIN_MODE_INPUT(GPIOB_PIN8) | \ + PIN_MODE_INPUT(GPIOB_LSM303DLHC_SDA) | \ + PIN_MODE_INPUT(GPIOB_MP45DT02_CLK_IN) |\ + PIN_MODE_INPUT(GPIOB_PIN11) | \ + PIN_MODE_INPUT(GPIOB_PIN12) | \ + PIN_MODE_INPUT(GPIOB_PIN13) | \ + PIN_MODE_INPUT(GPIOB_PIN14) | \ + PIN_MODE_INPUT(GPIOB_PIN15)) + +#undef VAL_GPIOB_PUPDR +#define VAL_GPIOB_PUPDR (PIN_PUPDR_PULLDOWN(GPIOB_PIN0) | \ + PIN_PUPDR_PULLDOWN(GPIOB_PIN1) | \ + PIN_PUPDR_PULLDOWN(GPIOB_PIN2) | \ + PIN_PUPDR_PULLDOWN(GPIOB_SWO) | \ + PIN_PUPDR_PULLDOWN(GPIOB_PIN4) | \ + PIN_PUPDR_PULLDOWN(GPIOB_PIN5) | \ + PIN_PUPDR_PULLDOWN(GPIOB_LSM303DLHC_SCL) |\ + PIN_PUPDR_PULLDOWN(GPIOB_PIN7) | \ + PIN_PUPDR_PULLDOWN(GPIOB_PIN8) | \ + PIN_PUPDR_PULLDOWN(GPIOB_LSM303DLHC_SDA) |\ + PIN_PUPDR_PULLDOWN(GPIOB_MP45DT02_CLK_IN) |\ + PIN_PUPDR_PULLDOWN(GPIOB_PIN11) | \ + PIN_PUPDR_PULLDOWN(GPIOB_PIN12) | \ + PIN_PUPDR_PULLDOWN(GPIOB_PIN13) | \ + PIN_PUPDR_PULLDOWN(GPIOB_PIN14) | \ + PIN_PUPDR_PULLDOWN(GPIOB_PIN15)) + +#undef VAL_GPIOB_AFRL +#define VAL_GPIOB_AFRL (PIN_AFIO_AF(GPIOB_PIN0, 0U) | \ + PIN_AFIO_AF(GPIOB_PIN1, 0U) | \ + PIN_AFIO_AF(GPIOB_PIN2, 0U) | \ + PIN_AFIO_AF(GPIOB_SWO, 0U) | \ + PIN_AFIO_AF(GPIOB_PIN4, 0U) | \ + PIN_AFIO_AF(GPIOB_PIN5, 0U) | \ + PIN_AFIO_AF(GPIOB_LSM303DLHC_SCL, 0) | \ + PIN_AFIO_AF(GPIOB_PIN7, 0U)) + +#undef VAL_GPIOB_AFRH +#define VAL_GPIOB_AFRH (PIN_AFIO_AF(GPIOB_PIN8, 0U) | \ + PIN_AFIO_AF(GPIOB_LSM303DLHC_SDA, 0) | \ + PIN_AFIO_AF(GPIOB_MP45DT02_CLK_IN, 0U) |\ + PIN_AFIO_AF(GPIOB_PIN11, 0U) | \ + PIN_AFIO_AF(GPIOB_PIN12, 0U) | \ + PIN_AFIO_AF(GPIOB_PIN13, 0U) | \ + PIN_AFIO_AF(GPIOB_PIN14, 0U) | \ + PIN_AFIO_AF(GPIOB_PIN15, 0U)) + +/* C5 Need to be pulldown */ +#undef VAL_GPIOC_MODER +#define VAL_GPIOC_MODER (PIN_MODE_INPUT(GPIOC_OTG_FS_POWER_ON) |\ + PIN_MODE_INPUT(GPIOC_PIN1) | \ + PIN_MODE_INPUT(GPIOC_PIN2) | \ + PIN_MODE_INPUT(GPIOC_CS43L22_AIN4x) | \ + PIN_MODE_INPUT(GPIOC_PIN4) | \ + PIN_MODE_INPUT(GPIOC_PIN5) | \ + PIN_MODE_INPUT(GPIOC_PIN6) | \ + PIN_MODE_INPUT(GPIOC_CS43L22_MCLK) | \ + PIN_MODE_INPUT(GPIOC_PIN8) | \ + PIN_MODE_INPUT(GPIOC_PIN9) | \ + PIN_MODE_INPUT(GPIOC_CS43L22_SCLK) | \ + PIN_MODE_INPUT(GPIOC_PIN11) | \ + PIN_MODE_INPUT(GPIOC_CS43L22_SDIN) | \ + PIN_MODE_INPUT(GPIOC_PIN13) | \ + PIN_MODE_INPUT(GPIOC_OSC32_IN) | \ + PIN_MODE_INPUT(GPIOC_OSC32_OUT)) + +#undef VAL_GPIOC_PUPDR +#define VAL_GPIOC_PUPDR (PIN_PUPDR_PULLUP(GPIOC_OTG_FS_POWER_ON) |\ + PIN_PUPDR_PULLUP(GPIOC_PIN1) | \ + PIN_PUPDR_PULLUP(GPIOC_PIN2) | \ + PIN_PUPDR_PULLUP(GPIOC_CS43L22_AIN4x) |\ + PIN_PUPDR_PULLUP(GPIOC_PIN4) | \ + PIN_PUPDR_PULLDOWN(GPIOC_PIN5) | \ + PIN_PUPDR_PULLUP(GPIOC_PIN6) | \ + PIN_PUPDR_PULLUP(GPIOC_CS43L22_MCLK) | \ + PIN_PUPDR_PULLUP(GPIOC_PIN8) | \ + PIN_PUPDR_PULLUP(GPIOC_PIN9) | \ + PIN_PUPDR_PULLUP(GPIOC_CS43L22_SCLK) | \ + PIN_PUPDR_PULLUP(GPIOC_PIN11) | \ + PIN_PUPDR_PULLUP(GPIOC_CS43L22_SDIN) | \ + PIN_PUPDR_PULLUP(GPIOC_PIN13) | \ + PIN_PUPDR_PULLUP(GPIOC_OSC32_IN) | \ + PIN_PUPDR_PULLUP(GPIOC_OSC32_OUT)) + +/* Set all GPIOD pins to INPUT & PULLUP to avoid FLOATING */ +#undef VAL_GPIOD_MODER +#define VAL_GPIOD_MODER (PIN_MODE_INPUT(GPIOD_PIN0) | \ + PIN_MODE_INPUT(GPIOD_PIN1) | \ + PIN_MODE_INPUT(GPIOD_PIN2) | \ + PIN_MODE_INPUT(GPIOD_PIN3) | \ + PIN_MODE_INPUT(GPIOD_CS43L22_RESET) | \ + PIN_MODE_INPUT(GPIOD_OverCurrent) | \ + PIN_MODE_INPUT(GPIOD_PIN6) | \ + PIN_MODE_INPUT(GPIOD_PIN7) | \ + PIN_MODE_INPUT(GPIOD_PIN8) | \ + PIN_MODE_INPUT(GPIOD_PIN9) | \ + PIN_MODE_INPUT(GPIOD_PIN10) | \ + PIN_MODE_INPUT(GPIOD_PIN11) | \ + PIN_MODE_INPUT(GPIOD_LED4) | \ + PIN_MODE_INPUT(GPIOD_LED3) | \ + PIN_MODE_INPUT(GPIOD_LED5) | \ + PIN_MODE_INPUT(GPIOD_LED6)) + +#undef VAL_GPIOD_PUPDR +#define VAL_GPIOD_PUPDR (PIN_PUPDR_PULLUP(GPIOD_PIN0) | \ + PIN_PUPDR_PULLUP(GPIOD_PIN1) | \ + PIN_PUPDR_PULLUP(GPIOD_PIN2) | \ + PIN_PUPDR_PULLUP(GPIOD_PIN3) | \ + PIN_PUPDR_PULLUP(GPIOD_CS43L22_RESET) |\ + PIN_PUPDR_PULLUP(GPIOD_OverCurrent) | \ + PIN_PUPDR_PULLUP(GPIOD_PIN6) | \ + PIN_PUPDR_PULLUP(GPIOD_PIN7) | \ + PIN_PUPDR_PULLUP(GPIOD_PIN8) | \ + PIN_PUPDR_PULLUP(GPIOD_PIN9) | \ + PIN_PUPDR_PULLUP(GPIOD_PIN10) | \ + PIN_PUPDR_PULLUP(GPIOD_PIN11) | \ + PIN_PUPDR_PULLUP(GPIOD_LED4) | \ + PIN_PUPDR_PULLUP(GPIOD_LED3) | \ + PIN_PUPDR_PULLUP(GPIOD_LED5) | \ + PIN_PUPDR_PULLUP(GPIOD_LED6)) + +/* Set all GPIOE pins to INPUT & PULLUP to avoid FLOATING */ +#undef VAL_GPIOE_MODER +#define VAL_GPIOE_MODER (PIN_MODE_INPUT(GPIOE_L3GD20_INT1) | \ + PIN_MODE_INPUT(GPIOE_L3GD20_INT2) | \ + PIN_MODE_INPUT(GPIOE_LSM303DLHC_DRDY) |\ + PIN_MODE_INPUT(GPIOE_L3GD20_CS) | \ + PIN_MODE_INPUT(GPIOE_LSM303DLHC_INT1) |\ + PIN_MODE_INPUT(GPIOE_LSM303DLHC_INT2) |\ + PIN_MODE_INPUT(GPIOE_PIN6) | \ + PIN_MODE_INPUT(GPIOE_PIN7) | \ + PIN_MODE_INPUT(GPIOE_PIN8) | \ + PIN_MODE_INPUT(GPIOE_PIN9) | \ + PIN_MODE_INPUT(GPIOE_PIN10) | \ + PIN_MODE_INPUT(GPIOE_PIN11) | \ + PIN_MODE_INPUT(GPIOE_PIN12) | \ + PIN_MODE_INPUT(GPIOE_PIN13) | \ + PIN_MODE_INPUT(GPIOE_PIN14) | \ + PIN_MODE_INPUT(GPIOE_PIN15)) + +#undef VAL_GPIOE_PUPDR +#define VAL_GPIOE_PUPDR (PIN_PUPDR_PULLUP(GPIOE_L3GD20_INT1) | \ + PIN_PUPDR_PULLUP(GPIOE_L3GD20_INT2) | \ + PIN_PUPDR_PULLUP(GPIOE_LSM303DLHC_DRDY) |\ + PIN_PUPDR_PULLUP(GPIOE_L3GD20_CS) | \ + PIN_PUPDR_PULLUP(GPIOE_LSM303DLHC_INT1) |\ + PIN_PUPDR_PULLUP(GPIOE_LSM303DLHC_INT2) |\ + PIN_PUPDR_PULLUP(GPIOE_PIN6) | \ + PIN_PUPDR_PULLUP(GPIOE_PIN7) | \ + PIN_PUPDR_PULLUP(GPIOE_PIN8) | \ + PIN_PUPDR_PULLUP(GPIOE_PIN9) | \ + PIN_PUPDR_PULLUP(GPIOE_PIN10) | \ + PIN_PUPDR_PULLUP(GPIOE_PIN11) | \ + PIN_PUPDR_PULLUP(GPIOE_PIN12) | \ + PIN_PUPDR_PULLUP(GPIOE_PIN13) | \ + PIN_PUPDR_PULLUP(GPIOE_PIN14) | \ + PIN_PUPDR_PULLUP(GPIOE_PIN15)) + diff --git a/keyboards/keychron/k5_max/config.h b/keyboards/keychron/k5_max/config.h new file mode 100644 index 0000000000..ffabc3b3bc --- /dev/null +++ b/keyboards/keychron/k5_max/config.h @@ -0,0 +1,93 @@ +/* Copyright 2024 @ Keychron (https://www.keychron.com) + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#pragma once + +/* Caps lock LED */ +#define LED_CAPS_LOCK_PIN A13 +#define LED_PIN_ON_STATE 1 + +#ifdef LK_WIRELESS_ENABLE +/* Hardware configuration */ +# define P2P4_MODE_SELECT_PIN A10 +# define BT_MODE_SELECT_PIN A9 + +# define LKBT51_RESET_PIN C4 +# define LKBT51_INT_INPUT_PIN B1 +# define BLUETOOTH_INT_OUTPUT_PIN A4 + +# define USB_POWER_SENSE_PIN B0 +# define USB_POWER_CONNECTED_LEVEL 0 + +# define BAT_CHARGING_PIN B13 +# define BAT_CHARGING_LEVEL 0 + +# define BAT_LOW_LED_PIN B12 +# define BAT_LOW_LED_PIN_ON_STATE 1 + +# define BT_HOST_DEVICES_COUNT 3 + +# define BT_HOST_LED_PIN_LIST \ + { C9, C9, C9 } +# define HOST_LED_PIN_ON_STATE 0 + +# define P24G_HOST_DEVICES_COUNT 1 + +# define P24G_HOST_LED_PIN_LIST \ + { A8 } + +# if defined(RGB_MATRIX_ENABLE) || defined(LED_MATRIX_ENABLE) + +# define LED_DRIVER_SHUTDOWN_PIN B7 + +# define BT_HOST_LED_MATRIX_LIST \ + { 21, 22, 23 } + +# define P2P4G_HOST_LED_MATRIX_LIST \ + { 24 } + +# define BAT_LEVEL_LED_LIST \ + { 21, 22, 23, 24, 25, 26, 27, 28, 29, 30 } + +/* Backlit disable timeout when keyboard is disconnected(unit: second) */ +# define DISCONNECTED_BACKLIGHT_DISABLE_TIMEOUT 40 + +/* Backlit disable timeout when keyboard is connected(unit: second) */ +# define CONNECTED_BACKLIGHT_DISABLE_TIMEOUT 600 + +/* Reinit LED driver on tranport changed */ +# define REINIT_LED_DRIVER 1 + +# endif + +/* Keep USB connection in blueooth mode */ +# define KEEP_USB_CONNECTION_IN_WIRELESS_MODE + +/* Enable bluetooth NKRO */ +# define WIRELESS_NKRO_ENABLE + +/* Raw hid command for factory test and bluetooth DFU */ +# define RAW_HID_CMD 0xAA ... 0xAB +#else +/* Raw hid command for factory test */ +# define RAW_HID_CMD 0xAB +#endif + +/* Factory test keys */ +#define FN_KEY_1 MO(1) +#define FN_KEY_2 MO(3) + +#define MATRIX_IO_DELAY 10 diff --git a/keyboards/keychron/k5_max/halconf.h b/keyboards/keychron/k5_max/halconf.h new file mode 100644 index 0000000000..37bcc7c47b --- /dev/null +++ b/keyboards/keychron/k5_max/halconf.h @@ -0,0 +1,31 @@ +/* Copyright 2024 @ 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 + +#define _CHIBIOS_HAL_CONF_VER_8_0_ + +#define HAL_USE_SPI TRUE + +#ifdef LK_WIRELESS_ENABLE +# define HAL_USE_RTC TRUE +#endif + +#if defined(LK_WIRELESS_ENABLE) || defined(ENCODER_ENABLE) +# define PAL_USE_CALLBACKS TRUE +#endif + +#include_next diff --git a/keyboards/keychron/k5_max/info.json b/keyboards/keychron/k5_max/info.json new file mode 100644 index 0000000000..8eeed34509 --- /dev/null +++ b/keyboards/keychron/k5_max/info.json @@ -0,0 +1,154 @@ +{ + "keyboard_name": "Keychron K5 Max", + "manufacturer": "Keychron", + "url": "https://github.com/Keychron", + "maintainer": "lokher", + "processor": "STM32F401", + "bootloader": "stm32-dfu", + "usb": { + "vid": "0x3434" + }, + "features": { + "bootmagic": true, + "extrakey": true, + "mousekey": true, + "dip_switch": true, + "nkro": true, + "raw": true, + "sendstring": true + }, + "matrix_pins": { + "cols": ["C6", "C7", "C8", "A14", "A15", "C10", "C11", "C13", "C14", "C15", "C0", "C1", "C2", "C3", "A0", "A1", "A2", "A3", "C5", "B10", "B15"], + "rows": ["C12", "D2", "B3", "B4", "B5", "B6"] + }, + "diode_direction": "ROW2COL", + "dip_switch": { + "pins": ["B14"] + }, + "eeprom": { + "wear_leveling": { + "driver": "embedded_flash", + "logical_size": 2048, + "backing_size": 4096 + } + }, + "layouts": { + "LAYOUT_108_ansi": { + "layout": [ + {"matrix": [0, 0], "x": 0, "y": 0}, + {"matrix": [0, 1], "x": 2, "y": 0}, + {"matrix": [0, 2], "x": 3, "y": 0}, + {"matrix": [0, 3], "x": 4, "y": 0}, + {"matrix": [0, 4], "x": 5, "y": 0}, + {"matrix": [0, 5], "x": 6.5, "y": 0}, + {"matrix": [0, 6], "x": 7.5, "y": 0}, + {"matrix": [0, 7], "x": 8.5, "y": 0}, + {"matrix": [0, 8], "x": 9.5, "y": 0}, + {"matrix": [0, 9], "x": 11, "y": 0}, + {"matrix": [0, 10], "x": 12, "y": 0}, + {"matrix": [0, 11], "x": 13, "y": 0}, + {"matrix": [0, 12], "x": 14, "y": 0}, + {"matrix": [0, 14], "x": 15, "y": 0}, + {"matrix": [0, 15], "x": 16, "y": 0}, + {"matrix": [0, 16], "x": 17, "y": 0}, + {"matrix": [0, 17], "x": 18.25, "y": 0}, + {"matrix": [0, 18], "x": 19.25, "y": 0}, + {"matrix": [0, 19], "x": 20.25, "y": 0}, + {"matrix": [0, 20], "x": 21.25, "y": 0}, + + {"matrix": [1, 0], "x": 0, "y": 1}, + {"matrix": [1, 1], "x": 1, "y": 1}, + {"matrix": [1, 2], "x": 2, "y": 1}, + {"matrix": [1, 3], "x": 3, "y": 1}, + {"matrix": [1, 4], "x": 4, "y": 1}, + {"matrix": [1, 5], "x": 5, "y": 1}, + {"matrix": [1, 6], "x": 6, "y": 1}, + {"matrix": [1, 7], "x": 7, "y": 1}, + {"matrix": [1, 8], "x": 8, "y": 1}, + {"matrix": [1, 9], "x": 9, "y": 1}, + {"matrix": [1, 10], "x": 10, "y": 1}, + {"matrix": [1, 11], "x": 11, "y": 1}, + {"matrix": [1, 12], "x": 12, "y": 1}, + {"matrix": [1, 13], "x": 13, "y": 1, "w": 2}, + {"matrix": [1, 14], "x": 15, "y": 1}, + {"matrix": [1, 15], "x": 16, "y": 1}, + {"matrix": [1, 16], "x": 17, "y": 1}, + {"matrix": [1, 17], "x": 18.25, "y": 1}, + {"matrix": [1, 18], "x": 19.25, "y": 1}, + {"matrix": [1, 19], "x": 20.25, "y": 1}, + {"matrix": [1, 20], "x": 21.25, "y": 1}, + + {"matrix": [2, 0], "x": 0, "y": 2, "w": 1.5}, + {"matrix": [2, 1], "x": 1.5, "y": 2}, + {"matrix": [2, 2], "x": 2.5, "y": 2}, + {"matrix": [2, 3], "x": 3.5, "y": 2}, + {"matrix": [2, 4], "x": 4.5, "y": 2}, + {"matrix": [2, 5], "x": 5.5, "y": 2}, + {"matrix": [2, 6], "x": 6.5, "y": 2}, + {"matrix": [2, 7], "x": 7.5, "y": 2}, + {"matrix": [2, 8], "x": 8.5, "y": 2}, + {"matrix": [2, 9], "x": 9.5, "y": 2}, + {"matrix": [2, 10], "x": 10.5, "y": 2}, + {"matrix": [2, 11], "x": 11.5, "y": 2}, + {"matrix": [2, 12], "x": 12.5, "y": 2}, + {"matrix": [2, 13], "x": 13.5, "y": 2, "w": 1.5}, + {"matrix": [2, 14], "x": 15, "y": 2}, + {"matrix": [2, 15], "x": 16, "y": 2}, + {"matrix": [2, 16], "x": 17, "y": 2}, + {"matrix": [2, 17], "x": 18.25, "y": 2}, + {"matrix": [2, 18], "x": 19.25, "y": 2}, + {"matrix": [2, 19], "x": 20.25, "y": 2}, + + {"matrix": [3, 0], "x": 0, "y": 3, "w": 1.75}, + {"matrix": [3, 1], "x": 1.75, "y": 3}, + {"matrix": [3, 2], "x": 2.75, "y": 3}, + {"matrix": [3, 3], "x": 3.75, "y": 3}, + {"matrix": [3, 4], "x": 4.75, "y": 3}, + {"matrix": [3, 5], "x": 5.75, "y": 3}, + {"matrix": [3, 6], "x": 6.75, "y": 3}, + {"matrix": [3, 7], "x": 7.75, "y": 3}, + {"matrix": [3, 8], "x": 8.75, "y": 3}, + {"matrix": [3, 9], "x": 9.75, "y": 3}, + {"matrix": [3, 10], "x": 10.75, "y": 3}, + {"matrix": [3, 11], "x": 11.75, "y": 3}, + {"matrix": [3, 13], "x": 12.75, "y": 3, "w": 2.25}, + {"matrix": [3, 17], "x": 18.25, "y": 3}, + {"matrix": [3, 18], "x": 19.25, "y": 3}, + {"matrix": [3, 19], "x": 20.25, "y": 3}, + {"matrix": [2, 20], "x": 21.25, "y": 2, "h": 2}, + + {"matrix": [4, 0], "x": 0, "y": 4, "w": 2.25}, + {"matrix": [4, 2], "x": 2.25, "y": 4}, + {"matrix": [4, 3], "x": 3.25, "y": 4}, + {"matrix": [4, 4], "x": 4.25, "y": 4}, + {"matrix": [4, 5], "x": 5.25, "y": 4}, + {"matrix": [4, 6], "x": 6.25, "y": 4}, + {"matrix": [4, 7], "x": 7.25, "y": 4}, + {"matrix": [4, 8], "x": 8.25, "y": 4}, + {"matrix": [4, 9], "x": 9.25, "y": 4}, + {"matrix": [4, 10], "x": 10.25, "y": 4}, + {"matrix": [4, 11], "x": 11.25, "y": 4}, + {"matrix": [4, 13], "x": 12.25, "y": 4, "w": 2.75}, + {"matrix": [4, 15], "x": 16, "y": 4}, + {"matrix": [4, 17], "x": 18.25, "y": 4}, + {"matrix": [4, 18], "x": 19.25, "y": 4}, + {"matrix": [4, 19], "x": 20.25, "y": 4}, + + {"matrix": [5, 0], "x": 0, "y": 5, "w": 1.25}, + {"matrix": [5, 1], "x": 1.25, "y": 5, "w": 1.25}, + {"matrix": [5, 2], "x": 2.5, "y": 5, "w": 1.25}, + {"matrix": [5, 6], "x": 3.75, "y": 5, "w": 6.25}, + {"matrix": [5, 10], "x": 10, "y": 5, "w": 1.25}, + {"matrix": [5, 11], "x": 11.25, "y": 5, "w": 1.25}, + {"matrix": [5, 12], "x": 12.5, "y": 5, "w": 1.25}, + {"matrix": [5, 13], "x": 13.75, "y": 5, "w": 1.25}, + {"matrix": [5, 14], "x": 15, "y": 5}, + {"matrix": [5, 15], "x": 16, "y": 5}, + {"matrix": [5, 16], "x": 17, "y": 5}, + {"matrix": [5, 17], "x": 18.25, "y": 5, "w": 2}, + {"matrix": [5, 19], "x": 20.25, "y": 5}, + {"matrix": [4, 20], "x": 21.25, "y": 4, "h": 2} + ] + } + } +} diff --git a/keyboards/keychron/k5_max/k5_max.c b/keyboards/keychron/k5_max/k5_max.c new file mode 100644 index 0000000000..223caac788 --- /dev/null +++ b/keyboards/keychron/k5_max/k5_max.c @@ -0,0 +1,100 @@ +/* Copyright 2024 @ Keychron (https://www.keychron.com) + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#include "quantum.h" +#include "keychron_task.h" +#ifdef FACTORY_TEST_ENABLE +# include "factory_test.h" +# include "keychron_common.h" +#endif +#ifdef LK_WIRELESS_ENABLE +# include "lkbt51.h" +# include "wireless.h" +# include "transport.h" +# include "keychron_wireless_common.h" +# include "battery.h" +#endif + +#define POWER_ON_LED_DURATION 3000 +static uint32_t power_on_indicator_timer; + +#ifdef LK_WIRELESS_ENABLE +pin_t bt_led_pins[] = BT_HOST_LED_PIN_LIST; +pin_t p24g_led_pins[] = P24G_HOST_LED_PIN_LIST; +#endif + +bool dip_switch_update_kb(uint8_t index, bool active) { + if (index == 0) { + default_layer_set(1UL << (active ? 0 : 2)); + } + dip_switch_update_user(index, active); + + return true; +} + +void keyboard_post_init_kb(void) { +#ifdef LK_WIRELESS_ENABLE + palSetLineMode(P2P4_MODE_SELECT_PIN, PAL_MODE_INPUT); + palSetLineMode(BT_MODE_SELECT_PIN, PAL_MODE_INPUT); + + writePin(BAT_LOW_LED_PIN, BAT_LOW_LED_PIN_ON_STATE); + lkbt51_init(false); + wireless_init(); +#endif + + power_on_indicator_timer = timer_read32(); +#ifdef ENCODER_ENABLE + encoder_cb_init(); +#endif + + keyboard_post_init_user(); +} + +bool keychron_task_kb(void) { + if (power_on_indicator_timer) { + if (timer_elapsed32(power_on_indicator_timer) > POWER_ON_LED_DURATION) { + power_on_indicator_timer = 0; + + if (!host_keyboard_led_state().caps_lock) writePin(LED_CAPS_LOCK_PIN, !LED_PIN_ON_STATE); +#ifdef LK_WIRELESS_ENABLE + writePin(BAT_LOW_LED_PIN, !BAT_LOW_LED_PIN_ON_STATE); + for (uint8_t i = 0; i < sizeof(bt_led_pins) / sizeof(pin_t); i++) + writePin(bt_led_pins[i], 1); + for (uint8_t i = 0; i < sizeof(p24g_led_pins) / sizeof(pin_t); i++) + writePin(p24g_led_pins[i], 1); +#endif + + } else { + writePin(LED_CAPS_LOCK_PIN, LED_PIN_ON_STATE); +#ifdef LK_WIRELESS_ENABLE + writePin(BAT_LOW_LED_PIN, BAT_LOW_LED_PIN_ON_STATE); + if (get_transport() != TRANSPORT_P2P4) + for (uint8_t i = 0; i < sizeof(bt_led_pins) / sizeof(pin_t); i++) + writePin(bt_led_pins[i], 0); + if (get_transport() != TRANSPORT_BLUETOOTH) + for (uint8_t i = 0; i < sizeof(p24g_led_pins) / sizeof(pin_t); i++) + writePin(p24g_led_pins[i], 0); +#endif + } + } + return true; +} + +#ifdef LK_WIRELESS_ENABLE +bool lpm_is_kb_idle(void) { + return power_on_indicator_timer == 0 && !factory_reset_indicating(); +} +#endif diff --git a/keyboards/keychron/k5_max/mcuconf.h b/keyboards/keychron/k5_max/mcuconf.h new file mode 100644 index 0000000000..89294ee64b --- /dev/null +++ b/keyboards/keychron/k5_max/mcuconf.h @@ -0,0 +1,37 @@ +/* Copyright 2024 @ 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_next + +#undef STM32_HSECLK +#define STM32_HSECLK 16000000 + +#undef STM32_PLLM_VALUE +#define STM32_PLLM_VALUE 8 + +#undef STM32_PLLN_VALUE +#define STM32_PLLN_VALUE 96 + +#undef STM32_PLLP_VALUE +#define STM32_PLLP_VALUE 4 + +#undef STM32_PLLQ_VALUE +#define STM32_PLLQ_VALUE 4 + +#undef STM32_SPI_USE_SPI1 +#define STM32_SPI_USE_SPI1 TRUE diff --git a/keyboards/keychron/k5_max/readme.md b/keyboards/keychron/k5_max/readme.md new file mode 100644 index 0000000000..b5918289a0 --- /dev/null +++ b/keyboards/keychron/k5_max/readme.md @@ -0,0 +1,23 @@ +# Keychron K5 Max + +![Keychron K5 Max](https://cdn.shopify.com/s/files/1/0059/0630/1017/files/K5-Max-page13.jpg?v=1705308494) + +A customizable 84 keys 100% fullsize keyboard. + +* Keyboard Maintainer: [Keychron](https://github.com/keychron) +* Hardware Supported: Keychron K5 Max +* Hardware Availability: [Keychron K5 Max QMK/VIA Wireless Custom Mechanical Keyboard](https://www.keychron.com/products/keychron-k5-max-qmk-via-wireless-custom-mechanical-keyboard) + +Make example for this keyboard (after setting up your build environment): + + make keychron/k5_max/ansi/rgb:default + make keychron/k5_max/ansi/white:default + +Flashing example for this keyboard: + + make keychron/k5_max/ansi/rgb:default:flash + make keychron/k5_max/ansi/white:default:flash + +**Reset Key**: Disconnect the USB cable, toggle mode switch to "Cable", hold down the *Esc* key or reset button underneath space bar, then connect the USB cable. + +See the [build environment setup](https://docs.qmk.fm/#/getting_started_build_tools) and the [make instructions](https://docs.qmk.fm/#/getting_started_make_guide) for more information. Brand new to QMK? Start with our [Complete Newbs Guide](https://docs.qmk.fm/#/newbs). diff --git a/keyboards/keychron/k5_max/rules.mk b/keyboards/keychron/k5_max/rules.mk new file mode 100644 index 0000000000..4eaf6820bc --- /dev/null +++ b/keyboards/keychron/k5_max/rules.mk @@ -0,0 +1,4 @@ +include keyboards/keychron/common/wireless/wireless.mk +include keyboards/keychron/common/keychron_common.mk + +VPATH += $(TOP_DIR)/keyboards/keychron diff --git a/keyboards/keychron/k5_max/via_json/k5_max_ansi_rgb.json b/keyboards/keychron/k5_max/via_json/k5_max_ansi_rgb.json new file mode 100644 index 0000000000..ea914fbd76 --- /dev/null +++ b/keyboards/keychron/k5_max/via_json/k5_max_ansi_rgb.json @@ -0,0 +1,342 @@ +{ + "name": "Keychron K5 Max ANSI RGB", + "vendorId": "0x3434", + "productId": "0x0A50", + "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": "Misson Control", "title": "Misson Control in Mac", "shortName": "MCtl"}, + {"name": "Lanuch Pad", "title": "Lanuch Pad in Windows", "shortName": "LPad"}, + {"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": "2.4G", "title": "2.4G", "shortName": "2.4G"}, + {"name": "Battery Level", "title": "Show battery level", "shortName": "Batt"} + ], + "matrix": {"rows": 6, "cols" : 21}, + "layouts": { + "keymap": [ + [ + { + "c": "#777777" + }, + "0, 0", + { + "x": 1, + "c": "#cccccc" + }, + "0, 1", + "0, 2", + "0, 3", + "0, 4", + { + "x": 0.5, + "c": "#aaaaaa" + }, + "0, 5", + "0, 6", + "0, 7", + "0, 8", + { + "x": 0.5, + "c": "#cccccc" + }, + "0, 9", + "0, 10", + "0, 11", + "0, 12", + { + "x": 0.25, + "c": "#aaaaaa" + }, + "0, 14", + "0, 15", + "0, 16", + { + "x": 0.25, + "c": "#cccccc" + }, + "0, 17", + "0, 18", + "0, 19", + "0, 20" + ], + [ + { + "c": "#aaaaaa" + }, + "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", + { + "w": 2, + "c": "#aaaaaa" + }, + "1, 13", + { + "x": 0.25 + }, + "1, 14", + "1, 15", + "1, 16", + { + "x": 0.25, + "c": "#cccccc" + }, + "1, 17", + "1, 18", + "1, 19", + "1, 20" + ], + [ + { + "w": 1.5, + "c": "#aaaaaa" + }, + "2, 0", + { + "c": "#cccccc" + }, + "2, 1", + "2, 2", + "2, 3", + "2, 4", + "2, 5", + "2, 6", + "2, 7", + "2, 8", + "2, 9", + "2, 10", + "2, 11", + "2, 12", + { + "w": 1.5, + "c": "#aaaaaa" + }, + "2, 13", + { + "x": 0.25 + }, + "2, 14", + "2, 15", + "2, 16", + { + "x": 0.25, + "c": "#cccccc" + }, + "2, 17", + "2, 18", + "2, 19", + { + "h": 2 + }, + "2, 20" + ], + [ + { + "w": 1.75, + "c": "#aaaaaa" + }, + "3, 0", + { + "c": "#cccccc" + }, + "3, 1", + "3, 2", + "3, 3", + "3, 4", + "3, 5", + "3, 6", + "3, 7", + "3, 8", + "3, 9", + "3, 10", + "3, 11", + { + "w": 2.25, + "c": "#777777" + }, + "3, 13", + { + "x": 3.5, + "c": "#cccccc" + }, + "3, 17", + "3, 18", + "3, 19" + ], + [ + { + "w": 2.25, + "c": "#aaaaaa" + }, + "4, 0", + { + "c": "#cccccc" + }, + "4, 2", + "4, 3", + "4, 4", + "4, 5", + "4, 6", + "4, 7", + "4, 8", + "4, 9", + "4, 10", + "4, 11", + { + "w": 2.75, + "c": "#aaaaaa" + }, + "4, 13", + { + "x": 1.25, + "c": "#cccccc" + }, + "4, 15", + { + "x": 1.25 + }, + "4, 17", + "4, 18", + "4, 19", + { + "h": 2 + }, + "4, 20" + ], + [ + { + "w": 1.25, + "c": "#aaaaaa" + }, + "5, 0", + { + "w": 1.25 + }, + "5, 1", + { + "w": 1.25 + }, + "5, 2", + { + "w": 6.25, + "c": "#cccccc" + }, + "5, 6", + { + "w": 1.25, + "c": "#aaaaaa" + }, + "5, 10", + { + "w": 1.25 + }, + "5, 11", + { + "w": 1.25 + }, + "5, 12", + { + "w": 1.25 + }, + "5, 13", + { + "x": 0.25, + "c": "#cccccc" + }, + "5, 14", + "5, 15", + "5, 16", + { + "x": 0.25, + "w": 2 + }, + "5, 17", + "5, 19" + ] + ] + } + } diff --git a/keyboards/keychron/k5_max/via_json/k5_max_ansi_white.json b/keyboards/keychron/k5_max/via_json/k5_max_ansi_white.json new file mode 100644 index 0000000000..e1f8f410f7 --- /dev/null +++ b/keyboards/keychron/k5_max/via_json/k5_max_ansi_white.json @@ -0,0 +1,281 @@ +{ + "name": "Keychron K5 Max ANSI White", + "vendorId": "0x3434", + "productId": "0x0A53", + "keycodes": ["qmk_lighting"], + "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": "Misson Control", "title": "Misson Control in Mac", "shortName": "MCtl"}, + {"name": "Lanuch Pad", "title": "Lanuch Pad in Windows", "shortName": "LPad"}, + {"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": "2.4G", "title": "2.4G", "shortName": "2.4G"}, + {"name": "Battery Level", "title": "Show battery level", "shortName": "Batt"} + ], + "matrix": {"rows": 6, "cols" : 21}, + "layouts": { + "keymap": [ + [ + { + "c": "#777777" + }, + "0, 0", + { + "x": 1, + "c": "#cccccc" + }, + "0, 1", + "0, 2", + "0, 3", + "0, 4", + { + "x": 0.5, + "c": "#aaaaaa" + }, + "0, 5", + "0, 6", + "0, 7", + "0, 8", + { + "x": 0.5, + "c": "#cccccc" + }, + "0, 9", + "0, 10", + "0, 11", + "0, 12", + { + "x": 0.25, + "c": "#aaaaaa" + }, + "0, 14", + "0, 15", + "0, 16", + { + "x": 0.25, + "c": "#cccccc" + }, + "0, 17", + "0, 18", + "0, 19", + "0, 20" + ], + [ + { + "c": "#aaaaaa" + }, + "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", + { + "w": 2, + "c": "#aaaaaa" + }, + "1, 13", + { + "x": 0.25 + }, + "1, 14", + "1, 15", + "1, 16", + { + "x": 0.25, + "c": "#cccccc" + }, + "1, 17", + "1, 18", + "1, 19", + "1, 20" + ], + [ + { + "w": 1.5, + "c": "#aaaaaa" + }, + "2, 0", + { + "c": "#cccccc" + }, + "2, 1", + "2, 2", + "2, 3", + "2, 4", + "2, 5", + "2, 6", + "2, 7", + "2, 8", + "2, 9", + "2, 10", + "2, 11", + "2, 12", + { + "w": 1.5, + "c": "#aaaaaa" + }, + "2, 13", + { + "x": 0.25 + }, + "2, 14", + "2, 15", + "2, 16", + { + "x": 0.25, + "c": "#cccccc" + }, + "2, 17", + "2, 18", + "2, 19", + { + "h": 2 + }, + "2, 20" + ], + [ + { + "w": 1.75, + "c": "#aaaaaa" + }, + "3, 0", + { + "c": "#cccccc" + }, + "3, 1", + "3, 2", + "3, 3", + "3, 4", + "3, 5", + "3, 6", + "3, 7", + "3, 8", + "3, 9", + "3, 10", + "3, 11", + { + "w": 2.25, + "c": "#777777" + }, + "3, 13", + { + "x": 3.5, + "c": "#cccccc" + }, + "3, 17", + "3, 18", + "3, 19" + ], + [ + { + "w": 2.25, + "c": "#aaaaaa" + }, + "4, 0", + { + "c": "#cccccc" + }, + "4, 2", + "4, 3", + "4, 4", + "4, 5", + "4, 6", + "4, 7", + "4, 8", + "4, 9", + "4, 10", + "4, 11", + { + "w": 2.75, + "c": "#aaaaaa" + }, + "4, 13", + { + "x": 1.25, + "c": "#cccccc" + }, + "4, 15", + { + "x": 1.25 + }, + "4, 17", + "4, 18", + "4, 19", + { + "h": 2 + }, + "4, 20" + ], + [ + { + "w": 1.25, + "c": "#aaaaaa" + }, + "5, 0", + { + "w": 1.25 + }, + "5, 1", + { + "w": 1.25 + }, + "5, 2", + { + "w": 6.25, + "c": "#cccccc" + }, + "5, 6", + { + "w": 1.25, + "c": "#aaaaaa" + }, + "5, 10", + { + "w": 1.25 + }, + "5, 11", + { + "w": 1.25 + }, + "5, 12", + { + "w": 1.25 + }, + "5, 13", + { + "x": 0.25, + "c": "#cccccc" + }, + "5, 14", + "5, 15", + "5, 16", + { + "x": 0.25, + "w": 2 + }, + "5, 17", + "5, 19" + ] + ] + } + } \ No newline at end of file diff --git a/keyboards/keychron/k7_max/ansi/rgb/config.h b/keyboards/keychron/k7_max/ansi/rgb/config.h new file mode 100644 index 0000000000..0ba2a9266a --- /dev/null +++ b/keyboards/keychron/k7_max/ansi/rgb/config.h @@ -0,0 +1,57 @@ +/* Copyright 2024 @ Keychron (https://www.keychron.com) + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#pragma once + +#ifdef RGB_MATRIX_ENABLE +/* RGB Matrix driver configuration */ +# define DRIVER_COUNT 2 +# define RGB_MATRIX_LED_COUNT 68 + +# define SPI_SCK_PIN A5 +# define SPI_MISO_PIN A6 +# define SPI_MOSI_PIN A7 + +# define DRIVER_CS_PINS \ + { B8, B9 } +# define SNLED23751_SPI_DIVISOR 16 +# define SPI_DRIVER SPID1 + +/* Scan phase of led driver set as MSKPHASE_9CHANNEL(defined as 0x03 in snled27351.h) */ +# define SNLED27351_PHASE_CHANNEL MSKPHASE_9CHANNEL + +/* Set LED driver current */ +# define SNLED27351_CURRENT_TUNE \ + { 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14 } + +/* Set to infinit, which is use in USB mode by default */ +# define RGB_MATRIX_TIMEOUT RGB_MATRIX_TIMEOUT_INFINITE + +/* Allow shutdown of led driver to save power */ +# define RGB_MATRIX_DRIVER_SHUTDOWN_ENABLE +/* Turn off backlight on low brightness to save power */ +# define RGB_MATRIX_BRIGHTNESS_TURN_OFF_VAL 48 + +/* Indications */ +# define DIM_CAPS_LOCK +# define CAPS_LOCK_INDEX 30 +# define LOW_BAT_IND_INDEX \ + { 61 } + +# define RGB_MATRIX_KEYPRESSES +# define RGB_MATRIX_FRAMEBUFFER_EFFECTS + +#endif diff --git a/keyboards/keychron/k7_max/ansi/rgb/info.json b/keyboards/keychron/k7_max/ansi/rgb/info.json new file mode 100644 index 0000000000..69b6943f69 --- /dev/null +++ b/keyboards/keychron/k7_max/ansi/rgb/info.json @@ -0,0 +1,36 @@ +{ + "usb": { + "pid": "0x0A70", + "device_version": "1.0.0" + }, + "features": { + "rgb_matrix": true + }, + "rgb_matrix": { + "driver": "snled27351_spi", + "sleep": true, + "animations": { + "band_spiral_val": true, + "breathing": true, + "cycle_all": true, + "cycle_left_right": true, + "cycle_out_in": true, + "cycle_out_in_dual": true, + "cycle_pinwheel": true, + "cycle_spiral": true, + "cycle_up_down": true, + "digital_rain": true, + "dual_beacon": true, + "jellybean_raindrops": true, + "pixel_rain": true, + "rainbow_beacon": true, + "rainbow_moving_chevron": true, + "solid_reactive_multinexus": true, + "solid_reactive_multiwide": true, + "solid_reactive_simple": true, + "solid_splash": true, + "splash": true, + "typing_heatmap": true + } + } +} diff --git a/keyboards/keychron/k7_max/ansi/rgb/keymaps/default/keymap.c b/keyboards/keychron/k7_max/ansi/rgb/keymaps/default/keymap.c new file mode 100644 index 0000000000..20e56e98cc --- /dev/null +++ b/keyboards/keychron/k7_max/ansi/rgb/keymaps/default/keymap.c @@ -0,0 +1,72 @@ +/* Copyright 2024 @ Keychron (https://www.keychron.com) + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#include QMK_KEYBOARD_H +#include "keychron_common.h" + +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_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_DEL, + 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_HOME, + 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_PGUP, + 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_PGDN, + KC_LCTL, KC_LOPTN, KC_LCMMD, KC_SPC, KC_RCMMD,MO(MAC_FN1),MO(FN2), KC_LEFT, KC_DOWN, KC_RGHT), + +[WIN_BASE] = LAYOUT_ansi_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_DEL, + 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_HOME, + 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_PGUP, + 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_PGDN, + KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, MO(WIN_FN1),MO(FN2), KC_LEFT, KC_DOWN, KC_RGHT), + +[MAC_FN1] = LAYOUT_ansi_68( + KC_GRV, KC_BRID, KC_BRIU, KC_MCTRL, KC_LNPAD, RGB_VAD, RGB_VAI, KC_MPRV, KC_MPLY, KC_MNXT, KC_MUTE, KC_VOLD, KC_VOLU, _______, _______, + _______, BT_HST1, BT_HST2, BT_HST3, P2P4G, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_END, + 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_ansi_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, _______, _______, + _______, BT_HST1, BT_HST2, BT_HST3, P2P4G, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_END, + 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_ansi_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, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______), +}; + +// clang-format on +bool process_record_user(uint16_t keycode, keyrecord_t *record) { + if (!process_record_keychron_common(keycode, record)) { + return false; + } + return true; +} diff --git a/keyboards/keychron/k7_max/ansi/rgb/keymaps/via/keymap.c b/keyboards/keychron/k7_max/ansi/rgb/keymaps/via/keymap.c new file mode 100644 index 0000000000..20e56e98cc --- /dev/null +++ b/keyboards/keychron/k7_max/ansi/rgb/keymaps/via/keymap.c @@ -0,0 +1,72 @@ +/* Copyright 2024 @ Keychron (https://www.keychron.com) + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#include QMK_KEYBOARD_H +#include "keychron_common.h" + +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_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_DEL, + 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_HOME, + 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_PGUP, + 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_PGDN, + KC_LCTL, KC_LOPTN, KC_LCMMD, KC_SPC, KC_RCMMD,MO(MAC_FN1),MO(FN2), KC_LEFT, KC_DOWN, KC_RGHT), + +[WIN_BASE] = LAYOUT_ansi_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_DEL, + 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_HOME, + 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_PGUP, + 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_PGDN, + KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, MO(WIN_FN1),MO(FN2), KC_LEFT, KC_DOWN, KC_RGHT), + +[MAC_FN1] = LAYOUT_ansi_68( + KC_GRV, KC_BRID, KC_BRIU, KC_MCTRL, KC_LNPAD, RGB_VAD, RGB_VAI, KC_MPRV, KC_MPLY, KC_MNXT, KC_MUTE, KC_VOLD, KC_VOLU, _______, _______, + _______, BT_HST1, BT_HST2, BT_HST3, P2P4G, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_END, + 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_ansi_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, _______, _______, + _______, BT_HST1, BT_HST2, BT_HST3, P2P4G, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_END, + 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_ansi_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, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______), +}; + +// clang-format on +bool process_record_user(uint16_t keycode, keyrecord_t *record) { + if (!process_record_keychron_common(keycode, record)) { + return false; + } + return true; +} diff --git a/keyboards/keychron/k7_max/ansi/rgb/keymaps/via/rules.mk b/keyboards/keychron/k7_max/ansi/rgb/keymaps/via/rules.mk new file mode 100644 index 0000000000..1e5b99807c --- /dev/null +++ b/keyboards/keychron/k7_max/ansi/rgb/keymaps/via/rules.mk @@ -0,0 +1 @@ +VIA_ENABLE = yes diff --git a/keyboards/keychron/k7_max/ansi/rgb/rgb.c b/keyboards/keychron/k7_max/ansi/rgb/rgb.c new file mode 100644 index 0000000000..a279422516 --- /dev/null +++ b/keyboards/keychron/k7_max/ansi/rgb/rgb.c @@ -0,0 +1,130 @@ +/* Copyright 2024 @ Keychron (https://www.keychron.com) + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#include "quantum.h" + +// clang-format off +#ifdef RGB_MATRIX_ENABLE +const snled27351_led_t g_snled27351_leds[RGB_MATRIX_LED_COUNT] = { +/* Refer to snled27351manual for these locations + * driver + * | R location + * | | G location + * | | | B location + * | | | | */ + {0, F_1, D_1, E_1}, + {0, F_2, D_2, E_2}, + {0, F_3, D_3, E_3}, + {0, F_4, D_4, E_4}, + {0, F_5, D_5, E_5}, + {0, F_6, D_6, E_6}, + {0, F_7, D_7, E_7}, + {0, F_8, D_8, E_8}, + {0, F_9, D_9, E_9}, + {0, F_10, D_10, E_10}, + {0, F_11, D_11, E_11}, + {0, F_12, D_12, E_12}, + {0, F_13, D_13, E_13}, + {0, F_14, D_14, E_14}, + {0, F_16, D_16, E_16}, + + {0, A_1, C_1, B_1}, + {0, A_2, C_2, B_2}, + {0, A_3, C_3, B_3}, + {0, A_4, C_4, B_4}, + {0, A_5, C_5, B_5}, + {0, A_6, C_6, B_6}, + {0, A_7, C_7, B_7}, + {0, A_8, C_8, B_8}, + {0, A_9, C_9, B_9}, + {0, A_10, C_10, B_10}, + {0, A_11, C_11, B_11}, + {0, A_12, C_12, B_12}, + {0, A_13, C_13, B_13}, + {0, A_14, C_14, B_14}, + {0, A_16, C_16, B_16}, + + {1, I_1, G_1, H_1}, + {1, I_2, G_2, H_2}, + {1, I_3, G_3, H_3}, + {1, I_4, G_4, H_4}, + {1, I_5, G_5, H_5}, + {1, I_6, G_6, H_6}, + {1, I_7, G_7, H_7}, + {1, I_8, G_8, H_8}, + {1, I_9, G_9, H_9}, + {1, I_10, G_10, H_10}, + {1, I_11, G_11, H_11}, + {1, I_12, G_12, H_12}, + {1, I_14, G_14, H_14}, + {1, I_16, G_16, H_16}, + + {1, C_1, A_1, B_1}, + {1, C_3, A_3, B_3}, + {1, C_4, A_4, B_4}, + {1, C_5, A_5, B_5}, + {1, C_6, A_6, B_6}, + {1, C_7, A_7, B_7}, + {1, C_8, A_8, B_8}, + {1, C_9, A_9, B_9}, + {1, C_10, A_10, B_10}, + {1, C_11, A_11, B_11}, + {1, C_12, A_12, B_12}, + {1, C_14, A_14, B_14}, + {1, C_15, A_15, B_15}, + {1, C_16, A_16, B_16}, + + {1, F_1, D_1, E_1}, + {1, F_2, D_2, E_2}, + {1, F_3, D_3, E_3}, + {1, F_7, D_7, E_7}, + {1, F_11, D_11, E_11}, + {1, F_12, D_12, E_12}, + {1, F_13, D_13, E_13}, + {1, F_14, D_14, E_14}, + {1, F_15, D_15, E_15}, + {1, F_16, D_16, E_16}, +}; + +#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 }, + }, + { + // LED Index to Physical Position + {0, 0}, {15, 0}, {30, 0}, {45, 0}, {60, 0}, {75, 0}, { 90, 0}, {105, 0}, {119, 0}, {134, 0}, {149, 0}, {164, 0}, {179, 0}, {202, 0}, {224, 0}, + {4,16}, {22,16}, {37,16}, {52,16}, {67,16}, {82,16}, { 97,16}, {112,16}, {127,16}, {142,16}, {157,16}, {172,16}, {187,16}, {205,16}, {224,16}, + {6,32}, {26,32}, {41,32}, {56,32}, {71,32}, {86,32}, {101,32}, {116,32}, {131,32}, {146,32}, {161,32}, {175,32}, {200,32}, {224,32}, + {9,48}, {34,48}, {49,48}, {64,48}, {78,48}, { 93,48}, {108,48}, {123,48}, {138,48}, {153,48}, {168,48}, {189,48}, {209,48}, {224,48}, + {2,64}, {21,64}, {39,64}, { 95,64}, {149,64}, {164,64}, {179,64}, {194,64}, {209,64}, {224,64} + }, + { + // RGB LED Index to Flag + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 + } +}; +#endif diff --git a/keyboards/keychron/k7_max/ansi/rgb/rules.mk b/keyboards/keychron/k7_max/ansi/rgb/rules.mk new file mode 100644 index 0000000000..6e7633bfe0 --- /dev/null +++ b/keyboards/keychron/k7_max/ansi/rgb/rules.mk @@ -0,0 +1 @@ +# This file intentionally left blank diff --git a/keyboards/keychron/k7_max/ansi/white/config.h b/keyboards/keychron/k7_max/ansi/white/config.h new file mode 100644 index 0000000000..69d948ca2c --- /dev/null +++ b/keyboards/keychron/k7_max/ansi/white/config.h @@ -0,0 +1,54 @@ +/* Copyright 2024 @ Keychron (https://www.keychron.com) + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#pragma once + +#ifdef LED_MATRIX_ENABLE +/* LED matrix driver configuration */ +# define DRIVER_COUNT 1 +# define LED_MATRIX_LED_COUNT 68 + +# define SPI_SCK_PIN A5 +# define SPI_MISO_PIN A6 +# define SPI_MOSI_PIN A7 + +# define DRIVER_CS_PINS \ + { B9 } +# define SNLED23751_SPI_DIVISOR 16 +# define SPI_DRIVER SPID1 + +/* Use first 6 channels of LED driver */ +# define SNLED27351_PHASE_CHANNEL MSKPHASE_6CHANNEL + +/* Set LED driver current */ +# define SNLED27351_CURRENT_TUNE \ + { 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20 } + +/* Set to infinit, which is use in USB mode by default */ +# define LED_MATRIX_TIMEOUT LED_MATRIX_TIMEOUT_INFINITE +/* Allow shutdown of led driver to save power */ +# define LED_MATRIX_DRIVER_SHUTDOWN_ENABLE +/* Turn off backlight on low brightness to save power */ +# define LED_MATRIX_BRIGHTNESS_TURN_OFF_VAL 48 + +/* Indications */ +# define DIM_CAPS_LOCK +# define CAPS_LOCK_INDEX 30 +# define LOW_BAT_IND_INDEX \ + { 61 } + +# define LED_MATRIX_KEYPRESSES +#endif diff --git a/keyboards/keychron/k7_max/ansi/white/info.json b/keyboards/keychron/k7_max/ansi/white/info.json new file mode 100644 index 0000000000..211aa6d92a --- /dev/null +++ b/keyboards/keychron/k7_max/ansi/white/info.json @@ -0,0 +1,30 @@ +{ + "usb": { + "pid": "0x0A73", + "device_version": "1.0.0" + }, + "features": { + "led_matrix": true + }, + "led_matrix": { + "driver": "snled27351_spi", + "sleep": true, + "animations": { + "none": true, + "solid": true, + "breathing": true, + "band_pinwheel": true, + "band_spiral": true, + "cycle_left_right": true, + "cycle_up_down": true, + "cycle_out_in": true, + "dual_beacon": true, + "solid_reactive_simple": true, + "solid_reactive_multiwide": true, + "solid_reactive_multinexus": true, + "solid_splash": true, + "wave_left_right": true, + "wave_up_down": true + } + } +} diff --git a/keyboards/keychron/k7_max/ansi/white/keymaps/default/keymap.c b/keyboards/keychron/k7_max/ansi/white/keymaps/default/keymap.c new file mode 100644 index 0000000000..093bf2c084 --- /dev/null +++ b/keyboards/keychron/k7_max/ansi/white/keymaps/default/keymap.c @@ -0,0 +1,72 @@ +/* Copyright 2024 @ Keychron (https://www.keychron.com) + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#include QMK_KEYBOARD_H +#include "keychron_common.h" + +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_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_DEL, + 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_HOME, + 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_PGUP, + 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_PGDN, + KC_LCTL, KC_LOPTN, KC_LCMMD, KC_SPC, KC_RCMMD,MO(MAC_FN1),MO(FN2), KC_LEFT, KC_DOWN, KC_RGHT), + +[WIN_BASE] = LAYOUT_ansi_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_DEL, + 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_HOME, + 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_PGUP, + 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_PGDN, + KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, MO(WIN_FN1),MO(FN2), KC_LEFT, KC_DOWN, KC_RGHT), + +[MAC_FN1] = LAYOUT_ansi_68( + KC_GRV, KC_BRID, KC_BRIU, KC_MCTRL, KC_LNPAD, BL_DOWN, BL_UP, KC_MPRV, KC_MPLY, KC_MNXT, KC_MUTE, KC_VOLD, KC_VOLU, _______, _______, + _______, BT_HST1, BT_HST2, BT_HST3, P2P4G, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_END, + BL_TOGG, BL_STEP, BL_UP, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, BL_DOWN, _______, _______, _______, NK_TOGG, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______), + +[WIN_FN1] = LAYOUT_ansi_68( + KC_GRV, KC_BRID, KC_BRIU, KC_TASK, KC_FILE, BL_DOWN, BL_UP, KC_MPRV, KC_MPLY, KC_MNXT, KC_MUTE, KC_VOLD, KC_VOLU, _______, _______, + _______, BT_HST1, BT_HST2, BT_HST3, P2P4G, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_END, + BL_TOGG, BL_STEP, BL_UP, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, BL_DOWN, _______, _______, _______, NK_TOGG, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______), + +[FN2] = LAYOUT_ansi_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, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______), +}; + +// clang-format on +bool process_record_user(uint16_t keycode, keyrecord_t *record) { + if (!process_record_keychron_common(keycode, record)) { + return false; + } + return true; +} diff --git a/keyboards/keychron/k7_max/ansi/white/keymaps/via/keymap.c b/keyboards/keychron/k7_max/ansi/white/keymaps/via/keymap.c new file mode 100644 index 0000000000..093bf2c084 --- /dev/null +++ b/keyboards/keychron/k7_max/ansi/white/keymaps/via/keymap.c @@ -0,0 +1,72 @@ +/* Copyright 2024 @ Keychron (https://www.keychron.com) + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#include QMK_KEYBOARD_H +#include "keychron_common.h" + +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_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_DEL, + 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_HOME, + 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_PGUP, + 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_PGDN, + KC_LCTL, KC_LOPTN, KC_LCMMD, KC_SPC, KC_RCMMD,MO(MAC_FN1),MO(FN2), KC_LEFT, KC_DOWN, KC_RGHT), + +[WIN_BASE] = LAYOUT_ansi_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_DEL, + 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_HOME, + 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_PGUP, + 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_PGDN, + KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, MO(WIN_FN1),MO(FN2), KC_LEFT, KC_DOWN, KC_RGHT), + +[MAC_FN1] = LAYOUT_ansi_68( + KC_GRV, KC_BRID, KC_BRIU, KC_MCTRL, KC_LNPAD, BL_DOWN, BL_UP, KC_MPRV, KC_MPLY, KC_MNXT, KC_MUTE, KC_VOLD, KC_VOLU, _______, _______, + _______, BT_HST1, BT_HST2, BT_HST3, P2P4G, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_END, + BL_TOGG, BL_STEP, BL_UP, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, BL_DOWN, _______, _______, _______, NK_TOGG, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______), + +[WIN_FN1] = LAYOUT_ansi_68( + KC_GRV, KC_BRID, KC_BRIU, KC_TASK, KC_FILE, BL_DOWN, BL_UP, KC_MPRV, KC_MPLY, KC_MNXT, KC_MUTE, KC_VOLD, KC_VOLU, _______, _______, + _______, BT_HST1, BT_HST2, BT_HST3, P2P4G, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_END, + BL_TOGG, BL_STEP, BL_UP, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, BL_DOWN, _______, _______, _______, NK_TOGG, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______), + +[FN2] = LAYOUT_ansi_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, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______), +}; + +// clang-format on +bool process_record_user(uint16_t keycode, keyrecord_t *record) { + if (!process_record_keychron_common(keycode, record)) { + return false; + } + return true; +} diff --git a/keyboards/keychron/k7_max/ansi/white/keymaps/via/rules.mk b/keyboards/keychron/k7_max/ansi/white/keymaps/via/rules.mk new file mode 100644 index 0000000000..1e5b99807c --- /dev/null +++ b/keyboards/keychron/k7_max/ansi/white/keymaps/via/rules.mk @@ -0,0 +1 @@ +VIA_ENABLE = yes diff --git a/keyboards/keychron/k7_max/ansi/white/rules.mk b/keyboards/keychron/k7_max/ansi/white/rules.mk new file mode 100644 index 0000000000..6e7633bfe0 --- /dev/null +++ b/keyboards/keychron/k7_max/ansi/white/rules.mk @@ -0,0 +1 @@ +# This file intentionally left blank diff --git a/keyboards/keychron/k7_max/ansi/white/white.c b/keyboards/keychron/k7_max/ansi/white/white.c new file mode 100644 index 0000000000..cab38c5cde --- /dev/null +++ b/keyboards/keychron/k7_max/ansi/white/white.c @@ -0,0 +1,128 @@ +/* Copyright 2024 @ Keychron (https://www.keychron.com) + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#include "quantum.h" + +// clang-format off +#ifdef LED_MATRIX_ENABLE +const snled27351_led_t g_snled27351_leds[LED_MATRIX_LED_COUNT] = { +/* Refer to SNLED27351 manual for these locations + * driver + * | LED address + * | | */ + {0, E_1}, + {0, E_2}, + {0, E_3}, + {0, E_4}, + {0, E_5}, + {0, E_6}, + {0, E_7}, + {0, E_8}, + {0, E_9}, + {0, E_10}, + {0, E_11}, + {0, E_12}, + {0, E_13}, + {0, E_14}, + {0, E_16}, + + {0, D_1}, + {0, D_2}, + {0, D_3}, + {0, D_4}, + {0, D_5}, + {0, D_6}, + {0, D_7}, + {0, D_8}, + {0, D_9}, + {0, D_10}, + {0, D_11}, + {0, D_12}, + {0, D_13}, + {0, D_14}, + {0, D_16}, + + {0, C_1}, + {0, C_2}, + {0, C_3}, + {0, C_4}, + {0, C_5}, + {0, C_6}, + {0, C_7}, + {0, C_8}, + {0, C_9}, + {0, C_10}, + {0, C_11}, + {0, C_12}, + {0, C_14}, + {0, C_16}, + + {0, B_1}, + {0, B_3}, + {0, B_4}, + {0, B_5}, + {0, B_6}, + {0, B_7}, + {0, B_8}, + {0, B_9}, + {0, B_10}, + {0, B_11}, + {0, B_12}, + {0, B_13}, + {0, B_14}, + {0, B_16}, + + {0, A_1}, + {0, A_2}, + {0, A_3}, + {0, A_7}, + {0, A_11}, + {0, A_12}, + {0, A_13}, + {0, A_14}, + {0, A_15}, + {0, A_16}, +}; + +#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 }, + }, + { + // LED Index to Physical Position + {0, 0}, {15, 0}, {30, 0}, {45, 0}, {60, 0}, {75, 0}, { 90, 0}, {105, 0}, {119, 0}, {134, 0}, {149, 0}, {164, 0}, {179, 0}, {202, 0}, {224, 0}, + {4,16}, {22,16}, {37,16}, {52,16}, {67,16}, {82,16}, { 97,16}, {112,16}, {127,16}, {142,16}, {157,16}, {172,16}, {187,16}, {205,16}, {224,16}, + {6,32}, {26,32}, {41,32}, {56,32}, {71,32}, {86,32}, {101,32}, {116,32}, {131,32}, {146,32}, {161,32}, {175,32}, {200,32}, {224,32}, + {9,48}, {34,48}, {49,48}, {64,48}, {78,48}, { 93,48}, {108,48}, {123,48}, {138,48}, {153,48}, {168,48}, {189,48}, {209,48}, {224,48}, + {2,64}, {21,64}, {39,64}, { 95,64}, {149,64}, {164,64}, {179,64}, {194,64}, {209,64}, {224,64} + }, + { + // RGB LED Index to Flag + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 + } +}; +#endif diff --git a/keyboards/keychron/k7_max/board.h b/keyboards/keychron/k7_max/board.h new file mode 100644 index 0000000000..54fba748bf --- /dev/null +++ b/keyboards/keychron/k7_max/board.h @@ -0,0 +1,226 @@ +/* Copyright 2024 @ Keychron (https://www.keychron.com) + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#pragma once + +#include_next + +// clang-format off + +/* Set GPIOA_SWDIO to INPUT and NOT FLOATING */ +#undef VAL_GPIOA_MODER +#define VAL_GPIOA_MODER (PIN_MODE_INPUT(GPIOA_BUTTON) | \ + PIN_MODE_INPUT(GPIOA_PIN1) | \ + PIN_MODE_INPUT(GPIOA_PIN2) | \ + PIN_MODE_INPUT(GPIOA_PIN3) | \ + PIN_MODE_ALTERNATE(GPIOA_CS43L22_LRCK) |\ + PIN_MODE_ALTERNATE(GPIOA_L3GD20_SCL) | \ + PIN_MODE_ALTERNATE(GPIOA_L3GD20_SD0) | \ + PIN_MODE_ALTERNATE(GPIOA_L3GD20_SDI) | \ + PIN_MODE_INPUT(GPIOA_PIN8) | \ + PIN_MODE_INPUT(GPIOA_VBUS_FS) | \ + PIN_MODE_ALTERNATE(GPIOA_OTG_FS_ID) | \ + PIN_MODE_ALTERNATE(GPIOA_OTG_FS_DM) | \ + PIN_MODE_ALTERNATE(GPIOA_OTG_FS_DP) | \ + PIN_MODE_INPUT(GPIOA_SWDIO) | \ + PIN_MODE_INPUT(GPIOA_SWCLK) | \ + PIN_MODE_INPUT(GPIOA_PIN15)) + +#undef VAL_GPIOA_PUPDR +#define VAL_GPIOA_PUPDR (PIN_PUPDR_FLOATING(GPIOA_BUTTON) | \ + PIN_PUPDR_PULLUP(GPIOA_PIN1) | \ + PIN_PUPDR_PULLUP(GPIOA_PIN2) | \ + PIN_PUPDR_PULLUP(GPIOA_PIN3) | \ + PIN_PUPDR_FLOATING(GPIOA_CS43L22_LRCK) |\ + PIN_PUPDR_FLOATING(GPIOA_L3GD20_SCL) | \ + PIN_PUPDR_PULLUP(GPIOA_L3GD20_SD0) | \ + PIN_PUPDR_PULLUP(GPIOA_L3GD20_SDI) | \ + PIN_PUPDR_PULLUP(GPIOA_PIN8) | \ + PIN_PUPDR_FLOATING(GPIOA_VBUS_FS) | \ + PIN_PUPDR_FLOATING(GPIOA_OTG_FS_ID) | \ + PIN_PUPDR_FLOATING(GPIOA_OTG_FS_DM) | \ + PIN_PUPDR_FLOATING(GPIOA_OTG_FS_DP) | \ + PIN_PUPDR_PULLUP(GPIOA_SWDIO) | \ + PIN_PUPDR_PULLUP(GPIOA_SWCLK) | \ + PIN_PUPDR_PULLUP(GPIOA_PIN15)) + +#undef VAL_GPIOB_MODER +#define VAL_GPIOB_MODER (PIN_MODE_INPUT(GPIOB_PIN0) | \ + PIN_MODE_INPUT(GPIOB_PIN1) | \ + PIN_MODE_INPUT(GPIOB_PIN2) | \ + PIN_MODE_INPUT(GPIOB_SWO) | \ + PIN_MODE_INPUT(GPIOB_PIN4) | \ + PIN_MODE_INPUT(GPIOB_PIN5) | \ + PIN_MODE_INPUT(GPIOB_LSM303DLHC_SCL) | \ + PIN_MODE_INPUT(GPIOB_PIN7) | \ + PIN_MODE_INPUT(GPIOB_PIN8) | \ + PIN_MODE_INPUT(GPIOB_LSM303DLHC_SDA) | \ + PIN_MODE_INPUT(GPIOB_MP45DT02_CLK_IN) |\ + PIN_MODE_INPUT(GPIOB_PIN11) | \ + PIN_MODE_INPUT(GPIOB_PIN12) | \ + PIN_MODE_INPUT(GPIOB_PIN13) | \ + PIN_MODE_INPUT(GPIOB_PIN14) | \ + PIN_MODE_INPUT(GPIOB_PIN15)) + +#undef VAL_GPIOB_PUPDR +#define VAL_GPIOB_PUPDR (PIN_PUPDR_PULLDOWN(GPIOB_PIN0) | \ + PIN_PUPDR_PULLDOWN(GPIOB_PIN1) | \ + PIN_PUPDR_PULLDOWN(GPIOB_PIN2) | \ + PIN_PUPDR_PULLDOWN(GPIOB_SWO) | \ + PIN_PUPDR_PULLDOWN(GPIOB_PIN4) | \ + PIN_PUPDR_PULLDOWN(GPIOB_PIN5) | \ + PIN_PUPDR_PULLDOWN(GPIOB_LSM303DLHC_SCL) |\ + PIN_PUPDR_PULLDOWN(GPIOB_PIN7) | \ + PIN_PUPDR_PULLDOWN(GPIOB_PIN8) | \ + PIN_PUPDR_PULLDOWN(GPIOB_LSM303DLHC_SDA) |\ + PIN_PUPDR_PULLDOWN(GPIOB_MP45DT02_CLK_IN) |\ + PIN_PUPDR_PULLDOWN(GPIOB_PIN11) | \ + PIN_PUPDR_PULLDOWN(GPIOB_PIN12) | \ + PIN_PUPDR_PULLDOWN(GPIOB_PIN13) | \ + PIN_PUPDR_PULLDOWN(GPIOB_PIN14) | \ + PIN_PUPDR_PULLDOWN(GPIOB_PIN15)) + +#undef VAL_GPIOB_AFRL +#define VAL_GPIOB_AFRL (PIN_AFIO_AF(GPIOB_PIN0, 0U) | \ + PIN_AFIO_AF(GPIOB_PIN1, 0U) | \ + PIN_AFIO_AF(GPIOB_PIN2, 0U) | \ + PIN_AFIO_AF(GPIOB_SWO, 0U) | \ + PIN_AFIO_AF(GPIOB_PIN4, 0U) | \ + PIN_AFIO_AF(GPIOB_PIN5, 0U) | \ + PIN_AFIO_AF(GPIOB_LSM303DLHC_SCL, 0) | \ + PIN_AFIO_AF(GPIOB_PIN7, 0U)) + +#undef VAL_GPIOB_AFRH +#define VAL_GPIOB_AFRH (PIN_AFIO_AF(GPIOB_PIN8, 0U) | \ + PIN_AFIO_AF(GPIOB_LSM303DLHC_SDA, 0) | \ + PIN_AFIO_AF(GPIOB_MP45DT02_CLK_IN, 0U) |\ + PIN_AFIO_AF(GPIOB_PIN11, 0U) | \ + PIN_AFIO_AF(GPIOB_PIN12, 0U) | \ + PIN_AFIO_AF(GPIOB_PIN13, 0U) | \ + PIN_AFIO_AF(GPIOB_PIN14, 0U) | \ + PIN_AFIO_AF(GPIOB_PIN15, 0U)) + +/* C5 Need to be pulldown */ +#undef VAL_GPIOC_MODER +#define VAL_GPIOC_MODER (PIN_MODE_INPUT(GPIOC_OTG_FS_POWER_ON) |\ + PIN_MODE_INPUT(GPIOC_PIN1) | \ + PIN_MODE_INPUT(GPIOC_PIN2) | \ + PIN_MODE_INPUT(GPIOC_CS43L22_AIN4x) | \ + PIN_MODE_INPUT(GPIOC_PIN4) | \ + PIN_MODE_INPUT(GPIOC_PIN5) | \ + PIN_MODE_INPUT(GPIOC_PIN6) | \ + PIN_MODE_INPUT(GPIOC_CS43L22_MCLK) | \ + PIN_MODE_INPUT(GPIOC_PIN8) | \ + PIN_MODE_INPUT(GPIOC_PIN9) | \ + PIN_MODE_INPUT(GPIOC_CS43L22_SCLK) | \ + PIN_MODE_INPUT(GPIOC_PIN11) | \ + PIN_MODE_INPUT(GPIOC_CS43L22_SDIN) | \ + PIN_MODE_INPUT(GPIOC_PIN13) | \ + PIN_MODE_INPUT(GPIOC_OSC32_IN) | \ + PIN_MODE_INPUT(GPIOC_OSC32_OUT)) + +#undef VAL_GPIOC_PUPDR +#define VAL_GPIOC_PUPDR (PIN_PUPDR_PULLUP(GPIOC_OTG_FS_POWER_ON) |\ + PIN_PUPDR_PULLUP(GPIOC_PIN1) | \ + PIN_PUPDR_PULLUP(GPIOC_PIN2) | \ + PIN_PUPDR_PULLUP(GPIOC_CS43L22_AIN4x) |\ + PIN_PUPDR_PULLUP(GPIOC_PIN4) | \ + PIN_PUPDR_PULLDOWN(GPIOC_PIN5) | \ + PIN_PUPDR_PULLUP(GPIOC_PIN6) | \ + PIN_PUPDR_PULLUP(GPIOC_CS43L22_MCLK) | \ + PIN_PUPDR_PULLUP(GPIOC_PIN8) | \ + PIN_PUPDR_PULLUP(GPIOC_PIN9) | \ + PIN_PUPDR_PULLUP(GPIOC_CS43L22_SCLK) | \ + PIN_PUPDR_PULLUP(GPIOC_PIN11) | \ + PIN_PUPDR_PULLUP(GPIOC_CS43L22_SDIN) | \ + PIN_PUPDR_PULLUP(GPIOC_PIN13) | \ + PIN_PUPDR_PULLUP(GPIOC_OSC32_IN) | \ + PIN_PUPDR_PULLUP(GPIOC_OSC32_OUT)) + +/* Set all GPIOD pins to INPUT & PULLUP to avoid FLOATING */ +#undef VAL_GPIOD_MODER +#define VAL_GPIOD_MODER (PIN_MODE_INPUT(GPIOD_PIN0) | \ + PIN_MODE_INPUT(GPIOD_PIN1) | \ + PIN_MODE_INPUT(GPIOD_PIN2) | \ + PIN_MODE_INPUT(GPIOD_PIN3) | \ + PIN_MODE_INPUT(GPIOD_CS43L22_RESET) | \ + PIN_MODE_INPUT(GPIOD_OverCurrent) | \ + PIN_MODE_INPUT(GPIOD_PIN6) | \ + PIN_MODE_INPUT(GPIOD_PIN7) | \ + PIN_MODE_INPUT(GPIOD_PIN8) | \ + PIN_MODE_INPUT(GPIOD_PIN9) | \ + PIN_MODE_INPUT(GPIOD_PIN10) | \ + PIN_MODE_INPUT(GPIOD_PIN11) | \ + PIN_MODE_INPUT(GPIOD_LED4) | \ + PIN_MODE_INPUT(GPIOD_LED3) | \ + PIN_MODE_INPUT(GPIOD_LED5) | \ + PIN_MODE_INPUT(GPIOD_LED6)) + +#undef VAL_GPIOD_PUPDR +#define VAL_GPIOD_PUPDR (PIN_PUPDR_PULLUP(GPIOD_PIN0) | \ + PIN_PUPDR_PULLUP(GPIOD_PIN1) | \ + PIN_PUPDR_PULLUP(GPIOD_PIN2) | \ + PIN_PUPDR_PULLUP(GPIOD_PIN3) | \ + PIN_PUPDR_PULLUP(GPIOD_CS43L22_RESET) |\ + PIN_PUPDR_PULLUP(GPIOD_OverCurrent) | \ + PIN_PUPDR_PULLUP(GPIOD_PIN6) | \ + PIN_PUPDR_PULLUP(GPIOD_PIN7) | \ + PIN_PUPDR_PULLUP(GPIOD_PIN8) | \ + PIN_PUPDR_PULLUP(GPIOD_PIN9) | \ + PIN_PUPDR_PULLUP(GPIOD_PIN10) | \ + PIN_PUPDR_PULLUP(GPIOD_PIN11) | \ + PIN_PUPDR_PULLUP(GPIOD_LED4) | \ + PIN_PUPDR_PULLUP(GPIOD_LED3) | \ + PIN_PUPDR_PULLUP(GPIOD_LED5) | \ + PIN_PUPDR_PULLUP(GPIOD_LED6)) + +/* Set all GPIOE pins to INPUT & PULLUP to avoid FLOATING */ +#undef VAL_GPIOE_MODER +#define VAL_GPIOE_MODER (PIN_MODE_INPUT(GPIOE_L3GD20_INT1) | \ + PIN_MODE_INPUT(GPIOE_L3GD20_INT2) | \ + PIN_MODE_INPUT(GPIOE_LSM303DLHC_DRDY) |\ + PIN_MODE_INPUT(GPIOE_L3GD20_CS) | \ + PIN_MODE_INPUT(GPIOE_LSM303DLHC_INT1) |\ + PIN_MODE_INPUT(GPIOE_LSM303DLHC_INT2) |\ + PIN_MODE_INPUT(GPIOE_PIN6) | \ + PIN_MODE_INPUT(GPIOE_PIN7) | \ + PIN_MODE_INPUT(GPIOE_PIN8) | \ + PIN_MODE_INPUT(GPIOE_PIN9) | \ + PIN_MODE_INPUT(GPIOE_PIN10) | \ + PIN_MODE_INPUT(GPIOE_PIN11) | \ + PIN_MODE_INPUT(GPIOE_PIN12) | \ + PIN_MODE_INPUT(GPIOE_PIN13) | \ + PIN_MODE_INPUT(GPIOE_PIN14) | \ + PIN_MODE_INPUT(GPIOE_PIN15)) + +#undef VAL_GPIOE_PUPDR +#define VAL_GPIOE_PUPDR (PIN_PUPDR_PULLUP(GPIOE_L3GD20_INT1) | \ + PIN_PUPDR_PULLUP(GPIOE_L3GD20_INT2) | \ + PIN_PUPDR_PULLUP(GPIOE_LSM303DLHC_DRDY) |\ + PIN_PUPDR_PULLUP(GPIOE_L3GD20_CS) | \ + PIN_PUPDR_PULLUP(GPIOE_LSM303DLHC_INT1) |\ + PIN_PUPDR_PULLUP(GPIOE_LSM303DLHC_INT2) |\ + PIN_PUPDR_PULLUP(GPIOE_PIN6) | \ + PIN_PUPDR_PULLUP(GPIOE_PIN7) | \ + PIN_PUPDR_PULLUP(GPIOE_PIN8) | \ + PIN_PUPDR_PULLUP(GPIOE_PIN9) | \ + PIN_PUPDR_PULLUP(GPIOE_PIN10) | \ + PIN_PUPDR_PULLUP(GPIOE_PIN11) | \ + PIN_PUPDR_PULLUP(GPIOE_PIN12) | \ + PIN_PUPDR_PULLUP(GPIOE_PIN13) | \ + PIN_PUPDR_PULLUP(GPIOE_PIN14) | \ + PIN_PUPDR_PULLUP(GPIOE_PIN15)) + diff --git a/keyboards/keychron/k7_max/config.h b/keyboards/keychron/k7_max/config.h new file mode 100644 index 0000000000..e137fbd348 --- /dev/null +++ b/keyboards/keychron/k7_max/config.h @@ -0,0 +1,83 @@ +/* Copyright 2024 @ Keychron (https://www.keychron.com) + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#pragma once + +/* Caps lock LED */ +#define LED_CAPS_LOCK_PIN A13 +#define LED_PIN_ON_STATE 1 + +#ifdef LK_WIRELESS_ENABLE +/* Hardware configuration */ +# define P2P4_MODE_SELECT_PIN A10 +# define BT_MODE_SELECT_PIN A9 + +# define LKBT51_RESET_PIN C4 +# define LKBT51_INT_INPUT_PIN B1 +# define BLUETOOTH_INT_OUTPUT_PIN A4 + +# define USB_POWER_SENSE_PIN B0 +# define USB_POWER_CONNECTED_LEVEL 0 + +# define BAT_CHARGING_PIN B13 +# define BAT_CHARGING_LEVEL 0 + +# define BAT_LOW_LED_PIN B12 +# define BAT_LOW_LED_PIN_ON_STATE 1 + +# define BT_HOST_DEVICES_COUNT 3 + +# if defined(RGB_MATRIX_ENABLE) || defined(LED_MATRIX_ENABLE) + +# define LED_DRIVER_SHUTDOWN_PIN B7 + +# define BT_HOST_LED_MATRIX_LIST \ + { 16, 17, 18 } + +# define P2P4G_HOST_LED_MATRIX_LIST \ + { 19 } + +# define BAT_LEVEL_LED_LIST \ + { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 } + +/* Backlit disable timeout when keyboard is disconnected(unit: second) */ +# define DISCONNECTED_BACKLIGHT_DISABLE_TIMEOUT 40 + +/* Backlit disable timeout when keyboard is connected(unit: second) */ +# define CONNECTED_BACKLIGHT_DISABLE_TIMEOUT 600 + +/* Reinit LED driver on tranport changed */ +# define REINIT_LED_DRIVER 1 + +# endif + +/* Keep USB connection in blueooth mode */ +# define KEEP_USB_CONNECTION_IN_WIRELESS_MODE + +/* Enable bluetooth NKRO */ +# define WIRELESS_NKRO_ENABLE + +/* Raw hid command for factory test and bluetooth DFU */ +# define RAW_HID_CMD 0xAA ... 0xAB +#else +/* Raw hid command for factory test */ +# define RAW_HID_CMD 0xAB +#endif + +/* Factory test keys */ +#define FN_KEY_3 MO(4) + +#define MATRIX_IO_DELAY 10 diff --git a/keyboards/keychron/k7_max/halconf.h b/keyboards/keychron/k7_max/halconf.h new file mode 100644 index 0000000000..37bcc7c47b --- /dev/null +++ b/keyboards/keychron/k7_max/halconf.h @@ -0,0 +1,31 @@ +/* Copyright 2024 @ 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 + +#define _CHIBIOS_HAL_CONF_VER_8_0_ + +#define HAL_USE_SPI TRUE + +#ifdef LK_WIRELESS_ENABLE +# define HAL_USE_RTC TRUE +#endif + +#if defined(LK_WIRELESS_ENABLE) || defined(ENCODER_ENABLE) +# define PAL_USE_CALLBACKS TRUE +#endif + +#include_next diff --git a/keyboards/keychron/k7_max/info.json b/keyboards/keychron/k7_max/info.json new file mode 100644 index 0000000000..ca6a915a32 --- /dev/null +++ b/keyboards/keychron/k7_max/info.json @@ -0,0 +1,117 @@ +{ + "keyboard_name": "Keychron K7 Max", + "manufacturer": "Keychron", + "url": "https://github.com/Keychron", + "maintainer": "lokher", + "processor": "STM32F401", + "bootloader": "stm32-dfu", + "usb": { + "vid": "0x3434" + }, + "features": { + "bootmagic": true, + "extrakey": true, + "mousekey": true, + "dip_switch": true, + "nkro": true, + "raw": true, + "sendstring": true + }, + "matrix_pins": { + "cols": ["C6", "C7", "C8", "A14", "A15", "C10", "C11", "C13", "C14", "C15", "C0", "C1", "C2", "C3", "A0", "A1"], + "rows": ["D2", "B3", "B4", "B5", "B6"] + }, + "diode_direction": "ROW2COL", + "dip_switch": { + "pins": ["B14"] + }, + "eeprom": { + "wear_leveling": { + "driver": "embedded_flash", + "logical_size": 2048, + "backing_size": 4096 + } + }, + "dynamic_keymap": { + "layer_count": 5 + }, + "layouts": { + "LAYOUT_ansi_68": { + "layout": [ + {"matrix": [0, 0], "x": 0, "y": 0}, + {"matrix": [0, 1], "x": 1, "y": 0}, + {"matrix": [0, 2], "x": 2, "y": 0}, + {"matrix": [0, 3], "x": 3, "y": 0}, + {"matrix": [0, 4], "x": 4, "y": 0}, + {"matrix": [0, 5], "x": 5, "y": 0}, + {"matrix": [0, 6], "x": 6, "y": 0}, + {"matrix": [0, 7], "x": 7, "y": 0}, + {"matrix": [0, 8], "x": 8, "y": 0}, + {"matrix": [0, 9], "x": 9, "y": 0}, + {"matrix": [0, 10], "x": 10, "y": 0}, + {"matrix": [0, 11], "x": 11, "y": 0}, + {"matrix": [0, 12], "x": 12, "y": 0}, + {"matrix": [0, 13], "x": 13, "y": 0, "w": 2}, + {"matrix": [0, 15], "x": 15, "y": 0}, + + {"matrix": [1, 0], "x": 0, "y": 1, "w": 1.5}, + {"matrix": [1, 1], "x": 1.5, "y": 1}, + {"matrix": [1, 2], "x": 2.5, "y": 1}, + {"matrix": [1, 3], "x": 3.5, "y": 1}, + {"matrix": [1, 4], "x": 4.5, "y": 1}, + {"matrix": [1, 5], "x": 5.5, "y": 1}, + {"matrix": [1, 6], "x": 6.5, "y": 1}, + {"matrix": [1, 7], "x": 7.5, "y": 1}, + {"matrix": [1, 8], "x": 8.5, "y": 1}, + {"matrix": [1, 9], "x": 9.5, "y": 1}, + {"matrix": [1, 10], "x": 10.5, "y": 1}, + {"matrix": [1, 11], "x": 11.5, "y": 1}, + {"matrix": [1, 12], "x": 12.5, "y": 1}, + {"matrix": [1, 13], "x": 13.5, "y": 1, "w": 1.5}, + {"matrix": [1, 15], "x": 15, "y": 1}, + + {"matrix": [2, 0], "x": 0, "y": 2, "w": 1.75}, + {"matrix": [2, 1], "x": 1.75, "y": 2}, + {"matrix": [2, 2], "x": 2.75, "y": 2}, + {"matrix": [2, 3], "x": 3.75, "y": 2}, + {"matrix": [2, 4], "x": 4.75, "y": 2}, + {"matrix": [2, 5], "x": 5.75, "y": 2}, + {"matrix": [2, 6], "x": 6.75, "y": 2}, + {"matrix": [2, 7], "x": 7.75, "y": 2}, + {"matrix": [2, 8], "x": 8.75, "y": 2}, + {"matrix": [2, 9], "x": 9.75, "y": 2}, + {"matrix": [2, 10], "x": 10.75, "y": 2}, + {"matrix": [2, 11], "x": 11.75, "y": 2}, + {"matrix": [2, 13], "x": 12.75, "y": 2, "w": 2.25}, + {"matrix": [2, 15], "x": 15, "y": 2}, + + {"matrix": [3, 0], "x": 0, "y": 3, "w": 2.25}, + {"matrix": [3, 2], "x": 2.25, "y": 3}, + {"matrix": [3, 3], "x": 3.25, "y": 3}, + {"matrix": [3, 4], "x": 4.25, "y": 3}, + {"matrix": [3, 5], "x": 5.25, "y": 3}, + {"matrix": [3, 6], "x": 6.25, "y": 3}, + {"matrix": [3, 7], "x": 7.25, "y": 3}, + {"matrix": [3, 8], "x": 8.25, "y": 3}, + {"matrix": [3, 9], "x": 9.25, "y": 3}, + {"matrix": [3, 10], "x": 10.25, "y": 3}, + {"matrix": [3, 11], "x": 11.25, "y": 3}, + {"matrix": [3, 13], "x": 12.25, "y": 3, "w": 1.75}, + {"matrix": [3, 14], "x": 14, "y": 3}, + {"matrix": [3, 15], "x": 15, "y": 3}, + + {"matrix": [4, 0], "x": 0, "y": 4, "w": 1.25}, + {"matrix": [4, 1], "x": 1.25, "y": 4, "w": 1.25}, + {"matrix": [4, 2], "x": 2.5, "y": 4, "w": 1.25}, + {"matrix": [4, 6], "x": 3.75, "y": 4, "w": 6.25}, + {"matrix": [4, 10], "x": 10, "y": 4}, + {"matrix": [4, 11], "x": 11, "y": 4}, + {"matrix": [4, 12], "x": 12, "y": 4}, + {"matrix": [4, 13], "x": 13, "y": 4}, + {"matrix": [4, 14], "x": 14, "y": 4}, + {"matrix": [4, 15], "x": 15, "y": 4} + ] + } + } + +} diff --git a/keyboards/keychron/k7_max/k7_max.c b/keyboards/keychron/k7_max/k7_max.c new file mode 100644 index 0000000000..51e8c90125 --- /dev/null +++ b/keyboards/keychron/k7_max/k7_max.c @@ -0,0 +1,83 @@ +/* Copyright 2024 @ Keychron (https://www.keychron.com) + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#include "quantum.h" +#include "keychron_task.h" +#ifdef FACTORY_TEST_ENABLE +# include "factory_test.h" +# include "keychron_common.h" +#endif +#ifdef LK_WIRELESS_ENABLE +# include "lkbt51.h" +# include "wireless.h" +# include "transport.h" +# include "keychron_wireless_common.h" +# include "battery.h" +#endif + +#define POWER_ON_LED_DURATION 3000 +static uint32_t power_on_indicator_timer; + + +bool dip_switch_update_kb(uint8_t index, bool active) { + if (index == 0) { + default_layer_set(1UL << (active ? 0 : 1)); + } + dip_switch_update_user(index, active); + + return true; +} + +void keyboard_post_init_kb(void) { +#ifdef LK_WIRELESS_ENABLE + palSetLineMode(P2P4_MODE_SELECT_PIN, PAL_MODE_INPUT); + palSetLineMode(BT_MODE_SELECT_PIN, PAL_MODE_INPUT); + + lkbt51_init(false); + wireless_init(); +#endif + + power_on_indicator_timer = timer_read32(); +#ifdef ENCODER_ENABLE + encoder_cb_init(); +#endif + + keyboard_post_init_user(); +} + +bool keychron_task_kb(void) { + if (power_on_indicator_timer) { + if (timer_elapsed32(power_on_indicator_timer) > POWER_ON_LED_DURATION) { + power_on_indicator_timer = 0; + +#ifdef LK_WIRELESS_ENABLE + writePin(BAT_LOW_LED_PIN, !BAT_LOW_LED_PIN_ON_STATE); +#endif + + } else { +#ifdef LK_WIRELESS_ENABLE + writePin(BAT_LOW_LED_PIN, BAT_LOW_LED_PIN_ON_STATE); +#endif + } + } + return true; +} + +#ifdef LK_WIRELESS_ENABLE +bool lpm_is_kb_idle(void) { + return power_on_indicator_timer == 0 && !factory_reset_indicating(); +} +#endif diff --git a/keyboards/keychron/k7_max/mcuconf.h b/keyboards/keychron/k7_max/mcuconf.h new file mode 100644 index 0000000000..89294ee64b --- /dev/null +++ b/keyboards/keychron/k7_max/mcuconf.h @@ -0,0 +1,37 @@ +/* Copyright 2024 @ 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_next + +#undef STM32_HSECLK +#define STM32_HSECLK 16000000 + +#undef STM32_PLLM_VALUE +#define STM32_PLLM_VALUE 8 + +#undef STM32_PLLN_VALUE +#define STM32_PLLN_VALUE 96 + +#undef STM32_PLLP_VALUE +#define STM32_PLLP_VALUE 4 + +#undef STM32_PLLQ_VALUE +#define STM32_PLLQ_VALUE 4 + +#undef STM32_SPI_USE_SPI1 +#define STM32_SPI_USE_SPI1 TRUE diff --git a/keyboards/keychron/k7_max/readme.md b/keyboards/keychron/k7_max/readme.md new file mode 100644 index 0000000000..e15629f0d9 --- /dev/null +++ b/keyboards/keychron/k7_max/readme.md @@ -0,0 +1,23 @@ +# Keychron K7 Max + +![Keychron K7 Max](https://cdn.shopify.com/s/files/1/0059/0630/1017/t/5/assets/pf-d1ce6496--KeychronK765percentultraslimcompactwirelessmechanicalkeyboardforMacWindowsHotswappablelowprofileGateronMechanicalandOpticalswitchesforMacWindowswithRGBbacklit.jpg?v=1627545535) + +A customizable 65% low profile keyboard. + +* Keyboard Maintainer: [Keychron](https://github.com/keychron) +* Hardware Supported: Keychron K7 Max +* Hardware Availability: [Keychron K7 Max QMK/VIA Wireless Custom Mechanical Keyboard](https://www.keychron.com/products/keychron-k7-ultra-slim-wireless-mechanical-keyboard) + +Make example for this keyboard (after setting up your build environment): + + make keychron/k7_max/ansi/rgb:default + make keychron/k7_max/ansi/white:default + +Flashing example for this keyboard: + + make keychron/k7_max/ansi/rgb:default:flash + make keychron/k7_max/ansi/white:default:flash + +**Reset Key**: Disconnect the USB cable, toggle mode switch to "Cable", hold down the *Esc* key or reset button underneath space bar, then connect the USB cable. + +See the [build environment setup](https://docs.qmk.fm/#/getting_started_build_tools) and the [make instructions](https://docs.qmk.fm/#/getting_started_make_guide) for more information. Brand new to QMK? Start with our [Complete Newbs Guide](https://docs.qmk.fm/#/newbs). diff --git a/keyboards/keychron/k7_max/rules.mk b/keyboards/keychron/k7_max/rules.mk new file mode 100644 index 0000000000..4eaf6820bc --- /dev/null +++ b/keyboards/keychron/k7_max/rules.mk @@ -0,0 +1,4 @@ +include keyboards/keychron/common/wireless/wireless.mk +include keyboards/keychron/common/keychron_common.mk + +VPATH += $(TOP_DIR)/keyboards/keychron diff --git a/keyboards/keychron/k7_max/via_json/k7_max_ansi_rgb_v1.0.json b/keyboards/keychron/k7_max/via_json/k7_max_ansi_rgb_v1.0.json new file mode 100644 index 0000000000..bfcde4d09f --- /dev/null +++ b/keyboards/keychron/k7_max/via_json/k7_max_ansi_rgb_v1.0.json @@ -0,0 +1,240 @@ +{ + "name": "Keychron K7 Max ANSI RGB", + "vendorId": "0x3434", + "productId": "0x0A70", + "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": "Misson Control", "title": "Misson Control in Mac", "shortName": "MCtl"}, + {"name": "Lanuch Pad", "title": "Lanuch Pad in Windows", "shortName": "LPad"}, + {"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": "2.4G", "title": "2.4G", "shortName": "2.4G"}, + {"name": "Battery Level", "title": "Show battery level", "shortName": "Batt"} + ], + "matrix": {"rows": 5, "cols" : 16}, + "layouts": { + "keymap": [ + [ + { + "c": "#777777" + }, + "0, 0", + { + "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", + { + "w": 2, + "c": "#aaaaaa" + }, + "0, 13", + "0, 15" + ], + [ + { + "w": 1.5, + "c": "#aaaaaa" + }, + "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", + { + "w": 1.5, + "c": "#aaaaaa" + }, + "1, 13", + "1, 15" + ], + [ + { + "w": 1.75, + "c": "#aaaaaa" + }, + "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", + { + "w": 2.25, + "c": "#777777" + }, + "2, 13", + { + "c": "#aaaaaa" + }, + "2, 15" + ], + [ + { + "w": 2.25, + "c": "#aaaaaa" + }, + "3, 0", + { + "c": "#cccccc" + }, + "3, 2", + "3, 3", + "3, 4", + "3, 5", + "3, 6", + "3, 7", + "3, 8", + "3, 9", + "3, 10", + "3, 11", + { + "w": 1.75, + "c": "#aaaaaa" + }, + "3, 13", + { + "c": "#cccccc" + }, + "3, 14", + { + "c": "#aaaaaa" + }, + "3, 15" + ], + [ + { + "w": 1.25, + "c": "#aaaaaa" + }, + "4, 0", + { + "w": 1.25 + }, + "4, 1", + { + "w": 1.25 + }, + "4, 2", + { + "w": 6.25, + "c": "#cccccc" + }, + "4, 6", + { + "c": "#aaaaaa" + }, + "4, 10", + "4, 11", + "4, 12", + { + "c": "#cccccc" + }, + "4, 13", + "4, 14", + "4, 15" + ] + ] + } +} diff --git a/keyboards/keychron/k7_max/via_json/k7_max_ansi_white_v1.0.json b/keyboards/keychron/k7_max/via_json/k7_max_ansi_white_v1.0.json new file mode 100644 index 0000000000..70de6397ba --- /dev/null +++ b/keyboards/keychron/k7_max/via_json/k7_max_ansi_white_v1.0.json @@ -0,0 +1,179 @@ +{ + "name": "Keychron K7 Max White ANSI", + "vendorId": "0x3434", + "productId": "0x0A73", + "keycodes": ["qmk_lighting"], + "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": "Misson Control", "title": "Misson Control in Mac", "shortName": "MCtl"}, + {"name": "Lanuch Pad", "title": "Lanuch Pad in Windows", "shortName": "LPad"}, + {"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": "2.4G", "title": "2.4G", "shortName": "2.4G"}, + {"name": "Battery Level", "title": "Show battery level", "shortName": "Batt"} + ], + "matrix": {"rows": 5, "cols" : 16}, + "layouts": { + "keymap": [ + [ + { + "c": "#777777" + }, + "0, 0", + { + "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", + { + "w": 2, + "c": "#aaaaaa" + }, + "0, 13", + "0, 15" + ], + [ + { + "w": 1.5, + "c": "#aaaaaa" + }, + "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", + { + "w": 1.5, + "c": "#aaaaaa" + }, + "1, 13", + "1, 15" + ], + [ + { + "w": 1.75, + "c": "#aaaaaa" + }, + "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", + { + "w": 2.25, + "c": "#777777" + }, + "2, 13", + { + "c": "#aaaaaa" + }, + "2, 15" + ], + [ + { + "w": 2.25, + "c": "#aaaaaa" + }, + "3, 0", + { + "c": "#cccccc" + }, + "3, 2", + "3, 3", + "3, 4", + "3, 5", + "3, 6", + "3, 7", + "3, 8", + "3, 9", + "3, 10", + "3, 11", + { + "w": 1.75, + "c": "#aaaaaa" + }, + "3, 13", + { + "c": "#cccccc" + }, + "3, 14", + { + "c": "#aaaaaa" + }, + "3, 15" + ], + [ + { + "w": 1.25, + "c": "#aaaaaa" + }, + "4, 0", + { + "w": 1.25 + }, + "4, 1", + { + "w": 1.25 + }, + "4, 2", + { + "w": 6.25, + "c": "#cccccc" + }, + "4, 6", + { + "c": "#aaaaaa" + }, + "4, 10", + "4, 11", + "4, 12", + { + "c": "#cccccc" + }, + "4, 13", + "4, 14", + "4, 15" + ] + ] + } + } diff --git a/keyboards/keychron/k7_max/via_json/k7_max_iso_rgb_v1.0.json b/keyboards/keychron/k7_max/via_json/k7_max_iso_rgb_v1.0.json new file mode 100644 index 0000000000..6e1158c6a4 --- /dev/null +++ b/keyboards/keychron/k7_max/via_json/k7_max_iso_rgb_v1.0.json @@ -0,0 +1,279 @@ +{ + "name": "Keychron K3 Max ISO RGB", + "vendorId": "0x3434", + "productId": "0x0A31", + "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": "Misson Control", "title": "Misson Control in Mac", "shortName": "MCtl"}, + {"name": "Lanuch Pad", "title": "Lanuch Pad in Windows", "shortName": "LPad"}, + {"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": "2.4G", "title": "2.4G", "shortName": "2.4G"}, + {"name": "Battery Level", "title": "Show battery level", "shortName": "Batt"} + ], + "matrix": {"rows": 6, "cols" : 16}, + "layouts": { + "keymap": [ + [ + { + "c": "#777777" + }, + "0, 0", + { + "c": "#cccccc" + }, + "0, 1", + "0, 2", + "0, 3", + "0, 4", + { + "c": "#aaaaaa" + }, + "0, 5", + "0, 6", + "0, 7", + "0, 8", + "0, 9", + { + "c": "#cccccc" + }, + "0, 10", + "0, 11", + "0, 12", + { + "c": "#aaaaaa" + }, + "0, 13", + "0, 14", + "0, 15" + ], + [ + { + "c": "#aaaaaa" + }, + "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", + { + "w": 2, + "c": "#aaaaaa" + }, + "1, 13", + "1, 15" + ], + [ + { + "w": 1.5, + "c": "#aaaaaa" + }, + "2, 0", + { + "c": "#cccccc" + }, + "2, 1", + "2, 2", + "2, 3", + "2, 4", + "2, 5", + "2, 6", + "2, 7", + "2, 8", + "2, 9", + "2, 10", + "2, 11", + "2, 12", + { + "x": 0.25, + "w": 1.25, + "h": 2, + "x2": -0.25, + "w2": 1.5, + "h2": 1, + "c": "#777777" + }, + "2, 13", + { + "c": "#aaaaaa" + }, + "2, 15" + ], + [ + { + "w": 1.75, + "c": "#aaaaaa" + }, + "3, 0", + { + "c": "#cccccc" + }, + "3, 1", + "3, 2", + "3, 3", + "3, 4", + "3, 5", + "3, 6", + "3, 7", + "3, 8", + "3, 9", + "3, 10", + "3, 11", + "3, 13", + { + "x": 1.25, + "c": "#aaaaaa" + }, + "3, 15" + ], + [ + { + "w": 1.25, + "c": "#aaaaaa" + }, + "4, 0", + { + "c": "#cccccc" + }, + "4, 1", + "4, 2", + "4, 3", + "4, 4", + "4, 5", + "4, 6", + "4, 7", + "4, 8", + "4, 9", + "4, 10", + "4, 11", + { + "w": 1.75, + "c": "#aaaaaa" + }, + "4, 13", + { + "c": "#cccccc" + }, + "4, 14", + { + "c": "#aaaaaa" + }, + "4, 15" + ], + [ + { + "w": 1.25, + "c": "#aaaaaa" + }, + "5, 0", + { + "w": 1.25 + }, + "5, 1", + { + "w": 1.25 + }, + "5, 2", + { + "w": 6.25, + "c": "#cccccc" + }, + "5, 6", + { + "c": "#aaaaaa" + }, + "5, 10", + "5, 11", + "5, 12", + { + "c": "#cccccc" + }, + "5, 13", + "5, 14", + "5, 15" + ] + ] + } +} diff --git a/keyboards/keychron/k7_max/via_json/k7_max_iso_white_v1.0.json b/keyboards/keychron/k7_max/via_json/k7_max_iso_white_v1.0.json new file mode 100644 index 0000000000..5bdfbb24b7 --- /dev/null +++ b/keyboards/keychron/k7_max/via_json/k7_max_iso_white_v1.0.json @@ -0,0 +1,218 @@ +{ + "name": "Keychron K3 Max ISO White", + "vendorId": "0x3434", + "productId": "0x0A34", + "keycodes": ["qmk_lighting"], + "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": "Misson Control", "title": "Misson Control in Mac", "shortName": "MCtl"}, + {"name": "Lanuch Pad", "title": "Lanuch Pad in Windows", "shortName": "LPad"}, + {"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": "2.4G", "title": "2.4G", "shortName": "2.4G"}, + {"name": "Battery Level", "title": "Show battery level", "shortName": "Batt"} + ], + "matrix": {"rows": 6, "cols" : 16}, + "layouts": { + "keymap": [ + [ + { + "c": "#777777" + }, + "0, 0", + { + "c": "#cccccc" + }, + "0, 1", + "0, 2", + "0, 3", + "0, 4", + { + "c": "#aaaaaa" + }, + "0, 5", + "0, 6", + "0, 7", + "0, 8", + "0, 9", + { + "c": "#cccccc" + }, + "0, 10", + "0, 11", + "0, 12", + { + "c": "#aaaaaa" + }, + "0, 13", + "0, 14", + "0, 15" + ], + [ + { + "c": "#aaaaaa" + }, + "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", + { + "w": 2, + "c": "#aaaaaa" + }, + "1, 13", + "1, 15" + ], + [ + { + "w": 1.5, + "c": "#aaaaaa" + }, + "2, 0", + { + "c": "#cccccc" + }, + "2, 1", + "2, 2", + "2, 3", + "2, 4", + "2, 5", + "2, 6", + "2, 7", + "2, 8", + "2, 9", + "2, 10", + "2, 11", + "2, 12", + { + "x": 0.25, + "w": 1.25, + "h": 2, + "x2": -0.25, + "w2": 1.5, + "h2": 1, + "c": "#777777" + }, + "2, 13", + { + "c": "#aaaaaa" + }, + "2, 15" + ], + [ + { + "w": 1.75, + "c": "#aaaaaa" + }, + "3, 0", + { + "c": "#cccccc" + }, + "3, 1", + "3, 2", + "3, 3", + "3, 4", + "3, 5", + "3, 6", + "3, 7", + "3, 8", + "3, 9", + "3, 10", + "3, 11", + "3, 13", + { + "x": 1.25, + "c": "#aaaaaa" + }, + "3, 15" + ], + [ + { + "w": 1.25, + "c": "#aaaaaa" + }, + "4, 0", + { + "c": "#cccccc" + }, + "4, 1", + "4, 2", + "4, 3", + "4, 4", + "4, 5", + "4, 6", + "4, 7", + "4, 8", + "4, 9", + "4, 10", + "4, 11", + { + "w": 1.75, + "c": "#aaaaaa" + }, + "4, 13", + { + "c": "#cccccc" + }, + "4, 14", + { + "c": "#aaaaaa" + }, + "4, 15" + ], + [ + { + "w": 1.25, + "c": "#aaaaaa" + }, + "5, 0", + { + "w": 1.25 + }, + "5, 1", + { + "w": 1.25 + }, + "5, 2", + { + "w": 6.25, + "c": "#cccccc" + }, + "5, 6", + { + "c": "#aaaaaa" + }, + "5, 10", + "5, 11", + "5, 12", + { + "c": "#cccccc" + }, + "5, 13", + "5, 14", + "5, 15" + ] + ] + } +} diff --git a/keyboards/keychron/k7_max/via_json/k7_max_jis_rgb_v1.0.json b/keyboards/keychron/k7_max/via_json/k7_max_jis_rgb_v1.0.json new file mode 100644 index 0000000000..8598a7447f --- /dev/null +++ b/keyboards/keychron/k7_max/via_json/k7_max_jis_rgb_v1.0.json @@ -0,0 +1,267 @@ +{ + "name": "Keychron K3 Max JIS RGB", + "vendorId": "0x3434", + "productId": "0x0A32", + "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": "Misson Control", "title": "Misson Control in Mac", "shortName": "MCtl"}, + {"name": "Lanuch Pad", "title": "Lanuch Pad in Windows", "shortName": "LPad"}, + {"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": "2.4G", "title": "2.4G", "shortName": "2.4G"}, + {"name": "Battery Level", "title": "Show battery level", "shortName": "Batt"} + ], + "matrix": {"rows": 6, "cols" : 16}, + "layouts": { + "keymap": [ + [ + { + "c": "#777777" + }, + "0, 0", + { + "c": "#cccccc" + }, + "0, 1", + "0, 2", + "0, 3", + "0, 4", + { + "c": "#aaaaaa" + }, + "0, 5", + "0, 6", + "0, 7", + "0, 8", + "0, 9", + { + "c": "#cccccc" + }, + "0, 10", + "0, 11", + "0, 12", + { + "c": "#aaaaaa" + }, + "0, 13", + "0, 14", + "0, 15" + ], + [ + { + "c": "#aaaaaa" + }, + "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", + "1, 13", + "1, 14", + { + "c": "#aaaaaa" + }, + "1, 15" + ], + [ + { + "w": 1.5, + "c": "#aaaaaa" + }, + "2, 0", + { + "c": "#cccccc" + }, + "2, 1", + "2, 2", + "2, 3", + "2, 4", + "2, 5", + "2, 6", + "2, 7", + "2, 8", + "2, 9", + "2, 10", + "2, 11", + "2, 12", + { + "x": 0.25, + "w": 1.25, + "h": 2, + "x2": -0.25, + "w2": 1.5, + "h2": 1, + "c": "#777777" + }, + "2, 13", + { + "c": "#aaaaaa" + }, + "2, 15" + ], + [ + { + "w": 1.75, + "c": "#aaaaaa" + }, + "3, 0", + { + "c": "#cccccc" + }, + "3, 1", + "3, 2", + "3, 3", + "3, 4", + "3, 5", + "3, 6", + "3, 7", + "3, 8", + "3, 9", + "3, 10", + "3, 11", + "3, 13", + { + "x": 1.25, + "c": "#aaaaaa" + }, + "3, 15" + ], + [ + { + "w": 2.25, + "c": "#aaaaaa" + }, + "4, 0", + { + "c": "#cccccc" + }, + "4, 2", + "4, 3", + "4, 4", + "4, 5", + "4, 6", + "4, 7", + "4, 8", + "4, 9", + "4, 10", + "4, 11", + "4, 13", + { + "w": 1.75, + "c": "#aaaaaa" + }, + "4, 14", + "4, 15" + ], + [ + { + "c": "#aaaaaa" + }, + "5, 0", + "5, 1", + "5, 2", + "5, 3", + { + "w": 5, + "c": "#cccccc" + }, + "5, 6", + { + "c": "#aaaaaa" + }, + "5, 9", + "5, 10", + "5, 11", + { + "c": "#cccccc" + }, + "5, 12", + "5, 13", + "5, 14", + "5, 15" + ] + ] + } +} diff --git a/keyboards/keychron/k7_max/via_json/k7_max_jis_white_v1.0.json b/keyboards/keychron/k7_max/via_json/k7_max_jis_white_v1.0.json new file mode 100644 index 0000000000..47e3a6e7b6 --- /dev/null +++ b/keyboards/keychron/k7_max/via_json/k7_max_jis_white_v1.0.json @@ -0,0 +1,205 @@ +{ + "name": "Keychron K3 Max White JIS", + "vendorId": "0x3434", + "productId": "0x0A35", + "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": "Misson Control", "title": "Misson Control in Mac", "shortName": "MCtl"}, + {"name": "Lanuch Pad", "title": "Lanuch Pad in Windows", "shortName": "LPad"}, + {"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": "2.4G", "title": "2.4G", "shortName": "2.4G"}, + {"name": "Battery Level", "title": "Show battery level", "shortName": "Batt"} + ], + "matrix": {"rows": 6, "cols" : 16}, + "layouts": { + "keymap": [ + [ + { + "c": "#777777" + }, + "0, 0", + { + "c": "#cccccc" + }, + "0, 1", + "0, 2", + "0, 3", + "0, 4", + { + "c": "#aaaaaa" + }, + "0, 5", + "0, 6", + "0, 7", + "0, 8", + "0, 9", + { + "c": "#cccccc" + }, + "0, 10", + "0, 11", + "0, 12", + { + "c": "#aaaaaa" + }, + "0, 13", + "0, 14", + "0, 15" + ], + [ + { + "c": "#aaaaaa" + }, + "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", + "1, 13", + "1, 14", + { + "c": "#aaaaaa" + }, + "1, 15" + ], + [ + { + "w": 1.5, + "c": "#aaaaaa" + }, + "2, 0", + { + "c": "#cccccc" + }, + "2, 1", + "2, 2", + "2, 3", + "2, 4", + "2, 5", + "2, 6", + "2, 7", + "2, 8", + "2, 9", + "2, 10", + "2, 11", + "2, 12", + { + "x": 0.25, + "w": 1.25, + "h": 2, + "x2": -0.25, + "w2": 1.5, + "h2": 1, + "c": "#777777" + }, + "2, 13", + { + "c": "#aaaaaa" + }, + "2, 15" + ], + [ + { + "w": 1.75, + "c": "#aaaaaa" + }, + "3, 0", + { + "c": "#cccccc" + }, + "3, 1", + "3, 2", + "3, 3", + "3, 4", + "3, 5", + "3, 6", + "3, 7", + "3, 8", + "3, 9", + "3, 10", + "3, 11", + "3, 13", + { + "x": 1.25, + "c": "#aaaaaa" + }, + "3, 15" + ], + [ + { + "w": 2.25, + "c": "#aaaaaa" + }, + "4, 0", + { + "c": "#cccccc" + }, + "4, 2", + "4, 3", + "4, 4", + "4, 5", + "4, 6", + "4, 7", + "4, 8", + "4, 9", + "4, 10", + "4, 11", + "4, 13", + { + "w": 1.75, + "c": "#aaaaaa" + }, + "4, 14", + "4, 15" + ], + [ + { + "c": "#aaaaaa" + }, + "5, 0", + "5, 1", + "5, 2", + "5, 3", + { + "w": 5, + "c": "#cccccc" + }, + "5, 6", + { + "c": "#aaaaaa" + }, + "5, 9", + "5, 10", + "5, 11", + { + "c": "#cccccc" + }, + "5, 12", + "5, 13", + "5, 14", + "5, 15" + ] + ] + } +} diff --git a/keyboards/keychron/q2_max/ansi_encoder/keymaps/via/keymap.c b/keyboards/keychron/q2_max/ansi_encoder/keymaps/via/keymap.c index f4efaa9738..286aaa1cc9 100644 --- a/keyboards/keychron/q2_max/ansi_encoder/keymaps/via/keymap.c +++ b/keyboards/keychron/q2_max/ansi_encoder/keymaps/via/keymap.c @@ -69,7 +69,7 @@ const uint16_t PROGMEM encoder_map[][NUM_ENCODERS][2] = { [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(_______, _______)} + [FN2] = { ENCODER_CCW_CW(_______, _______)}, }; #endif // ENCODER_MAP_ENABLE diff --git a/keyboards/keychron/q3_max/q3_max.c b/keyboards/keychron/q3_max/q3_max.c index 55e65e0357..5ba6224b6f 100644 --- a/keyboards/keychron/q3_max/q3_max.c +++ b/keyboards/keychron/q3_max/q3_max.c @@ -30,10 +30,6 @@ #define POWER_ON_LED_DURATION 3000 static uint32_t power_on_indicator_timer; -#ifdef KEYCHRON_CALLBACK_ENABLE -bool keychron_task_kb(void); -#endif - #ifdef DIP_SWITCH_ENABLE bool dip_switch_update_kb(uint8_t index, bool active) { if (index == 0) { @@ -59,11 +55,6 @@ void keyboard_post_init_kb(void) { encoder_cb_init(); #endif -#ifdef KEYCHRON_CALLBACK_ENABLE - factory_test_init(); - register_record_process(process_record_keychron_kb, false); - register_keychron_task(keychron_task_kb, false); -#endif keyboard_post_init_user(); } @@ -84,6 +75,7 @@ bool keychron_task_kb(void) { } return true; } + #ifdef LK_WIRELESS_ENABLE bool lpm_is_kb_idle(void) { return power_on_indicator_timer == 0 && !factory_reset_indicating(); diff --git a/keyboards/keychron/q5_max/ansi_encoder/ansi_encoder.c b/keyboards/keychron/q5_max/ansi_encoder/ansi_encoder.c new file mode 100644 index 0000000000..43ffdf6040 --- /dev/null +++ b/keyboards/keychron/q5_max/ansi_encoder/ansi_encoder.c @@ -0,0 +1,168 @@ +/* Copyright 2024 @ Keychron (https://www.keychron.com) + * + * This program is free software : you can redistribute it and /or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program.If not, see < http://www.gnu.org/licenses/>. + */ + +#include "quantum.h" + +// clang-format off + +#ifdef RGB_MATRIX_ENABLE +const snled27351_led_t g_snled27351_leds[RGB_MATRIX_LED_COUNT] = { +/* Refer to SNLED27351 manual for these locations + * driver + * | R location + * | | G location + * | | | B location + * | | | | */ + {0, G_15, I_15, H_15}, + {0, G_14, I_14, H_14}, + {0, G_13, I_13, H_13}, + {0, G_12, I_12, H_12}, + {0, G_11, I_11, H_11}, + {0, G_10, I_10, H_10}, + {0, G_9, I_9, H_9}, + {0, G_8, I_8, H_8}, + {0, G_7, I_7, H_7}, + {0, G_6, I_6, H_6}, + {0, G_5, I_5, H_5}, + {0, G_4, I_4, H_4}, + {0, G_3, I_3, H_3}, + {0, G_2, I_2, H_2}, + {0, D_4, F_4, E_4}, + {0, D_3, F_3, E_3}, + {0, D_2, F_2, E_2}, + + {0, A_15, C_15, B_15}, + {0, A_14, C_14, B_14}, + {0, A_13, C_13, B_13}, + {0, A_12, C_12, B_12}, + {0, A_11, C_11, B_11}, + {0, A_10, C_10, B_10}, + {0, A_9, C_9, B_9}, + {0, A_8, C_8, B_8}, + {0, A_7, C_7, B_7}, + {0, A_6, C_6, B_6}, + {0, A_5, C_5, B_5}, + {0, A_4, C_4, B_4}, + {0, A_3, C_3, B_3}, + {0, A_2, C_2, B_2}, + {0, A_1, C_1, B_1}, + {0, D_8, F_8, E_8}, + {0, D_7, F_7, E_7}, + {0, D_6, F_6, E_6}, + {0, D_5, F_5, E_5}, + + {0, J_15, L_15, K_15}, + {0, J_14, L_14, K_14}, + {0, J_13, L_13, K_13}, + {0, J_12, L_12, K_12}, + {0, J_11, L_11, K_11}, + {0, J_10, L_10, K_10}, + {0, J_9, L_9, K_9}, + {0, J_8, L_8, K_8}, + {0, J_7, L_7, K_7}, + {0, J_6, L_6, K_6}, + {0, J_5, L_5, K_5}, + {0, J_4, L_4, K_4}, + {0, J_3, L_3, K_3}, + {0, J_2, L_2, K_2}, + {0, J_1, L_1, K_1}, + {0, D_12, F_12, E_12}, + {0, D_11, F_11, E_11}, + {0, D_10, F_10, E_10}, + {0, D_9, F_9, E_9}, + + {1, A_15, C_15, B_15}, + {1, A_14, C_14, B_14}, + {1, A_13, C_13, B_13}, + {1, A_12, C_12, B_12}, + {1, A_11, C_11, B_11}, + {1, A_10, C_10, B_10}, + {1, A_9, C_9, B_9}, + {1, A_8, C_8, B_8}, + {1, A_7, C_7, B_7}, + {1, A_6, C_6, B_6}, + {1, A_5, C_5, B_5}, + {1, A_4, C_4, B_4}, + {1, A_3, C_3, B_3}, + {1, A_2, C_2, B_2}, + {1, J_9, L_9, K_9}, + {1, J_8, L_8, K_8}, + {1, J_7, L_7, K_7}, + + {1, G_15, I_15, H_15}, + {1, G_13, I_13, H_13}, + {1, G_12, I_12, H_12}, + {1, G_11, I_11, H_11}, + {1, G_10, I_10, H_10}, + {1, G_9, I_9, H_9}, + {1, G_8, I_8, H_8}, + {1, G_7, I_7, H_7}, + {1, G_6, I_6, H_6}, + {1, G_5, I_5, H_5}, + {1, G_4, I_4, H_4}, + {1, G_3, I_3, H_3}, + {1, G_2, I_2, H_2}, + {1, J_6, L_6, K_6}, + {1, J_5, L_5, K_5}, + {1, J_4, L_4, K_4}, + {1, J_3, L_3, K_3}, + + {1, D_15, F_15, E_15}, + {1, D_14, F_14, E_14}, + {1, D_13, F_13, E_13}, + {1, D_9, F_9, E_9}, + {1, D_6, F_6, E_6}, + {1, D_5, F_5, E_5}, + {1, D_4, F_4, E_4}, + {1, D_3, F_3, E_3}, + {1, D_2, F_2, E_2}, + {1, D_1, F_1, E_1}, + {1, J_2, L_2, K_2}, + {1, J_1, L_1, K_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, 67, 68, __, 69, 70, 71, __ }, + { 72, __, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, __, 85, 86, 87, 88 }, + { 89, 90, 91, __, __, __, 92, __, __, 93, 94, 95, 96, 97, 98, __, 99, 100, __ }, + }, + { + // LED Index to Physical Position + {0, 0}, {23, 0}, {34, 0}, {46, 0}, {57, 0}, {75, 0}, {86, 0}, {98, 0}, {109, 0}, {127, 0}, {138, 0}, {150, 0}, {161, 0}, {175, 0}, {189, 0}, {201, 0}, {212, 0}, + {0,15}, {12,15}, {23,15}, {35,15}, {46,15}, {58,15}, {69,15}, {81,15}, { 92,15}, {104,15}, {115,15}, {127,15}, {138,15}, {155,15}, {175,15}, {189,15}, {201,15}, {212,15}, {224,15}, + {3,26}, {17,26}, {29,26}, {40,26}, {52,26}, {63,26}, {75,26}, {86,26}, { 98,26}, {109,26}, {121,26}, {132,26}, {144,26}, {158,26}, {175,26}, {189,26}, {201,26}, {212,26}, {224,32}, + {4,38}, {20,38}, {32,38}, {43,38}, {55,38}, {66,38}, {78,38}, {89,38}, {101,38}, {112,38}, {124,38}, {135,38}, {154,38}, {175,38}, {189,38}, {201,38}, {212,38}, + {7,50}, {26,50}, {37,50}, {49,50}, {60,50}, {72,50}, {83,50}, { 95,50}, {106,50}, {118,50}, {129,50}, {145,50}, {164,52}, {189,50}, {201,50}, {212,50}, {224,55}, + {1,61}, {16,61}, {30,61}, {73,61}, {115,61}, {126,61}, {138,61}, {152,64}, {164,64}, {175,64}, {195,61}, {212,61}, + }, + { + // RGB LED Index to Flag + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + } +}; +#endif diff --git a/keyboards/keychron/q5_max/ansi_encoder/config.h b/keyboards/keychron/q5_max/ansi_encoder/config.h new file mode 100644 index 0000000000..7625b9401e --- /dev/null +++ b/keyboards/keychron/q5_max/ansi_encoder/config.h @@ -0,0 +1,54 @@ +/* Copyright 2024 @ Keychron (https://www.keychron.com) + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#pragma once + +#ifdef RGB_MATRIX_ENABLE +/* RGB Matrix driver configuration */ +# define DRIVER_COUNT 2 +# define RGB_MATRIX_LED_COUNT 101 + +# define SPI_SCK_PIN A5 +# define SPI_MISO_PIN A6 +# define SPI_MOSI_PIN A7 + +# define DRIVER_CS_PINS \ + { B8, B9 } +# define SNLED23751_SPI_DIVISOR 16 +# define SPI_DRIVER SPID1 + +/* Set LED driver current */ +# define SNLED27351_CURRENT_TUNE \ + { 0x2C, 0x2C, 0x2C, 0x2C, 0x2C, 0x2C, 0x2C, 0x2C, 0x2C, 0x2C, 0x2C, 0x2C } + +/* Set to infinit, which is use in USB mode by default */ +# define RGB_MATRIX_TIMEOUT RGB_MATRIX_TIMEOUT_INFINITE + +/* Allow shutdown of led driver to save power */ +# define RGB_MATRIX_DRIVER_SHUTDOWN_ENABLE +/* Turn off backlight on low brightness to save power */ +# define RGB_MATRIX_BRIGHTNESS_TURN_OFF_VAL 32 + +/* Indications */ +# define NUM_LOCK_INDEX 32 +# define CAPS_LOCK_INDEX 55 +# define LOW_BAT_IND_INDEX \ + { 92 } + +# define RGB_MATRIX_KEYPRESSES +# define RGB_MATRIX_FRAMEBUFFER_EFFECTS + +#endif diff --git a/keyboards/keychron/q5_max/ansi_encoder/info.json b/keyboards/keychron/q5_max/ansi_encoder/info.json new file mode 100644 index 0000000000..a206fdef1a --- /dev/null +++ b/keyboards/keychron/q5_max/ansi_encoder/info.json @@ -0,0 +1,119 @@ +{ + "usb": { + "pid": "0x0850", + "device_version": "1.0.0" + }, + "layouts": { + "LAYOUT_ansi_101": { + "layout": [ + {"matrix": [0, 0], "x": 0, "y": 0}, + {"matrix": [0, 1], "x": 2, "y": 0}, + {"matrix": [0, 2], "x": 3, "y": 0}, + {"matrix": [0, 3], "x": 4, "y": 0}, + {"matrix": [0, 4], "x": 5, "y": 0}, + {"matrix": [0, 5], "x": 6.5, "y": 0}, + {"matrix": [0, 6], "x": 7.5, "y": 0}, + {"matrix": [0, 7], "x": 8.5, "y": 0}, + {"matrix": [0, 8], "x": 9.5, "y": 0}, + {"matrix": [0, 9], "x": 11, "y": 0}, + {"matrix": [0, 10], "x": 12, "y": 0}, + {"matrix": [0, 11], "x": 13, "y": 0}, + {"matrix": [0, 12], "x": 14, "y": 0}, + {"matrix": [0, 13], "x": 15.25, "y": 0}, + {"matrix": [0, 15], "x": 16.5, "y": 0}, + {"matrix": [0, 16], "x": 17.5, "y": 0}, + {"matrix": [0, 17], "x": 18.5, "y": 0}, + {"matrix": [0, 18], "x": 19.5, "y": 0}, + + {"matrix": [1, 0], "x": 0, "y": 1.25}, + {"matrix": [1, 1], "x": 1, "y": 1.25}, + {"matrix": [1, 2], "x": 2, "y": 1.25}, + {"matrix": [1, 3], "x": 3, "y": 1.25}, + {"matrix": [1, 4], "x": 4, "y": 1.25}, + {"matrix": [1, 5], "x": 5, "y": 1.25}, + {"matrix": [1, 6], "x": 6, "y": 1.25}, + {"matrix": [1, 7], "x": 7, "y": 1.25}, + {"matrix": [1, 8], "x": 8, "y": 1.25}, + {"matrix": [1, 9], "x": 9, "y": 1.25}, + {"matrix": [1, 10], "x": 10, "y": 1.25}, + {"matrix": [1, 11], "x": 11, "y": 1.25}, + {"matrix": [1, 12], "x": 12, "y": 1.25}, + {"matrix": [1, 13], "x": 13, "y": 1.25, "w": 2}, + {"matrix": [1, 14], "x": 15.25, "y": 1.25}, + {"matrix": [1, 15], "x": 16.5, "y": 1.25}, + {"matrix": [1, 16], "x": 17.5, "y": 1.25}, + {"matrix": [1, 17], "x": 18.5, "y": 1.25}, + {"matrix": [1, 18], "x": 19.5, "y": 1.25}, + + {"matrix": [2, 0], "x": 0, "y": 2.25, "w": 1.5}, + {"matrix": [2, 1], "x": 1.5, "y": 2.25}, + {"matrix": [2, 2], "x": 2.5, "y": 2.25}, + {"matrix": [2, 3], "x": 3.5, "y": 2.25}, + {"matrix": [2, 4], "x": 4.5, "y": 2.25}, + {"matrix": [2, 5], "x": 5.5, "y": 2.25}, + {"matrix": [2, 6], "x": 6.5, "y": 2.25}, + {"matrix": [2, 7], "x": 7.5, "y": 2.25}, + {"matrix": [2, 8], "x": 8.5, "y": 2.25}, + {"matrix": [2, 9], "x": 9.5, "y": 2.25}, + {"matrix": [2, 10], "x": 10.5, "y": 2.25}, + {"matrix": [2, 11], "x": 11.5, "y": 2.25}, + {"matrix": [2, 12], "x": 12.5, "y": 2.25}, + {"matrix": [2, 13], "x": 13.5, "y": 2.25, "w": 1.5}, + {"matrix": [2, 14], "x": 15.25, "y": 2.25}, + {"matrix": [2, 15], "x": 16.5, "y": 2.25}, + {"matrix": [2, 16], "x": 17.5, "y": 2.25}, + {"matrix": [2, 17], "x": 18.5, "y": 2.25}, + + {"matrix": [3, 0], "x": 0, "y": 3.25, "w": 1.75}, + {"matrix": [3, 1], "x": 1.75, "y": 3.25}, + {"matrix": [3, 2], "x": 2.75, "y": 3.25}, + {"matrix": [3, 3], "x": 3.75, "y": 3.25}, + {"matrix": [3, 4], "x": 4.75, "y": 3.25}, + {"matrix": [3, 5], "x": 5.75, "y": 3.25}, + {"matrix": [3, 6], "x": 6.75, "y": 3.25}, + {"matrix": [3, 7], "x": 7.75, "y": 3.25}, + {"matrix": [3, 8], "x": 8.75, "y": 3.25}, + {"matrix": [3, 9], "x": 9.75, "y": 3.25}, + {"matrix": [3, 10], "x": 10.75, "y": 3.25}, + {"matrix": [3, 11], "x": 11.75, "y": 3.25}, + {"matrix": [3, 12], "x": 12.75, "y": 3.25, "w": 2.25}, + {"matrix": [3, 13], "x": 15.25, "y": 3.25}, + {"matrix": [3, 15], "x": 16.5, "y": 3.25}, + {"matrix": [3, 16], "x": 17.5, "y": 3.25}, + {"matrix": [3, 17], "x": 18.5, "y": 3.25}, + {"matrix": [2, 18], "x": 19.5, "y": 2.25, "h": 2}, + + {"matrix": [4, 0], "x": 0, "y": 4.25, "w": 2.25}, + {"matrix": [4, 2], "x": 2.25, "y": 4.25}, + {"matrix": [4, 3], "x": 3.25, "y": 4.25}, + {"matrix": [4, 4], "x": 4.25, "y": 4.25}, + {"matrix": [4, 5], "x": 5.25, "y": 4.25}, + {"matrix": [4, 6], "x": 6.25, "y": 4.25}, + {"matrix": [4, 7], "x": 7.25, "y": 4.25}, + {"matrix": [4, 8], "x": 8.25, "y": 4.25}, + {"matrix": [4, 9], "x": 9.25, "y": 4.25}, + {"matrix": [4, 10], "x": 10.25, "y": 4.25}, + {"matrix": [4, 11], "x": 11.25, "y": 4.25}, + {"matrix": [4, 12], "x": 12.25, "y": 4.25, "w": 1.75}, + {"matrix": [4, 13], "x": 14.25, "y": 4.5}, + {"matrix": [4, 15], "x": 16.5, "y": 4.25}, + {"matrix": [4, 16], "x": 17.5, "y": 4.25}, + {"matrix": [4, 17], "x": 18.5, "y": 4.25}, + + {"matrix": [5, 0], "x": 0, "y": 5.25, "w": 1.25}, + {"matrix": [5, 1], "x": 1.25, "y": 5.25, "w": 1.25}, + {"matrix": [5, 2], "x": 2.5, "y": 5.25, "w": 1.25}, + {"matrix": [5, 6], "x": 3.75, "y": 5.25, "w": 6.25}, + {"matrix": [5, 9], "x": 10, "y": 5.25}, + {"matrix": [5, 10], "x": 11, "y": 5.25}, + {"matrix": [5, 11], "x": 12, "y": 5.25}, + {"matrix": [5, 12], "x": 13.25, "y": 5.5}, + {"matrix": [5, 13], "x": 14.25, "y": 5.5}, + {"matrix": [5, 14], "x": 15.25, "y": 5.5}, + {"matrix": [5, 16], "x": 16.5, "y": 5.25, "w": 2}, + {"matrix": [5, 17], "x": 18.5, "y": 5.25}, + {"matrix": [4, 18], "x": 19.5, "y": 4.25, "h": 2} + ] + } + } +} diff --git a/keyboards/keychron/q5_max/ansi_encoder/keymaps/default/keymap.c b/keyboards/keychron/q5_max/ansi_encoder/keymaps/default/keymap.c new file mode 100644 index 0000000000..25436a14e0 --- /dev/null +++ b/keyboards/keychron/q5_max/ansi_encoder/keymaps/default/keymap.c @@ -0,0 +1,74 @@ +/* Copyright 2024 @ Keychron (https://www.keychron.com) + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#include QMK_KEYBOARD_H +#include "keychron_common.h" + +enum layers { + MAC_BASE, + MAC_FN, + WIN_BASE, + WIN_FN, +}; + +// clang-format off +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + [MAC_BASE] = LAYOUT_ansi_101( + KC_ESC, KC_BRID, KC_BRIU, KC_MCTRL, KC_LNPAD, RGB_VAD, RGB_VAI, KC_MPRV, KC_MPLY, KC_MNXT, KC_MUTE, KC_VOLD, KC_VOLU, KC_DEL, KC_F13, KC_F14 , KC_F15, KC_MUTE, + 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_NUM, KC_PSLS, KC_PAST, KC_PMNS, + 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_P7, KC_P8, KC_P9, + 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_P4, KC_P5, KC_P6, KC_PPLS, + 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_P1, KC_P2, KC_P3, + KC_LCTL, KC_LOPTN, KC_LCMMD, KC_SPC, KC_RCMMD, MO(MAC_FN), KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT, KC_P0, KC_PDOT, KC_PENT), + [MAC_FN] = LAYOUT_ansi_101( + _______, 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, + _______, BT_HST1, BT_HST2, BT_HST3, P2P4G, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + RGB_TOG, RGB_MOD, RGB_VAI, RGB_HUI, RGB_SAI, RGB_SPI, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, RGB_RMOD, RGB_VAD, RGB_HUD, RGB_SAD, RGB_SPD, _______, _______, _______, _______, _______, _______, _______, KC_END, _______, _______, _______, _______, + _______, _______, _______, _______, _______, BAT_LVL, NK_TOGG, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______), + [WIN_BASE] = LAYOUT_ansi_101( + 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_MUTE, + 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_NUM, KC_PSLS, KC_PAST, KC_PMNS, + 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_P7, KC_P8, KC_P9, + 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_P4, KC_P5, KC_P6, KC_PPLS, + 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_P1, KC_P2, KC_P3, + KC_LCTL, KC_LWIN, KC_LALT, KC_SPC, KC_RALT, MO(WIN_FN), KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT, KC_P0, KC_PDOT, KC_PENT), + [WIN_FN] = LAYOUT_ansi_101( + _______, 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, P2P4G, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + RGB_TOG, RGB_MOD, RGB_VAI, RGB_HUI, RGB_SAI, RGB_SPI, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, RGB_RMOD, RGB_VAD, RGB_HUD, RGB_SAD, RGB_SPD, _______, _______, _______, _______, _______, _______, _______, KC_END, _______, _______, _______, _______, + _______, _______, _______, _______, _______, BAT_LVL, NK_TOGG, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______), +}; + +// clang-format on +#if defined(ENCODER_MAP_ENABLE) +const uint16_t PROGMEM encoder_map[][NUM_ENCODERS][2] = { + [MAC_BASE] = {ENCODER_CCW_CW(KC_VOLD, KC_VOLU)}, + [MAC_FN] = {ENCODER_CCW_CW(RGB_VAD, RGB_VAI)}, + [WIN_BASE] = {ENCODER_CCW_CW(KC_VOLD, KC_VOLU)}, + [WIN_FN] = {ENCODER_CCW_CW(RGB_VAD, RGB_VAI)}, +}; +#endif // ENCODER_MAP_ENABLE + +bool process_record_user(uint16_t keycode, keyrecord_t *record) { + if (!process_record_keychron_common(keycode, record)) { + return false; + } + return true; +} diff --git a/keyboards/keychron/q5_max/ansi_encoder/keymaps/via/keymap.c b/keyboards/keychron/q5_max/ansi_encoder/keymaps/via/keymap.c new file mode 100644 index 0000000000..25436a14e0 --- /dev/null +++ b/keyboards/keychron/q5_max/ansi_encoder/keymaps/via/keymap.c @@ -0,0 +1,74 @@ +/* Copyright 2024 @ Keychron (https://www.keychron.com) + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#include QMK_KEYBOARD_H +#include "keychron_common.h" + +enum layers { + MAC_BASE, + MAC_FN, + WIN_BASE, + WIN_FN, +}; + +// clang-format off +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + [MAC_BASE] = LAYOUT_ansi_101( + KC_ESC, KC_BRID, KC_BRIU, KC_MCTRL, KC_LNPAD, RGB_VAD, RGB_VAI, KC_MPRV, KC_MPLY, KC_MNXT, KC_MUTE, KC_VOLD, KC_VOLU, KC_DEL, KC_F13, KC_F14 , KC_F15, KC_MUTE, + 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_NUM, KC_PSLS, KC_PAST, KC_PMNS, + 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_P7, KC_P8, KC_P9, + 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_P4, KC_P5, KC_P6, KC_PPLS, + 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_P1, KC_P2, KC_P3, + KC_LCTL, KC_LOPTN, KC_LCMMD, KC_SPC, KC_RCMMD, MO(MAC_FN), KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT, KC_P0, KC_PDOT, KC_PENT), + [MAC_FN] = LAYOUT_ansi_101( + _______, 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, + _______, BT_HST1, BT_HST2, BT_HST3, P2P4G, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + RGB_TOG, RGB_MOD, RGB_VAI, RGB_HUI, RGB_SAI, RGB_SPI, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, RGB_RMOD, RGB_VAD, RGB_HUD, RGB_SAD, RGB_SPD, _______, _______, _______, _______, _______, _______, _______, KC_END, _______, _______, _______, _______, + _______, _______, _______, _______, _______, BAT_LVL, NK_TOGG, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______), + [WIN_BASE] = LAYOUT_ansi_101( + 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_MUTE, + 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_NUM, KC_PSLS, KC_PAST, KC_PMNS, + 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_P7, KC_P8, KC_P9, + 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_P4, KC_P5, KC_P6, KC_PPLS, + 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_P1, KC_P2, KC_P3, + KC_LCTL, KC_LWIN, KC_LALT, KC_SPC, KC_RALT, MO(WIN_FN), KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT, KC_P0, KC_PDOT, KC_PENT), + [WIN_FN] = LAYOUT_ansi_101( + _______, 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, P2P4G, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + RGB_TOG, RGB_MOD, RGB_VAI, RGB_HUI, RGB_SAI, RGB_SPI, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, RGB_RMOD, RGB_VAD, RGB_HUD, RGB_SAD, RGB_SPD, _______, _______, _______, _______, _______, _______, _______, KC_END, _______, _______, _______, _______, + _______, _______, _______, _______, _______, BAT_LVL, NK_TOGG, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______), +}; + +// clang-format on +#if defined(ENCODER_MAP_ENABLE) +const uint16_t PROGMEM encoder_map[][NUM_ENCODERS][2] = { + [MAC_BASE] = {ENCODER_CCW_CW(KC_VOLD, KC_VOLU)}, + [MAC_FN] = {ENCODER_CCW_CW(RGB_VAD, RGB_VAI)}, + [WIN_BASE] = {ENCODER_CCW_CW(KC_VOLD, KC_VOLU)}, + [WIN_FN] = {ENCODER_CCW_CW(RGB_VAD, RGB_VAI)}, +}; +#endif // ENCODER_MAP_ENABLE + +bool process_record_user(uint16_t keycode, keyrecord_t *record) { + if (!process_record_keychron_common(keycode, record)) { + return false; + } + return true; +} diff --git a/keyboards/keychron/q5_max/ansi_encoder/keymaps/via/rules.mk b/keyboards/keychron/q5_max/ansi_encoder/keymaps/via/rules.mk new file mode 100644 index 0000000000..1e5b99807c --- /dev/null +++ b/keyboards/keychron/q5_max/ansi_encoder/keymaps/via/rules.mk @@ -0,0 +1 @@ +VIA_ENABLE = yes diff --git a/keyboards/keychron/q5_max/ansi_encoder/rules.mk b/keyboards/keychron/q5_max/ansi_encoder/rules.mk new file mode 100644 index 0000000000..7ff128fa69 --- /dev/null +++ b/keyboards/keychron/q5_max/ansi_encoder/rules.mk @@ -0,0 +1 @@ +# This file intentionally left blank \ No newline at end of file diff --git a/keyboards/keychron/q5_max/board.h b/keyboards/keychron/q5_max/board.h new file mode 100644 index 0000000000..54fba748bf --- /dev/null +++ b/keyboards/keychron/q5_max/board.h @@ -0,0 +1,226 @@ +/* Copyright 2024 @ Keychron (https://www.keychron.com) + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#pragma once + +#include_next + +// clang-format off + +/* Set GPIOA_SWDIO to INPUT and NOT FLOATING */ +#undef VAL_GPIOA_MODER +#define VAL_GPIOA_MODER (PIN_MODE_INPUT(GPIOA_BUTTON) | \ + PIN_MODE_INPUT(GPIOA_PIN1) | \ + PIN_MODE_INPUT(GPIOA_PIN2) | \ + PIN_MODE_INPUT(GPIOA_PIN3) | \ + PIN_MODE_ALTERNATE(GPIOA_CS43L22_LRCK) |\ + PIN_MODE_ALTERNATE(GPIOA_L3GD20_SCL) | \ + PIN_MODE_ALTERNATE(GPIOA_L3GD20_SD0) | \ + PIN_MODE_ALTERNATE(GPIOA_L3GD20_SDI) | \ + PIN_MODE_INPUT(GPIOA_PIN8) | \ + PIN_MODE_INPUT(GPIOA_VBUS_FS) | \ + PIN_MODE_ALTERNATE(GPIOA_OTG_FS_ID) | \ + PIN_MODE_ALTERNATE(GPIOA_OTG_FS_DM) | \ + PIN_MODE_ALTERNATE(GPIOA_OTG_FS_DP) | \ + PIN_MODE_INPUT(GPIOA_SWDIO) | \ + PIN_MODE_INPUT(GPIOA_SWCLK) | \ + PIN_MODE_INPUT(GPIOA_PIN15)) + +#undef VAL_GPIOA_PUPDR +#define VAL_GPIOA_PUPDR (PIN_PUPDR_FLOATING(GPIOA_BUTTON) | \ + PIN_PUPDR_PULLUP(GPIOA_PIN1) | \ + PIN_PUPDR_PULLUP(GPIOA_PIN2) | \ + PIN_PUPDR_PULLUP(GPIOA_PIN3) | \ + PIN_PUPDR_FLOATING(GPIOA_CS43L22_LRCK) |\ + PIN_PUPDR_FLOATING(GPIOA_L3GD20_SCL) | \ + PIN_PUPDR_PULLUP(GPIOA_L3GD20_SD0) | \ + PIN_PUPDR_PULLUP(GPIOA_L3GD20_SDI) | \ + PIN_PUPDR_PULLUP(GPIOA_PIN8) | \ + PIN_PUPDR_FLOATING(GPIOA_VBUS_FS) | \ + PIN_PUPDR_FLOATING(GPIOA_OTG_FS_ID) | \ + PIN_PUPDR_FLOATING(GPIOA_OTG_FS_DM) | \ + PIN_PUPDR_FLOATING(GPIOA_OTG_FS_DP) | \ + PIN_PUPDR_PULLUP(GPIOA_SWDIO) | \ + PIN_PUPDR_PULLUP(GPIOA_SWCLK) | \ + PIN_PUPDR_PULLUP(GPIOA_PIN15)) + +#undef VAL_GPIOB_MODER +#define VAL_GPIOB_MODER (PIN_MODE_INPUT(GPIOB_PIN0) | \ + PIN_MODE_INPUT(GPIOB_PIN1) | \ + PIN_MODE_INPUT(GPIOB_PIN2) | \ + PIN_MODE_INPUT(GPIOB_SWO) | \ + PIN_MODE_INPUT(GPIOB_PIN4) | \ + PIN_MODE_INPUT(GPIOB_PIN5) | \ + PIN_MODE_INPUT(GPIOB_LSM303DLHC_SCL) | \ + PIN_MODE_INPUT(GPIOB_PIN7) | \ + PIN_MODE_INPUT(GPIOB_PIN8) | \ + PIN_MODE_INPUT(GPIOB_LSM303DLHC_SDA) | \ + PIN_MODE_INPUT(GPIOB_MP45DT02_CLK_IN) |\ + PIN_MODE_INPUT(GPIOB_PIN11) | \ + PIN_MODE_INPUT(GPIOB_PIN12) | \ + PIN_MODE_INPUT(GPIOB_PIN13) | \ + PIN_MODE_INPUT(GPIOB_PIN14) | \ + PIN_MODE_INPUT(GPIOB_PIN15)) + +#undef VAL_GPIOB_PUPDR +#define VAL_GPIOB_PUPDR (PIN_PUPDR_PULLDOWN(GPIOB_PIN0) | \ + PIN_PUPDR_PULLDOWN(GPIOB_PIN1) | \ + PIN_PUPDR_PULLDOWN(GPIOB_PIN2) | \ + PIN_PUPDR_PULLDOWN(GPIOB_SWO) | \ + PIN_PUPDR_PULLDOWN(GPIOB_PIN4) | \ + PIN_PUPDR_PULLDOWN(GPIOB_PIN5) | \ + PIN_PUPDR_PULLDOWN(GPIOB_LSM303DLHC_SCL) |\ + PIN_PUPDR_PULLDOWN(GPIOB_PIN7) | \ + PIN_PUPDR_PULLDOWN(GPIOB_PIN8) | \ + PIN_PUPDR_PULLDOWN(GPIOB_LSM303DLHC_SDA) |\ + PIN_PUPDR_PULLDOWN(GPIOB_MP45DT02_CLK_IN) |\ + PIN_PUPDR_PULLDOWN(GPIOB_PIN11) | \ + PIN_PUPDR_PULLDOWN(GPIOB_PIN12) | \ + PIN_PUPDR_PULLDOWN(GPIOB_PIN13) | \ + PIN_PUPDR_PULLDOWN(GPIOB_PIN14) | \ + PIN_PUPDR_PULLDOWN(GPIOB_PIN15)) + +#undef VAL_GPIOB_AFRL +#define VAL_GPIOB_AFRL (PIN_AFIO_AF(GPIOB_PIN0, 0U) | \ + PIN_AFIO_AF(GPIOB_PIN1, 0U) | \ + PIN_AFIO_AF(GPIOB_PIN2, 0U) | \ + PIN_AFIO_AF(GPIOB_SWO, 0U) | \ + PIN_AFIO_AF(GPIOB_PIN4, 0U) | \ + PIN_AFIO_AF(GPIOB_PIN5, 0U) | \ + PIN_AFIO_AF(GPIOB_LSM303DLHC_SCL, 0) | \ + PIN_AFIO_AF(GPIOB_PIN7, 0U)) + +#undef VAL_GPIOB_AFRH +#define VAL_GPIOB_AFRH (PIN_AFIO_AF(GPIOB_PIN8, 0U) | \ + PIN_AFIO_AF(GPIOB_LSM303DLHC_SDA, 0) | \ + PIN_AFIO_AF(GPIOB_MP45DT02_CLK_IN, 0U) |\ + PIN_AFIO_AF(GPIOB_PIN11, 0U) | \ + PIN_AFIO_AF(GPIOB_PIN12, 0U) | \ + PIN_AFIO_AF(GPIOB_PIN13, 0U) | \ + PIN_AFIO_AF(GPIOB_PIN14, 0U) | \ + PIN_AFIO_AF(GPIOB_PIN15, 0U)) + +/* C5 Need to be pulldown */ +#undef VAL_GPIOC_MODER +#define VAL_GPIOC_MODER (PIN_MODE_INPUT(GPIOC_OTG_FS_POWER_ON) |\ + PIN_MODE_INPUT(GPIOC_PIN1) | \ + PIN_MODE_INPUT(GPIOC_PIN2) | \ + PIN_MODE_INPUT(GPIOC_CS43L22_AIN4x) | \ + PIN_MODE_INPUT(GPIOC_PIN4) | \ + PIN_MODE_INPUT(GPIOC_PIN5) | \ + PIN_MODE_INPUT(GPIOC_PIN6) | \ + PIN_MODE_INPUT(GPIOC_CS43L22_MCLK) | \ + PIN_MODE_INPUT(GPIOC_PIN8) | \ + PIN_MODE_INPUT(GPIOC_PIN9) | \ + PIN_MODE_INPUT(GPIOC_CS43L22_SCLK) | \ + PIN_MODE_INPUT(GPIOC_PIN11) | \ + PIN_MODE_INPUT(GPIOC_CS43L22_SDIN) | \ + PIN_MODE_INPUT(GPIOC_PIN13) | \ + PIN_MODE_INPUT(GPIOC_OSC32_IN) | \ + PIN_MODE_INPUT(GPIOC_OSC32_OUT)) + +#undef VAL_GPIOC_PUPDR +#define VAL_GPIOC_PUPDR (PIN_PUPDR_PULLUP(GPIOC_OTG_FS_POWER_ON) |\ + PIN_PUPDR_PULLUP(GPIOC_PIN1) | \ + PIN_PUPDR_PULLUP(GPIOC_PIN2) | \ + PIN_PUPDR_PULLUP(GPIOC_CS43L22_AIN4x) |\ + PIN_PUPDR_PULLUP(GPIOC_PIN4) | \ + PIN_PUPDR_PULLDOWN(GPIOC_PIN5) | \ + PIN_PUPDR_PULLUP(GPIOC_PIN6) | \ + PIN_PUPDR_PULLUP(GPIOC_CS43L22_MCLK) | \ + PIN_PUPDR_PULLUP(GPIOC_PIN8) | \ + PIN_PUPDR_PULLUP(GPIOC_PIN9) | \ + PIN_PUPDR_PULLUP(GPIOC_CS43L22_SCLK) | \ + PIN_PUPDR_PULLUP(GPIOC_PIN11) | \ + PIN_PUPDR_PULLUP(GPIOC_CS43L22_SDIN) | \ + PIN_PUPDR_PULLUP(GPIOC_PIN13) | \ + PIN_PUPDR_PULLUP(GPIOC_OSC32_IN) | \ + PIN_PUPDR_PULLUP(GPIOC_OSC32_OUT)) + +/* Set all GPIOD pins to INPUT & PULLUP to avoid FLOATING */ +#undef VAL_GPIOD_MODER +#define VAL_GPIOD_MODER (PIN_MODE_INPUT(GPIOD_PIN0) | \ + PIN_MODE_INPUT(GPIOD_PIN1) | \ + PIN_MODE_INPUT(GPIOD_PIN2) | \ + PIN_MODE_INPUT(GPIOD_PIN3) | \ + PIN_MODE_INPUT(GPIOD_CS43L22_RESET) | \ + PIN_MODE_INPUT(GPIOD_OverCurrent) | \ + PIN_MODE_INPUT(GPIOD_PIN6) | \ + PIN_MODE_INPUT(GPIOD_PIN7) | \ + PIN_MODE_INPUT(GPIOD_PIN8) | \ + PIN_MODE_INPUT(GPIOD_PIN9) | \ + PIN_MODE_INPUT(GPIOD_PIN10) | \ + PIN_MODE_INPUT(GPIOD_PIN11) | \ + PIN_MODE_INPUT(GPIOD_LED4) | \ + PIN_MODE_INPUT(GPIOD_LED3) | \ + PIN_MODE_INPUT(GPIOD_LED5) | \ + PIN_MODE_INPUT(GPIOD_LED6)) + +#undef VAL_GPIOD_PUPDR +#define VAL_GPIOD_PUPDR (PIN_PUPDR_PULLUP(GPIOD_PIN0) | \ + PIN_PUPDR_PULLUP(GPIOD_PIN1) | \ + PIN_PUPDR_PULLUP(GPIOD_PIN2) | \ + PIN_PUPDR_PULLUP(GPIOD_PIN3) | \ + PIN_PUPDR_PULLUP(GPIOD_CS43L22_RESET) |\ + PIN_PUPDR_PULLUP(GPIOD_OverCurrent) | \ + PIN_PUPDR_PULLUP(GPIOD_PIN6) | \ + PIN_PUPDR_PULLUP(GPIOD_PIN7) | \ + PIN_PUPDR_PULLUP(GPIOD_PIN8) | \ + PIN_PUPDR_PULLUP(GPIOD_PIN9) | \ + PIN_PUPDR_PULLUP(GPIOD_PIN10) | \ + PIN_PUPDR_PULLUP(GPIOD_PIN11) | \ + PIN_PUPDR_PULLUP(GPIOD_LED4) | \ + PIN_PUPDR_PULLUP(GPIOD_LED3) | \ + PIN_PUPDR_PULLUP(GPIOD_LED5) | \ + PIN_PUPDR_PULLUP(GPIOD_LED6)) + +/* Set all GPIOE pins to INPUT & PULLUP to avoid FLOATING */ +#undef VAL_GPIOE_MODER +#define VAL_GPIOE_MODER (PIN_MODE_INPUT(GPIOE_L3GD20_INT1) | \ + PIN_MODE_INPUT(GPIOE_L3GD20_INT2) | \ + PIN_MODE_INPUT(GPIOE_LSM303DLHC_DRDY) |\ + PIN_MODE_INPUT(GPIOE_L3GD20_CS) | \ + PIN_MODE_INPUT(GPIOE_LSM303DLHC_INT1) |\ + PIN_MODE_INPUT(GPIOE_LSM303DLHC_INT2) |\ + PIN_MODE_INPUT(GPIOE_PIN6) | \ + PIN_MODE_INPUT(GPIOE_PIN7) | \ + PIN_MODE_INPUT(GPIOE_PIN8) | \ + PIN_MODE_INPUT(GPIOE_PIN9) | \ + PIN_MODE_INPUT(GPIOE_PIN10) | \ + PIN_MODE_INPUT(GPIOE_PIN11) | \ + PIN_MODE_INPUT(GPIOE_PIN12) | \ + PIN_MODE_INPUT(GPIOE_PIN13) | \ + PIN_MODE_INPUT(GPIOE_PIN14) | \ + PIN_MODE_INPUT(GPIOE_PIN15)) + +#undef VAL_GPIOE_PUPDR +#define VAL_GPIOE_PUPDR (PIN_PUPDR_PULLUP(GPIOE_L3GD20_INT1) | \ + PIN_PUPDR_PULLUP(GPIOE_L3GD20_INT2) | \ + PIN_PUPDR_PULLUP(GPIOE_LSM303DLHC_DRDY) |\ + PIN_PUPDR_PULLUP(GPIOE_L3GD20_CS) | \ + PIN_PUPDR_PULLUP(GPIOE_LSM303DLHC_INT1) |\ + PIN_PUPDR_PULLUP(GPIOE_LSM303DLHC_INT2) |\ + PIN_PUPDR_PULLUP(GPIOE_PIN6) | \ + PIN_PUPDR_PULLUP(GPIOE_PIN7) | \ + PIN_PUPDR_PULLUP(GPIOE_PIN8) | \ + PIN_PUPDR_PULLUP(GPIOE_PIN9) | \ + PIN_PUPDR_PULLUP(GPIOE_PIN10) | \ + PIN_PUPDR_PULLUP(GPIOE_PIN11) | \ + PIN_PUPDR_PULLUP(GPIOE_PIN12) | \ + PIN_PUPDR_PULLUP(GPIOE_PIN13) | \ + PIN_PUPDR_PULLUP(GPIOE_PIN14) | \ + PIN_PUPDR_PULLUP(GPIOE_PIN15)) + diff --git a/keyboards/keychron/q5_max/config.h b/keyboards/keychron/q5_max/config.h new file mode 100644 index 0000000000..cd19b08ae1 --- /dev/null +++ b/keyboards/keychron/q5_max/config.h @@ -0,0 +1,81 @@ +/* Copyright 2024 @ Keychron (https://www.keychron.com) + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#pragma once + +/* Encoder Configuration */ +#define ENCODER_DEFAULT_POS 0x3 +#define ENCODER_MAP_KEY_DELAY 2 + +#ifdef LK_WIRELESS_ENABLE +/* Hardware configuration */ +# define P2P4_MODE_SELECT_PIN A10 +# define BT_MODE_SELECT_PIN A9 + +# define LKBT51_RESET_PIN C4 +# define LKBT51_INT_INPUT_PIN B1 +# define BLUETOOTH_INT_OUTPUT_PIN A4 + +# define USB_POWER_SENSE_PIN B0 +# define USB_POWER_CONNECTED_LEVEL 0 + +# define BAT_CHARGING_PIN B13 +# define BAT_CHARGING_LEVEL 0 + +# define BT_HOST_DEVICES_COUNT 3 + +# if defined(RGB_MATRIX_ENABLE) || defined(LED_MATRIX_ENABLE) + +# define LED_DRIVER_SHUTDOWN_PIN B7 + +# define BT_HOST_LED_MATRIX_LIST \ + { 18, 19, 20 } + +# define P2P4G_HOST_LED_MATRIX_LIST \ + { 21 } + +# define BAT_LEVEL_LED_LIST \ + { 18, 19, 20, 21, 22, 23, 24, 25, 26, 27 } + +/* Backlit disable timeout when keyboard is disconnected(unit: second) */ +# define DISCONNECTED_BACKLIGHT_DISABLE_TIMEOUT 40 + +/* Backlit disable timeout when keyboard is connected(unit: second) */ +# define CONNECTED_BACKLIGHT_DISABLE_TIMEOUT 600 + +/* Reinit LED driver on tranport changed */ +# define REINIT_LED_DRIVER 1 + +# endif + +/* Keep USB connection in blueooth mode */ +# define KEEP_USB_CONNECTION_IN_WIRELESS_MODE + +/* Enable bluetooth NKRO */ +# define WIRELESS_NKRO_ENABLE + +/* Raw hid command for factory test and bluetooth DFU */ +# define RAW_HID_CMD 0xAA ... 0xAB +#else +/* Raw hid command for factory test */ +# define RAW_HID_CMD 0xAB +#endif + +/* Factory test keys */ +#define FN_KEY_1 MO(1) +#define FN_KEY_2 MO(3) + +#define MATRIX_IO_DELAY 10 diff --git a/keyboards/keychron/q5_max/halconf.h b/keyboards/keychron/q5_max/halconf.h new file mode 100644 index 0000000000..37bcc7c47b --- /dev/null +++ b/keyboards/keychron/q5_max/halconf.h @@ -0,0 +1,31 @@ +/* Copyright 2024 @ 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 + +#define _CHIBIOS_HAL_CONF_VER_8_0_ + +#define HAL_USE_SPI TRUE + +#ifdef LK_WIRELESS_ENABLE +# define HAL_USE_RTC TRUE +#endif + +#if defined(LK_WIRELESS_ENABLE) || defined(ENCODER_ENABLE) +# define PAL_USE_CALLBACKS TRUE +#endif + +#include_next diff --git a/keyboards/keychron/q5_max/info.json b/keyboards/keychron/q5_max/info.json new file mode 100644 index 0000000000..0dd1ea7652 --- /dev/null +++ b/keyboards/keychron/q5_max/info.json @@ -0,0 +1,77 @@ +{ + "keyboard_name": "Keychron Q5 Max", + "manufacturer": "Keychron", + "url": "https://github.com/Keychron", + "maintainer": "lokher", + "processor": "STM32F401", + "bootloader": "stm32-dfu", + "usb": { + "vid": "0x3434" + }, + "features": { + "bootmagic": true, + "extrakey" : true, + "mousekey" : true, + "dip_switch" : true, + "encoder": true, + "encoder_map": true, + "nkro" : true, + "rgb_matrix": true, + "raw" : true, + "sendstring" : true + }, + "matrix_pins": { + "cols": ["C6", "C7", "C8", "A14", "A15", "C10", "C11", "C13", "C14", "C15", "C0", "C1", "C2", "C3", "A0", "A1", "A2", "A3", "B10"], + "rows": ["C12", "D2", "B3", "B4", "B5", "B6"] + }, + "diode_direction": "ROW2COL", + "encoder": { + "rotary": [ + { + "pin_a": "B14", + "pin_b": "B15" + } + ] + }, + "dip_switch" :{ + "pins": ["B12"] + }, + "rgb_matrix": { + "driver": "snled27351_spi", + "sleep": true, + "animations": { + "band_spiral_val": true, + "breathing": true, + "cycle_all": true, + "cycle_left_right": true, + "cycle_out_in": true, + "cycle_out_in_dual": true, + "cycle_pinwheel": true, + "cycle_spiral": true, + "cycle_up_down": true, + "digital_rain": true, + "dual_beacon": true, + "jellybean_raindrops": true, + "pixel_rain": true, + "rainbow_beacon": true, + "rainbow_moving_chevron": true, + "solid_reactive_multinexus": true, + "solid_reactive_multiwide": true, + "solid_reactive_simple": true, + "solid_splash": true, + "splash": true, + "typing_heatmap": true + } + }, + "eeprom": { + "wear_leveling": { + "driver": "embedded_flash", + "logical_size": 2048, + "backing_size": 4096 + } + }, + "build": { + "debounce_type": "sym_eager_pk" + }, + "debounce": 20 +} diff --git a/keyboards/keychron/q5_max/mcuconf.h b/keyboards/keychron/q5_max/mcuconf.h new file mode 100644 index 0000000000..89294ee64b --- /dev/null +++ b/keyboards/keychron/q5_max/mcuconf.h @@ -0,0 +1,37 @@ +/* Copyright 2024 @ 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_next + +#undef STM32_HSECLK +#define STM32_HSECLK 16000000 + +#undef STM32_PLLM_VALUE +#define STM32_PLLM_VALUE 8 + +#undef STM32_PLLN_VALUE +#define STM32_PLLN_VALUE 96 + +#undef STM32_PLLP_VALUE +#define STM32_PLLP_VALUE 4 + +#undef STM32_PLLQ_VALUE +#define STM32_PLLQ_VALUE 4 + +#undef STM32_SPI_USE_SPI1 +#define STM32_SPI_USE_SPI1 TRUE diff --git a/keyboards/keychron/q5_max/q5_max.c b/keyboards/keychron/q5_max/q5_max.c new file mode 100644 index 0000000000..be569dd189 --- /dev/null +++ b/keyboards/keychron/q5_max/q5_max.c @@ -0,0 +1,62 @@ +/* Copyright 2024 @ 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" +#include "keychron_task.h" +#ifdef FACTORY_TEST_ENABLE +# include "factory_test.h" +# include "keychron_common.h" +#endif +#ifdef LK_WIRELESS_ENABLE +# include "lkbt51.h" +# include "wireless.h" +# include "keychron_wireless_common.h" +# include "battery.h" +#endif + + +#ifdef DIP_SWITCH_ENABLE +bool dip_switch_update_kb(uint8_t index, bool active) { + if (index == 0) { + default_layer_set(1UL << (active ? 2 : 0)); + } + dip_switch_update_user(index, active); + + return true; +} +#endif + +void keyboard_post_init_kb(void) { +#ifdef LK_WIRELESS_ENABLE + palSetLineMode(P2P4_MODE_SELECT_PIN, PAL_MODE_INPUT); + palSetLineMode(BT_MODE_SELECT_PIN, PAL_MODE_INPUT); + + lkbt51_init(false); + wireless_init(); +#endif + +#ifdef ENCODER_ENABLE + encoder_cb_init(); +#endif + + keyboard_post_init_user(); +} + +#ifdef LK_WIRELESS_ENABLE +bool lpm_is_kb_idle(void) { + return !factory_reset_indicating(); +} +#endif diff --git a/keyboards/keychron/q5_max/readme.md b/keyboards/keychron/q5_max/readme.md new file mode 100644 index 0000000000..d053eb8fdc --- /dev/null +++ b/keyboards/keychron/q5_max/readme.md @@ -0,0 +1,21 @@ +# Keychron Q5 Max + +![Keychron Q5 Max](https://cdn.shopify.com/s/files/1/0059/0630/1017/files/Q5-Max-1.jpg?v=1703736781) + +A customizable 98% keyboard. + +* Keyboard Maintainer: [Keychron](https://github.com/keychron) +* Hardware Supported: Keychron Q5 Max +* Hardware Availability: [Keychron Q5 Max QMK/VIA Wireless Custom Mechanical Keyboard](https://www.keychron.com/products/keychron-q5-max-qmk-via-wireless-custom-mechanical-keyboard) + +Make example for this keyboard (after setting up your build environment): + + make keychron/q5_max/ansi_encoder:default + +Flashing example for this keyboard: + + make keychron/q5_max/ansi_encoder:default:flash + +**Reset Key**: Toggle mode switch to "Cable", hold down the *Esc* key or reset button underneath space bar while connecting the USB cable, + +See the [build environment setup](https://docs.qmk.fm/#/getting_started_build_tools) and the [make instructions](https://docs.qmk.fm/#/getting_started_make_guide) for more information. Brand new to QMK? Start with our [Complete Newbs Guide](https://docs.qmk.fm/#/newbs). diff --git a/keyboards/keychron/q5_max/rules.mk b/keyboards/keychron/q5_max/rules.mk new file mode 100644 index 0000000000..4eaf6820bc --- /dev/null +++ b/keyboards/keychron/q5_max/rules.mk @@ -0,0 +1,4 @@ +include keyboards/keychron/common/wireless/wireless.mk +include keyboards/keychron/common/keychron_common.mk + +VPATH += $(TOP_DIR)/keyboards/keychron diff --git a/keyboards/keychron/q5_max/via_json/q5_max_ansi_encoder.json b/keyboards/keychron/q5_max/via_json/q5_max_ansi_encoder.json new file mode 100644 index 0000000000..94a5028c36 --- /dev/null +++ b/keyboards/keychron/q5_max/via_json/q5_max_ansi_encoder.json @@ -0,0 +1,339 @@ +{ + "name": "Keychron Q5 Max ANSI Knob", + "vendorId": "0x3434", + "productId": "0x0850", + "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": "Misson Control", "title": "Misson Control in Mac", "shortName": "MCtl"}, + {"name": "Lanuch Pad", "title": "Lanuch Pad in Windows", "shortName": "LPad"}, + {"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": "2.4G", "title": "2.4G", "shortName": "2.4G"}, + {"name": "Battery Level", "title": "Show battery level", "shortName": "Batt"} + ], + "matrix": {"rows": 6, "cols" : 19}, + "layouts": { + "keymap": [ + [ + { + "c": "#777777" + }, + "0, 0", + { + "x": 1, + "c": "#cccccc" + }, + "0, 1", + "0, 2", + "0, 3", + "0, 4", + { + "x": 0.5, + "c": "#aaaaaa" + }, + "0, 5", + "0, 6", + "0, 7", + "0, 8", + { + "x": 0.5, + "c": "#cccccc" + }, + "0, 9", + "0, 10", + "0, 11", + "0, 12", + { + "x": 0.25, + "c": "#aaaaaa" + }, + "0, 13", + { + "x": 0.25, + "c": "#cccccc" + }, + "0, 15", + "0, 16", + "0, 17", + { + "x": 0.25, + "c": "#aaaaaa" + }, + "0, 18\n\n\n\n\n\n\n\n\ne0" + ], + [ + { + "y": 0.25, + "c": "#aaaaaa" + }, + "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", + { + "w": 2, + "c": "#aaaaaa" + }, + "1, 13", + { + "x": 0.25 + }, + "1, 14", + { + "x": 0.25, + "c": "#cccccc" + }, + "1, 15", + "1, 16", + "1, 17", + "1, 18" + ], + [ + { + "w": 1.5, + "c": "#aaaaaa" + }, + "2, 0", + { + "c": "#cccccc" + }, + "2, 1", + "2, 2", + "2, 3", + "2, 4", + "2, 5", + "2, 6", + "2, 7", + "2, 8", + "2, 9", + "2, 10", + "2, 11", + "2, 12", + { + "w": 1.5, + "c": "#aaaaaa" + }, + "2, 13", + { + "x": 0.25 + }, + "2, 14", + { + "x": 0.25, + "c": "#cccccc" + }, + "2, 15", + "2, 16", + "2, 17", + { + "h": 2 + }, + "2, 18" + ], + [ + { + "w": 1.75, + "c": "#aaaaaa" + }, + "3, 0", + { + "c": "#cccccc" + }, + "3, 1", + "3, 2", + "3, 3", + "3, 4", + "3, 5", + "3, 6", + "3, 7", + "3, 8", + "3, 9", + "3, 10", + "3, 11", + { + "w": 2.25, + "c": "#777777" + }, + "3, 12", + { + "x": 0.25, + "c": "#aaaaaa" + }, + "3, 13", + { + "x": 0.25, + "c": "#cccccc" + }, + "3, 15", + "3, 16", + "3, 17" + ], + [ + { + "w": 2.25, + "c": "#aaaaaa" + }, + "4, 0", + { + "c": "#cccccc" + }, + "4, 2", + "4, 3", + "4, 4", + "4, 5", + "4, 6", + "4, 7", + "4, 8", + "4, 9", + "4, 10", + "4, 11", + { + "w": 1.75, + "c": "#aaaaaa" + }, + "4, 12", + { + "x": 0.25, + "y": 0.25, + "c": "#cccccc" + }, + "4, 13", + { + "x": 1.25, + "y": -0.25 + }, + "4, 15", + "4, 16", + "4, 17", + { + "h": 2 + }, + "4, 18" + ], + [ + { + "w": 1.25, + "c": "#aaaaaa" + }, + "5, 0", + { + "w": 1.25 + }, + "5, 1", + { + "w": 1.25 + }, + "5, 2", + { + "w": 6.25, + "c": "#cccccc" + }, + "5, 6", + { + "c": "#aaaaaa" + }, + "5, 9", + "5, 10", + "5, 11", + { + "x": 0.25, + "y": 0.25, + "c": "#cccccc" + }, + "5, 12", + "5, 13", + "5, 14", + { + "x": 0.25, + "y": -0.25, + "w": 2 + }, + "5, 16", + "5, 17" + ] + ] + } +} diff --git a/keyboards/keychron/q6_max/ansi_encoder/ansi_encoder.c b/keyboards/keychron/q6_max/ansi_encoder/ansi_encoder.c new file mode 100644 index 0000000000..b55fea0668 --- /dev/null +++ b/keyboards/keychron/q6_max/ansi_encoder/ansi_encoder.c @@ -0,0 +1,175 @@ +/* Copyright 2024 @ Keychron (https://www.keychron.com) + * + * This program is free software : you can redistribute it and /or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program.If not, see < http://www.gnu.org/licenses/>. + */ + +#include "quantum.h" + +// clang-format off + +#ifdef RGB_MATRIX_ENABLE +const snled27351_led_t g_snled27351_leds[RGB_MATRIX_LED_COUNT] = { +/* Refer to SNLED27351 manual for these locations + * driver + * | R location + * | | G location + * | | | B location + * | | | | */ + {0, G_16, I_16, H_16}, + {0, G_15, I_15, H_15}, + {0, G_14, I_14, H_14}, + {0, G_13, I_13, H_13}, + {0, G_12, I_12, H_12}, + {0, G_11, I_11, H_11}, + {0, G_10, I_10, H_10}, + {0, G_9, I_9, H_9}, + {0, G_8, I_8, H_8}, + {0, G_7, I_7, H_7}, + {0, G_6, I_6, H_6}, + {0, G_5, I_5, H_5}, + {0, G_4, I_4, H_4}, + {0, G_2, I_2, H_2}, + {0, G_1, I_1, H_1}, + {1, A_3, C_3, B_3}, + {0, D_4, F_4, E_4}, + {0, D_3, F_3, E_3}, + {0, D_2, F_2, E_2}, + + {0, A_16, C_16, B_16}, + {0, A_15, C_15, B_15}, + {0, A_14, C_14, B_14}, + {0, A_13, C_13, B_13}, + {0, A_12, C_12, B_12}, + {0, A_11, C_11, B_11}, + {0, A_10, C_10, B_10}, + {0, A_9, C_9, B_9}, + {0, A_8, C_8, B_8}, + {0, A_7, C_7, B_7}, + {0, A_6, C_6, B_6}, + {0, A_5, C_5, B_5}, + {0, A_4, C_4, B_4}, + {0, A_3, C_3, B_3}, + {0, A_2, C_2, B_2}, + {0, A_1, C_1, B_1}, + {1, A_2, C_2, B_2}, + {0, D_8, F_8, E_8}, + {0, D_7, F_7, E_7}, + {0, D_6, F_6, E_6}, + + {0, J_16, L_16, K_16}, + {0, J_15, L_15, K_15}, + {0, J_14, L_14, K_14}, + {0, J_13, L_13, K_13}, + {0, J_12, L_12, K_12}, + {0, J_11, L_11, K_11}, + {0, J_10, L_10, K_10}, + {0, J_9, L_9, K_9}, + {0, J_8, L_8, K_8}, + {0, J_7, L_7, K_7}, + {0, J_6, L_6, K_6}, + {0, J_5, L_5, K_5}, + {0, J_4, L_4, K_4}, + {0, J_3, L_3, K_3}, + {0, J_2, L_2, K_2}, + {0, J_1, L_1, K_1}, + {1, A_1, C_1, B_1}, + {0, D_12, F_12, E_12}, + {0, D_11, F_11, E_11}, + {0, D_10, F_10, E_10}, + + {1, A_16, C_16, B_16}, + {1, A_15, C_15, B_15}, + {1, A_14, C_14, B_14}, + {1, A_13, C_13, B_13}, + {1, A_12, C_12, B_12}, + {1, A_11, C_11, B_11}, + {1, A_10, C_10, B_10}, + {1, A_9, C_9, B_9}, + {1, A_8, C_8, B_8}, + {1, A_7, C_7, B_7}, + {1, A_6, C_6, B_6}, + {1, A_5, C_5, B_5}, + {1, A_4, C_4, B_4}, + {0, D_1, F_1, E_1}, + {0, D_5, F_5, E_5}, + {0, D_9, F_9, E_9}, + {1, J_3, L_3, K_3}, + {1, J_9, L_9, K_9}, + {1, J_8, L_8, K_8}, + {1, J_7, L_7, K_7}, + + {1, G_16, I_16, H_16}, + {1, G_14, I_14, H_14}, + {1, G_13, I_13, H_13}, + {1, G_12, I_12, H_12}, + {1, G_11, I_11, H_11}, + {1, G_10, I_10, H_10}, + {1, G_9, I_9, H_9}, + {1, G_8, I_8, H_8}, + {1, G_7, I_7, H_7}, + {1, G_6, I_6, H_6}, + {1, G_5, I_5, H_5}, + {1, G_3, I_3, H_3}, + {1, G_1, I_1, H_1}, + {1, J_6, L_6, K_6}, + {1, J_5, L_5, K_5}, + {1, J_4, L_4, K_4}, + + {1, D_16, F_16, E_16}, + {1, D_15, F_15, E_15}, + {1, D_14, F_14, E_14}, + {1, D_10, F_10, E_10}, + {1, D_6, F_6, E_6}, + {1, D_5, F_5, E_5}, + {1, D_4, F_4, E_4}, + {1, D_3, F_3, E_3}, + {1, D_2, F_2, E_2}, + {1, D_1, F_1, E_1}, + {1, G_2, I_2, H_2}, + {1, J_2, L_2, K_2}, + {1, J_1, L_1, K_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, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78 }, + { 79, __, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, __, 90, __, 91, __, 92, 93, 94 }, + { 95, 96, 97, __, __, __, 98, __, __, __, 99, 100, 101, 102, 103, 104, 105, __, 106, 107 }, + }, + { + // LED Index to Physical Position + {0, 0}, {13, 0}, {24, 0}, {34, 0}, {45, 0}, {57, 0}, {68, 0}, {78, 0}, {89, 0}, {102, 0}, {112, 0}, {123, 0}, {133, 0}, {159, 0}, {169, 0}, {180, 0}, {193, 0}, {203, 0}, {214, 0}, + {0,15}, {10,15}, {21,15}, {31,15}, {42,15}, {52,15}, {63,15}, {73,15}, {83,15}, { 94,15}, {104,15}, {115,15}, {125,15}, {141,15}, {159,15}, {169,15}, {180,15}, {193,15}, {203,15}, {214,15}, + {3,27}, {16,27}, {26,27}, {36,27}, {47,27}, {57,27}, {68,27}, {78,27}, {89,27}, { 99,27}, {109,27}, {120,27}, {130,27}, {143,27}, {159,27}, {169,27}, {180,27}, {193,27}, {203,27}, {214,27}, + {4,40}, {18,40}, {29,40}, {39,40}, {50,40}, {60,40}, {70,40}, {81,40}, {91,40}, {102,40}, {112,40}, {123,40}, {139,40}, {224, 0}, {224,15}, {224,34}, {224,58}, {193,40}, {203,40}, {214,40}, + {7,52}, {23,52}, {34,52}, {44,52}, {55,52}, {65,52}, {76,52}, {86,52}, { 96,52}, {107,52}, {117,52}, {137,52}, {169,52}, {193,52}, {203,52}, {214,52}, + {1,64}, {14,64}, {27,64}, {66,64}, {105,64}, {118,64}, {131,64}, {145,64}, {159,64}, {169,64}, {180,64}, {198,64}, {214,64}, + }, + { + // RGB LED Index to Flag + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + } +}; +#endif diff --git a/keyboards/keychron/q6_max/ansi_encoder/config.h b/keyboards/keychron/q6_max/ansi_encoder/config.h new file mode 100644 index 0000000000..7806a09ba0 --- /dev/null +++ b/keyboards/keychron/q6_max/ansi_encoder/config.h @@ -0,0 +1,54 @@ +/* Copyright 2024 @ Keychron (https://www.keychron.com) + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#pragma once + +#ifdef RGB_MATRIX_ENABLE +/* RGB Matrix driver configuration */ +# define DRIVER_COUNT 2 +# define RGB_MATRIX_LED_COUNT 108 + +# define SPI_SCK_PIN A5 +# define SPI_MISO_PIN A6 +# define SPI_MOSI_PIN A7 + +# define DRIVER_CS_PINS \ + { B8, B9 } +# define SNLED23751_SPI_DIVISOR 16 +# define SPI_DRIVER SPID1 + +/* Set LED driver current */ +# define SNLED27351_CURRENT_TUNE \ + { 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28 } + +/* Set to infinit, which is use in USB mode by default */ +# define RGB_MATRIX_TIMEOUT RGB_MATRIX_TIMEOUT_INFINITE + +/* Allow shutdown of led driver to save power */ +# define RGB_MATRIX_DRIVER_SHUTDOWN_ENABLE +/* Turn off backlight on low brightness to save power */ +# define RGB_MATRIX_BRIGHTNESS_TURN_OFF_VAL 32 + +/* Indications */ +# define NUM_LOCK_INDEX 36 +# define CAPS_LOCK_INDEX 59 +# define LOW_BAT_IND_INDEX \ + { 98 } + +# define RGB_MATRIX_KEYPRESSES +# define RGB_MATRIX_FRAMEBUFFER_EFFECTS + +#endif diff --git a/keyboards/keychron/q6_max/ansi_encoder/info.json b/keyboards/keychron/q6_max/ansi_encoder/info.json new file mode 100644 index 0000000000..a438ce3c04 --- /dev/null +++ b/keyboards/keychron/q6_max/ansi_encoder/info.json @@ -0,0 +1,126 @@ +{ + "usb": { + "pid": "0x0860", + "device_version": "1.0.0" + }, + "layouts": { + "LAYOUT_109_ansi": { + "layout": [ + {"matrix": [0, 0], "x": 0, "y": 0}, + {"matrix": [0, 1], "x": 1.25, "y": 0}, + {"matrix": [0, 2], "x": 2.25, "y": 0}, + {"matrix": [0, 3], "x": 3.25, "y": 0}, + {"matrix": [0, 4], "x": 4.25, "y": 0}, + {"matrix": [0, 5], "x": 5.5, "y": 0}, + {"matrix": [0, 6], "x": 6.5, "y": 0}, + {"matrix": [0, 7], "x": 7.5, "y": 0}, + {"matrix": [0, 8], "x": 8.5, "y": 0}, + {"matrix": [0, 9], "x": 9.75, "y": 0}, + {"matrix": [0, 10], "x": 10.75, "y": 0}, + {"matrix": [0, 11], "x": 11.75, "y": 0}, + {"matrix": [0, 12], "x": 12.75, "y": 0}, + {"matrix": [0, 13], "x": 14, "y": 0}, + {"matrix": [0, 14], "x": 15.25, "y": 0}, + {"matrix": [0, 15], "x": 16.25, "y": 0}, + {"matrix": [0, 16], "x": 17.25, "y": 0}, + {"matrix": [0, 17], "x": 18.5, "y": 0}, + {"matrix": [0, 18], "x": 19.5, "y": 0}, + {"matrix": [0, 19], "x": 20.5, "y": 0}, + {"matrix": [3, 13], "x": 21.5, "y": 0}, + + {"matrix": [1, 0], "x": 0, "y": 1.25}, + {"matrix": [1, 1], "x": 1, "y": 1.25}, + {"matrix": [1, 2], "x": 2, "y": 1.25}, + {"matrix": [1, 3], "x": 3, "y": 1.25}, + {"matrix": [1, 4], "x": 4, "y": 1.25}, + {"matrix": [1, 5], "x": 5, "y": 1.25}, + {"matrix": [1, 6], "x": 6, "y": 1.25}, + {"matrix": [1, 7], "x": 7, "y": 1.25}, + {"matrix": [1, 8], "x": 8, "y": 1.25}, + {"matrix": [1, 9], "x": 9, "y": 1.25}, + {"matrix": [1, 10], "x": 10, "y": 1.25}, + {"matrix": [1, 11], "x": 11, "y": 1.25}, + {"matrix": [1, 12], "x": 12, "y": 1.25}, + {"matrix": [1, 13], "x": 13, "y": 1.25, "w": 2}, + {"matrix": [1, 14], "x": 15.25, "y": 1.25}, + {"matrix": [1, 15], "x": 16.25, "y": 1.25}, + {"matrix": [1, 16], "x": 17.25, "y": 1.25}, + {"matrix": [1, 17], "x": 18.5, "y": 1.25}, + {"matrix": [1, 18], "x": 19.5, "y": 1.25}, + {"matrix": [1, 19], "x": 20.5, "y": 1.25}, + {"matrix": [3, 14], "x": 21.5, "y": 1.25}, + + {"matrix": [2, 0], "x": 0, "y": 2.25, "w": 1.5}, + {"matrix": [2, 1], "x": 1.5, "y": 2.25}, + {"matrix": [2, 2], "x": 2.5, "y": 2.25}, + {"matrix": [2, 3], "x": 3.5, "y": 2.25}, + {"matrix": [2, 4], "x": 4.5, "y": 2.25}, + {"matrix": [2, 5], "x": 5.5, "y": 2.25}, + {"matrix": [2, 6], "x": 6.5, "y": 2.25}, + {"matrix": [2, 7], "x": 7.5, "y": 2.25}, + {"matrix": [2, 8], "x": 8.5, "y": 2.25}, + {"matrix": [2, 9], "x": 9.5, "y": 2.25}, + {"matrix": [2, 10], "x": 10.5, "y": 2.25}, + {"matrix": [2, 11], "x": 11.5, "y": 2.25}, + {"matrix": [2, 12], "x": 12.5, "y": 2.25}, + {"matrix": [2, 13], "x": 13.5, "y": 2.25, "w": 1.5}, + {"matrix": [2, 14], "x": 15.25, "y": 2.25}, + {"matrix": [2, 15], "x": 16.25, "y": 2.25}, + {"matrix": [2, 16], "x": 17.25, "y": 2.25}, + {"matrix": [2, 17], "x": 18.5, "y": 2.25}, + {"matrix": [2, 18], "x": 19.5, "y": 2.25}, + {"matrix": [2, 19], "x": 20.5, "y": 2.25}, + + {"matrix": [3, 0], "x": 0, "y": 3.25, "w": 1.75}, + {"matrix": [3, 1], "x": 1.75, "y": 3.25}, + {"matrix": [3, 2], "x": 2.75, "y": 3.25}, + {"matrix": [3, 3], "x": 3.75, "y": 3.25}, + {"matrix": [3, 4], "x": 4.75, "y": 3.25}, + {"matrix": [3, 5], "x": 5.75, "y": 3.25}, + {"matrix": [3, 6], "x": 6.75, "y": 3.25}, + {"matrix": [3, 7], "x": 7.75, "y": 3.25}, + {"matrix": [3, 8], "x": 8.75, "y": 3.25}, + {"matrix": [3, 9], "x": 9.75, "y": 3.25}, + {"matrix": [3, 10], "x": 10.75, "y": 3.25}, + {"matrix": [3, 11], "x": 11.75, "y": 3.25}, + {"matrix": [3, 12], "x": 12.75, "y": 3.25, "w": 2.25}, + {"matrix": [3, 17], "x": 18.5, "y": 3.25}, + {"matrix": [3, 18], "x": 19.5, "y": 3.25}, + {"matrix": [3, 19], "x": 20.5, "y": 3.25}, + {"matrix": [3, 15], "x": 21.5, "y": 2.25, "h": 2}, + + {"matrix": [4, 0], "x": 0, "y": 4.25, "w": 2.25}, + {"matrix": [4, 2], "x": 2.25, "y": 4.25}, + {"matrix": [4, 3], "x": 3.25, "y": 4.25}, + {"matrix": [4, 4], "x": 4.25, "y": 4.25}, + {"matrix": [4, 5], "x": 5.25, "y": 4.25}, + {"matrix": [4, 6], "x": 6.25, "y": 4.25}, + {"matrix": [4, 7], "x": 7.25, "y": 4.25}, + {"matrix": [4, 8], "x": 8.25, "y": 4.25}, + {"matrix": [4, 9], "x": 9.25, "y": 4.25}, + {"matrix": [4, 10], "x": 10.25, "y": 4.25}, + {"matrix": [4, 11], "x": 11.25, "y": 4.25}, + {"matrix": [4, 13], "x": 12.25, "y": 4.25, "w": 2.75}, + {"matrix": [4, 15], "x": 16.25, "y": 4.25}, + {"matrix": [4, 17], "x": 18.5, "y": 4.25}, + {"matrix": [4, 18], "x": 19.5, "y": 4.25}, + {"matrix": [4, 19], "x": 20.5, "y": 4.25}, + + {"matrix": [5, 0], "x": 0, "y": 5.25, "w": 1.25}, + {"matrix": [5, 1], "x": 1.25, "y": 5.25, "w": 1.25}, + {"matrix": [5, 2], "x": 2.5, "y": 5.25, "w": 1.25}, + {"matrix": [5, 6], "x": 3.75, "y": 5.25, "w": 6.25}, + {"matrix": [5, 10], "x": 10, "y": 5.25, "w": 1.25}, + {"matrix": [5, 11], "x": 11.25, "y": 5.25, "w": 1.25}, + {"matrix": [5, 12], "x": 12.5, "y": 5.25, "w": 1.25}, + {"matrix": [5, 13], "x": 13.75, "y": 5.25, "w": 1.25}, + {"matrix": [5, 14], "x": 15.25, "y": 5.25}, + {"matrix": [5, 15], "x": 16.25, "y": 5.25}, + {"matrix": [5, 16], "x": 17.25, "y": 5.25}, + {"matrix": [5, 18], "x": 18.5, "y": 5.25, "w": 2}, + {"matrix": [5, 19], "x": 20.5, "y": 5.25}, + {"matrix": [3, 16], "x": 21.5, "y": 4.25, "h": 2} + ] + } + } +} diff --git a/keyboards/keychron/q6_max/ansi_encoder/keymaps/default/keymap.c b/keyboards/keychron/q6_max/ansi_encoder/keymaps/default/keymap.c new file mode 100644 index 0000000000..70e2526b49 --- /dev/null +++ b/keyboards/keychron/q6_max/ansi_encoder/keymaps/default/keymap.c @@ -0,0 +1,74 @@ +/* Copyright 2024 @ Keychron (https://www.keychron.com) + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#include QMK_KEYBOARD_H +#include "keychron_common.h" + +enum layers { + MAC_BASE, + MAC_FN, + WIN_BASE, + WIN_FN, +}; + +// clang-format off +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + [MAC_BASE] = LAYOUT_109_ansi( + KC_ESC, KC_BRID, KC_BRIU, KC_MCTRL, KC_LNPAD, RGB_VAD, RGB_VAI, KC_MPRV, KC_MPLY, KC_MNXT, KC_MUTE, KC_VOLD, KC_VOLU, KC_MUTE, KC_SNAP, KC_SIRI, RGB_MOD, KC_F13, KC_F14, KC_F15, KC_F16, + KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, KC_INS, KC_HOME, KC_PGUP, KC_NUM, KC_PSLS, KC_PAST, KC_PMNS, + KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, KC_DEL, KC_END, KC_PGDN, KC_P7, KC_P8, KC_P9, + 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_P4, KC_P5, KC_P6, KC_PPLS, + 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_P1, KC_P2, KC_P3, + KC_LCTL, KC_LOPTN, KC_LCMMD, KC_SPC, KC_RCMMD, KC_ROPTN, MO(MAC_FN), KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT, KC_P0, KC_PDOT, KC_PENT), + [MAC_FN] = LAYOUT_109_ansi( + _______, 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_TOG, _______, _______, _______, _______, + _______, BT_HST1, BT_HST2, BT_HST3, P2P4G, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + RGB_TOG, RGB_MOD, RGB_VAI, RGB_HUI, RGB_SAI, RGB_SPI, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, RGB_RMOD, RGB_VAD, RGB_HUD, RGB_SAD, RGB_SPD, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, BAT_LVL, NK_TOGG, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______), + [WIN_BASE] = LAYOUT_109_ansi( + KC_ESC, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_MUTE, KC_PSCR, KC_CTANA, RGB_MOD, _______, _______, _______, _______, + KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, KC_INS, KC_HOME, KC_PGUP, KC_NUM, KC_PSLS, KC_PAST, KC_PMNS, + KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, KC_DEL, KC_END, KC_PGDN, KC_P7, KC_P8, KC_P9, + 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_P4, KC_P5, KC_P6, KC_PPLS, + 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_P1, KC_P2, KC_P3, + KC_LCTL, KC_LWIN, KC_LALT, KC_SPC, KC_RALT, KC_RWIN, MO(WIN_FN), KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT, KC_P0, KC_PDOT, KC_PENT), + [WIN_FN] = LAYOUT_109_ansi( + _______, 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, _______, _______, RGB_TOG, _______, _______, _______, _______, + _______, BT_HST1, BT_HST2, BT_HST3, P2P4G, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + RGB_TOG, RGB_MOD, RGB_VAI, RGB_HUI, RGB_SAI, RGB_SPI, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, RGB_RMOD, RGB_VAD, RGB_HUD, RGB_SAD, RGB_SPD, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, BAT_LVL, NK_TOGG, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______) +}; + +// clang-format on +#if defined(ENCODER_MAP_ENABLE) +const uint16_t PROGMEM encoder_map[][NUM_ENCODERS][2] = { + [MAC_BASE] = {ENCODER_CCW_CW(KC_VOLD, KC_VOLU)}, + [MAC_FN] = {ENCODER_CCW_CW(RGB_VAD, RGB_VAI)}, + [WIN_BASE] = {ENCODER_CCW_CW(KC_VOLD, KC_VOLU)}, + [WIN_FN] = {ENCODER_CCW_CW(RGB_VAD, RGB_VAI)}, +}; +#endif // ENCODER_MAP_ENABLE + +bool process_record_user(uint16_t keycode, keyrecord_t *record) { + if (!process_record_keychron_common(keycode, record)) { + return false; + } + return true; +} diff --git a/keyboards/keychron/q6_max/ansi_encoder/keymaps/via/keymap.c b/keyboards/keychron/q6_max/ansi_encoder/keymaps/via/keymap.c new file mode 100644 index 0000000000..70e2526b49 --- /dev/null +++ b/keyboards/keychron/q6_max/ansi_encoder/keymaps/via/keymap.c @@ -0,0 +1,74 @@ +/* Copyright 2024 @ Keychron (https://www.keychron.com) + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#include QMK_KEYBOARD_H +#include "keychron_common.h" + +enum layers { + MAC_BASE, + MAC_FN, + WIN_BASE, + WIN_FN, +}; + +// clang-format off +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + [MAC_BASE] = LAYOUT_109_ansi( + KC_ESC, KC_BRID, KC_BRIU, KC_MCTRL, KC_LNPAD, RGB_VAD, RGB_VAI, KC_MPRV, KC_MPLY, KC_MNXT, KC_MUTE, KC_VOLD, KC_VOLU, KC_MUTE, KC_SNAP, KC_SIRI, RGB_MOD, KC_F13, KC_F14, KC_F15, KC_F16, + KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, KC_INS, KC_HOME, KC_PGUP, KC_NUM, KC_PSLS, KC_PAST, KC_PMNS, + KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, KC_DEL, KC_END, KC_PGDN, KC_P7, KC_P8, KC_P9, + 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_P4, KC_P5, KC_P6, KC_PPLS, + 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_P1, KC_P2, KC_P3, + KC_LCTL, KC_LOPTN, KC_LCMMD, KC_SPC, KC_RCMMD, KC_ROPTN, MO(MAC_FN), KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT, KC_P0, KC_PDOT, KC_PENT), + [MAC_FN] = LAYOUT_109_ansi( + _______, 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_TOG, _______, _______, _______, _______, + _______, BT_HST1, BT_HST2, BT_HST3, P2P4G, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + RGB_TOG, RGB_MOD, RGB_VAI, RGB_HUI, RGB_SAI, RGB_SPI, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, RGB_RMOD, RGB_VAD, RGB_HUD, RGB_SAD, RGB_SPD, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, BAT_LVL, NK_TOGG, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______), + [WIN_BASE] = LAYOUT_109_ansi( + KC_ESC, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_MUTE, KC_PSCR, KC_CTANA, RGB_MOD, _______, _______, _______, _______, + KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, KC_INS, KC_HOME, KC_PGUP, KC_NUM, KC_PSLS, KC_PAST, KC_PMNS, + KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, KC_DEL, KC_END, KC_PGDN, KC_P7, KC_P8, KC_P9, + 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_P4, KC_P5, KC_P6, KC_PPLS, + 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_P1, KC_P2, KC_P3, + KC_LCTL, KC_LWIN, KC_LALT, KC_SPC, KC_RALT, KC_RWIN, MO(WIN_FN), KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT, KC_P0, KC_PDOT, KC_PENT), + [WIN_FN] = LAYOUT_109_ansi( + _______, 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, _______, _______, RGB_TOG, _______, _______, _______, _______, + _______, BT_HST1, BT_HST2, BT_HST3, P2P4G, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + RGB_TOG, RGB_MOD, RGB_VAI, RGB_HUI, RGB_SAI, RGB_SPI, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, RGB_RMOD, RGB_VAD, RGB_HUD, RGB_SAD, RGB_SPD, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, BAT_LVL, NK_TOGG, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______) +}; + +// clang-format on +#if defined(ENCODER_MAP_ENABLE) +const uint16_t PROGMEM encoder_map[][NUM_ENCODERS][2] = { + [MAC_BASE] = {ENCODER_CCW_CW(KC_VOLD, KC_VOLU)}, + [MAC_FN] = {ENCODER_CCW_CW(RGB_VAD, RGB_VAI)}, + [WIN_BASE] = {ENCODER_CCW_CW(KC_VOLD, KC_VOLU)}, + [WIN_FN] = {ENCODER_CCW_CW(RGB_VAD, RGB_VAI)}, +}; +#endif // ENCODER_MAP_ENABLE + +bool process_record_user(uint16_t keycode, keyrecord_t *record) { + if (!process_record_keychron_common(keycode, record)) { + return false; + } + return true; +} diff --git a/keyboards/keychron/q6_max/ansi_encoder/keymaps/via/rules.mk b/keyboards/keychron/q6_max/ansi_encoder/keymaps/via/rules.mk new file mode 100644 index 0000000000..1e5b99807c --- /dev/null +++ b/keyboards/keychron/q6_max/ansi_encoder/keymaps/via/rules.mk @@ -0,0 +1 @@ +VIA_ENABLE = yes diff --git a/keyboards/keychron/q6_max/ansi_encoder/rules.mk b/keyboards/keychron/q6_max/ansi_encoder/rules.mk new file mode 100644 index 0000000000..7ff128fa69 --- /dev/null +++ b/keyboards/keychron/q6_max/ansi_encoder/rules.mk @@ -0,0 +1 @@ +# This file intentionally left blank \ No newline at end of file diff --git a/keyboards/keychron/q6_max/board.h b/keyboards/keychron/q6_max/board.h new file mode 100644 index 0000000000..debc73961e --- /dev/null +++ b/keyboards/keychron/q6_max/board.h @@ -0,0 +1,226 @@ +/* Copyright 2024 @ Keychron (https://www.keychron.com) + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#pragma once + +#include_next + +// clang-format off + +/* Set GPIOA_SWDIO to INPUT and NOT FLOATING */ +#undef VAL_GPIOA_MODER +#define VAL_GPIOA_MODER (PIN_MODE_INPUT(GPIOA_BUTTON) | \ + PIN_MODE_INPUT(GPIOA_PIN1) | \ + PIN_MODE_INPUT(GPIOA_PIN2) | \ + PIN_MODE_INPUT(GPIOA_PIN3) | \ + PIN_MODE_ALTERNATE(GPIOA_CS43L22_LRCK) |\ + PIN_MODE_ALTERNATE(GPIOA_L3GD20_SCL) | \ + PIN_MODE_ALTERNATE(GPIOA_L3GD20_SD0) | \ + PIN_MODE_ALTERNATE(GPIOA_L3GD20_SDI) | \ + PIN_MODE_INPUT(GPIOA_PIN8) | \ + PIN_MODE_INPUT(GPIOA_VBUS_FS) | \ + PIN_MODE_ALTERNATE(GPIOA_OTG_FS_ID) | \ + PIN_MODE_ALTERNATE(GPIOA_OTG_FS_DM) | \ + PIN_MODE_ALTERNATE(GPIOA_OTG_FS_DP) | \ + PIN_MODE_INPUT(GPIOA_SWDIO) | \ + PIN_MODE_INPUT(GPIOA_SWCLK) | \ + PIN_MODE_INPUT(GPIOA_PIN15)) + +#undef VAL_GPIOA_PUPDR +#define VAL_GPIOA_PUPDR (PIN_PUPDR_FLOATING(GPIOA_BUTTON) | \ + PIN_PUPDR_PULLUP(GPIOA_PIN1) | \ + PIN_PUPDR_PULLUP(GPIOA_PIN2) | \ + PIN_PUPDR_PULLUP(GPIOA_PIN3) | \ + PIN_PUPDR_FLOATING(GPIOA_CS43L22_LRCK) |\ + PIN_PUPDR_FLOATING(GPIOA_L3GD20_SCL) | \ + PIN_PUPDR_PULLUP(GPIOA_L3GD20_SD0) | \ + PIN_PUPDR_PULLUP(GPIOA_L3GD20_SDI) | \ + PIN_PUPDR_PULLUP(GPIOA_PIN8) | \ + PIN_PUPDR_FLOATING(GPIOA_VBUS_FS) | \ + PIN_PUPDR_FLOATING(GPIOA_OTG_FS_ID) | \ + PIN_PUPDR_FLOATING(GPIOA_OTG_FS_DM) | \ + PIN_PUPDR_FLOATING(GPIOA_OTG_FS_DP) | \ + PIN_PUPDR_PULLUP(GPIOA_SWDIO) | \ + PIN_PUPDR_PULLUP(GPIOA_SWCLK) | \ + PIN_PUPDR_PULLUP(GPIOA_PIN15)) + +#undef VAL_GPIOB_MODER +#define VAL_GPIOB_MODER (PIN_MODE_INPUT(GPIOB_PIN0) | \ + PIN_MODE_INPUT(GPIOB_PIN1) | \ + PIN_MODE_INPUT(GPIOB_PIN2) | \ + PIN_MODE_INPUT(GPIOB_SWO) | \ + PIN_MODE_INPUT(GPIOB_PIN4) | \ + PIN_MODE_INPUT(GPIOB_PIN5) | \ + PIN_MODE_INPUT(GPIOB_LSM303DLHC_SCL) | \ + PIN_MODE_INPUT(GPIOB_PIN7) | \ + PIN_MODE_INPUT(GPIOB_PIN8) | \ + PIN_MODE_INPUT(GPIOB_LSM303DLHC_SDA) | \ + PIN_MODE_INPUT(GPIOB_MP45DT02_CLK_IN) |\ + PIN_MODE_INPUT(GPIOB_PIN11) | \ + PIN_MODE_INPUT(GPIOB_PIN12) | \ + PIN_MODE_INPUT(GPIOB_PIN13) | \ + PIN_MODE_INPUT(GPIOB_PIN14) | \ + PIN_MODE_INPUT(GPIOB_PIN15)) + +#undef VAL_GPIOB_PUPDR +#define VAL_GPIOB_PUPDR (PIN_PUPDR_PULLDOWN(GPIOB_PIN0) | \ + PIN_PUPDR_PULLDOWN(GPIOB_PIN1) | \ + PIN_PUPDR_PULLDOWN(GPIOB_PIN2) | \ + PIN_PUPDR_PULLDOWN(GPIOB_SWO) | \ + PIN_PUPDR_PULLDOWN(GPIOB_PIN4) | \ + PIN_PUPDR_PULLDOWN(GPIOB_PIN5) | \ + PIN_PUPDR_PULLDOWN(GPIOB_LSM303DLHC_SCL) |\ + PIN_PUPDR_PULLDOWN(GPIOB_PIN7) | \ + PIN_PUPDR_PULLDOWN(GPIOB_PIN8) | \ + PIN_PUPDR_PULLDOWN(GPIOB_LSM303DLHC_SDA) |\ + PIN_PUPDR_PULLDOWN(GPIOB_MP45DT02_CLK_IN) |\ + PIN_PUPDR_PULLDOWN(GPIOB_PIN11) | \ + PIN_PUPDR_PULLDOWN(GPIOB_PIN12) | \ + PIN_PUPDR_PULLDOWN(GPIOB_PIN13) | \ + PIN_PUPDR_PULLDOWN(GPIOB_PIN14) | \ + PIN_PUPDR_PULLDOWN(GPIOB_PIN15)) + +#undef VAL_GPIOB_AFRL +#define VAL_GPIOB_AFRL (PIN_AFIO_AF(GPIOB_PIN0, 0U) | \ + PIN_AFIO_AF(GPIOB_PIN1, 0U) | \ + PIN_AFIO_AF(GPIOB_PIN2, 0U) | \ + PIN_AFIO_AF(GPIOB_SWO, 0U) | \ + PIN_AFIO_AF(GPIOB_PIN4, 0U) | \ + PIN_AFIO_AF(GPIOB_PIN5, 0U) | \ + PIN_AFIO_AF(GPIOB_LSM303DLHC_SCL, 0) | \ + PIN_AFIO_AF(GPIOB_PIN7, 0U)) + +#undef VAL_GPIOB_AFRH +#define VAL_GPIOB_AFRH (PIN_AFIO_AF(GPIOB_PIN8, 0U) | \ + PIN_AFIO_AF(GPIOB_LSM303DLHC_SDA, 0) | \ + PIN_AFIO_AF(GPIOB_MP45DT02_CLK_IN, 0U) |\ + PIN_AFIO_AF(GPIOB_PIN11, 0U) | \ + PIN_AFIO_AF(GPIOB_PIN12, 0U) | \ + PIN_AFIO_AF(GPIOB_PIN13, 0U) | \ + PIN_AFIO_AF(GPIOB_PIN14, 0U) | \ + PIN_AFIO_AF(GPIOB_PIN15, 0U)) + +/* C5 Need to be pulldown */ +#undef VAL_GPIOC_MODER +#define VAL_GPIOC_MODER (PIN_MODE_INPUT(GPIOC_OTG_FS_POWER_ON) |\ + PIN_MODE_INPUT(GPIOC_PIN1) | \ + PIN_MODE_INPUT(GPIOC_PIN2) | \ + PIN_MODE_INPUT(GPIOC_CS43L22_AIN4x) | \ + PIN_MODE_INPUT(GPIOC_PIN4) | \ + PIN_MODE_INPUT(GPIOC_PIN5) | \ + PIN_MODE_INPUT(GPIOC_PIN6) | \ + PIN_MODE_INPUT(GPIOC_CS43L22_MCLK) | \ + PIN_MODE_INPUT(GPIOC_PIN8) | \ + PIN_MODE_INPUT(GPIOC_PIN9) | \ + PIN_MODE_INPUT(GPIOC_CS43L22_SCLK) | \ + PIN_MODE_INPUT(GPIOC_PIN11) | \ + PIN_MODE_INPUT(GPIOC_CS43L22_SDIN) | \ + PIN_MODE_INPUT(GPIOC_PIN13) | \ + PIN_MODE_INPUT(GPIOC_OSC32_IN) | \ + PIN_MODE_INPUT(GPIOC_OSC32_OUT)) + +#undef VAL_GPIOC_PUPDR +#define VAL_GPIOC_PUPDR (PIN_PUPDR_PULLUP(GPIOC_OTG_FS_POWER_ON) |\ + PIN_PUPDR_PULLUP(GPIOC_PIN1) | \ + PIN_PUPDR_PULLUP(GPIOC_PIN2) | \ + PIN_PUPDR_PULLUP(GPIOC_CS43L22_AIN4x) |\ + PIN_PUPDR_PULLUP(GPIOC_PIN4) | \ + PIN_PUPDR_PULLDOWN(GPIOC_PIN5) | \ + PIN_PUPDR_PULLUP(GPIOC_PIN6) | \ + PIN_PUPDR_PULLUP(GPIOC_CS43L22_MCLK) | \ + PIN_PUPDR_PULLUP(GPIOC_PIN8) | \ + PIN_PUPDR_PULLDOWN(GPIOC_PIN9) | \ + PIN_PUPDR_PULLUP(GPIOC_CS43L22_SCLK) | \ + PIN_PUPDR_PULLUP(GPIOC_PIN11) | \ + PIN_PUPDR_PULLUP(GPIOC_CS43L22_SDIN) | \ + PIN_PUPDR_PULLUP(GPIOC_PIN13) | \ + PIN_PUPDR_PULLUP(GPIOC_OSC32_IN) | \ + PIN_PUPDR_PULLUP(GPIOC_OSC32_OUT)) + +/* Set all GPIOD pins to INPUT & PULLUP to avoid FLOATING */ +#undef VAL_GPIOD_MODER +#define VAL_GPIOD_MODER (PIN_MODE_INPUT(GPIOD_PIN0) | \ + PIN_MODE_INPUT(GPIOD_PIN1) | \ + PIN_MODE_INPUT(GPIOD_PIN2) | \ + PIN_MODE_INPUT(GPIOD_PIN3) | \ + PIN_MODE_INPUT(GPIOD_CS43L22_RESET) | \ + PIN_MODE_INPUT(GPIOD_OverCurrent) | \ + PIN_MODE_INPUT(GPIOD_PIN6) | \ + PIN_MODE_INPUT(GPIOD_PIN7) | \ + PIN_MODE_INPUT(GPIOD_PIN8) | \ + PIN_MODE_INPUT(GPIOD_PIN9) | \ + PIN_MODE_INPUT(GPIOD_PIN10) | \ + PIN_MODE_INPUT(GPIOD_PIN11) | \ + PIN_MODE_INPUT(GPIOD_LED4) | \ + PIN_MODE_INPUT(GPIOD_LED3) | \ + PIN_MODE_INPUT(GPIOD_LED5) | \ + PIN_MODE_INPUT(GPIOD_LED6)) + +#undef VAL_GPIOD_PUPDR +#define VAL_GPIOD_PUPDR (PIN_PUPDR_PULLUP(GPIOD_PIN0) | \ + PIN_PUPDR_PULLUP(GPIOD_PIN1) | \ + PIN_PUPDR_PULLUP(GPIOD_PIN2) | \ + PIN_PUPDR_PULLUP(GPIOD_PIN3) | \ + PIN_PUPDR_PULLUP(GPIOD_CS43L22_RESET) |\ + PIN_PUPDR_PULLUP(GPIOD_OverCurrent) | \ + PIN_PUPDR_PULLUP(GPIOD_PIN6) | \ + PIN_PUPDR_PULLUP(GPIOD_PIN7) | \ + PIN_PUPDR_PULLUP(GPIOD_PIN8) | \ + PIN_PUPDR_PULLUP(GPIOD_PIN9) | \ + PIN_PUPDR_PULLUP(GPIOD_PIN10) | \ + PIN_PUPDR_PULLUP(GPIOD_PIN11) | \ + PIN_PUPDR_PULLUP(GPIOD_LED4) | \ + PIN_PUPDR_PULLUP(GPIOD_LED3) | \ + PIN_PUPDR_PULLUP(GPIOD_LED5) | \ + PIN_PUPDR_PULLUP(GPIOD_LED6)) + +/* Set all GPIOE pins to INPUT & PULLUP to avoid FLOATING */ +#undef VAL_GPIOE_MODER +#define VAL_GPIOE_MODER (PIN_MODE_INPUT(GPIOE_L3GD20_INT1) | \ + PIN_MODE_INPUT(GPIOE_L3GD20_INT2) | \ + PIN_MODE_INPUT(GPIOE_LSM303DLHC_DRDY) |\ + PIN_MODE_INPUT(GPIOE_L3GD20_CS) | \ + PIN_MODE_INPUT(GPIOE_LSM303DLHC_INT1) |\ + PIN_MODE_INPUT(GPIOE_LSM303DLHC_INT2) |\ + PIN_MODE_INPUT(GPIOE_PIN6) | \ + PIN_MODE_INPUT(GPIOE_PIN7) | \ + PIN_MODE_INPUT(GPIOE_PIN8) | \ + PIN_MODE_INPUT(GPIOE_PIN9) | \ + PIN_MODE_INPUT(GPIOE_PIN10) | \ + PIN_MODE_INPUT(GPIOE_PIN11) | \ + PIN_MODE_INPUT(GPIOE_PIN12) | \ + PIN_MODE_INPUT(GPIOE_PIN13) | \ + PIN_MODE_INPUT(GPIOE_PIN14) | \ + PIN_MODE_INPUT(GPIOE_PIN15)) + +#undef VAL_GPIOE_PUPDR +#define VAL_GPIOE_PUPDR (PIN_PUPDR_PULLUP(GPIOE_L3GD20_INT1) | \ + PIN_PUPDR_PULLUP(GPIOE_L3GD20_INT2) | \ + PIN_PUPDR_PULLUP(GPIOE_LSM303DLHC_DRDY) |\ + PIN_PUPDR_PULLUP(GPIOE_L3GD20_CS) | \ + PIN_PUPDR_PULLUP(GPIOE_LSM303DLHC_INT1) |\ + PIN_PUPDR_PULLUP(GPIOE_LSM303DLHC_INT2) |\ + PIN_PUPDR_PULLUP(GPIOE_PIN6) | \ + PIN_PUPDR_PULLUP(GPIOE_PIN7) | \ + PIN_PUPDR_PULLUP(GPIOE_PIN8) | \ + PIN_PUPDR_PULLUP(GPIOE_PIN9) | \ + PIN_PUPDR_PULLUP(GPIOE_PIN10) | \ + PIN_PUPDR_PULLUP(GPIOE_PIN11) | \ + PIN_PUPDR_PULLUP(GPIOE_PIN12) | \ + PIN_PUPDR_PULLUP(GPIOE_PIN13) | \ + PIN_PUPDR_PULLUP(GPIOE_PIN14) | \ + PIN_PUPDR_PULLUP(GPIOE_PIN15)) + diff --git a/keyboards/keychron/q6_max/config.h b/keyboards/keychron/q6_max/config.h new file mode 100644 index 0000000000..cfe6bff545 --- /dev/null +++ b/keyboards/keychron/q6_max/config.h @@ -0,0 +1,84 @@ +/* Copyright 2024 @ Keychron (https://www.keychron.com) + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#pragma once + +/* Encoder Configuration */ +#define ENCODER_DEFAULT_POS 0x3 +#define ENCODER_MAP_KEY_DELAY 2 + +#ifdef LK_WIRELESS_ENABLE +/* Hardware configuration */ +# define P2P4_MODE_SELECT_PIN A10 +# define BT_MODE_SELECT_PIN A9 + +# define LKBT51_RESET_PIN C4 +# define LKBT51_INT_INPUT_PIN B1 +# define BLUETOOTH_INT_OUTPUT_PIN A4 + +# define USB_POWER_SENSE_PIN B0 +# define USB_POWER_CONNECTED_LEVEL 0 + +# define BAT_LOW_LED_PIN C9 +# define BAT_LOW_LED_PIN_ON_STATE 1 + +# define BAT_CHARGING_PIN B13 +# define BAT_CHARGING_LEVEL 0 + +# define BT_HOST_DEVICES_COUNT 3 + +# if defined(RGB_MATRIX_ENABLE) || defined(LED_MATRIX_ENABLE) + +# define LED_DRIVER_SHUTDOWN_PIN B7 + +# define BT_HOST_LED_MATRIX_LIST \ + { 20, 21, 22 } + +# define P2P4G_HOST_LED_MATRIX_LIST \ + { 23 } + +# define BAT_LEVEL_LED_LIST \ + { 20, 21, 22, 23, 24, 25, 26, 27, 28, 29 } + +/* Backlit disable timeout when keyboard is disconnected(unit: second) */ +# define DISCONNECTED_BACKLIGHT_DISABLE_TIMEOUT 40 + +/* Backlit disable timeout when keyboard is connected(unit: second) */ +# define CONNECTED_BACKLIGHT_DISABLE_TIMEOUT 600 + +/* Reinit LED driver on tranport changed */ +# define REINIT_LED_DRIVER 1 + +# endif + +/* Keep USB connection in blueooth mode */ +# define KEEP_USB_CONNECTION_IN_WIRELESS_MODE + +/* Enable bluetooth NKRO */ +# define WIRELESS_NKRO_ENABLE + +/* Raw hid command for factory test and bluetooth DFU */ +# define RAW_HID_CMD 0xAA ... 0xAB +#else +/* Raw hid command for factory test */ +# define RAW_HID_CMD 0xAB +#endif + +/* Factory test keys */ +#define FN_KEY_1 MO(1) +#define FN_KEY_2 MO(3) + +#define MATRIX_IO_DELAY 10 diff --git a/keyboards/keychron/q6_max/halconf.h b/keyboards/keychron/q6_max/halconf.h new file mode 100644 index 0000000000..37bcc7c47b --- /dev/null +++ b/keyboards/keychron/q6_max/halconf.h @@ -0,0 +1,31 @@ +/* Copyright 2024 @ 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 + +#define _CHIBIOS_HAL_CONF_VER_8_0_ + +#define HAL_USE_SPI TRUE + +#ifdef LK_WIRELESS_ENABLE +# define HAL_USE_RTC TRUE +#endif + +#if defined(LK_WIRELESS_ENABLE) || defined(ENCODER_ENABLE) +# define PAL_USE_CALLBACKS TRUE +#endif + +#include_next diff --git a/keyboards/keychron/q6_max/info.json b/keyboards/keychron/q6_max/info.json new file mode 100644 index 0000000000..70e8af3f79 --- /dev/null +++ b/keyboards/keychron/q6_max/info.json @@ -0,0 +1,77 @@ +{ + "keyboard_name": "Keychron Q6 Max", + "manufacturer": "Keychron", + "url": "https://github.com/Keychron", + "maintainer": "lokher", + "processor": "STM32F401", + "bootloader": "stm32-dfu", + "usb": { + "vid": "0x3434" + }, + "features": { + "bootmagic": true, + "extrakey" : true, + "mousekey" : true, + "dip_switch" : true, + "encoder": true, + "encoder_map": true, + "nkro" : true, + "rgb_matrix": true, + "raw" : true, + "sendstring" : true + }, + "matrix_pins": { + "cols": ["C6", "C7", "C8", "A13", "A14", "A15", "C10", "C11", "C13", "C14", "C15", "C0", "C1", "C2", "C3", "A0", "A1", "A2", "A3", "B10"], + "rows": ["C12", "D2", "B3", "B4", "B5", "B6"] + }, + "diode_direction": "ROW2COL", + "encoder": { + "rotary": [ + { + "pin_a": "B14", + "pin_b": "B15" + } + ] + }, + "dip_switch" :{ + "pins": ["B12"] + }, + "rgb_matrix": { + "driver": "snled27351_spi", + "sleep": true, + "animations": { + "band_spiral_val": true, + "breathing": true, + "cycle_all": true, + "cycle_left_right": true, + "cycle_out_in": true, + "cycle_out_in_dual": true, + "cycle_pinwheel": true, + "cycle_spiral": true, + "cycle_up_down": true, + "digital_rain": true, + "dual_beacon": true, + "jellybean_raindrops": true, + "pixel_rain": true, + "rainbow_beacon": true, + "rainbow_moving_chevron": true, + "solid_reactive_multinexus": true, + "solid_reactive_multiwide": true, + "solid_reactive_simple": true, + "solid_splash": true, + "splash": true, + "typing_heatmap": true + } + }, + "eeprom": { + "wear_leveling": { + "driver": "embedded_flash", + "logical_size": 2048, + "backing_size": 4096 + } + }, + "build": { + "debounce_type": "sym_eager_pk" + }, + "debounce": 20 +} diff --git a/keyboards/keychron/q6_max/mcuconf.h b/keyboards/keychron/q6_max/mcuconf.h new file mode 100644 index 0000000000..89294ee64b --- /dev/null +++ b/keyboards/keychron/q6_max/mcuconf.h @@ -0,0 +1,37 @@ +/* Copyright 2024 @ 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_next + +#undef STM32_HSECLK +#define STM32_HSECLK 16000000 + +#undef STM32_PLLM_VALUE +#define STM32_PLLM_VALUE 8 + +#undef STM32_PLLN_VALUE +#define STM32_PLLN_VALUE 96 + +#undef STM32_PLLP_VALUE +#define STM32_PLLP_VALUE 4 + +#undef STM32_PLLQ_VALUE +#define STM32_PLLQ_VALUE 4 + +#undef STM32_SPI_USE_SPI1 +#define STM32_SPI_USE_SPI1 TRUE diff --git a/keyboards/keychron/q6_max/q6_max.c b/keyboards/keychron/q6_max/q6_max.c new file mode 100644 index 0000000000..be15f9ad4a --- /dev/null +++ b/keyboards/keychron/q6_max/q6_max.c @@ -0,0 +1,84 @@ +/* Copyright 2024 @ 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" +#include "keychron_task.h" +#ifdef FACTORY_TEST_ENABLE +# include "factory_test.h" +# include "keychron_common.h" +#endif +#ifdef LK_WIRELESS_ENABLE +# include "lkbt51.h" +# include "wireless.h" +# include "keychron_wireless_common.h" +# include "battery.h" +#endif + +#define POWER_ON_LED_DURATION 3000 +static uint32_t power_on_indicator_timer; + +#ifdef DIP_SWITCH_ENABLE +bool dip_switch_update_kb(uint8_t index, bool active) { + if (index == 0) { + default_layer_set(1UL << (active ? 2 : 0)); + } + dip_switch_update_user(index, active); + + return true; +} +#endif + +void keyboard_post_init_kb(void) { +#ifdef LK_WIRELESS_ENABLE + palSetLineMode(P2P4_MODE_SELECT_PIN, PAL_MODE_INPUT); + palSetLineMode(BT_MODE_SELECT_PIN, PAL_MODE_INPUT); + + writePin(BAT_LOW_LED_PIN, BAT_LOW_LED_PIN_ON_STATE); + + lkbt51_init(false); + wireless_init(); +#endif + + power_on_indicator_timer = timer_read32(); +#ifdef ENCODER_ENABLE + encoder_cb_init(); +#endif + + keyboard_post_init_user(); +} + +bool keychron_task_kb(void) { + if (power_on_indicator_timer) { + if (timer_elapsed32(power_on_indicator_timer) > POWER_ON_LED_DURATION) { + power_on_indicator_timer = 0; + +#ifdef LK_WIRELESS_ENABLE + writePin(BAT_LOW_LED_PIN, !BAT_LOW_LED_PIN_ON_STATE); +#endif + } else { +#ifdef LK_WIRELESS_ENABLE + writePin(BAT_LOW_LED_PIN, BAT_LOW_LED_PIN_ON_STATE); +#endif + } + } + return true; +} + +#ifdef LK_WIRELESS_ENABLE +bool lpm_is_kb_idle(void) { + return power_on_indicator_timer == 0 && !factory_reset_indicating(); +} +#endif diff --git a/keyboards/keychron/q6_max/readme.md b/keyboards/keychron/q6_max/readme.md new file mode 100644 index 0000000000..e403583d6e --- /dev/null +++ b/keyboards/keychron/q6_max/readme.md @@ -0,0 +1,21 @@ +# Keychron Q6 Max + +![Keychron Q6 Max](https://cdn.shopify.com/s/files/1/0059/0630/1017/files/Keychron-Q6-Max-100_-Layout-QMK_VIA-Wireless-Custom-Mechanical-Keyboard-White.jpg?v=1705458447) + +A customizable 100% fullsize keyboard. + +* Keyboard Maintainer: [Keychron](https://github.com/keychron) +* Hardware Supported: Keychron Q6 Max +* Hardware Availability: [Keychron Q6 Max QMK/VIA Wireless Custom Mechanical Keyboard](https://www.keychron.com/products/keychron-q6-max-qmk-via-wireless-custom-mechanical-keyboard) + +Make example for this keyboard (after setting up your build environment): + + make keychron/q6_max/ansi_encoder:default + +Flashing example for this keyboard: + + make keychron/q6_max/ansi_encoder:default:flash + +**Reset Key**: Toggle mode switch to "Cable", hold down the *Esc* key or reset button underneath space bar while connecting the USB cable, + +See the [build environment setup](https://docs.qmk.fm/#/getting_started_build_tools) and the [make instructions](https://docs.qmk.fm/#/getting_started_make_guide) for more information. Brand new to QMK? Start with our [Complete Newbs Guide](https://docs.qmk.fm/#/newbs). diff --git a/keyboards/keychron/q6_max/rules.mk b/keyboards/keychron/q6_max/rules.mk new file mode 100644 index 0000000000..4eaf6820bc --- /dev/null +++ b/keyboards/keychron/q6_max/rules.mk @@ -0,0 +1,4 @@ +include keyboards/keychron/common/wireless/wireless.mk +include keyboards/keychron/common/keychron_common.mk + +VPATH += $(TOP_DIR)/keyboards/keychron diff --git a/keyboards/keychron/q6_max/via_json/q6_max_ansi_encoder.json b/keyboards/keychron/q6_max/via_json/q6_max_ansi_encoder.json new file mode 100644 index 0000000000..5254a68dfa --- /dev/null +++ b/keyboards/keychron/q6_max/via_json/q6_max_ansi_encoder.json @@ -0,0 +1,349 @@ +{ + "name": "Keychron Q6 Max ANSI Knob", + "vendorId": "0x3434", + "productId": "0x0860", + "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": "Misson Control", "title": "Misson Control in Mac", "shortName": "MCtl"}, + {"name": "Lanuch Pad", "title": "Lanuch Pad in Windows", "shortName": "LPad"}, + {"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": "2.4G", "title": "2.4G", "shortName": "2.4G"}, + {"name": "Battery Level", "title": "Show battery level", "shortName": "Batt"} + ], + "matrix": {"rows": 6, "cols" : 20}, + "layouts": { + "keymap": [ + [ + { + "c": "#777777" + }, + "0, 0", + { + "x": 0.25, + "c": "#aaaaaa" + }, + "0, 1", + "0, 2", + "0, 3", + "0, 4", + { + "x": 0.25, + "c": "#cccccc" + }, + "0, 5", + "0, 6", + "0, 7", + "0, 8", + { + "x": 0.25, + "c": "#aaaaaa" + }, + "0, 9", + "0, 10", + "0, 11", + "0, 12", + { + "x": 0.25, + "c": "#cccccc" + }, + "0, 13\n\n\n\n\n\n\n\n\ne0", + { + "x": 0.25 + }, + "0, 14", + "0, 15", + "0, 16", + { + "x": 0.25, + "c": "#aaaaaa" + }, + "0, 17", + "0, 18", + "0, 19", + "3, 13" + ], + [ + { + "y": 0.25, + "c": "#cccccc" + }, + "1, 0", + { + "c": "#aaaaaa" + }, + "1, 1", + "1, 2", + "1, 3", + "1, 4", + "1, 5", + "1, 6", + "1, 7", + "1, 8", + "1, 9", + "1, 10", + "1, 11", + "1, 12", + { + "w": 2, + "c": "#cccccc" + }, + "1, 13", + { + "x": 0.25 + }, + "1, 14", + "1, 15", + "1, 16", + { + "x": 0.25, + "c": "#aaaaaa" + }, + "1, 17", + "1, 18", + "1, 19", + "3, 14" + ], + [ + { + "w": 1.5, + "c": "#cccccc" + }, + "2, 0", + { + "c": "#aaaaaa" + }, + "2, 1", + "2, 2", + "2, 3", + "2, 4", + "2, 5", + "2, 6", + "2, 7", + "2, 8", + "2, 9", + "2, 10", + "2, 11", + "2, 12", + { + "w": 1.5, + "c": "#cccccc" + }, + "2, 13", + { + "x": 0.25 + }, + "2, 14", + "2, 15", + "2, 16", + { + "x": 0.25, + "c": "#aaaaaa" + }, + "2, 17", + "2, 18", + "2, 19", + { + "h": 2, + "c": "#aaaaaa" + }, + "3, 15" + ], + [ + { + "w": 1.75, + "c": "#cccccc" + }, + "3, 0", + { + "c": "#aaaaaa" + }, + "3, 1", + "3, 2", + "3, 3", + "3, 4", + "3, 5", + "3, 6", + "3, 7", + "3, 8", + "3, 9", + "3, 10", + "3, 11", + { + "w": 2.25, + "c": "#777777" + }, + "3, 12", + { + "x": 3.5, + "c": "#aaaaaa" + }, + "3, 17", + "3, 18", + "3, 19" + ], + [ + { + "w": 2.25, + "c": "#cccccc" + }, + "4, 0", + { + "c": "#aaaaaa" + }, + "4, 2", + "4, 3", + "4, 4", + "4, 5", + "4, 6", + "4, 7", + "4, 8", + "4, 9", + "4, 10", + "4, 11", + { + "w": 2.75, + "c": "#cccccc" + }, + "4, 13", + { + "x": 1.25, + "c": "#aaaaaa" + }, + "4, 15", + { + "x": 1.25 + }, + "4, 17", + "4, 18", + "4, 19", + { + "h": 2 + }, + "3, 16" + ], + [ + { + "w": 1.25, + "c": "#cccccc" + }, + "5, 0", + { + "w": 1.25 + }, + "5, 1", + { + "w": 1.25 + }, + "5, 2", + { + "w": 6.25, + "c": "#aaaaaa" + }, + "5, 6", + { + "w": 1.25, + "c": "#cccccc" + }, + "5, 10", + { + "w": 1.25 + }, + "5, 11", + { + "w": 1.25, + "c": "#cccccc" + }, + "5, 12", + { + "w": 1.25 + }, + "5, 13", + { + "x": 0.25, + "c": "#aaaaaa" + }, + "5, 14", + "5, 15", + "5, 16", + { + "x": 0.25, + "w": 2 + }, + "5, 18", + "5, 19" + ] + ] + } + } diff --git a/keyboards/keychron/q8_max/ansi_encoder/ansi_encoder.c b/keyboards/keychron/q8_max/ansi_encoder/ansi_encoder.c new file mode 100644 index 0000000000..cd368ec051 --- /dev/null +++ b/keyboards/keychron/q8_max/ansi_encoder/ansi_encoder.c @@ -0,0 +1,131 @@ +/* Copyright 2024 @ Keychron (https://www.keychron.com) + * + * This program is free software : you can redistribute it and /or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program.If not, see < http://www.gnu.org/licenses/>. + */ + +#include "quantum.h" + +// clang-format off + +#ifdef RGB_MATRIX_ENABLE +const snled27351_led_t g_snled27351_leds[RGB_MATRIX_LED_COUNT] = { +/* Refer to SNLED27351 manual for these locations + * driver + * | R location + * | | G location + * | | | B location + * | | | | */ + {0, L_2, J_2, K_2}, + {0, L_3, J_3, K_3}, + {0, L_4, J_4, K_4}, + {0, L_5, J_5, K_5}, + {0, L_6, J_6, K_6}, + {0, L_7, J_7, K_7}, + {0, L_8, J_8, K_8}, + {0, L_9, J_9, K_9}, + {0, L_10, J_10, K_10}, + {0, L_11, J_11, K_11}, + {0, L_12, J_12, K_12}, + {0, L_13, J_13, K_13}, + {0, L_14, J_14, K_14}, + {0, L_15, J_15, K_15}, + + {0, C_2, A_2, B_2}, + {0, C_3, A_3, B_3}, + {0, C_4, A_4, B_4}, + {0, C_5, A_5, B_5}, + {0, C_6, A_6, B_6}, + {0, C_7, A_7, B_7}, + {0, C_8, A_8, B_8}, + {0, C_9, A_9, B_9}, + {0, C_10, A_10, B_10}, + {0, C_11, A_11, B_11}, + {0, C_12, A_12, B_12}, + {0, C_13, A_13, B_13}, + {0, C_14, A_14, B_14}, + {0, C_15, A_15, B_15}, + {0, 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_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_4, A_4, B_4}, + {1, C_3, A_3, B_3}, + {1, C_2, A_2, B_2}, + {1, C_1, A_1, B_1}, + + {1, I_15, G_15, H_15}, + {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_4, G_4, H_4}, + {1, I_3, G_3, H_3}, + {1, I_2, G_2, H_2}, + {1, I_1, G_1, H_1}, + + {1, F_15, D_15, E_15}, + {1, F_14, D_14, E_14}, + {1, F_13, D_13, E_13}, + {1, F_12, D_12, E_12}, + {1, F_9, D_9, E_9}, + {1, F_8, D_8, E_8}, + {1, F_7, D_7, E_7}, + {1, F_6, D_6, E_6}, + {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, 67 }, + }, + { + // LED Index to Physical Position + {7, 1}, {20, 1}, {33, 0}, {47, 3}, {60, 6}, {73, 8}, { 86,11}, {107,11}, {120, 8}, {133, 6}, {146, 3}, {160, 0}, {173, 1}, {193, 1}, + {7,14}, {24,14}, {38,14}, {51,17}, {64,20}, {77,22}, {103,25}, {116,22}, {129,19}, {142,17}, {155,14}, {170,14}, {183,14}, {200,14}, {222,16}, + {6,27}, {24,27}, {39,28}, {52,30}, {65,33}, {78,36}, {109,37}, {122,34}, {135,31}, {148,29}, {162,27}, {176,27}, {197,27}, {224,29}, + {7,40}, {28,40}, {43,41}, {56,44}, {69,47}, { 82,49}, {102,51}, {115,49}, {128,46}, {141,43}, {154,41}, {169,40}, {187,40}, {209,43}, + {0,53}, {17,53}, {42,54}, {64,59}, { 85,63}, {105,64}, {129,59}, {154,54}, {196,56}, {209,56}, {222,56} + }, + { + // RGB LED Index to Flag + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 + } +}; +#endif diff --git a/keyboards/keychron/q8_max/ansi_encoder/config.h b/keyboards/keychron/q8_max/ansi_encoder/config.h new file mode 100644 index 0000000000..442e71143b --- /dev/null +++ b/keyboards/keychron/q8_max/ansi_encoder/config.h @@ -0,0 +1,56 @@ +/* Copyright 2024 @ Keychron (https://www.keychron.com) + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#pragma once + +#ifdef RGB_MATRIX_ENABLE +/* RGB Matrix driver configuration */ +# define DRIVER_COUNT 2 +# define RGB_MATRIX_LED_COUNT 68 + +# define SPI_SCK_PIN A5 +# define SPI_MISO_PIN A6 +# define SPI_MOSI_PIN A7 + +# define DRIVER_CS_PINS \ + { B8, B10 } +# define SNLED23751_SPI_DIVISOR 16 +# define SPI_DRIVER SPID1 + +/* Scan phase of led driver set as MSKPHASE_9CHANNEL(defined as 0x03 in snled27351.h) */ +# define SNLED27351_PHASE_CHANNEL MSKPHASE_12CHANNEL + +/* Set LED driver current */ +# define SNLED27351_CURRENT_TUNE \ + { 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40 } + +/* Set to infinit, which is use in USB mode by default */ +# define RGB_MATRIX_TIMEOUT RGB_MATRIX_TIMEOUT_INFINITE + +/* Allow shutdown of led driver to save power */ +# define RGB_MATRIX_DRIVER_SHUTDOWN_ENABLE +/* Turn off backlight on low brightness to save power */ +# define RGB_MATRIX_BRIGHTNESS_TURN_OFF_VAL 32 + +/* Indications */ +# define CAPS_LOCK_INDEX 29 +# define LOW_BAT_IND_INDEX \ + { 60, 63 } + +# define RGB_MATRIX_KEYPRESSES +# define RGB_MATRIX_FRAMEBUFFER_EFFECTS + +#endif diff --git a/keyboards/keychron/q8_max/ansi_encoder/info.json b/keyboards/keychron/q8_max/ansi_encoder/info.json new file mode 100644 index 0000000000..628e911786 --- /dev/null +++ b/keyboards/keychron/q8_max/ansi_encoder/info.json @@ -0,0 +1,85 @@ +{ + "usb": { + "pid": "0x0880", + "device_version": "1.0.0" + }, + "layouts": { + "LAYOUT_ansi_69": { + "layout": [ + {"matrix": [0, 0], "x": 0, "y": 0}, + {"matrix": [0, 1], "x": 1, "y": 0}, + {"matrix": [0, 2], "x": 2, "y": 0}, + {"matrix": [0, 3], "x": 3, "y": 0.25}, + {"matrix": [0, 4], "x": 4, "y": 0.25}, + {"matrix": [0, 5], "x": 5, "y": 0.5}, + {"matrix": [0, 6], "x": 6, "y": 0.75}, + {"matrix": [0, 7], "x": 7.5, "y": 0.75}, + {"matrix": [0, 8], "x": 8.5, "y": 0.5}, + {"matrix": [0, 9], "x": 9.5, "y": 0.25}, + {"matrix": [0, 10], "x": 10.5, "y": 0.25}, + {"matrix": [0, 11], "x": 11.5, "y": 0}, + {"matrix": [0, 12], "x": 12.5, "y": 0}, + {"matrix": [0, 13], "x": 13.5, "y": 0, "w": 2}, + {"matrix": [0, 14], "x": 16, "y": 0}, + + {"matrix": [1, 0], "x": -0.25, "y": 1, "w": 1.5}, + {"matrix": [1, 1], "x": 1.25, "y": 1}, + {"matrix": [1, 2], "x": 2.25, "y": 1}, + {"matrix": [1, 3], "x": 3.25, "y": 1.25}, + {"matrix": [1, 4], "x": 4.25, "y": 1.5}, + {"matrix": [1, 5], "x": 5.25, "y": 1.75}, + {"matrix": [1, 6], "x": 7.25, "y": 1.75}, + {"matrix": [1, 7], "x": 8.25, "y": 1.75}, + {"matrix": [1, 8], "x": 9.25, "y": 1.5}, + {"matrix": [1, 9], "x": 10.25, "y": 1.25}, + {"matrix": [1, 10], "x": 11.25, "y": 1}, + {"matrix": [1, 11], "x": 12.25, "y": 1}, + {"matrix": [1, 12], "x": 13.25, "y": 1}, + {"matrix": [1, 13], "x": 14.25, "y": 1, "w": 1.5}, + {"matrix": [1, 14], "x": 16.25, "y": 1.25}, + + {"matrix": [2, 0], "x": -0.5, "y": 2, "w": 1.75}, + {"matrix": [2, 1], "x": 1.25, "y": 2}, + {"matrix": [2, 2], "x": 2.5, "y": 2}, + {"matrix": [2, 3], "x": 3.5, "y": 2.25}, + {"matrix": [2, 4], "x": 4.25, "y": 2.5}, + {"matrix": [2, 5], "x": 5.25, "y": 2.75}, + {"matrix": [2, 7], "x": 7.75, "y": 2.75}, + {"matrix": [2, 8], "x": 8.75, "y": 2.5}, + {"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}, + {"matrix": [2, 12], "x": 12.75, "y": 2}, + {"matrix": [2, 13], "x": 13.75, "y": 2, "w": 2.25}, + {"matrix": [2, 14], "x": 16.25, "y": 2.25}, + + {"matrix": [3, 0], "x": -0.75, "y": 3, "w": 2.25}, + {"matrix": [3, 2], "x": 1.5, "y": 3}, + {"matrix": [3, 3], "x": 2.75, "y": 3.25}, + {"matrix": [3, 4], "x": 3.75, "y": 3.25}, + {"matrix": [3, 5], "x": 4.75, "y": 3.5}, + {"matrix": [3, 6], "x": 5.5, "y": 3.75}, + {"matrix": [3, 7], "x": 7.25, "y": 4}, + {"matrix": [3, 8], "x": 8.25, "y": 3.75}, + {"matrix": [3, 9], "x": 9.25, "y": 3.5}, + {"matrix": [3, 10], "x": 10, "y": 3.25}, + {"matrix": [3, 11], "x": 11, "y": 3}, + {"matrix": [3, 12], "x": 12.25, "y": 3}, + {"matrix": [3, 13], "x": 13.25, "y": 3, "w": 1.75}, + {"matrix": [3, 14], "x": 15.25, "y": 3.25}, + + {"matrix": [4, 0], "x": -0.75, "y": 4, "w": 1.25}, + {"matrix": [4, 1], "x": 0.5, "y": 4, "w": 1.25}, + {"matrix": [4, 2], "x": 2.5, "y": 4.25, "w": 1.25}, + {"matrix": [4, 3], "x": 3.75, "y": 4.5, "w": 2.25}, + {"matrix": [4, 6], "x": 6, "y": 4.75}, + {"matrix": [4, 7], "x": 7.5, "y": 5}, + {"matrix": [4, 8], "x": 8.25, "y": 4.5, "w": 2.75}, + {"matrix": [4, 9], "x": 11, "y": 4}, + {"matrix": [4, 12], "x": 14.25, "y": 4.25}, + {"matrix": [4, 13], "x": 15.25, "y": 4.25}, + {"matrix": [4, 14], "x": 16.25, "y": 4.25} + ] + } + } +} diff --git a/keyboards/keychron/q8_max/ansi_encoder/keymaps/default/keymap.c b/keyboards/keychron/q8_max/ansi_encoder/keymaps/default/keymap.c new file mode 100644 index 0000000000..aca29a0cea --- /dev/null +++ b/keyboards/keychron/q8_max/ansi_encoder/keymaps/default/keymap.c @@ -0,0 +1,82 @@ +/* Copyright 2024 @ Keychron (https://www.keychron.com) + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#include QMK_KEYBOARD_H +#include "keychron_common.h" + +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_69( + 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_BSLS, 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_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_FN1), MO(FN2), KC_SPC, KC_RCMMD, KC_LEFT, KC_DOWN, KC_RGHT), + + [WIN_BASE] = LAYOUT_ansi_69( + 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_BSLS, 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_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_LWIN, KC_LALT, KC_SPC, MO(WIN_FN1), MO(FN2), KC_SPC, KC_RALT, KC_LEFT, KC_DOWN, KC_RGHT), + + [MAC_FN1] = LAYOUT_ansi_69( + KC_GRV, KC_BRID, KC_BRIU, KC_MCTRL,KC_LNPAD,RGB_VAD, RGB_VAI, KC_MPRV, KC_MPLY, KC_MNXT, KC_MUTE, KC_VOLD, KC_VOLU, _______, RGB_TOG, + _______, BT_HST1, BT_HST2, BT_HST3, P2P4G, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + RGB_TOG, RGB_MOD, RGB_VAI, RGB_HUI, RGB_SAI, RGB_SPI, _______, _______, _______, _______, _______, _______, _______, KC_END, + _______, RGB_RMOD, RGB_VAD, RGB_HUD, RGB_SAD, RGB_SPD, _______, NK_TOGG, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______), + + [WIN_FN1] = LAYOUT_ansi_69( + 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, P2P4G, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + RGB_TOG, RGB_MOD, RGB_VAI, RGB_HUI, RGB_SAI, RGB_SPI, _______, _______, _______, _______, _______, _______, _______, KC_END, + _______, RGB_RMOD, RGB_VAD, RGB_HUD, RGB_SAD, RGB_SPD, _______, NK_TOGG, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______), + + [FN2] = LAYOUT_ansi_69( + 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, _______, _______, + _______, BT_HST1, BT_HST2, BT_HST3, P2P4G, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, BAT_LVL, 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 + +// clang-format on +bool process_record_user(uint16_t keycode, keyrecord_t *record) { + if (!process_record_keychron_common(keycode, record)) { + return false; + } + return true; +} diff --git a/keyboards/keychron/q8_max/ansi_encoder/keymaps/via/keymap.c b/keyboards/keychron/q8_max/ansi_encoder/keymaps/via/keymap.c new file mode 100644 index 0000000000..aca29a0cea --- /dev/null +++ b/keyboards/keychron/q8_max/ansi_encoder/keymaps/via/keymap.c @@ -0,0 +1,82 @@ +/* Copyright 2024 @ Keychron (https://www.keychron.com) + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#include QMK_KEYBOARD_H +#include "keychron_common.h" + +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_69( + 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_BSLS, 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_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_FN1), MO(FN2), KC_SPC, KC_RCMMD, KC_LEFT, KC_DOWN, KC_RGHT), + + [WIN_BASE] = LAYOUT_ansi_69( + 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_BSLS, 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_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_LWIN, KC_LALT, KC_SPC, MO(WIN_FN1), MO(FN2), KC_SPC, KC_RALT, KC_LEFT, KC_DOWN, KC_RGHT), + + [MAC_FN1] = LAYOUT_ansi_69( + KC_GRV, KC_BRID, KC_BRIU, KC_MCTRL,KC_LNPAD,RGB_VAD, RGB_VAI, KC_MPRV, KC_MPLY, KC_MNXT, KC_MUTE, KC_VOLD, KC_VOLU, _______, RGB_TOG, + _______, BT_HST1, BT_HST2, BT_HST3, P2P4G, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + RGB_TOG, RGB_MOD, RGB_VAI, RGB_HUI, RGB_SAI, RGB_SPI, _______, _______, _______, _______, _______, _______, _______, KC_END, + _______, RGB_RMOD, RGB_VAD, RGB_HUD, RGB_SAD, RGB_SPD, _______, NK_TOGG, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______), + + [WIN_FN1] = LAYOUT_ansi_69( + 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, P2P4G, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + RGB_TOG, RGB_MOD, RGB_VAI, RGB_HUI, RGB_SAI, RGB_SPI, _______, _______, _______, _______, _______, _______, _______, KC_END, + _______, RGB_RMOD, RGB_VAD, RGB_HUD, RGB_SAD, RGB_SPD, _______, NK_TOGG, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______), + + [FN2] = LAYOUT_ansi_69( + 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, _______, _______, + _______, BT_HST1, BT_HST2, BT_HST3, P2P4G, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, BAT_LVL, 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 + +// clang-format on +bool process_record_user(uint16_t keycode, keyrecord_t *record) { + if (!process_record_keychron_common(keycode, record)) { + return false; + } + return true; +} diff --git a/keyboards/keychron/q8_max/ansi_encoder/keymaps/via/rules.mk b/keyboards/keychron/q8_max/ansi_encoder/keymaps/via/rules.mk new file mode 100644 index 0000000000..1e5b99807c --- /dev/null +++ b/keyboards/keychron/q8_max/ansi_encoder/keymaps/via/rules.mk @@ -0,0 +1 @@ +VIA_ENABLE = yes diff --git a/keyboards/keychron/q8_max/ansi_encoder/rules.mk b/keyboards/keychron/q8_max/ansi_encoder/rules.mk new file mode 100644 index 0000000000..7ff128fa69 --- /dev/null +++ b/keyboards/keychron/q8_max/ansi_encoder/rules.mk @@ -0,0 +1 @@ +# This file intentionally left blank \ No newline at end of file diff --git a/keyboards/keychron/q8_max/board.h b/keyboards/keychron/q8_max/board.h new file mode 100644 index 0000000000..54fba748bf --- /dev/null +++ b/keyboards/keychron/q8_max/board.h @@ -0,0 +1,226 @@ +/* Copyright 2024 @ Keychron (https://www.keychron.com) + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#pragma once + +#include_next + +// clang-format off + +/* Set GPIOA_SWDIO to INPUT and NOT FLOATING */ +#undef VAL_GPIOA_MODER +#define VAL_GPIOA_MODER (PIN_MODE_INPUT(GPIOA_BUTTON) | \ + PIN_MODE_INPUT(GPIOA_PIN1) | \ + PIN_MODE_INPUT(GPIOA_PIN2) | \ + PIN_MODE_INPUT(GPIOA_PIN3) | \ + PIN_MODE_ALTERNATE(GPIOA_CS43L22_LRCK) |\ + PIN_MODE_ALTERNATE(GPIOA_L3GD20_SCL) | \ + PIN_MODE_ALTERNATE(GPIOA_L3GD20_SD0) | \ + PIN_MODE_ALTERNATE(GPIOA_L3GD20_SDI) | \ + PIN_MODE_INPUT(GPIOA_PIN8) | \ + PIN_MODE_INPUT(GPIOA_VBUS_FS) | \ + PIN_MODE_ALTERNATE(GPIOA_OTG_FS_ID) | \ + PIN_MODE_ALTERNATE(GPIOA_OTG_FS_DM) | \ + PIN_MODE_ALTERNATE(GPIOA_OTG_FS_DP) | \ + PIN_MODE_INPUT(GPIOA_SWDIO) | \ + PIN_MODE_INPUT(GPIOA_SWCLK) | \ + PIN_MODE_INPUT(GPIOA_PIN15)) + +#undef VAL_GPIOA_PUPDR +#define VAL_GPIOA_PUPDR (PIN_PUPDR_FLOATING(GPIOA_BUTTON) | \ + PIN_PUPDR_PULLUP(GPIOA_PIN1) | \ + PIN_PUPDR_PULLUP(GPIOA_PIN2) | \ + PIN_PUPDR_PULLUP(GPIOA_PIN3) | \ + PIN_PUPDR_FLOATING(GPIOA_CS43L22_LRCK) |\ + PIN_PUPDR_FLOATING(GPIOA_L3GD20_SCL) | \ + PIN_PUPDR_PULLUP(GPIOA_L3GD20_SD0) | \ + PIN_PUPDR_PULLUP(GPIOA_L3GD20_SDI) | \ + PIN_PUPDR_PULLUP(GPIOA_PIN8) | \ + PIN_PUPDR_FLOATING(GPIOA_VBUS_FS) | \ + PIN_PUPDR_FLOATING(GPIOA_OTG_FS_ID) | \ + PIN_PUPDR_FLOATING(GPIOA_OTG_FS_DM) | \ + PIN_PUPDR_FLOATING(GPIOA_OTG_FS_DP) | \ + PIN_PUPDR_PULLUP(GPIOA_SWDIO) | \ + PIN_PUPDR_PULLUP(GPIOA_SWCLK) | \ + PIN_PUPDR_PULLUP(GPIOA_PIN15)) + +#undef VAL_GPIOB_MODER +#define VAL_GPIOB_MODER (PIN_MODE_INPUT(GPIOB_PIN0) | \ + PIN_MODE_INPUT(GPIOB_PIN1) | \ + PIN_MODE_INPUT(GPIOB_PIN2) | \ + PIN_MODE_INPUT(GPIOB_SWO) | \ + PIN_MODE_INPUT(GPIOB_PIN4) | \ + PIN_MODE_INPUT(GPIOB_PIN5) | \ + PIN_MODE_INPUT(GPIOB_LSM303DLHC_SCL) | \ + PIN_MODE_INPUT(GPIOB_PIN7) | \ + PIN_MODE_INPUT(GPIOB_PIN8) | \ + PIN_MODE_INPUT(GPIOB_LSM303DLHC_SDA) | \ + PIN_MODE_INPUT(GPIOB_MP45DT02_CLK_IN) |\ + PIN_MODE_INPUT(GPIOB_PIN11) | \ + PIN_MODE_INPUT(GPIOB_PIN12) | \ + PIN_MODE_INPUT(GPIOB_PIN13) | \ + PIN_MODE_INPUT(GPIOB_PIN14) | \ + PIN_MODE_INPUT(GPIOB_PIN15)) + +#undef VAL_GPIOB_PUPDR +#define VAL_GPIOB_PUPDR (PIN_PUPDR_PULLDOWN(GPIOB_PIN0) | \ + PIN_PUPDR_PULLDOWN(GPIOB_PIN1) | \ + PIN_PUPDR_PULLDOWN(GPIOB_PIN2) | \ + PIN_PUPDR_PULLDOWN(GPIOB_SWO) | \ + PIN_PUPDR_PULLDOWN(GPIOB_PIN4) | \ + PIN_PUPDR_PULLDOWN(GPIOB_PIN5) | \ + PIN_PUPDR_PULLDOWN(GPIOB_LSM303DLHC_SCL) |\ + PIN_PUPDR_PULLDOWN(GPIOB_PIN7) | \ + PIN_PUPDR_PULLDOWN(GPIOB_PIN8) | \ + PIN_PUPDR_PULLDOWN(GPIOB_LSM303DLHC_SDA) |\ + PIN_PUPDR_PULLDOWN(GPIOB_MP45DT02_CLK_IN) |\ + PIN_PUPDR_PULLDOWN(GPIOB_PIN11) | \ + PIN_PUPDR_PULLDOWN(GPIOB_PIN12) | \ + PIN_PUPDR_PULLDOWN(GPIOB_PIN13) | \ + PIN_PUPDR_PULLDOWN(GPIOB_PIN14) | \ + PIN_PUPDR_PULLDOWN(GPIOB_PIN15)) + +#undef VAL_GPIOB_AFRL +#define VAL_GPIOB_AFRL (PIN_AFIO_AF(GPIOB_PIN0, 0U) | \ + PIN_AFIO_AF(GPIOB_PIN1, 0U) | \ + PIN_AFIO_AF(GPIOB_PIN2, 0U) | \ + PIN_AFIO_AF(GPIOB_SWO, 0U) | \ + PIN_AFIO_AF(GPIOB_PIN4, 0U) | \ + PIN_AFIO_AF(GPIOB_PIN5, 0U) | \ + PIN_AFIO_AF(GPIOB_LSM303DLHC_SCL, 0) | \ + PIN_AFIO_AF(GPIOB_PIN7, 0U)) + +#undef VAL_GPIOB_AFRH +#define VAL_GPIOB_AFRH (PIN_AFIO_AF(GPIOB_PIN8, 0U) | \ + PIN_AFIO_AF(GPIOB_LSM303DLHC_SDA, 0) | \ + PIN_AFIO_AF(GPIOB_MP45DT02_CLK_IN, 0U) |\ + PIN_AFIO_AF(GPIOB_PIN11, 0U) | \ + PIN_AFIO_AF(GPIOB_PIN12, 0U) | \ + PIN_AFIO_AF(GPIOB_PIN13, 0U) | \ + PIN_AFIO_AF(GPIOB_PIN14, 0U) | \ + PIN_AFIO_AF(GPIOB_PIN15, 0U)) + +/* C5 Need to be pulldown */ +#undef VAL_GPIOC_MODER +#define VAL_GPIOC_MODER (PIN_MODE_INPUT(GPIOC_OTG_FS_POWER_ON) |\ + PIN_MODE_INPUT(GPIOC_PIN1) | \ + PIN_MODE_INPUT(GPIOC_PIN2) | \ + PIN_MODE_INPUT(GPIOC_CS43L22_AIN4x) | \ + PIN_MODE_INPUT(GPIOC_PIN4) | \ + PIN_MODE_INPUT(GPIOC_PIN5) | \ + PIN_MODE_INPUT(GPIOC_PIN6) | \ + PIN_MODE_INPUT(GPIOC_CS43L22_MCLK) | \ + PIN_MODE_INPUT(GPIOC_PIN8) | \ + PIN_MODE_INPUT(GPIOC_PIN9) | \ + PIN_MODE_INPUT(GPIOC_CS43L22_SCLK) | \ + PIN_MODE_INPUT(GPIOC_PIN11) | \ + PIN_MODE_INPUT(GPIOC_CS43L22_SDIN) | \ + PIN_MODE_INPUT(GPIOC_PIN13) | \ + PIN_MODE_INPUT(GPIOC_OSC32_IN) | \ + PIN_MODE_INPUT(GPIOC_OSC32_OUT)) + +#undef VAL_GPIOC_PUPDR +#define VAL_GPIOC_PUPDR (PIN_PUPDR_PULLUP(GPIOC_OTG_FS_POWER_ON) |\ + PIN_PUPDR_PULLUP(GPIOC_PIN1) | \ + PIN_PUPDR_PULLUP(GPIOC_PIN2) | \ + PIN_PUPDR_PULLUP(GPIOC_CS43L22_AIN4x) |\ + PIN_PUPDR_PULLUP(GPIOC_PIN4) | \ + PIN_PUPDR_PULLDOWN(GPIOC_PIN5) | \ + PIN_PUPDR_PULLUP(GPIOC_PIN6) | \ + PIN_PUPDR_PULLUP(GPIOC_CS43L22_MCLK) | \ + PIN_PUPDR_PULLUP(GPIOC_PIN8) | \ + PIN_PUPDR_PULLUP(GPIOC_PIN9) | \ + PIN_PUPDR_PULLUP(GPIOC_CS43L22_SCLK) | \ + PIN_PUPDR_PULLUP(GPIOC_PIN11) | \ + PIN_PUPDR_PULLUP(GPIOC_CS43L22_SDIN) | \ + PIN_PUPDR_PULLUP(GPIOC_PIN13) | \ + PIN_PUPDR_PULLUP(GPIOC_OSC32_IN) | \ + PIN_PUPDR_PULLUP(GPIOC_OSC32_OUT)) + +/* Set all GPIOD pins to INPUT & PULLUP to avoid FLOATING */ +#undef VAL_GPIOD_MODER +#define VAL_GPIOD_MODER (PIN_MODE_INPUT(GPIOD_PIN0) | \ + PIN_MODE_INPUT(GPIOD_PIN1) | \ + PIN_MODE_INPUT(GPIOD_PIN2) | \ + PIN_MODE_INPUT(GPIOD_PIN3) | \ + PIN_MODE_INPUT(GPIOD_CS43L22_RESET) | \ + PIN_MODE_INPUT(GPIOD_OverCurrent) | \ + PIN_MODE_INPUT(GPIOD_PIN6) | \ + PIN_MODE_INPUT(GPIOD_PIN7) | \ + PIN_MODE_INPUT(GPIOD_PIN8) | \ + PIN_MODE_INPUT(GPIOD_PIN9) | \ + PIN_MODE_INPUT(GPIOD_PIN10) | \ + PIN_MODE_INPUT(GPIOD_PIN11) | \ + PIN_MODE_INPUT(GPIOD_LED4) | \ + PIN_MODE_INPUT(GPIOD_LED3) | \ + PIN_MODE_INPUT(GPIOD_LED5) | \ + PIN_MODE_INPUT(GPIOD_LED6)) + +#undef VAL_GPIOD_PUPDR +#define VAL_GPIOD_PUPDR (PIN_PUPDR_PULLUP(GPIOD_PIN0) | \ + PIN_PUPDR_PULLUP(GPIOD_PIN1) | \ + PIN_PUPDR_PULLUP(GPIOD_PIN2) | \ + PIN_PUPDR_PULLUP(GPIOD_PIN3) | \ + PIN_PUPDR_PULLUP(GPIOD_CS43L22_RESET) |\ + PIN_PUPDR_PULLUP(GPIOD_OverCurrent) | \ + PIN_PUPDR_PULLUP(GPIOD_PIN6) | \ + PIN_PUPDR_PULLUP(GPIOD_PIN7) | \ + PIN_PUPDR_PULLUP(GPIOD_PIN8) | \ + PIN_PUPDR_PULLUP(GPIOD_PIN9) | \ + PIN_PUPDR_PULLUP(GPIOD_PIN10) | \ + PIN_PUPDR_PULLUP(GPIOD_PIN11) | \ + PIN_PUPDR_PULLUP(GPIOD_LED4) | \ + PIN_PUPDR_PULLUP(GPIOD_LED3) | \ + PIN_PUPDR_PULLUP(GPIOD_LED5) | \ + PIN_PUPDR_PULLUP(GPIOD_LED6)) + +/* Set all GPIOE pins to INPUT & PULLUP to avoid FLOATING */ +#undef VAL_GPIOE_MODER +#define VAL_GPIOE_MODER (PIN_MODE_INPUT(GPIOE_L3GD20_INT1) | \ + PIN_MODE_INPUT(GPIOE_L3GD20_INT2) | \ + PIN_MODE_INPUT(GPIOE_LSM303DLHC_DRDY) |\ + PIN_MODE_INPUT(GPIOE_L3GD20_CS) | \ + PIN_MODE_INPUT(GPIOE_LSM303DLHC_INT1) |\ + PIN_MODE_INPUT(GPIOE_LSM303DLHC_INT2) |\ + PIN_MODE_INPUT(GPIOE_PIN6) | \ + PIN_MODE_INPUT(GPIOE_PIN7) | \ + PIN_MODE_INPUT(GPIOE_PIN8) | \ + PIN_MODE_INPUT(GPIOE_PIN9) | \ + PIN_MODE_INPUT(GPIOE_PIN10) | \ + PIN_MODE_INPUT(GPIOE_PIN11) | \ + PIN_MODE_INPUT(GPIOE_PIN12) | \ + PIN_MODE_INPUT(GPIOE_PIN13) | \ + PIN_MODE_INPUT(GPIOE_PIN14) | \ + PIN_MODE_INPUT(GPIOE_PIN15)) + +#undef VAL_GPIOE_PUPDR +#define VAL_GPIOE_PUPDR (PIN_PUPDR_PULLUP(GPIOE_L3GD20_INT1) | \ + PIN_PUPDR_PULLUP(GPIOE_L3GD20_INT2) | \ + PIN_PUPDR_PULLUP(GPIOE_LSM303DLHC_DRDY) |\ + PIN_PUPDR_PULLUP(GPIOE_L3GD20_CS) | \ + PIN_PUPDR_PULLUP(GPIOE_LSM303DLHC_INT1) |\ + PIN_PUPDR_PULLUP(GPIOE_LSM303DLHC_INT2) |\ + PIN_PUPDR_PULLUP(GPIOE_PIN6) | \ + PIN_PUPDR_PULLUP(GPIOE_PIN7) | \ + PIN_PUPDR_PULLUP(GPIOE_PIN8) | \ + PIN_PUPDR_PULLUP(GPIOE_PIN9) | \ + PIN_PUPDR_PULLUP(GPIOE_PIN10) | \ + PIN_PUPDR_PULLUP(GPIOE_PIN11) | \ + PIN_PUPDR_PULLUP(GPIOE_PIN12) | \ + PIN_PUPDR_PULLUP(GPIOE_PIN13) | \ + PIN_PUPDR_PULLUP(GPIOE_PIN14) | \ + PIN_PUPDR_PULLUP(GPIOE_PIN15)) + diff --git a/keyboards/keychron/q8_max/config.h b/keyboards/keychron/q8_max/config.h new file mode 100644 index 0000000000..6812fc93f8 --- /dev/null +++ b/keyboards/keychron/q8_max/config.h @@ -0,0 +1,81 @@ +/* Copyright 2024 @ Keychron (https://www.keychron.com) + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#pragma once + +/* Encoder Configuration */ +#define ENCODER_DEFAULT_POS 0x3 +#define ENCODER_MAP_KEY_DELAY 2 + +#ifdef LK_WIRELESS_ENABLE +/* Hardware configuration */ + +# define P2P4_MODE_SELECT_PIN A10 +# define BT_MODE_SELECT_PIN A9 + +# define LKBT51_RESET_PIN C4 +# define LKBT51_INT_INPUT_PIN B1 +# define BLUETOOTH_INT_OUTPUT_PIN A4 + +# define USB_POWER_SENSE_PIN B0 +# define USB_POWER_CONNECTED_LEVEL 0 + +# define BAT_CHARGING_PIN C14 +# define BAT_CHARGING_LEVEL 0 + +# define BT_HOST_DEVICES_COUNT 3 + +# if defined(RGB_MATRIX_ENABLE) + +# define LED_DRIVER_SHUTDOWN_PIN B9 + +# define BT_HOST_LED_MATRIX_LIST \ + { 15, 16, 17 } + +# define P2P4G_HOST_LED_MATRIX_LIST \ + { 18 } + +# define BAT_LEVEL_LED_LIST \ + { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 } + +/* Backlit disable timeout when keyboard is disconnected(unit: second) */ +# define DISCONNECTED_BACKLIGHT_DISABLE_TIMEOUT 40 + +/* Backlit disable timeout when keyboard is connected(unit: second) */ +# define CONNECTED_BACKLIGHT_DISABLE_TIMEOUT 600 + +/* Reinit LED driver on tranport changed */ +# define REINIT_LED_DRIVER 1 + +# endif + +/* Keep USB connection in blueooth mode */ +# define KEEP_USB_CONNECTION_IN_WIRELESS_MODE + +/* Enable bluetooth NKRO */ +# define WIRELESS_NKRO_ENABLE + +/* Raw hid command for factory test and bluetooth DFU */ +# define RAW_HID_CMD 0xAA ... 0xAB +#else +/* Raw hid command for factory test */ +# define RAW_HID_CMD 0xAB +#endif + +/* Factory test keys */ +#define FN_KEY_1 MO(4) + +#define MATRIX_IO_DELAY 10 diff --git a/keyboards/keychron/q8_max/halconf.h b/keyboards/keychron/q8_max/halconf.h new file mode 100644 index 0000000000..37bcc7c47b --- /dev/null +++ b/keyboards/keychron/q8_max/halconf.h @@ -0,0 +1,31 @@ +/* Copyright 2024 @ 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 + +#define _CHIBIOS_HAL_CONF_VER_8_0_ + +#define HAL_USE_SPI TRUE + +#ifdef LK_WIRELESS_ENABLE +# define HAL_USE_RTC TRUE +#endif + +#if defined(LK_WIRELESS_ENABLE) || defined(ENCODER_ENABLE) +# define PAL_USE_CALLBACKS TRUE +#endif + +#include_next diff --git a/keyboards/keychron/q8_max/info.json b/keyboards/keychron/q8_max/info.json new file mode 100644 index 0000000000..68a0297017 --- /dev/null +++ b/keyboards/keychron/q8_max/info.json @@ -0,0 +1,80 @@ +{ + "keyboard_name": "Keychron Q8 Max", + "manufacturer": "Keychron", + "url": "https://github.com/Keychron", + "maintainer": "lokher", + "processor": "STM32F401", + "bootloader": "stm32-dfu", + "usb": { + "vid": "0x3434" + }, + "features": { + "bootmagic": true, + "extrakey" : true, + "mousekey" : true, + "dip_switch" : true, + "encoder": true, + "encoder_map": true, + "nkro" : true, + "rgb_matrix": true, + "raw" : true, + "sendstring" : true + }, + "matrix_pins": { + "cols": ["C8", "C9", "A8", "A15", "C10", "C11", "C15", "C0", "C1", "C2", "C3", "A0", "A1", "A2", "A3"], + "rows": ["D2", "B3", "B4", "B5", "B6"] + }, + "diode_direction": "ROW2COL", + "encoder": { + "rotary": [ + { + "pin_a": "B14", + "pin_b": "B15" + } + ] + }, + "dip_switch" :{ + "pins": ["B7"] + }, + "rgb_matrix": { + "driver": "snled27351_spi", + "sleep": true, + "animations": { + "band_spiral_val": true, + "breathing": true, + "cycle_all": true, + "cycle_left_right": true, + "cycle_out_in": true, + "cycle_out_in_dual": true, + "cycle_pinwheel": true, + "cycle_spiral": true, + "cycle_up_down": true, + "digital_rain": true, + "dual_beacon": true, + "jellybean_raindrops": true, + "pixel_rain": true, + "rainbow_beacon": true, + "rainbow_moving_chevron": true, + "solid_reactive_multinexus": true, + "solid_reactive_multiwide": true, + "solid_reactive_simple": true, + "solid_splash": true, + "splash": true, + "typing_heatmap": true + } + }, + "eeprom": { + "wear_leveling": { + "driver": "embedded_flash", + "logical_size": 2048, + "backing_size": 4096 + } + }, + "dynamic_keymap": { + "layer_count": 5 + }, + "build": { + "debounce_type": "sym_eager_pk" + }, + "debounce": 20 +} diff --git a/keyboards/keychron/q8_max/mcuconf.h b/keyboards/keychron/q8_max/mcuconf.h new file mode 100644 index 0000000000..89294ee64b --- /dev/null +++ b/keyboards/keychron/q8_max/mcuconf.h @@ -0,0 +1,37 @@ +/* Copyright 2024 @ 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_next + +#undef STM32_HSECLK +#define STM32_HSECLK 16000000 + +#undef STM32_PLLM_VALUE +#define STM32_PLLM_VALUE 8 + +#undef STM32_PLLN_VALUE +#define STM32_PLLN_VALUE 96 + +#undef STM32_PLLP_VALUE +#define STM32_PLLP_VALUE 4 + +#undef STM32_PLLQ_VALUE +#define STM32_PLLQ_VALUE 4 + +#undef STM32_SPI_USE_SPI1 +#define STM32_SPI_USE_SPI1 TRUE diff --git a/keyboards/keychron/q8_max/q8_max.c b/keyboards/keychron/q8_max/q8_max.c new file mode 100644 index 0000000000..0c4361f4e2 --- /dev/null +++ b/keyboards/keychron/q8_max/q8_max.c @@ -0,0 +1,61 @@ +/* Copyright 2024 @ Keychron (https://www.keychron.com) + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#include "quantum.h" +#include "keychron_task.h" +#ifdef FACTORY_TEST_ENABLE +# include "factory_test.h" +# include "keychron_common.h" +#endif +#ifdef LK_WIRELESS_ENABLE +# include "lkbt51.h" +# include "wireless.h" +# include "keychron_wireless_common.h" +# include "battery.h" +#endif + +#ifdef DIP_SWITCH_ENABLE +bool dip_switch_update_kb(uint8_t index, bool active) { + if (index == 0) { + default_layer_set(1UL << (active ? 1 : 0)); + } + dip_switch_update_user(index, active); + + return true; +} +#endif + +void keyboard_post_init_kb(void) { +#ifdef LK_WIRELESS_ENABLE + palSetLineMode(P2P4_MODE_SELECT_PIN, PAL_MODE_INPUT); + palSetLineMode(BT_MODE_SELECT_PIN, PAL_MODE_INPUT); + + lkbt51_init(false); + wireless_init(); +#endif + +#ifdef ENCODER_ENABLE + encoder_cb_init(); +#endif + + keyboard_post_init_user(); +} + +#ifdef LK_WIRELESS_ENABLE +bool lpm_is_kb_idle(void) { + return !factory_reset_indicating(); +} +#endif diff --git a/keyboards/keychron/q8_max/readme.md b/keyboards/keychron/q8_max/readme.md new file mode 100644 index 0000000000..f7f5cd844f --- /dev/null +++ b/keyboards/keychron/q8_max/readme.md @@ -0,0 +1,21 @@ +# Keychron Q8 Max + +![Keychron Q8 Max](https://cdn.shopify.com/s/files/1/0059/0630/1017/files/Q8-Max-7.jpg?v=1705654326) + +A customizable 65% ergonomic keyboard. + +* Keyboard Maintainer: [Keychron](https://github.com/keychron) +* Hardware Supported: Keychron Q8 Max +* Hardware Availability: [Keychron Q8 Max QMK/VIA Wireless Custom Mechanical Keyboard](https://www.keychron.com/products/keychron-q8-max-alice-layout-qmk-via-wireless-custom-mechanical-keyboard) + +Make example for this keyboard (after setting up your build environment): + + make keychron/q8_max/ansi_encoder:default + +Flashing example for this keyboard: + + make keychron/q8_max/ansi_encoder:default:flash + +**Reset Key**: Toggle mode switch to "Cable", hold down the *Esc* key or reset button underneath space bar while connecting the USB cable, + +See the [build environment setup](https://docs.qmk.fm/#/getting_started_build_tools) and the [make instructions](https://docs.qmk.fm/#/getting_started_make_guide) for more information. Brand new to QMK? Start with our [Complete Newbs Guide](https://docs.qmk.fm/#/newbs). diff --git a/keyboards/keychron/q8_max/rules.mk b/keyboards/keychron/q8_max/rules.mk new file mode 100644 index 0000000000..4eaf6820bc --- /dev/null +++ b/keyboards/keychron/q8_max/rules.mk @@ -0,0 +1,4 @@ +include keyboards/keychron/common/wireless/wireless.mk +include keyboards/keychron/common/keychron_common.mk + +VPATH += $(TOP_DIR)/keyboards/keychron diff --git a/keyboards/keychron/q8_max/via_json/q8_max_ansi_encoder.json b/keyboards/keychron/q8_max/via_json/q8_max_ansi_encoder.json new file mode 100644 index 0000000000..8809dba483 --- /dev/null +++ b/keyboards/keychron/q8_max/via_json/q8_max_ansi_encoder.json @@ -0,0 +1,351 @@ +{ + "name": "Keychron Q8 Max ANSI Knob", + "vendorId": "0x3434", + "productId": "0x0880", + "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": "Misson Control", "title": "Misson Control in Mac", "shortName": "MCtl"}, + {"name": "Lanuch Pad", "title": "Lanuch Pad in Windows", "shortName": "LPad"}, + {"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": "2.4G", "title": "2.4G", "shortName": "2.4G"}, + {"name": "Battery Level", "title": "Show battery level", "shortName": "Batt"} + ], + "matrix": {"rows": 5, "cols": 15}, + "layouts": { + "keymap": [ + [ + { + "x": 2.75 + }, + "0,2", + { + "x": 8.85 + }, + "0,11", + { + "x": 3.5, + "c": "#aaaaaa" + }, + "0,14\n\n\n\n\n\n\n\n\ne0" + ], + [ + { + "y": -0.85, + "x": 0.75, + "c": "#777777" + }, + "0,0\nESC", + { + "c": "#cccccc" + }, + "0,1" + ], + [ + { + "y": -0.85, + "x": 13.6 + }, + "0,12", + { + "c": "#aaaaaa", + "w": 2 + }, + "0,13" + ], + [ + { + "x": 0.5, + "w": 1.5 + }, + "1,0", + { + "c": "#cccccc" + }, + "1,1", + { + "x": 10.3 + }, + "1,11", + "1,12", + { + "w": 1.5, + "c": "#aaaaaa" + }, + "1,13" + ], + [ + { + "y": -0.9, + "x": 17.3 + }, + "1,14" + ], + [ + { + "y": -0.1, + "x": 0.25, + "w": 1.75 + }, + "2,0", + { + "c": "#cccccc" + }, + "2,1", + { + "x": 9.75 + }, + "2,11", + "2,12", + { + "c": "#777777", + "w": 2.25 + }, + "2,13" + ], + [ + { + "y": -0.9, + "x": 17.5, + "c": "#aaaaaa" + }, + "2,14" + ], + [ + { + "y": -0.1, + "w": 2.25 + }, + "3,0", + { + "c": "#cccccc" + }, + "3,2", + { + "x": 10.15 + }, + "3,12", + { + "c": "#aaaaaa", + "w": 1.75 + }, + "3,13" + ], + [ + { + "y": -0.75, + "x": 16.4, + "c": "#777777" + }, + "3,14" + ], + [ + { + "y": -0.25, + "c": "#aaaaaa", + "w": 1.25 + }, + "4,0", + { + "w": 1.25 + }, + "4,1" + ], + [ + { + "y": -0.75, + "x": 15.4, + "c": "#777777" + }, + "4,12", + "4,13", + "4,14" + ], + [ + { + "r": 6, + "y": -5.7, + "x": 3.85, + "c": "#cccccc" + }, + "0,3", + "0,4", + "0,5", + "0,6" + ], + [ + { + "x": 3.35 + }, + "1,2", + "1,3", + "1,4", + "1,5" + ], + [ + { + "x": 3.55 + }, + "2,2", + "2,3", + "2,4", + "2,5" + ], + [ + { + "x": 3.9 + }, + "3,3", + "3,4", + "3,5", + "3,6" + ], + [ + { + "x": 4, + "c": "#aaaaaa", + "w": 1.25 + }, + "4,2", + { + "w": 2.25 + }, + "4,3", + { + "c": "#aaaaaa" + }, + "4,6" + ], + [ + { + "r": -6, + "y": -3.2, + "x": 8.35, + "c": "#cccccc" + }, + "0,7", + "0,8", + { + "c": "#cccccc" + }, + "0,9", + "0,10" + ], + [ + { + "x": 7.9 + }, + "1,6", + "1,7", + "1,8", + "1,9", + "1,10" + ], + [ + { + "x": 8.25 + }, + "2,7", + "2,8", + "2,9", + "2,10" + ], + [ + { + "x": 7.8 + }, + "3,7", + "3,8", + "3,9", + "3,10", + "3,11" + ], + [ + { + "x": 7.8, + "c": "#aaaaaa" + }, + "4,7", + { + "w": 2.75 + }, + "4,8", + { + "c": "#aaaaaa" + }, + "4,9" + ] + ] + } +} diff --git a/keyboards/keychron/v1_max/ansi_encoder/config.h b/keyboards/keychron/v1_max/ansi_encoder/config.h index 44ec6db552..6a2ba7b89f 100644 --- a/keyboards/keychron/v1_max/ansi_encoder/config.h +++ b/keyboards/keychron/v1_max/ansi_encoder/config.h @@ -47,7 +47,7 @@ /* Turn off backlight on low brightness to save power */ # define RGB_MATRIX_BRIGHTNESS_TURN_OFF_VAL 32 -/* Indicator */ +/* Indications */ # define BT_HOST_LED_MATRIX_LIST \ { 15, 16, 17 } diff --git a/keyboards/keychron/v1_max/ansi_encoder/keymaps/via/keymap.c b/keyboards/keychron/v1_max/ansi_encoder/keymaps/via/keymap.c index 0a126c7a8d..0636af6396 100644 --- a/keyboards/keychron/v1_max/ansi_encoder/keymaps/via/keymap.c +++ b/keyboards/keychron/v1_max/ansi_encoder/keymaps/via/keymap.c @@ -58,7 +58,6 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { _______, _______, _______, _______, _______, _______, _______, _______, _______, _______) }; -// clang-format on #if defined(ENCODER_MAP_ENABLE) const uint16_t PROGMEM encoder_map[][NUM_ENCODERS][2] = { [MAC_BASE] = {ENCODER_CCW_CW(KC_VOLD, KC_VOLU)}, @@ -68,6 +67,7 @@ const uint16_t PROGMEM encoder_map[][NUM_ENCODERS][2] = { }; #endif // ENCODER_MAP_ENABLE +// clang-format on bool process_record_user(uint16_t keycode, keyrecord_t *record) { if (!process_record_keychron_common(keycode, record)) { return false; diff --git a/keyboards/keychron/v1_max/v1_max.c b/keyboards/keychron/v1_max/v1_max.c index e3d29e9f5a..9708782945 100644 --- a/keyboards/keychron/v1_max/v1_max.c +++ b/keyboards/keychron/v1_max/v1_max.c @@ -30,10 +30,6 @@ #define POWER_ON_LED_DURATION 3000 static uint32_t power_on_indicator_timer_buffer; -#ifdef KEYCHRON_CALLBACK_ENABLE -bool keychron_task_kb(void); -#endif - #ifdef DIP_SWITCH_ENABLE bool dip_switch_update_kb(uint8_t index, bool active) { if (index == 0) { @@ -60,11 +56,7 @@ void keyboard_post_init_kb(void) { #ifdef ENCODER_ENABLE encoder_cb_init(); #endif -#ifdef KEYCHRON_CALLBACK_ENABLE - factory_test_init(); - register_record_process(process_record_keychron_kb, false); - register_keychron_task(keychron_task_kb, false); -#endif + keyboard_post_init_user(); } diff --git a/keyboards/keychron/v2_max/v2_max.c b/keyboards/keychron/v2_max/v2_max.c index 42f4eb8811..e619a50def 100644 --- a/keyboards/keychron/v2_max/v2_max.c +++ b/keyboards/keychron/v2_max/v2_max.c @@ -60,7 +60,7 @@ void keyboard_post_init_kb(void) { keyboard_post_init_user(); } -bool lemokey_task_kb(void) { +bool keychron_task_kb(void) { if (power_on_indicator_timer) { if (timer_elapsed32(power_on_indicator_timer) > POWER_ON_LED_DURATION) { power_on_indicator_timer = 0; @@ -68,6 +68,7 @@ bool lemokey_task_kb(void) { #ifdef LK_WIRELESS_ENABLE writePin(BAT_LOW_LED_PIN, !BAT_LOW_LED_PIN_ON_STATE); #endif + } else { #ifdef LK_WIRELESS_ENABLE writePin(BAT_LOW_LED_PIN, BAT_LOW_LED_PIN_ON_STATE); diff --git a/keyboards/keychron/v5_max/ansi_encoder/ansi_encoder.c b/keyboards/keychron/v5_max/ansi_encoder/ansi_encoder.c new file mode 100644 index 0000000000..30871c7357 --- /dev/null +++ b/keyboards/keychron/v5_max/ansi_encoder/ansi_encoder.c @@ -0,0 +1,165 @@ +/* Copyright 2024 @ Keychron (https://www.keychron.com) + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#include "quantum.h" + +// clang-format off + +#ifdef RGB_MATRIX_ENABLE +const snled27351_led_t g_snled27351_leds[RGB_MATRIX_LED_COUNT] = { +/* Refer to SNLED27351 manual for these locations + * driver + * | R location + * | | G location + * | | | B location + * | | | | */ + {0, G_1, I_1, H_1}, + {0, G_3, I_3, H_3}, + {0, G_4, I_4, H_4}, + {0, G_5, I_5, H_5}, + {0, G_6, I_6, H_6}, + {0, G_8, I_8, H_8}, + {0, G_9, I_9, H_9}, + {0, G_10, I_10, H_10}, + {0, G_11, I_11, H_11}, + {0, G_12, I_12, H_12}, + {0, G_13, I_13, H_13}, + {0, G_14, I_14, H_14}, + {0, G_15, I_15, H_15}, + {0, G_16, I_16, H_16}, + {0, J_16, L_16, K_16}, + {0, J_15, L_15, K_15}, + + {0, A_1, C_1, B_1}, + {0, A_2, C_2, B_2}, + {0, A_3, C_3, B_3}, + {0, A_4, C_4, B_4}, + {0, A_5, C_5, B_5}, + {0, A_6, C_6, B_6}, + {0, A_7, C_7, B_7}, + {0, A_8, C_8, B_8}, + {0, A_9, C_9, B_9}, + {0, A_10, C_10, B_10}, + {0, A_11, C_11, B_11}, + {0, A_12, C_12, B_12}, + {0, A_13, C_13, B_13}, + {0, A_14, C_14, B_14}, + {0, A_16, C_16, B_16}, + {0, J_13, L_13, K_13}, + {0, J_12, L_12, K_12}, + {0, J_11, L_11, K_11}, + + {0, D_1, F_1, E_1}, + {0, D_2, F_2, E_2}, + {0, D_3, F_3, E_3}, + {0, D_4, F_4, E_4}, + {0, D_5, F_5, E_5}, + {0, D_6, F_6, E_6}, + {0, D_7, F_7, E_7}, + {0, D_8, F_8, E_8}, + {0, D_9, F_9, E_9}, + {0, D_10, F_10, E_10}, + {0, D_11, F_11, E_11}, + {0, D_12, F_12, E_12}, + {0, D_13, F_13, E_13}, + {0, D_14, F_14, E_14}, + {0, D_16, F_16, E_16}, + {0, J_10, L_10, K_10}, + {0, J_9, L_9, K_9}, + + {1, A_16, C_16, B_16}, + {1, A_15, C_15, B_15}, + {1, A_14, C_14, B_14}, + {1, A_13, C_13, B_13}, + {1, A_12, C_12, B_12}, + {1, A_11, C_11, B_11}, + {1, A_10, C_10, B_10}, + {1, A_9, C_9, B_9}, + {1, A_8, C_8, B_8}, + {1, A_7, C_7, B_7}, + {1, A_6, C_6, B_6}, + {1, A_5, C_5, B_5}, + {1, A_4, C_4, B_4}, + {1, A_1, C_1, B_1}, + {1, J_6, L_6, K_6}, + {1, J_7, L_7, K_7}, + {1, J_8, L_8, K_8}, + + {1, G_16, I_16, H_16}, + {1, G_14, I_14, H_14}, + {1, G_13, I_13, H_13}, + {1, G_12, I_12, H_12}, + {1, G_11, I_11, H_11}, + {1, G_10, I_10, H_10}, + {1, G_9, I_9, H_9}, + {1, G_8, I_8, H_8}, + {1, G_7, I_7, H_7}, + {1, G_6, I_6, H_6}, + {1, G_5, I_5, H_5}, + {1, G_4, I_4, H_4}, + {1, G_2, I_2, H_2}, + {1, G_1, I_1, H_1}, + {1, J_3, L_3, K_3}, + {1, J_4, L_4, K_4}, + {1, J_5, L_5, K_5}, + + {1, D_16, F_16, E_16}, + {1, D_15, F_15, E_15}, + {1, D_14, F_14, E_14}, + {1, D_10, F_10, E_10}, + {1, D_6, F_6, E_6}, + {1, D_5, F_5, E_5}, + {1, D_4, F_4, E_4}, + {1, D_3, F_3, E_3}, + {1, D_2, F_2, E_2}, + {1, D_1, F_1, E_1}, + {1, J_1, L_1, K_1}, + {1, J_2, L_2, K_2}, +}; + +#define __ NO_LED + +led_config_t g_led_config = { + { + // Key Matrix to LED Index + { 0, __, 1, 2, 3, 4, __, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, __ }, + { 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, __, 30, 31, 32, 33 }, + { 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, __, 48, 49, 50, __ }, + { 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 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, __, __, __, 88, __, __, __, 89, 90, 91, 92, 93, 94, 95, 96, __ } + }, + { + // LED Index to Physical Position + {0,0}, {24,0}, {36,0}, {48,0}, {60,0}, {78,0}, {90,0}, {102,0}, {106,0}, {133,0}, {145,0}, {157,0}, {169,0}, {185,0}, {195,0}, {207,0}, + {0,15}, {12,15}, {24,15}, {36,15}, {48,15}, {60,15}, {72,15}, {84,15}, {97,15}, {109,15}, {121,15}, {133,15}, {145,15}, {163,15}, {188,15}, {200,15}, {212,15}, {224,15}, + {3,26}, {18,26}, {30,26}, {42,26}, {54,26}, {66,26}, {78,26}, {91,26}, {103,26}, {115,26}, {127,26}, {139,26}, {151,26}, {166,26}, {188,26}, {200,26}, {212,26}, + {5,38}, {21,38}, {33,38}, {45,38}, {57,38}, {69,38}, {81,38}, {94,38}, {106,38}, {118,38}, {130,38}, {142,38}, {161,38}, {188,38}, {200,38}, {212,38}, {224,32}, + {8,49}, {27,49}, {39,49}, {51,49}, {63,49}, {75,49}, {88,49}, {100,49}, {112,49}, {124,49}, {136,49}, {152,49}, {172,52}, {188,49}, {200,49}, {212,49}, {224,55}, + {1,61}, {17,61}, {32,61}, {77,61}, {121,61}, {133,61}, {145,61}, {160,64}, {172,64}, {184,64}, {200,61}, {212,61}, + }, + { + // 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, 8, 4, 4, 4, + 1, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 8, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 1, 4, 4, 4, 4, + 1, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 1, 1, 4, 4, 4, 4, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 + } + +}; +#endif diff --git a/keyboards/keychron/v5_max/ansi_encoder/config.h b/keyboards/keychron/v5_max/ansi_encoder/config.h new file mode 100644 index 0000000000..ae0c70a50c --- /dev/null +++ b/keyboards/keychron/v5_max/ansi_encoder/config.h @@ -0,0 +1,65 @@ +/* Copyright 2024 @ Keychron (https://www.keychron.com) + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#pragma once + +#ifdef RGB_MATRIX_ENABLE +/* RGB Matrix driver configuration */ +# define DRIVER_COUNT 2 +# define DRIVER_1_LED_COUNT 51 +# define DRIVER_2_LED_COUNT 46 +# define RGB_MATRIX_LED_COUNT (DRIVER_1_LED_COUNT + DRIVER_2_LED_COUNT) + +# define SPI_SCK_PIN A5 +# define SPI_MISO_PIN A6 +# define SPI_MOSI_PIN A7 + +# define DRIVER_CS_PINS \ + { B8, B9 } +# define SNLED23751_SPI_DIVISOR 16 +# define SPI_DRIVER SPID1 + +/* Set LED driver current */ +# define SNLED27351_CURRENT_TUNE \ + { 0x2C, 0x2C, 0x2C, 0x2C, 0x2C, 0x2C, 0x2C, 0x2C, 0x2C, 0x2C, 0x2C, 0x2C } + +/* Set to infinit, which is use in USB mode by default */ +# define RGB_MATRIX_TIMEOUT RGB_MATRIX_TIMEOUT_INFINITE + +/* Allow shutdown of led driver to save power */ +# define RGB_MATRIX_DRIVER_SHUTDOWN_ENABLE +/* Turn off backlight on low brightness to save power */ +# define RGB_MATRIX_BRIGHTNESS_TURN_OFF_VAL 32 + +/* Indications */ +# define BT_HOST_LED_MATRIX_LIST \ + { 17, 18, 19 } + +# define P2P4G_HOST_LED_MATRIX_LIST \ + { 20 } + +# define BAT_LEVEL_LED_LIST \ + { 17, 18, 19, 20, 21, 22, 23, 24, 25, 26 } + +# define NUM_LOCK_INDEX 30 +# define CAPS_LOCK_INDEX 51 +# define LOW_BAT_IND_INDEX \ + { 88 } + +# define RGB_MATRIX_KEYPRESSES +# define RGB_MATRIX_FRAMEBUFFER_EFFECTS + +#endif diff --git a/keyboards/keychron/v5_max/ansi_encoder/info.json b/keyboards/keychron/v5_max/ansi_encoder/info.json new file mode 100644 index 0000000000..e3776acb97 --- /dev/null +++ b/keyboards/keychron/v5_max/ansi_encoder/info.json @@ -0,0 +1,127 @@ +{ + "usb": { + "pid": "0x0950", + "device_version": "1.0.0" + }, + "features": { + "encoder": true, + "encoder_map": true + }, + "encoder": { + "rotary": [ + { + "pin_a": "B15", + "pin_b": "B14" + } + ] + }, + "layouts": { + "LAYOUT_ansi_98": { + "layout": [ + {"matrix": [0, 0], "x": 0, "y": 0}, + {"matrix": [0, 2], "x": 2, "y": 0}, + {"matrix": [0, 3], "x": 3, "y": 0}, + {"matrix": [0, 4], "x": 4, "y": 0}, + {"matrix": [0, 5], "x": 5, "y": 0}, + {"matrix": [0, 7], "x": 6.5, "y": 0}, + {"matrix": [0, 8], "x": 7.5, "y": 0}, + {"matrix": [0, 9], "x": 8.5, "y": 0}, + {"matrix": [0, 10], "x": 9.5, "y": 0}, + {"matrix": [0, 11], "x": 11, "y": 0}, + {"matrix": [0, 12], "x": 12, "y": 0}, + {"matrix": [0, 13], "x": 13, "y": 0}, + {"matrix": [0, 14], "x": 14, "y": 0}, + {"matrix": [0, 15], "x": 15.25, "y": 0}, + {"matrix": [0, 16], "x": 16.25, "y": 0}, + {"matrix": [0, 17], "x": 17.25, "y": 0}, + {"matrix": [0, 18], "x": 18.5, "y": 0}, + + {"matrix": [1, 0], "x": 0, "y": 1.25}, + {"matrix": [1, 1], "x": 1, "y": 1.25}, + {"matrix": [1, 2], "x": 2, "y": 1.25}, + {"matrix": [1, 3], "x": 3, "y": 1.25}, + {"matrix": [1, 4], "x": 4, "y": 1.25}, + {"matrix": [1, 5], "x": 5, "y": 1.25}, + {"matrix": [1, 6], "x": 6, "y": 1.25}, + {"matrix": [1, 7], "x": 7, "y": 1.25}, + {"matrix": [1, 8], "x": 8, "y": 1.25}, + {"matrix": [1, 9], "x": 9, "y": 1.25}, + {"matrix": [1, 10], "x": 10, "y": 1.25}, + {"matrix": [1, 11], "x": 11, "y": 1.25}, + {"matrix": [1, 12], "x": 12, "y": 1.25}, + {"matrix": [1, 13], "x": 13, "y": 1.25, "w": 2}, + {"matrix": [1, 15], "x": 15.5, "y": 1.25}, + {"matrix": [1, 16], "x": 16.5, "y": 1.25}, + {"matrix": [1, 17], "x": 17.5, "y": 1.25}, + {"matrix": [1, 18], "x": 18.5, "y": 1.25}, + + {"matrix": [2, 0], "x": 0, "y": 2.25, "w": 1.5}, + {"matrix": [2, 1], "x": 1.5, "y": 2.25}, + {"matrix": [2, 2], "x": 2.5, "y": 2.25}, + {"matrix": [2, 3], "x": 3.5, "y": 2.25}, + {"matrix": [2, 4], "x": 4.5, "y": 2.25}, + {"matrix": [2, 5], "x": 5.5, "y": 2.25}, + {"matrix": [2, 6], "x": 6.5, "y": 2.25}, + {"matrix": [2, 7], "x": 7.5, "y": 2.25}, + {"matrix": [2, 8], "x": 8.5, "y": 2.25}, + {"matrix": [2, 9], "x": 9.5, "y": 2.25}, + {"matrix": [2, 10], "x": 10.5, "y": 2.25}, + {"matrix": [2, 11], "x": 11.5, "y": 2.25}, + {"matrix": [2, 12], "x": 12.5, "y": 2.25}, + {"matrix": [2, 13], "x": 13.5, "y": 2.25, "w": 1.5}, + {"matrix": [2, 15], "x": 15.5, "y": 2.25}, + {"matrix": [2, 16], "x": 16.5, "y": 2.25}, + {"matrix": [2, 17], "x": 17.5, "y": 2.25}, + {"matrix": [3, 18], "x": 18.5, "y": 2.25, "h": 2}, + + {"matrix": [3, 0], "x": 0, "y": 3.25, "w": 1.75}, + {"matrix": [3, 1], "x": 1.75, "y": 3.25}, + {"matrix": [3, 2], "x": 2.75, "y": 3.25}, + {"matrix": [3, 3], "x": 3.75, "y": 3.25}, + {"matrix": [3, 4], "x": 4.75, "y": 3.25}, + {"matrix": [3, 5], "x": 5.75, "y": 3.25}, + {"matrix": [3, 6], "x": 6.75, "y": 3.25}, + {"matrix": [3, 7], "x": 7.75, "y": 3.25}, + {"matrix": [3, 8], "x": 8.75, "y": 3.25}, + {"matrix": [3, 9], "x": 9.75, "y": 3.25}, + {"matrix": [3, 10], "x": 10.75, "y": 3.25}, + {"matrix": [3, 11], "x": 11.75, "y": 3.25}, + {"matrix": [3, 12], "x": 12.75, "y": 3.25, "w": 2.25}, + {"matrix": [3, 15], "x": 15.5, "y": 3.25}, + {"matrix": [3, 16], "x": 16.5, "y": 3.25}, + {"matrix": [3, 17], "x": 17.5, "y": 3.25}, + + {"matrix": [4, 0], "x": 0, "y": 4.25, "w": 2.25}, + {"matrix": [4, 2], "x": 2.25, "y": 4.25}, + {"matrix": [4, 3], "x": 3.25, "y": 4.25}, + {"matrix": [4, 4], "x": 4.25, "y": 4.25}, + {"matrix": [4, 5], "x": 5.25, "y": 4.25}, + {"matrix": [4, 6], "x": 6.25, "y": 4.25}, + {"matrix": [4, 7], "x": 7.25, "y": 4.25}, + {"matrix": [4, 8], "x": 8.25, "y": 4.25}, + {"matrix": [4, 9], "x": 9.25, "y": 4.25}, + {"matrix": [4, 10], "x": 10.25, "y": 4.25}, + {"matrix": [4, 11], "x": 11.25, "y": 4.25}, + {"matrix": [4, 12], "x": 12.25, "y": 4.25, "w": 1.75}, + {"matrix": [4, 14], "x": 14.25, "y": 4.5}, + {"matrix": [4, 15], "x": 15.5, "y": 4.25}, + {"matrix": [4, 16], "x": 16.5, "y": 4.25}, + {"matrix": [4, 17], "x": 17.5, "y": 4.25}, + {"matrix": [4, 18], "x": 18.5, "y": 4.25, "h": 2}, + + {"matrix": [5, 0], "x": 0, "y": 5.25, "w": 1.25}, + {"matrix": [5, 1], "x": 1.25, "y": 5.25, "w": 1.25}, + {"matrix": [5, 2], "x": 2.5, "y": 5.25, "w": 1.25}, + {"matrix": [5, 6], "x": 3.75, "y": 5.25, "w": 6.25}, + {"matrix": [5, 10], "x": 10, "y": 5.25}, + {"matrix": [5, 11], "x": 11, "y": 5.25}, + {"matrix": [5, 12], "x": 12, "y": 5.25}, + {"matrix": [5, 13], "x": 13.25, "y": 5.5}, + {"matrix": [5, 14], "x": 14.25, "y": 5.5}, + {"matrix": [5, 15], "x": 15.25, "y": 5.5}, + {"matrix": [5, 16], "x": 16.5, "y": 5.25}, + {"matrix": [5, 17], "x": 17.5, "y": 5.25} + ] + } + } +} diff --git a/keyboards/keychron/v5_max/ansi_encoder/keymaps/default/keymap.c b/keyboards/keychron/v5_max/ansi_encoder/keymaps/default/keymap.c new file mode 100644 index 0000000000..ae14fcc872 --- /dev/null +++ b/keyboards/keychron/v5_max/ansi_encoder/keymaps/default/keymap.c @@ -0,0 +1,74 @@ +/* Copyright 2024 @ Keychron (https://www.keychron.com) + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#include QMK_KEYBOARD_H +#include "keychron_common.h" + +enum layers { + MAC_BASE, + MAC_FN, + WIN_BASE, + WIN_FN, +}; +// clang-format off +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + [MAC_BASE] = LAYOUT_ansi_98( + KC_ESC, KC_BRID, KC_BRIU, KC_MCTRL, KC_LNPAD, RGB_VAD, RGB_VAI, KC_MPRV, KC_MPLY, KC_MNXT, KC_MUTE, KC_VOLD, KC_VOLU, KC_DEL, KC_HOME, KC_END, KC_MUTE, + 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_NUM, KC_PSLS, KC_PAST, KC_PMNS, + 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_P7, KC_P8, KC_P9, KC_PPLS, + 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_P4, KC_P5, KC_P6, + 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_P1, KC_P2, KC_P3, KC_PENT, + KC_LCTL, KC_LOPTN, KC_LCMMD, KC_SPC, KC_RCMMD, MO(MAC_FN), KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT, KC_P0, KC_PDOT ), + [MAC_FN] = LAYOUT_ansi_98( + _______, 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, + _______, BT_HST1, BT_HST2, BT_HST3, P2P4G, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + RGB_TOG, RGB_MOD, RGB_VAI, RGB_HUI, RGB_SAI, RGB_SPI, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, RGB_RMOD, RGB_VAD, RGB_HUD, RGB_SAD, RGB_SPD, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, BAT_LVL, NK_TOGG, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ ), + [WIN_BASE] = LAYOUT_ansi_98( + 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_END, KC_MUTE, + 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_NUM, KC_PSLS, KC_PAST, KC_PMNS, + 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_P7, KC_P8, KC_P9, KC_PPLS, + 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_P4, KC_P5, KC_P6, + 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_P1, KC_P2, KC_P3, KC_PENT, + KC_LCTL, KC_LWIN, KC_LALT, KC_SPC, KC_RALT, MO(WIN_FN), KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT, KC_P0, KC_PDOT ), + [WIN_FN] = LAYOUT_ansi_98( + _______, 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, P2P4G, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + RGB_TOG, RGB_MOD, RGB_VAI, RGB_HUI, RGB_SAI, RGB_SPI, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, RGB_RMOD, RGB_VAD, RGB_HUD, RGB_SAD, RGB_SPD, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, BAT_LVL, NK_TOGG, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ ), + }; + +#if defined(ENCODER_MAP_ENABLE) +const uint16_t PROGMEM encoder_map[][NUM_ENCODERS][2] = { + [MAC_BASE] = {ENCODER_CCW_CW(KC_VOLD, KC_VOLU)}, + [MAC_FN] = {ENCODER_CCW_CW(RGB_VAD, RGB_VAI)}, + [WIN_BASE] = {ENCODER_CCW_CW(KC_VOLD, KC_VOLU)}, + [WIN_FN] = {ENCODER_CCW_CW(RGB_VAD, RGB_VAI)}, +}; +#endif // ENCODER_MAP_ENABLE + +// clang-format on +bool process_record_user(uint16_t keycode, keyrecord_t *record) { + if (!process_record_keychron_common(keycode, record)) { + return false; + } + return true; +} + diff --git a/keyboards/keychron/v5_max/ansi_encoder/keymaps/via/keymap.c b/keyboards/keychron/v5_max/ansi_encoder/keymaps/via/keymap.c new file mode 100644 index 0000000000..ae14fcc872 --- /dev/null +++ b/keyboards/keychron/v5_max/ansi_encoder/keymaps/via/keymap.c @@ -0,0 +1,74 @@ +/* Copyright 2024 @ Keychron (https://www.keychron.com) + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#include QMK_KEYBOARD_H +#include "keychron_common.h" + +enum layers { + MAC_BASE, + MAC_FN, + WIN_BASE, + WIN_FN, +}; +// clang-format off +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + [MAC_BASE] = LAYOUT_ansi_98( + KC_ESC, KC_BRID, KC_BRIU, KC_MCTRL, KC_LNPAD, RGB_VAD, RGB_VAI, KC_MPRV, KC_MPLY, KC_MNXT, KC_MUTE, KC_VOLD, KC_VOLU, KC_DEL, KC_HOME, KC_END, KC_MUTE, + 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_NUM, KC_PSLS, KC_PAST, KC_PMNS, + 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_P7, KC_P8, KC_P9, KC_PPLS, + 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_P4, KC_P5, KC_P6, + 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_P1, KC_P2, KC_P3, KC_PENT, + KC_LCTL, KC_LOPTN, KC_LCMMD, KC_SPC, KC_RCMMD, MO(MAC_FN), KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT, KC_P0, KC_PDOT ), + [MAC_FN] = LAYOUT_ansi_98( + _______, 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, + _______, BT_HST1, BT_HST2, BT_HST3, P2P4G, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + RGB_TOG, RGB_MOD, RGB_VAI, RGB_HUI, RGB_SAI, RGB_SPI, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, RGB_RMOD, RGB_VAD, RGB_HUD, RGB_SAD, RGB_SPD, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, BAT_LVL, NK_TOGG, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ ), + [WIN_BASE] = LAYOUT_ansi_98( + 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_END, KC_MUTE, + 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_NUM, KC_PSLS, KC_PAST, KC_PMNS, + 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_P7, KC_P8, KC_P9, KC_PPLS, + 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_P4, KC_P5, KC_P6, + 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_P1, KC_P2, KC_P3, KC_PENT, + KC_LCTL, KC_LWIN, KC_LALT, KC_SPC, KC_RALT, MO(WIN_FN), KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT, KC_P0, KC_PDOT ), + [WIN_FN] = LAYOUT_ansi_98( + _______, 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, P2P4G, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + RGB_TOG, RGB_MOD, RGB_VAI, RGB_HUI, RGB_SAI, RGB_SPI, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, RGB_RMOD, RGB_VAD, RGB_HUD, RGB_SAD, RGB_SPD, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, BAT_LVL, NK_TOGG, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ ), + }; + +#if defined(ENCODER_MAP_ENABLE) +const uint16_t PROGMEM encoder_map[][NUM_ENCODERS][2] = { + [MAC_BASE] = {ENCODER_CCW_CW(KC_VOLD, KC_VOLU)}, + [MAC_FN] = {ENCODER_CCW_CW(RGB_VAD, RGB_VAI)}, + [WIN_BASE] = {ENCODER_CCW_CW(KC_VOLD, KC_VOLU)}, + [WIN_FN] = {ENCODER_CCW_CW(RGB_VAD, RGB_VAI)}, +}; +#endif // ENCODER_MAP_ENABLE + +// clang-format on +bool process_record_user(uint16_t keycode, keyrecord_t *record) { + if (!process_record_keychron_common(keycode, record)) { + return false; + } + return true; +} + diff --git a/keyboards/keychron/v5_max/ansi_encoder/keymaps/via/rules.mk b/keyboards/keychron/v5_max/ansi_encoder/keymaps/via/rules.mk new file mode 100644 index 0000000000..1e5b99807c --- /dev/null +++ b/keyboards/keychron/v5_max/ansi_encoder/keymaps/via/rules.mk @@ -0,0 +1 @@ +VIA_ENABLE = yes diff --git a/keyboards/keychron/v5_max/ansi_encoder/rules.mk b/keyboards/keychron/v5_max/ansi_encoder/rules.mk new file mode 100644 index 0000000000..7ff128fa69 --- /dev/null +++ b/keyboards/keychron/v5_max/ansi_encoder/rules.mk @@ -0,0 +1 @@ +# This file intentionally left blank \ No newline at end of file diff --git a/keyboards/keychron/v5_max/board.h b/keyboards/keychron/v5_max/board.h new file mode 100644 index 0000000000..54fba748bf --- /dev/null +++ b/keyboards/keychron/v5_max/board.h @@ -0,0 +1,226 @@ +/* Copyright 2024 @ Keychron (https://www.keychron.com) + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#pragma once + +#include_next + +// clang-format off + +/* Set GPIOA_SWDIO to INPUT and NOT FLOATING */ +#undef VAL_GPIOA_MODER +#define VAL_GPIOA_MODER (PIN_MODE_INPUT(GPIOA_BUTTON) | \ + PIN_MODE_INPUT(GPIOA_PIN1) | \ + PIN_MODE_INPUT(GPIOA_PIN2) | \ + PIN_MODE_INPUT(GPIOA_PIN3) | \ + PIN_MODE_ALTERNATE(GPIOA_CS43L22_LRCK) |\ + PIN_MODE_ALTERNATE(GPIOA_L3GD20_SCL) | \ + PIN_MODE_ALTERNATE(GPIOA_L3GD20_SD0) | \ + PIN_MODE_ALTERNATE(GPIOA_L3GD20_SDI) | \ + PIN_MODE_INPUT(GPIOA_PIN8) | \ + PIN_MODE_INPUT(GPIOA_VBUS_FS) | \ + PIN_MODE_ALTERNATE(GPIOA_OTG_FS_ID) | \ + PIN_MODE_ALTERNATE(GPIOA_OTG_FS_DM) | \ + PIN_MODE_ALTERNATE(GPIOA_OTG_FS_DP) | \ + PIN_MODE_INPUT(GPIOA_SWDIO) | \ + PIN_MODE_INPUT(GPIOA_SWCLK) | \ + PIN_MODE_INPUT(GPIOA_PIN15)) + +#undef VAL_GPIOA_PUPDR +#define VAL_GPIOA_PUPDR (PIN_PUPDR_FLOATING(GPIOA_BUTTON) | \ + PIN_PUPDR_PULLUP(GPIOA_PIN1) | \ + PIN_PUPDR_PULLUP(GPIOA_PIN2) | \ + PIN_PUPDR_PULLUP(GPIOA_PIN3) | \ + PIN_PUPDR_FLOATING(GPIOA_CS43L22_LRCK) |\ + PIN_PUPDR_FLOATING(GPIOA_L3GD20_SCL) | \ + PIN_PUPDR_PULLUP(GPIOA_L3GD20_SD0) | \ + PIN_PUPDR_PULLUP(GPIOA_L3GD20_SDI) | \ + PIN_PUPDR_PULLUP(GPIOA_PIN8) | \ + PIN_PUPDR_FLOATING(GPIOA_VBUS_FS) | \ + PIN_PUPDR_FLOATING(GPIOA_OTG_FS_ID) | \ + PIN_PUPDR_FLOATING(GPIOA_OTG_FS_DM) | \ + PIN_PUPDR_FLOATING(GPIOA_OTG_FS_DP) | \ + PIN_PUPDR_PULLUP(GPIOA_SWDIO) | \ + PIN_PUPDR_PULLUP(GPIOA_SWCLK) | \ + PIN_PUPDR_PULLUP(GPIOA_PIN15)) + +#undef VAL_GPIOB_MODER +#define VAL_GPIOB_MODER (PIN_MODE_INPUT(GPIOB_PIN0) | \ + PIN_MODE_INPUT(GPIOB_PIN1) | \ + PIN_MODE_INPUT(GPIOB_PIN2) | \ + PIN_MODE_INPUT(GPIOB_SWO) | \ + PIN_MODE_INPUT(GPIOB_PIN4) | \ + PIN_MODE_INPUT(GPIOB_PIN5) | \ + PIN_MODE_INPUT(GPIOB_LSM303DLHC_SCL) | \ + PIN_MODE_INPUT(GPIOB_PIN7) | \ + PIN_MODE_INPUT(GPIOB_PIN8) | \ + PIN_MODE_INPUT(GPIOB_LSM303DLHC_SDA) | \ + PIN_MODE_INPUT(GPIOB_MP45DT02_CLK_IN) |\ + PIN_MODE_INPUT(GPIOB_PIN11) | \ + PIN_MODE_INPUT(GPIOB_PIN12) | \ + PIN_MODE_INPUT(GPIOB_PIN13) | \ + PIN_MODE_INPUT(GPIOB_PIN14) | \ + PIN_MODE_INPUT(GPIOB_PIN15)) + +#undef VAL_GPIOB_PUPDR +#define VAL_GPIOB_PUPDR (PIN_PUPDR_PULLDOWN(GPIOB_PIN0) | \ + PIN_PUPDR_PULLDOWN(GPIOB_PIN1) | \ + PIN_PUPDR_PULLDOWN(GPIOB_PIN2) | \ + PIN_PUPDR_PULLDOWN(GPIOB_SWO) | \ + PIN_PUPDR_PULLDOWN(GPIOB_PIN4) | \ + PIN_PUPDR_PULLDOWN(GPIOB_PIN5) | \ + PIN_PUPDR_PULLDOWN(GPIOB_LSM303DLHC_SCL) |\ + PIN_PUPDR_PULLDOWN(GPIOB_PIN7) | \ + PIN_PUPDR_PULLDOWN(GPIOB_PIN8) | \ + PIN_PUPDR_PULLDOWN(GPIOB_LSM303DLHC_SDA) |\ + PIN_PUPDR_PULLDOWN(GPIOB_MP45DT02_CLK_IN) |\ + PIN_PUPDR_PULLDOWN(GPIOB_PIN11) | \ + PIN_PUPDR_PULLDOWN(GPIOB_PIN12) | \ + PIN_PUPDR_PULLDOWN(GPIOB_PIN13) | \ + PIN_PUPDR_PULLDOWN(GPIOB_PIN14) | \ + PIN_PUPDR_PULLDOWN(GPIOB_PIN15)) + +#undef VAL_GPIOB_AFRL +#define VAL_GPIOB_AFRL (PIN_AFIO_AF(GPIOB_PIN0, 0U) | \ + PIN_AFIO_AF(GPIOB_PIN1, 0U) | \ + PIN_AFIO_AF(GPIOB_PIN2, 0U) | \ + PIN_AFIO_AF(GPIOB_SWO, 0U) | \ + PIN_AFIO_AF(GPIOB_PIN4, 0U) | \ + PIN_AFIO_AF(GPIOB_PIN5, 0U) | \ + PIN_AFIO_AF(GPIOB_LSM303DLHC_SCL, 0) | \ + PIN_AFIO_AF(GPIOB_PIN7, 0U)) + +#undef VAL_GPIOB_AFRH +#define VAL_GPIOB_AFRH (PIN_AFIO_AF(GPIOB_PIN8, 0U) | \ + PIN_AFIO_AF(GPIOB_LSM303DLHC_SDA, 0) | \ + PIN_AFIO_AF(GPIOB_MP45DT02_CLK_IN, 0U) |\ + PIN_AFIO_AF(GPIOB_PIN11, 0U) | \ + PIN_AFIO_AF(GPIOB_PIN12, 0U) | \ + PIN_AFIO_AF(GPIOB_PIN13, 0U) | \ + PIN_AFIO_AF(GPIOB_PIN14, 0U) | \ + PIN_AFIO_AF(GPIOB_PIN15, 0U)) + +/* C5 Need to be pulldown */ +#undef VAL_GPIOC_MODER +#define VAL_GPIOC_MODER (PIN_MODE_INPUT(GPIOC_OTG_FS_POWER_ON) |\ + PIN_MODE_INPUT(GPIOC_PIN1) | \ + PIN_MODE_INPUT(GPIOC_PIN2) | \ + PIN_MODE_INPUT(GPIOC_CS43L22_AIN4x) | \ + PIN_MODE_INPUT(GPIOC_PIN4) | \ + PIN_MODE_INPUT(GPIOC_PIN5) | \ + PIN_MODE_INPUT(GPIOC_PIN6) | \ + PIN_MODE_INPUT(GPIOC_CS43L22_MCLK) | \ + PIN_MODE_INPUT(GPIOC_PIN8) | \ + PIN_MODE_INPUT(GPIOC_PIN9) | \ + PIN_MODE_INPUT(GPIOC_CS43L22_SCLK) | \ + PIN_MODE_INPUT(GPIOC_PIN11) | \ + PIN_MODE_INPUT(GPIOC_CS43L22_SDIN) | \ + PIN_MODE_INPUT(GPIOC_PIN13) | \ + PIN_MODE_INPUT(GPIOC_OSC32_IN) | \ + PIN_MODE_INPUT(GPIOC_OSC32_OUT)) + +#undef VAL_GPIOC_PUPDR +#define VAL_GPIOC_PUPDR (PIN_PUPDR_PULLUP(GPIOC_OTG_FS_POWER_ON) |\ + PIN_PUPDR_PULLUP(GPIOC_PIN1) | \ + PIN_PUPDR_PULLUP(GPIOC_PIN2) | \ + PIN_PUPDR_PULLUP(GPIOC_CS43L22_AIN4x) |\ + PIN_PUPDR_PULLUP(GPIOC_PIN4) | \ + PIN_PUPDR_PULLDOWN(GPIOC_PIN5) | \ + PIN_PUPDR_PULLUP(GPIOC_PIN6) | \ + PIN_PUPDR_PULLUP(GPIOC_CS43L22_MCLK) | \ + PIN_PUPDR_PULLUP(GPIOC_PIN8) | \ + PIN_PUPDR_PULLUP(GPIOC_PIN9) | \ + PIN_PUPDR_PULLUP(GPIOC_CS43L22_SCLK) | \ + PIN_PUPDR_PULLUP(GPIOC_PIN11) | \ + PIN_PUPDR_PULLUP(GPIOC_CS43L22_SDIN) | \ + PIN_PUPDR_PULLUP(GPIOC_PIN13) | \ + PIN_PUPDR_PULLUP(GPIOC_OSC32_IN) | \ + PIN_PUPDR_PULLUP(GPIOC_OSC32_OUT)) + +/* Set all GPIOD pins to INPUT & PULLUP to avoid FLOATING */ +#undef VAL_GPIOD_MODER +#define VAL_GPIOD_MODER (PIN_MODE_INPUT(GPIOD_PIN0) | \ + PIN_MODE_INPUT(GPIOD_PIN1) | \ + PIN_MODE_INPUT(GPIOD_PIN2) | \ + PIN_MODE_INPUT(GPIOD_PIN3) | \ + PIN_MODE_INPUT(GPIOD_CS43L22_RESET) | \ + PIN_MODE_INPUT(GPIOD_OverCurrent) | \ + PIN_MODE_INPUT(GPIOD_PIN6) | \ + PIN_MODE_INPUT(GPIOD_PIN7) | \ + PIN_MODE_INPUT(GPIOD_PIN8) | \ + PIN_MODE_INPUT(GPIOD_PIN9) | \ + PIN_MODE_INPUT(GPIOD_PIN10) | \ + PIN_MODE_INPUT(GPIOD_PIN11) | \ + PIN_MODE_INPUT(GPIOD_LED4) | \ + PIN_MODE_INPUT(GPIOD_LED3) | \ + PIN_MODE_INPUT(GPIOD_LED5) | \ + PIN_MODE_INPUT(GPIOD_LED6)) + +#undef VAL_GPIOD_PUPDR +#define VAL_GPIOD_PUPDR (PIN_PUPDR_PULLUP(GPIOD_PIN0) | \ + PIN_PUPDR_PULLUP(GPIOD_PIN1) | \ + PIN_PUPDR_PULLUP(GPIOD_PIN2) | \ + PIN_PUPDR_PULLUP(GPIOD_PIN3) | \ + PIN_PUPDR_PULLUP(GPIOD_CS43L22_RESET) |\ + PIN_PUPDR_PULLUP(GPIOD_OverCurrent) | \ + PIN_PUPDR_PULLUP(GPIOD_PIN6) | \ + PIN_PUPDR_PULLUP(GPIOD_PIN7) | \ + PIN_PUPDR_PULLUP(GPIOD_PIN8) | \ + PIN_PUPDR_PULLUP(GPIOD_PIN9) | \ + PIN_PUPDR_PULLUP(GPIOD_PIN10) | \ + PIN_PUPDR_PULLUP(GPIOD_PIN11) | \ + PIN_PUPDR_PULLUP(GPIOD_LED4) | \ + PIN_PUPDR_PULLUP(GPIOD_LED3) | \ + PIN_PUPDR_PULLUP(GPIOD_LED5) | \ + PIN_PUPDR_PULLUP(GPIOD_LED6)) + +/* Set all GPIOE pins to INPUT & PULLUP to avoid FLOATING */ +#undef VAL_GPIOE_MODER +#define VAL_GPIOE_MODER (PIN_MODE_INPUT(GPIOE_L3GD20_INT1) | \ + PIN_MODE_INPUT(GPIOE_L3GD20_INT2) | \ + PIN_MODE_INPUT(GPIOE_LSM303DLHC_DRDY) |\ + PIN_MODE_INPUT(GPIOE_L3GD20_CS) | \ + PIN_MODE_INPUT(GPIOE_LSM303DLHC_INT1) |\ + PIN_MODE_INPUT(GPIOE_LSM303DLHC_INT2) |\ + PIN_MODE_INPUT(GPIOE_PIN6) | \ + PIN_MODE_INPUT(GPIOE_PIN7) | \ + PIN_MODE_INPUT(GPIOE_PIN8) | \ + PIN_MODE_INPUT(GPIOE_PIN9) | \ + PIN_MODE_INPUT(GPIOE_PIN10) | \ + PIN_MODE_INPUT(GPIOE_PIN11) | \ + PIN_MODE_INPUT(GPIOE_PIN12) | \ + PIN_MODE_INPUT(GPIOE_PIN13) | \ + PIN_MODE_INPUT(GPIOE_PIN14) | \ + PIN_MODE_INPUT(GPIOE_PIN15)) + +#undef VAL_GPIOE_PUPDR +#define VAL_GPIOE_PUPDR (PIN_PUPDR_PULLUP(GPIOE_L3GD20_INT1) | \ + PIN_PUPDR_PULLUP(GPIOE_L3GD20_INT2) | \ + PIN_PUPDR_PULLUP(GPIOE_LSM303DLHC_DRDY) |\ + PIN_PUPDR_PULLUP(GPIOE_L3GD20_CS) | \ + PIN_PUPDR_PULLUP(GPIOE_LSM303DLHC_INT1) |\ + PIN_PUPDR_PULLUP(GPIOE_LSM303DLHC_INT2) |\ + PIN_PUPDR_PULLUP(GPIOE_PIN6) | \ + PIN_PUPDR_PULLUP(GPIOE_PIN7) | \ + PIN_PUPDR_PULLUP(GPIOE_PIN8) | \ + PIN_PUPDR_PULLUP(GPIOE_PIN9) | \ + PIN_PUPDR_PULLUP(GPIOE_PIN10) | \ + PIN_PUPDR_PULLUP(GPIOE_PIN11) | \ + PIN_PUPDR_PULLUP(GPIOE_PIN12) | \ + PIN_PUPDR_PULLUP(GPIOE_PIN13) | \ + PIN_PUPDR_PULLUP(GPIOE_PIN14) | \ + PIN_PUPDR_PULLUP(GPIOE_PIN15)) + diff --git a/keyboards/keychron/v5_max/config.h b/keyboards/keychron/v5_max/config.h new file mode 100644 index 0000000000..15ca9a06cb --- /dev/null +++ b/keyboards/keychron/v5_max/config.h @@ -0,0 +1,77 @@ +/* Copyright 2024 @ Keychron (https://www.keychron.com) + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#pragma once + +/* Encoder Configuration */ +#define ENCODER_DEFAULT_POS 0x3 +#define ENCODER_MAP_KEY_DELAY 2 + +#ifdef LK_WIRELESS_ENABLE +/* Hardware configuration */ +# define P2P4_MODE_SELECT_PIN A10 +# define BT_MODE_SELECT_PIN A9 + +# define LKBT51_RESET_PIN C4 +# define LKBT51_INT_INPUT_PIN B1 +# define BLUETOOTH_INT_OUTPUT_PIN A4 + +# define USB_POWER_SENSE_PIN B0 +# define USB_POWER_CONNECTED_LEVEL 0 + +# define BAT_CHARGING_PIN B13 +# define BAT_CHARGING_LEVEL 0 + +# define BAT_LOW_LED_PIN B12 +# define BAT_LOW_LED_PIN_ON_STATE 1 + +# define BT_HOST_DEVICES_COUNT 3 + +# if defined(RGB_MATRIX_ENABLE) + +# define LED_DRIVER_SHUTDOWN_PIN B7 + +/* Backlit disable timeout when keyboard is disconnected(unit: second) */ +# define DISCONNECTED_BACKLIGHT_DISABLE_TIMEOUT 40 + +/* Backlit disable timeout when keyboard is connected(unit: second) */ +# define CONNECTED_BACKLIGHT_DISABLE_TIMEOUT 600 + +/* Reinit LED driver on tranport changed */ +# define REINIT_LED_DRIVER 1 + +# endif + +/* Keep USB connection in blueooth mode */ +# define KEEP_USB_CONNECTION_IN_WIRELESS_MODE + +/* Enable bluetooth NKRO */ +# define WIRELESS_NKRO_ENABLE + +/* Raw hid command for factory test and bluetooth DFU */ +# define RAW_HID_CMD 0xAA ... 0xAB +#else +/* Raw hid command for factory test */ +# define RAW_HID_CMD 0xAB +#endif + +/* Factory test keys */ +#define FN_KEY_1 MO(1) +#define FN_KEY_2 MO(3) + +#define P2P4G_CELAR_MASK 0 + +#define MATRIX_IO_DELAY 10 diff --git a/keyboards/keychron/v5_max/halconf.h b/keyboards/keychron/v5_max/halconf.h new file mode 100644 index 0000000000..37bcc7c47b --- /dev/null +++ b/keyboards/keychron/v5_max/halconf.h @@ -0,0 +1,31 @@ +/* Copyright 2024 @ 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 + +#define _CHIBIOS_HAL_CONF_VER_8_0_ + +#define HAL_USE_SPI TRUE + +#ifdef LK_WIRELESS_ENABLE +# define HAL_USE_RTC TRUE +#endif + +#if defined(LK_WIRELESS_ENABLE) || defined(ENCODER_ENABLE) +# define PAL_USE_CALLBACKS TRUE +#endif + +#include_next diff --git a/keyboards/keychron/v5_max/info.json b/keyboards/keychron/v5_max/info.json new file mode 100644 index 0000000000..32015f7425 --- /dev/null +++ b/keyboards/keychron/v5_max/info.json @@ -0,0 +1,67 @@ +{ + "keyboard_name": "Keychron V5 Max", + "manufacturer": "Keychron", + "url": "https://github.com/Keychron", + "maintainer": "lokher", + "processor": "STM32F401", + "bootloader": "stm32-dfu", + "usb": { + "vid": "0x3434" + }, + "features": { + "bootmagic": true, + "extrakey" : true, + "mousekey" : true, + "dip_switch" : true, + "nkro" : true, + "rgb_matrix": true, + "raw" : true, + "sendstring" : true + }, + "matrix_pins": { + "cols": ["C6", "C7", "C8", "A14", "A15", "C10", "C11", "C13", "C14", "C15", "C0", "C1", "C2", "C3", "A0", "A1", "A2", "A3", "C9"], + "rows": ["C12", "D2", "B3", "B4", "B5", "B6"] + }, + "diode_direction": "ROW2COL", + "dip_switch" :{ + "pins": ["A8"] + }, + "rgb_matrix": { + "driver": "snled27351_spi", + "sleep": true, + "animations": { + "band_spiral_val": true, + "breathing": true, + "cycle_all": true, + "cycle_left_right": true, + "cycle_out_in": true, + "cycle_out_in_dual": true, + "cycle_pinwheel": true, + "cycle_spiral": true, + "cycle_up_down": true, + "digital_rain": true, + "dual_beacon": true, + "jellybean_raindrops": true, + "pixel_rain": true, + "rainbow_beacon": true, + "rainbow_moving_chevron": true, + "solid_reactive_multinexus": true, + "solid_reactive_multiwide": true, + "solid_reactive_simple": true, + "solid_splash": true, + "splash": true, + "typing_heatmap": true + } + }, + "eeprom": { + "wear_leveling": { + "driver": "embedded_flash", + "logical_size": 2048, + "backing_size": 4096 + } + }, + "build": { + "debounce_type": "sym_eager_pk" + }, + "debounce": 20 +} diff --git a/keyboards/keychron/v5_max/mcuconf.h b/keyboards/keychron/v5_max/mcuconf.h new file mode 100644 index 0000000000..89294ee64b --- /dev/null +++ b/keyboards/keychron/v5_max/mcuconf.h @@ -0,0 +1,37 @@ +/* Copyright 2024 @ 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_next + +#undef STM32_HSECLK +#define STM32_HSECLK 16000000 + +#undef STM32_PLLM_VALUE +#define STM32_PLLM_VALUE 8 + +#undef STM32_PLLN_VALUE +#define STM32_PLLN_VALUE 96 + +#undef STM32_PLLP_VALUE +#define STM32_PLLP_VALUE 4 + +#undef STM32_PLLQ_VALUE +#define STM32_PLLQ_VALUE 4 + +#undef STM32_SPI_USE_SPI1 +#define STM32_SPI_USE_SPI1 TRUE diff --git a/keyboards/keychron/v5_max/readme.md b/keyboards/keychron/v5_max/readme.md new file mode 100644 index 0000000000..e33116545f --- /dev/null +++ b/keyboards/keychron/v5_max/readme.md @@ -0,0 +1,21 @@ +# Keychron V5 Max + +![Keychron V5 Max](https://cdn.shopify.com/s/files/1/0059/0630/1017/files/Keychron-V5-Max-QMK-VIA-wireless-mechanical-keyboard.jpg?v=1702977391) + +A customizable 96% keyboard. + +* Keyboard Maintainer: [Keychron](https://github.com/keychron) +* Hardware Supported: Keychron V5 Max +* Hardware Availability: [Keychron V5 Max QMK/VIA Wireless Custom Mechanical Keyboard](https://www.keychron.com/products/keychron-v5-max-qmk-via-wireless-custom-mechanical-keyboard?variant=40759400005721) + +Make example for this keyboard (after setting up your build environment): + + make keychron/v5_max/ansi_encoder:default + +Flashing example for this keyboard: + + make keychron/v5_max/ansi_encoder:default:flash + +**Reset Key**: Toggle mode switch to "Cable", hold down the *Esc* key or reset button underneath space bar while connecting the USB cable, + +See the [build environment setup](https://docs.qmk.fm/#/getting_started_build_tools) and the [make instructions](https://docs.qmk.fm/#/getting_started_make_guide) for more information. Brand new to QMK? Start with our [Complete Newbs Guide](https://docs.qmk.fm/#/newbs). diff --git a/keyboards/keychron/v5_max/rules.mk b/keyboards/keychron/v5_max/rules.mk new file mode 100644 index 0000000000..4eaf6820bc --- /dev/null +++ b/keyboards/keychron/v5_max/rules.mk @@ -0,0 +1,4 @@ +include keyboards/keychron/common/wireless/wireless.mk +include keyboards/keychron/common/keychron_common.mk + +VPATH += $(TOP_DIR)/keyboards/keychron diff --git a/keyboards/keychron/v5_max/v5_max.c b/keyboards/keychron/v5_max/v5_max.c new file mode 100644 index 0000000000..4a4818f572 --- /dev/null +++ b/keyboards/keychron/v5_max/v5_max.c @@ -0,0 +1,85 @@ +/* Copyright 2024 @ Keychron (https://www.keychron.com) + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#include "quantum.h" +#include "keychron_task.h" +#ifdef FACTORY_TEST_ENABLE +# include "factory_test.h" +# include "keychron_common.h" +#endif +#ifdef LK_WIRELESS_ENABLE +# include "lkbt51.h" +# include "wireless.h" +# include "keychron_wireless_common.h" +# include "battery.h" +#endif + +#define POWER_ON_LED_DURATION 3000 +static uint32_t power_on_indicator_timer; + +#ifdef DIP_SWITCH_ENABLE +bool dip_switch_update_kb(uint8_t index, bool active) { + if (index == 0) { + default_layer_set(1UL << (active ? 0 : 2)); + } + dip_switch_update_user(index, active); + + return true; +} +#endif + +void keyboard_post_init_kb(void) { +#ifdef LK_WIRELESS_ENABLE + palSetLineMode(P2P4_MODE_SELECT_PIN, PAL_MODE_INPUT); + palSetLineMode(BT_MODE_SELECT_PIN, PAL_MODE_INPUT); + + writePin(BAT_LOW_LED_PIN, BAT_LOW_LED_PIN_ON_STATE); + + lkbt51_init(false); + wireless_init(); +#endif + + power_on_indicator_timer = timer_read32(); +#ifdef ENCODER_ENABLE + encoder_cb_init(); +#endif + + keyboard_post_init_user(); +} + +bool keychron_task_kb(void) { + if (power_on_indicator_timer) { + if (timer_elapsed32(power_on_indicator_timer) > POWER_ON_LED_DURATION) { + power_on_indicator_timer = 0; + +#ifdef LK_WIRELESS_ENABLE + writePin(BAT_LOW_LED_PIN, !BAT_LOW_LED_PIN_ON_STATE); +#endif + + } else { +#ifdef LK_WIRELESS_ENABLE + writePin(BAT_LOW_LED_PIN, BAT_LOW_LED_PIN_ON_STATE); +#endif + } + } + return true; +} + +#ifdef LK_WIRELESS_ENABLE +bool lpm_is_kb_idle(void) { + return power_on_indicator_timer == 0 && !factory_reset_indicating(); +} +#endif diff --git a/keyboards/keychron/v5_max/via_json/v5_ansi_encoder.json b/keyboards/keychron/v5_max/via_json/v5_ansi_encoder.json new file mode 100644 index 0000000000..7e73a1616b --- /dev/null +++ b/keyboards/keychron/v5_max/via_json/v5_ansi_encoder.json @@ -0,0 +1,321 @@ +{ + "name": "Keychron V5 Max ANSI Knob", + "vendorId": "0x3434", + "productId": "0x0950", + "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": "Misson Control", "title": "Misson Control in Mac", "shortName": "MCtl"}, + {"name": "Lanuch Pad", "title": "Lanuch Pad in Windows", "shortName": "LPad"}, + {"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": "2.4G", "title": "2.4G", "shortName": "2.4G"}, + {"name": "Battery Level", "title": "Show battery level", "shortName": "Batt"} + ], + "matrix": {"rows": 6, "cols" : 19}, + "layouts": { + "keymap": [ + [ + { + "c": "#777777" + }, + "0, 0", + { + "x": 1, + "c": "#cccccc" + }, + "0, 2", + "0, 3", + "0, 4", + "0, 5", + { + "x": 0.5, + "c": "#aaaaaa" + }, + "0, 7", + "0, 8", + "0, 9", + "0, 10", + { + "x": 0.5, + "c": "#cccccc" + }, + "0, 11", + "0, 12", + "0, 13", + "0, 14", + { + "x": 0.25, + "c": "#aaaaaa" + }, + "0, 15", + "0, 16", + "0, 17", + { + "x": 0.25, + "c": "#aaaaaa" + }, + "0, 18\n\n\n\n\n\n\n\n\ne0" + ], + [ + { + "y": 0.25, + "c": "#aaaaaa" + }, + "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", + { + "w": 2, + "c": "#aaaaaa" + }, + "1, 13", + { + "x": 0.5 + }, + "1, 15", + "1, 16", + "1, 17", + "1, 18" + ], + [ + { + "w": 1.5, + "c": "#aaaaaa" + }, + "2, 0", + { + "c": "#cccccc" + }, + "2, 1", + "2, 2", + "2, 3", + "2, 4", + "2, 5", + "2, 6", + "2, 7", + "2, 8", + "2, 9", + "2, 10", + "2, 11", + "2, 12", + { + "w": 1.5, + "c": "#aaaaaa" + }, + "2, 13", + { + "x": 0.5, + "c": "#cccccc" + }, + "2, 15", + "2, 16", + "2, 17", + { + "h": 2, + "c": "#aaaaaa" + }, + "3, 18" + ], + [ + { + "w": 1.75, + "c": "#aaaaaa" + }, + "3, 0", + { + "c": "#cccccc" + }, + "3, 1", + "3, 2", + "3, 3", + "3, 4", + "3, 5", + "3, 6", + "3, 7", + "3, 8", + "3, 9", + "3, 10", + "3, 11", + { + "w": 2.25, + "c": "#aaaaaa" + }, + "3, 12", + { + "x": 0.5, + "c": "#cccccc" + }, + "3, 15", + "3, 16", + "3, 17" + ], + [ + { + "w": 2.25, + "c": "#aaaaaa" + }, + "4, 0", + { + "c": "#cccccc" + }, + "4, 2", + "4, 3", + "4, 4", + "4, 5", + "4, 6", + "4, 7", + "4, 8", + "4, 9", + "4, 10", + "4, 11", + { + "w": 1.75, + "c": "#aaaaaa" + }, + "4, 12", + { + "x": 0.25, + "y": 0.25, + "c": "#cccccc" + }, + "4, 14", + { + "x": 0.25, + "y": -0.25 + }, + "4, 15", + "4, 16", + "4, 17", + { + "h": 2, + "c": "#aaaaaa" + }, + "4, 18" + ], + [ + { "w": 1.25, + "c": "#aaaaaa" + }, + "5, 0", + { + "w": 1.25 + }, + "5, 1", + { + "w": 1.25 + }, + "5, 2", + { + "w": 6.25, + "c": "#cccccc" + }, + "5, 6", + { + "c": "#aaaaaa" + }, + "5, 10", + "5, 11", + "5, 12", + { + "x": 0.25, + "y": 0.25, + "c": "#cccccc" + }, + "5, 13", + "5, 14", + "5, 15", + { + "x": 0.25, + "y": -0.25 + }, + "5, 16", + "5, 17" + ] + ] + } + +}