summary refs log tree commit diff
path: root/quantum/via.h
diff options
context:
space:
mode:
authorWilba <Jason.S.Williams@gmail.com>2020-01-04 07:52:00 +1100
committerDrashna Jaelre <drashna@live.com>2020-01-03 12:52:00 -0800
commit320822d75b785401809f45007320e6fb6885b3fd (patch)
treec511d49a48b953ac29ffb4a51ac928319eb9fde4 /quantum/via.h
parentb36259566546eb884cc241bcfadb671051e5e75e (diff)
VIA Configurator Refactor (#7268)
* VIA Refactor

* Remove old code

* review changes

* review changes

* Fix cannonkeys/satisfaction75/prototype:via build

* Add via.h to quantum.h

* Move backlight init to after backlight config load

* Merge branch 'master' into via_refactor_pr

* Update user's rules.mk to new way of enabling VIA

* Added id_switch_matrix_state

* Review changes
Diffstat (limited to 'quantum/via.h')
-rw-r--r--quantum/via.h151
1 files changed, 151 insertions, 0 deletions
diff --git a/quantum/via.h b/quantum/via.h
new file mode 100644
index 0000000000..f9a8017b24
--- /dev/null
+++ b/quantum/via.h
@@ -0,0 +1,151 @@
+/* Copyright 2019 Jason Williams (Wilba)
+ *
+ * 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 <tmk_core/common/eeconfig.h> // for EECONFIG_SIZE
+
+// Keyboard level code can change where VIA stores the magic.
+// The magic is the build date YYMMDD encoded as BCD in 3 bytes,
+// thus installing firmware built on a different date to the one
+// already installed can be detected and the EEPROM data is reset.
+// The only reason this is important is in case EEPROM usage changes
+// and the EEPROM was not explicitly reset by bootmagic lite.
+#ifndef VIA_EEPROM_MAGIC_ADDR
+#   define VIA_EEPROM_MAGIC_ADDR (EECONFIG_SIZE)
+#endif
+
+#define VIA_EEPROM_LAYOUT_OPTIONS_ADDR (VIA_EEPROM_MAGIC_ADDR+3)
+
+// Changing the layout options size after release will invalidate EEPROM,
+// but this is something that should be set correctly on initial implementation.
+// 1 byte is enough for most uses (i.e. 8 binary states, or 6 binary + 1 ternary/quaternary )
+#ifndef VIA_EEPROM_LAYOUT_OPTIONS_SIZE
+#   define VIA_EEPROM_LAYOUT_OPTIONS_SIZE 1
+#endif
+
+// The end of the EEPROM memory used by VIA
+// By default, dynamic keymaps will start at this if there is no
+// custom config
+#define VIA_EEPROM_CUSTOM_CONFIG_ADDR (VIA_EEPROM_LAYOUT_OPTIONS_ADDR+VIA_EEPROM_LAYOUT_OPTIONS_SIZE)
+
+#ifndef VIA_EEPROM_CUSTOM_CONFIG_SIZE
+#   define VIA_EEPROM_CUSTOM_CONFIG_SIZE 0
+#endif
+
+// This is changed only when the command IDs change,
+// so VIA Configurator can detect compatible firmware. 
+#define VIA_PROTOCOL_VERSION 0x0009
+
+enum via_command_id
+{
+    id_get_protocol_version = 0x01, // always 0x01
+    id_get_keyboard_value,
+    id_set_keyboard_value,
+    id_dynamic_keymap_get_keycode,
+    id_dynamic_keymap_set_keycode,
+    id_dynamic_keymap_reset,
+    id_backlight_config_set_value,
+    id_backlight_config_get_value,
+    id_backlight_config_save,
+    id_eeprom_reset,
+    id_bootloader_jump,
+    id_dynamic_keymap_macro_get_count,
+    id_dynamic_keymap_macro_get_buffer_size,
+    id_dynamic_keymap_macro_get_buffer,
+    id_dynamic_keymap_macro_set_buffer,
+    id_dynamic_keymap_macro_reset,
+    id_dynamic_keymap_get_layer_count,
+    id_dynamic_keymap_get_buffer,
+    id_dynamic_keymap_set_buffer,
+    id_unhandled = 0xFF,
+};
+
+enum via_keyboard_value_id
+{
+  id_uptime = 0x01,
+  id_layout_options,
+  id_switch_matrix_state
+};
+
+// Can't use SAFE_RANGE here, it might change if someone adds
+// new values to enum quantum_keycodes.
+// Need to keep checking 0x5F10 is still in the safe range.
+// TODO: merge this into quantum_keycodes
+// Backlight keycodes are in range 0x5F00-0x5F0F
+enum via_keycodes {
+    FN_MO13 = 0x5F10,
+    FN_MO23,
+    MACRO00,
+    MACRO01,
+    MACRO02,
+    MACRO03,
+    MACRO04,
+    MACRO05,
+    MACRO06,
+    MACRO07,
+    MACRO08,
+    MACRO09,
+    MACRO10,
+    MACRO11,
+    MACRO12,
+    MACRO13,
+    MACRO14,
+    MACRO15,
+};
+
+enum user_keycodes {
+  USER00 = 0x5F80,
+  USER01,
+  USER02,
+  USER03,
+  USER04,
+  USER05,
+  USER06,
+  USER07,
+  USER08,
+  USER09,
+  USER10,
+  USER11,
+  USER12,
+  USER13,
+  USER14,
+  USER15,
+};
+
+// Can be called in an overriding via_init_kb() to test if keyboard level code usage of
+// EEPROM is invalid and use/save defaults.
+bool via_eeprom_is_valid(void);
+
+// Sets VIA/keyboard level usage of EEPROM to valid/invalid
+// Keyboard level code (eg. via_init_kb()) should not call this
+void via_eeprom_set_valid(bool valid);
+
+// Flag QMK and VIA/keyboard level EEPROM as invalid.
+// Used in bootmagic_lite() and VIA command handler.
+// Keyboard level code should not need to call this.
+void via_eeprom_reset(void);
+
+// Called by QMK core to initialize dynamic keymaps etc.
+void via_init(void);
+
+// Used by VIA to store and retrieve the layout options.
+uint32_t via_get_layout_options(void);
+void via_set_layout_options(uint32_t value);
+
+// Called by QMK core to process VIA-specific keycodes.
+bool process_record_via(uint16_t keycode, keyrecord_t *record);
+