/* 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 // Allow override of the layout options default value. // This requires advanced knowledge of how VIA stores layout options // and is only really useful for setting a boolean layout option // state to true by default. #ifndef VIA_EEPROM_LAYOUT_OPTIONS_DEFAULT # define VIA_EEPROM_LAYOUT_OPTIONS_DEFAULT 0x00000000 #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 = 0x02, id_set_keyboard_value = 0x03, id_dynamic_keymap_get_keycode = 0x04, id_dynamic_keymap_set_keycode = 0x05, id_dynamic_keymap_reset = 0x06, id_lighting_set_value = 0x07, id_lighting_get_value = 0x08, id_lighting_save = 0x09, id_eeprom_reset = 0x0A, id_bootloader_jump = 0x0B, id_dynamic_keymap_macro_get_count = 0x0C, id_dynamic_keymap_macro_get_buffer_size = 0x0D, id_dynamic_keymap_macro_get_buffer = 0x0E, id_dynamic_keymap_macro_set_buffer = 0x0F, id_dynamic_keymap_macro_reset = 0x10, id_dynamic_keymap_get_layer_count = 0x11, id_dynamic_keymap_get_buffer = 0x12, id_dynamic_keymap_set_buffer = 0x13, id_unhandled = 0xFF, }; enum via_keyboard_value_id { id_uptime = 0x01, // id_layout_options = 0x02, id_switch_matrix_state = 0x03 }; enum via_lighting_value { // QMK BACKLIGHT id_qmk_backlight_brightness = 0x09, id_qmk_backlight_effect = 0x0A, // QMK RGBLIGHT id_qmk_rgblight_brightness = 0x80, id_qmk_rgblight_effect = 0x81, id_qmk_rgblight_effect_speed = 0x82, id_qmk_rgblight_color = 0x83, }; // 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);