1 /* Copyright 2019 Jason Williams (Wilba)
3 * This program is free software: you can redistribute it and/or modify
4 * it under the terms of the GNU General Public License as published by
5 * the Free Software Foundation, either version 2 of the License, or
6 * (at your option) any later version.
8 * This program is distributed in the hope that it will be useful,
9 * but WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 * GNU General Public License for more details.
13 * You should have received a copy of the GNU General Public License
14 * along with this program. If not, see <http://www.gnu.org/licenses/>.
19 #include <tmk_core/common/eeconfig.h> // for EECONFIG_SIZE
21 // Keyboard level code can change where VIA stores the magic.
22 // The magic is the build date YYMMDD encoded as BCD in 3 bytes,
23 // thus installing firmware built on a different date to the one
24 // already installed can be detected and the EEPROM data is reset.
25 // The only reason this is important is in case EEPROM usage changes
26 // and the EEPROM was not explicitly reset by bootmagic lite.
27 #ifndef VIA_EEPROM_MAGIC_ADDR
28 # define VIA_EEPROM_MAGIC_ADDR (EECONFIG_SIZE)
31 #define VIA_EEPROM_LAYOUT_OPTIONS_ADDR (VIA_EEPROM_MAGIC_ADDR+3)
33 // Changing the layout options size after release will invalidate EEPROM,
34 // but this is something that should be set correctly on initial implementation.
35 // 1 byte is enough for most uses (i.e. 8 binary states, or 6 binary + 1 ternary/quaternary )
36 #ifndef VIA_EEPROM_LAYOUT_OPTIONS_SIZE
37 # define VIA_EEPROM_LAYOUT_OPTIONS_SIZE 1
40 // The end of the EEPROM memory used by VIA
41 // By default, dynamic keymaps will start at this if there is no
43 #define VIA_EEPROM_CUSTOM_CONFIG_ADDR (VIA_EEPROM_LAYOUT_OPTIONS_ADDR+VIA_EEPROM_LAYOUT_OPTIONS_SIZE)
45 #ifndef VIA_EEPROM_CUSTOM_CONFIG_SIZE
46 # define VIA_EEPROM_CUSTOM_CONFIG_SIZE 0
49 // This is changed only when the command IDs change,
50 // so VIA Configurator can detect compatible firmware.
51 #define VIA_PROTOCOL_VERSION 0x0009
55 id_get_protocol_version
= 0x01, // always 0x01
56 id_get_keyboard_value
,
57 id_set_keyboard_value
,
58 id_dynamic_keymap_get_keycode
,
59 id_dynamic_keymap_set_keycode
,
60 id_dynamic_keymap_reset
,
61 id_backlight_config_set_value
,
62 id_backlight_config_get_value
,
63 id_backlight_config_save
,
66 id_dynamic_keymap_macro_get_count
,
67 id_dynamic_keymap_macro_get_buffer_size
,
68 id_dynamic_keymap_macro_get_buffer
,
69 id_dynamic_keymap_macro_set_buffer
,
70 id_dynamic_keymap_macro_reset
,
71 id_dynamic_keymap_get_layer_count
,
72 id_dynamic_keymap_get_buffer
,
73 id_dynamic_keymap_set_buffer
,
77 enum via_keyboard_value_id
81 id_switch_matrix_state
84 // Can't use SAFE_RANGE here, it might change if someone adds
85 // new values to enum quantum_keycodes.
86 // Need to keep checking 0x5F10 is still in the safe range.
87 // TODO: merge this into quantum_keycodes
88 // Backlight keycodes are in range 0x5F00-0x5F0F
129 // Can be called in an overriding via_init_kb() to test if keyboard level code usage of
130 // EEPROM is invalid and use/save defaults.
131 bool via_eeprom_is_valid(void);
133 // Sets VIA/keyboard level usage of EEPROM to valid/invalid
134 // Keyboard level code (eg. via_init_kb()) should not call this
135 void via_eeprom_set_valid(bool valid
);
137 // Flag QMK and VIA/keyboard level EEPROM as invalid.
138 // Used in bootmagic_lite() and VIA command handler.
139 // Keyboard level code should not need to call this.
140 void via_eeprom_reset(void);
142 // Called by QMK core to initialize dynamic keymaps etc.
145 // Used by VIA to store and retrieve the layout options.
146 uint32_t via_get_layout_options(void);
147 void via_set_layout_options(uint32_t value
);
149 // Called by QMK core to process VIA-specific keycodes.
150 bool process_record_via(uint16_t keycode
, keyrecord_t
*record
);