204 lines
7.4 KiB
C
204 lines
7.4 KiB
C
/* 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 "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
|
|
|
|
#define VIA_EEPROM_CONFIG_END (VIA_EEPROM_CUSTOM_CONFIG_ADDR + VIA_EEPROM_CUSTOM_CONFIG_SIZE)
|
|
|
|
// This is changed only when the command IDs change,
|
|
// so VIA Configurator can detect compatible firmware.
|
|
#define VIA_PROTOCOL_VERSION 0x000C
|
|
|
|
// This is a version number for the firmware for the keyboard.
|
|
// It can be used to ensure the VIA keyboard definition and the firmware
|
|
// have the same version, especially if there are changes to custom values.
|
|
// Define this in config.h to override and bump this number.
|
|
// This is *not* required if the keyboard is only using basic functionality
|
|
// and not using custom values for lighting, rotary encoders, etc.
|
|
#ifndef VIA_FIRMWARE_VERSION
|
|
# define VIA_FIRMWARE_VERSION 0x00000000
|
|
#endif
|
|
|
|
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_custom_set_value = 0x07,
|
|
id_custom_get_value = 0x08,
|
|
id_custom_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_dynamic_keymap_get_encoder = 0x14,
|
|
id_dynamic_keymap_set_encoder = 0x15,
|
|
id_unhandled = 0xFF,
|
|
};
|
|
|
|
enum via_keyboard_value_id {
|
|
id_uptime = 0x01,
|
|
id_layout_options = 0x02,
|
|
id_switch_matrix_state = 0x03,
|
|
id_firmware_version = 0x04,
|
|
id_device_indication = 0x05,
|
|
};
|
|
|
|
enum via_channel_id {
|
|
id_custom_channel = 0,
|
|
id_qmk_backlight_channel = 1,
|
|
id_qmk_rgblight_channel = 2,
|
|
id_qmk_rgb_matrix_channel = 3,
|
|
id_qmk_audio_channel = 4,
|
|
id_qmk_led_matrix_channel = 5,
|
|
};
|
|
|
|
enum via_qmk_backlight_value {
|
|
id_qmk_backlight_brightness = 1,
|
|
id_qmk_backlight_effect = 2,
|
|
};
|
|
|
|
enum via_qmk_rgblight_value {
|
|
id_qmk_rgblight_brightness = 1,
|
|
id_qmk_rgblight_effect = 2,
|
|
id_qmk_rgblight_effect_speed = 3,
|
|
id_qmk_rgblight_color = 4,
|
|
};
|
|
|
|
enum via_qmk_rgb_matrix_value {
|
|
id_qmk_rgb_matrix_brightness = 1,
|
|
id_qmk_rgb_matrix_effect = 2,
|
|
id_qmk_rgb_matrix_effect_speed = 3,
|
|
id_qmk_rgb_matrix_color = 4,
|
|
};
|
|
|
|
enum via_qmk_led_matrix_value {
|
|
id_qmk_led_matrix_brightness = 1,
|
|
id_qmk_led_matrix_effect = 2,
|
|
id_qmk_led_matrix_effect_speed = 3,
|
|
};
|
|
|
|
enum via_qmk_audio_value {
|
|
id_qmk_audio_enable = 1,
|
|
id_qmk_audio_clicky_enable = 2,
|
|
};
|
|
|
|
// 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);
|
|
|
|
// Called by QMK core to initialize dynamic keymaps etc.
|
|
void eeconfig_init_via(void);
|
|
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);
|
|
void via_set_layout_options_kb(uint32_t value);
|
|
|
|
// Used by VIA to tell a device to flash LEDs (or do something else) when that
|
|
// device becomes the active device being configured, on startup or switching
|
|
// between devices.
|
|
void via_set_device_indication(uint8_t value);
|
|
|
|
// Called by QMK core to process VIA-specific keycodes.
|
|
bool process_record_via(uint16_t keycode, keyrecord_t *record);
|
|
|
|
// These are made external so that keyboard level custom value handlers can use them.
|
|
#if defined(BACKLIGHT_ENABLE)
|
|
void via_qmk_backlight_command(uint8_t *data, uint8_t length);
|
|
void via_qmk_backlight_set_value(uint8_t *data);
|
|
void via_qmk_backlight_get_value(uint8_t *data);
|
|
void via_qmk_backlight_save(void);
|
|
#endif
|
|
|
|
#if defined(RGBLIGHT_ENABLE)
|
|
void via_qmk_rgblight_command(uint8_t *data, uint8_t length);
|
|
void via_qmk_rgblight_set_value(uint8_t *data);
|
|
void via_qmk_rgblight_get_value(uint8_t *data);
|
|
void via_qmk_rgblight_save(void);
|
|
#endif
|
|
|
|
#if defined(RGB_MATRIX_ENABLE)
|
|
void via_qmk_rgb_matrix_command(uint8_t *data, uint8_t length);
|
|
void via_qmk_rgb_matrix_set_value(uint8_t *data);
|
|
void via_qmk_rgb_matrix_get_value(uint8_t *data);
|
|
void via_qmk_rgb_matrix_save(void);
|
|
#endif
|
|
|
|
#if defined(LED_MATRIX_ENABLE)
|
|
void via_qmk_led_matrix_command(uint8_t *data, uint8_t length);
|
|
void via_qmk_led_matrix_set_value(uint8_t *data);
|
|
void via_qmk_led_matrix_get_value(uint8_t *data);
|
|
void via_qmk_led_matrix_save(void);
|
|
#endif
|
|
|
|
#if defined(AUDIO_ENABLE)
|
|
void via_qmk_audio_command(uint8_t *data, uint8_t length);
|
|
void via_qmk_audio_set_value(uint8_t *data);
|
|
void via_qmk_audio_get_value(uint8_t *data);
|
|
void via_qmk_audio_save(void);
|
|
#endif |