summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--builddefs/common_features.mk13
-rw-r--r--drivers/eeprom/eeprom_driver.h2
-rw-r--r--drivers/led/ckled2001.c2
-rw-r--r--keyboards/keychron/bluetooth/bat_level_animation.c132
-rw-r--r--keyboards/keychron/bluetooth/bat_level_animation.h23
-rw-r--r--keyboards/keychron/bluetooth/battery.c107
-rw-r--r--keyboards/keychron/bluetooth/battery.h51
-rw-r--r--keyboards/keychron/bluetooth/bluetooth.c441
-rw-r--r--keyboards/keychron/bluetooth/bluetooth.h85
-rw-r--r--keyboards/keychron/bluetooth/bluetooth.mk14
-rw-r--r--keyboards/keychron/bluetooth/bluetooth_config.h32
-rw-r--r--keyboards/keychron/bluetooth/bluetooth_event_type.h44
-rw-r--r--keyboards/keychron/bluetooth/bluetooth_main.c37
-rw-r--r--keyboards/keychron/bluetooth/ckbt51.c591
-rw-r--r--keyboards/keychron/bluetooth/ckbt51.h156
-rw-r--r--keyboards/keychron/bluetooth/factory_test.c308
-rw-r--r--keyboards/keychron/bluetooth/factory_test.h24
-rw-r--r--keyboards/keychron/bluetooth/indicator.c444
-rw-r--r--keyboards/keychron/bluetooth/indicator.h89
-rw-r--r--keyboards/keychron/bluetooth/lpm.c88
-rw-r--r--keyboards/keychron/bluetooth/lpm.h30
-rw-r--r--keyboards/keychron/bluetooth/lpm_stm32l432.c339
-rw-r--r--keyboards/keychron/bluetooth/lpm_stm32l432.h19
-rw-r--r--keyboards/keychron/bluetooth/report_buffer.c141
-rw-r--r--keyboards/keychron/bluetooth/report_buffer.h50
-rw-r--r--keyboards/keychron/bluetooth/transport.c182
-rw-r--r--keyboards/keychron/bluetooth/transport.h32
-rw-r--r--keyboards/keychron/k8_pro/ansi/rgb/config.h75
-rw-r--r--keyboards/keychron/k8_pro/ansi/rgb/info.json108
-rw-r--r--keyboards/keychron/k8_pro/ansi/rgb/keymaps/default/keymap.c59
-rw-r--r--keyboards/keychron/k8_pro/ansi/rgb/keymaps/via/keymap.c59
-rw-r--r--keyboards/keychron/k8_pro/ansi/rgb/keymaps/via/rules.mk1
-rw-r--r--keyboards/keychron/k8_pro/ansi/rgb/rgb.c148
-rw-r--r--keyboards/keychron/k8_pro/ansi/rgb/rules.mk3
-rw-r--r--keyboards/keychron/k8_pro/ansi/white/config.h60
-rw-r--r--keyboards/keychron/k8_pro/ansi/white/info.json108
-rw-r--r--keyboards/keychron/k8_pro/ansi/white/keymaps/default/keymap.c59
-rw-r--r--keyboards/keychron/k8_pro/ansi/white/keymaps/via/keymap.c59
-rw-r--r--keyboards/keychron/k8_pro/ansi/white/keymaps/via/rules.mk1
-rw-r--r--keyboards/keychron/k8_pro/ansi/white/rules.mk2
-rw-r--r--keyboards/keychron/k8_pro/ansi/white/white.c147
-rw-r--r--keyboards/keychron/k8_pro/config.h105
-rw-r--r--keyboards/keychron/k8_pro/halconf.h26
-rw-r--r--keyboards/keychron/k8_pro/iso/rgb/config.h74
-rw-r--r--keyboards/keychron/k8_pro/iso/rgb/info.json109
-rw-r--r--keyboards/keychron/k8_pro/iso/rgb/keymaps/default/keymap.c59
-rw-r--r--keyboards/keychron/k8_pro/iso/rgb/keymaps/via/keymap.c59
-rw-r--r--keyboards/keychron/k8_pro/iso/rgb/keymaps/via/rules.mk1
-rw-r--r--keyboards/keychron/k8_pro/iso/rgb/rgb.c149
-rw-r--r--keyboards/keychron/k8_pro/iso/rgb/rules.mk3
-rw-r--r--keyboards/keychron/k8_pro/iso/white/config.h59
-rw-r--r--keyboards/keychron/k8_pro/iso/white/info.json109
-rw-r--r--keyboards/keychron/k8_pro/iso/white/keymaps/default/keymap.c59
-rw-r--r--keyboards/keychron/k8_pro/iso/white/keymaps/via/keymap.c59
-rw-r--r--keyboards/keychron/k8_pro/iso/white/keymaps/via/rules.mk1
-rw-r--r--keyboards/keychron/k8_pro/iso/white/rules.mk2
-rw-r--r--keyboards/keychron/k8_pro/iso/white/white.c148
-rw-r--r--keyboards/keychron/k8_pro/k8_pro.c299
-rw-r--r--keyboards/keychron/k8_pro/k8_pro.h99
-rw-r--r--keyboards/keychron/k8_pro/matrix.c173
-rw-r--r--keyboards/keychron/k8_pro/mcuconf.h37
-rw-r--r--keyboards/keychron/k8_pro/readme.md21
-rw-r--r--keyboards/keychron/k8_pro/rules.mk36
-rw-r--r--platforms/chibios/drivers/eeprom/eeprom_stm32_defs.h7
-rw-r--r--platforms/chibios/drivers/flash/flash_stm32.c55
-rw-r--r--platforms/chibios/drivers/flash/flash_stm32.h1
-rw-r--r--platforms/chibios/eeprom_stm32_l4.c598
-rw-r--r--platforms/chibios/eeprom_stm32_l4.h34
-rw-r--r--platforms/chibios/flash_stm32.c263
-rw-r--r--platforms/chibios/flash_stm32.h45
-rw-r--r--platforms/eeprom.h3
-rw-r--r--quantum/keyboard.c5
-rw-r--r--quantum/led_matrix/led_matrix.c86
-rw-r--r--quantum/led_matrix/led_matrix.h25
-rw-r--r--quantum/led_matrix/led_matrix_drivers.c40
-rw-r--r--quantum/rgb_matrix/rgb_matrix.c80
-rw-r--r--quantum/rgb_matrix/rgb_matrix.h23
-rw-r--r--quantum/rgb_matrix/rgb_matrix_drivers.c45
-rw-r--r--quantum/via.c6
-rw-r--r--tmk_core/protocol.mk2
-rw-r--r--tmk_core/protocol/chibios/chibios.c2
-rw-r--r--tmk_core/protocol/chibios/usb_driver.c2
-rw-r--r--tmk_core/protocol/chibios/usb_main.c28
-rw-r--r--tmk_core/protocol/chibios/usb_main.h7
-rw-r--r--tmk_core/protocol/host.h1
-rw-r--r--tmk_core/protocol/report.c40
86 files changed, 7417 insertions, 33 deletions
diff --git a/builddefs/common_features.mk b/builddefs/common_features.mk
index a23b5e82b9..e0b0caf42b 100644
--- a/builddefs/common_features.mk
+++ b/builddefs/common_features.mk
@@ -222,11 +222,16 @@ else
# True EEPROM on STM32L0xx, L1xx
OPT_DEFS += -DEEPROM_DRIVER -DEEPROM_STM32_L0_L1
SRC += eeprom_driver.c eeprom_stm32_L0_L1.c
+ else ifneq ($(filter $(MCU_SERIES),STM32L4xx),)
+ OPT_DEFS += -DEEPROM_DRIVER -DEEPROM_STM32_L4
+ COMMON_VPATH += $(DRIVER_PATH)/eeprom
+ SRC += eeprom_driver.c
+ SRC += $(PLATFORM_COMMON_DIR)/eeprom_stm32_l4.c
+ SRC += $(PLATFORM_COMMON_DIR)/flash_stm32.c
else ifneq ($(filter $(MCU_SERIES),RP2040),)
- # Wear-leveling EEPROM implementation, backed by RP2040 flash
- OPT_DEFS += -DEEPROM_DRIVER -DEEPROM_WEAR_LEVELING
- SRC += eeprom_driver.c eeprom_wear_leveling.c
- WEAR_LEVELING_DRIVER = rp2040_flash
+ # Wear-leveling EEPROM implementation, backed by RP2040 flash
+ OPT_DEFS += -DEEPROM_DRIVER -DEEPROM_WEAR_LEVELING
+ SRC += eeprom_driver.c eeprom_wear_leveling.c
else ifneq ($(filter $(MCU_SERIES),KL2x K20x),)
# Teensy EEPROM implementations
OPT_DEFS += -DEEPROM_TEENSY
diff --git a/drivers/eeprom/eeprom_driver.h b/drivers/eeprom/eeprom_driver.h
index 74592bc8f0..0249a96fd8 100644
--- a/drivers/eeprom/eeprom_driver.h
+++ b/drivers/eeprom/eeprom_driver.h
@@ -18,5 +18,5 @@
#include "eeprom.h"
-void eeprom_driver_init(void);
+uint16_t eeprom_driver_init(void);
void eeprom_driver_erase(void);
diff --git a/drivers/led/ckled2001.c b/drivers/led/ckled2001.c
index b7e7db06cc..dbe41dd9d5 100644
--- a/drivers/led/ckled2001.c
+++ b/drivers/led/ckled2001.c
@@ -232,3 +232,5 @@ void CKLED2001_sw_shutdown(uint8_t addr) {
// Write SW Sleep Register
CKLED2001_write_register(addr, SOFTWARE_SLEEP_REG, MSKSLEEP_ENABLE);
}
+
+
diff --git a/keyboards/keychron/bluetooth/bat_level_animation.c b/keyboards/keychron/bluetooth/bat_level_animation.c
new file mode 100644
index 0000000000..83a4f91cae
--- /dev/null
+++ b/keyboards/keychron/bluetooth/bat_level_animation.c
@@ -0,0 +1,132 @@
+
+#include "quantum.h"
+#include "bluetooth.h"
+#include "indicator.h"
+#include "lpm.h"
+#if defined(PROTOCOL_CHIBIOS)
+# include <usb_main.h>
+#elif if defined(PROTOCOL_LUFA)
+# include "lufa.h"
+#endif
+
+#ifndef BAT_LEVEL_GROWING_INTERVAL
+# define BAT_LEVEL_GROWING_INTERVAL 150
+#endif
+
+#ifndef BAT_LEVEL_ON_INTERVAL
+# define BAT_LEVEL_ON_INTERVAL 3000
+#endif
+
+enum {
+ BAT_LVL_ANI_NONE,
+ BAT_LVL_ANI_GROWING,
+ BAT_LVL_ANI_BLINK_OFF,
+ BAT_LVL_ANI_BLINK_ON,
+};
+
+static uint8_t animation_state = 0;
+static uint32_t bat_lvl_ani_timer_buffer = 0;
+static uint8_t bat_percentage;
+static uint8_t cur_percentage;
+static uint32_t time_interval;
+#ifdef RGB_MATRIX_ENABLE
+static uint8_t r, g, b;
+#endif
+
+extern indicator_config_t indicator_config;
+extern backlight_state_t original_backlight_state;
+
+void bat_level_animiation_start(uint8_t percentage) {
+ /* Turn on backlight mode for indicator */
+ indicator_enable();
+
+ animation_state = BAT_LVL_ANI_GROWING;
+ bat_percentage = percentage;
+ bat_lvl_ani_timer_buffer = sync_timer_read32();
+ cur_percentage = 0;
+ time_interval = BAT_LEVEL_GROWING_INTERVAL;
+#ifdef RGB_MATRIX_ENABLE
+ r = g = b = 255;
+#endif
+}
+
+void bat_level_animiation_stop(void) {
+ animation_state = BAT_LVL_ANI_NONE;
+}
+
+bool bat_level_animiation_actived(void) {
+ return animation_state;
+}
+
+void bat_level_animiation_indicate(void) {
+#ifdef LED_MATRIX_ENABLE
+ uint8_t bat_lvl_led_list[10] = BAT_LEVEL_LED_LIST;
+
+ for (uint8_t i = 0; i <= DRIVER_LED_TOTAL; i++) {
+ led_matrix_set_value(i, 0);
+ }
+
+ if (animation_state == BAT_LVL_ANI_GROWING || animation_state == BAT_LVL_ANI_BLINK_ON)
+ for (uint8_t i = 0; i < cur_percentage / 10; i++)
+ led_matrix_set_value(bat_lvl_led_list[i], 255);
+#endif
+
+#ifdef RGB_MATRIX_ENABLE
+ uint8_t bat_lvl_led_list[10] = BAT_LEVEL_LED_LIST;
+
+ for (uint8_t i = 0; i <= DRIVER_LED_TOTAL; i++) {
+ rgb_matrix_set_color(i, 0, 0, 0);
+ }
+
+ if (animation_state == BAT_LVL_ANI_GROWING || animation_state == BAT_LVL_ANI_BLINK_ON) {
+ for (uint8_t i = 0; i < cur_percentage / 10; i++) {
+ rgb_matrix_set_color(bat_lvl_led_list[i], r, g, b);
+ }
+ }
+#endif
+}
+
+void bat_level_animiation_update(void) {
+ switch (animation_state) {
+ case BAT_LVL_ANI_GROWING:
+ if (cur_percentage < bat_percentage)
+ cur_percentage += 10;
+ else {
+ if (cur_percentage == 0) cur_percentage = 10;
+ animation_state = BAT_LVL_ANI_BLINK_OFF;
+ }
+ break;
+
+ case BAT_LVL_ANI_BLINK_OFF:
+#ifdef RGB_MATRIX_ENABLE
+ if (bat_percentage < 30) {
+ r = 255;
+ b = g = 0;
+ } else {
+ r = b = 0;
+ g = 255;
+ }
+#endif
+ time_interval = BAT_LEVEL_ON_INTERVAL;
+ animation_state = BAT_LVL_ANI_BLINK_ON;
+ break;
+
+ case BAT_LVL_ANI_BLINK_ON:
+ animation_state = BAT_LVL_ANI_NONE;
+ if (indicator_config.value == 0 && !indicator_is_backlit_enabled_eeprom()) {
+ indicator_disable();
+ }
+ break;
+
+ default:
+ break;
+ }
+
+ bat_lvl_ani_timer_buffer = sync_timer_read32();
+}
+
+void bat_level_animiation_task(void) {
+ if (animation_state && sync_timer_elapsed32(bat_lvl_ani_timer_buffer) > time_interval) {
+ bat_level_animiation_update();
+ }
+}
diff --git a/keyboards/keychron/bluetooth/bat_level_animation.h b/keyboards/keychron/bluetooth/bat_level_animation.h
new file mode 100644
index 0000000000..716e924103
--- /dev/null
+++ b/keyboards/keychron/bluetooth/bat_level_animation.h
@@ -0,0 +1,23 @@
+/* Copyright 2022 @ lokher (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
+
+void bat_level_animiation_start(uint8_t percentage);
+void bat_level_animiation_stop(void);
+bool bat_level_animiation_actived(void);
+void bat_level_animiation_indicate(void);
+void bat_level_animiation_task(void);
diff --git a/keyboards/keychron/bluetooth/battery.c b/keyboards/keychron/bluetooth/battery.c
new file mode 100644
index 0000000000..6dd453357e
--- /dev/null
+++ b/keyboards/keychron/bluetooth/battery.c
@@ -0,0 +1,107 @@
+/* Copyright 2022 @ lokher (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 "bluetooth.h"
+#include "battery.h"
+#include "transport.h"
+#include "ckbt51.h"
+#include "lpm.h"
+
+#define BATTERY_EMPTY_COUNT 10
+#define CRITICAL_LOW_COUNT 20
+
+static uint32_t bat_monitor_timer_buffer = 0;
+static uint16_t voltage = FULL_VOLTAGE_VALUE;
+static uint8_t bat_empty = 0;
+static uint8_t critical_low = 0;
+static uint8_t bat_state;
+
+void battery_init(void) {
+ bat_monitor_timer_buffer = 0;
+ bat_state = BAT_NOT_CHARGING;
+}
+__attribute__((weak)) void battery_measure(void) {}
+
+/* Calculate the voltage */
+__attribute__((weak)) void battery_calculate_voltage(uint16_t value) {}
+
+void battery_set_voltage(uint16_t value) {
+ voltage = value;
+}
+
+uint16_t battery_get_voltage(void) {
+ return voltage;
+}
+
+uint8_t battery_get_percentage(void) {
+ if (voltage > FULL_VOLTAGE_VALUE) return 100;
+
+ if (voltage > EMPTY_VOLTAGE_VALUE) {
+ return ((uint32_t)voltage - EMPTY_VOLTAGE_VALUE) * 80 / (FULL_VOLTAGE_VALUE - EMPTY_VOLTAGE_VALUE) + 20;
+ }
+
+ if (voltage > SHUTDOWN_VOLTAGE_VALUE) {
+ return ((uint32_t)voltage - SHUTDOWN_VOLTAGE_VALUE) * 20 / (EMPTY_VOLTAGE_VALUE - SHUTDOWN_VOLTAGE_VALUE);
+ } else
+ return 0;
+}
+
+bool battery_is_empty(void) {
+ return bat_empty > BATTERY_EMPTY_COUNT;
+}
+
+bool battery_is_critical_low(void) {
+ return critical_low > CRITICAL_LOW_COUNT;
+}
+
+void battery_check_empty(void) {
+ if (voltage < EMPTY_VOLTAGE_VALUE) {
+ if (bat_empty <= BATTERY_EMPTY_COUNT) {
+ if (++bat_empty > BATTERY_EMPTY_COUNT) indicator_battery_low_enable(true);
+ }
+ } else if (bat_empty <= BATTERY_EMPTY_COUNT) {
+ bat_empty = BATTERY_EMPTY_COUNT;
+ }
+}
+
+void battery_check_critical_low(void) {
+ if (voltage < SHUTDOWN_VOLTAGE_VALUE) {
+ if (critical_low <= CRITICAL_LOW_COUNT) {
+ if (++critical_low > CRITICAL_LOW_COUNT) bluetooth_low_