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
54 id_get_protocol_version
= 0x01, // always 0x01
55 id_get_keyboard_value
= 0x02,
56 id_set_keyboard_value
= 0x03,
57 id_dynamic_keymap_get_keycode
= 0x04,
58 id_dynamic_keymap_set_keycode
= 0x05,
59 id_dynamic_keymap_reset
= 0x06,
60 id_lighting_set_value
= 0x07,
61 id_lighting_get_value
= 0x08,
62 id_lighting_save
= 0x09,
63 id_eeprom_reset
= 0x0A,
64 id_bootloader_jump
= 0x0B,
65 id_dynamic_keymap_macro_get_count
= 0x0C,
66 id_dynamic_keymap_macro_get_buffer_size
= 0x0D,
67 id_dynamic_keymap_macro_get_buffer
= 0x0E,
68 id_dynamic_keymap_macro_set_buffer
= 0x0F,
69 id_dynamic_keymap_macro_reset
= 0x10,
70 id_dynamic_keymap_get_layer_count
= 0x11,
71 id_dynamic_keymap_get_buffer
= 0x12,
72 id_dynamic_keymap_set_buffer
= 0x13,
76 enum via_keyboard_value_id
{
78 id_layout_options
= 0x02,
79 id_switch_matrix_state
= 0x03
82 enum via_lighting_value
{
84 id_qmk_backlight_brightness
= 0x09,
85 id_qmk_backlight_effect
= 0x0A,
88 id_qmk_rgblight_brightness
= 0x80,
89 id_qmk_rgblight_effect
= 0x81,
90 id_qmk_rgblight_effect_speed
= 0x82,
91 id_qmk_rgblight_color
= 0x83,
94 // Can't use SAFE_RANGE here, it might change if someone adds
95 // new values to enum quantum_keycodes.
96 // Need to keep checking 0x5F10 is still in the safe range.
97 // TODO: merge this into quantum_keycodes
98 // Backlight keycodes are in range 0x5F00-0x5F0F
139 // Can be called in an overriding via_init_kb() to test if keyboard level code usage of
140 // EEPROM is invalid and use/save defaults.
141 bool via_eeprom_is_valid(void);
143 // Sets VIA/keyboard level usage of EEPROM to valid/invalid
144 // Keyboard level code (eg. via_init_kb()) should not call this
145 void via_eeprom_set_valid(bool valid
);
147 // Flag QMK and VIA/keyboard level EEPROM as invalid.
148 // Used in bootmagic_lite() and VIA command handler.
149 // Keyboard level code should not need to call this.
150 void via_eeprom_reset(void);
152 // Called by QMK core to initialize dynamic keymaps etc.
155 // Used by VIA to store and retrieve the layout options.
156 uint32_t via_get_layout_options(void);
157 void via_set_layout_options(uint32_t value
);
159 // Called by QMK core to process VIA-specific keycodes.
160 bool process_record_via(uint16_t keycode
, keyrecord_t
*record
);