qmk_firmware

QMK firmware for my keyboards (Corne, Sweep Ferris) and trackball (Ploopy Adept)
Log | Files | Refs | Submodules | LICENSE

via.h (6939B)


      1 /* Copyright 2019 Jason Williams (Wilba)
      2  *
      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.
      7  *
      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.
     12  *
     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/>.
     15  */
     16 
     17 #pragma once
     18 
     19 #include "action.h"
     20 
     21 // Changing the layout options size after release will invalidate EEPROM,
     22 // but this is something that should be set correctly on initial implementation.
     23 // 1 byte is enough for most uses (i.e. 8 binary states, or 6 binary + 1 ternary/quaternary )
     24 #ifndef VIA_EEPROM_LAYOUT_OPTIONS_SIZE
     25 #    define VIA_EEPROM_LAYOUT_OPTIONS_SIZE 1
     26 #endif
     27 
     28 // Allow override of the layout options default value.
     29 // This requires advanced knowledge of how VIA stores layout options
     30 // and is only really useful for setting a boolean layout option
     31 // state to true by default.
     32 #ifndef VIA_EEPROM_LAYOUT_OPTIONS_DEFAULT
     33 #    define VIA_EEPROM_LAYOUT_OPTIONS_DEFAULT 0x00000000
     34 #endif
     35 
     36 #ifndef VIA_EEPROM_CUSTOM_CONFIG_SIZE
     37 #    define VIA_EEPROM_CUSTOM_CONFIG_SIZE 0
     38 #endif
     39 
     40 // This is changed only when the command IDs change,
     41 // so VIA Configurator can detect compatible firmware.
     42 #define VIA_PROTOCOL_VERSION 0x000C
     43 
     44 // This is a version number for the firmware for the keyboard.
     45 // It can be used to ensure the VIA keyboard definition and the firmware
     46 // have the same version, especially if there are changes to custom values.
     47 // Define this in config.h to override and bump this number.
     48 // This is *not* required if the keyboard is only using basic functionality
     49 // and not using custom values for lighting, rotary encoders, etc.
     50 #ifndef VIA_FIRMWARE_VERSION
     51 #    define VIA_FIRMWARE_VERSION 0x00000000
     52 #endif
     53 
     54 enum via_command_id {
     55     id_get_protocol_version                 = 0x01, // always 0x01
     56     id_get_keyboard_value                   = 0x02,
     57     id_set_keyboard_value                   = 0x03,
     58     id_dynamic_keymap_get_keycode           = 0x04,
     59     id_dynamic_keymap_set_keycode           = 0x05,
     60     id_dynamic_keymap_reset                 = 0x06,
     61     id_custom_set_value                     = 0x07,
     62     id_custom_get_value                     = 0x08,
     63     id_custom_save                          = 0x09,
     64     id_eeprom_reset                         = 0x0A,
     65     id_bootloader_jump                      = 0x0B,
     66     id_dynamic_keymap_macro_get_count       = 0x0C,
     67     id_dynamic_keymap_macro_get_buffer_size = 0x0D,
     68     id_dynamic_keymap_macro_get_buffer      = 0x0E,
     69     id_dynamic_keymap_macro_set_buffer      = 0x0F,
     70     id_dynamic_keymap_macro_reset           = 0x10,
     71     id_dynamic_keymap_get_layer_count       = 0x11,
     72     id_dynamic_keymap_get_buffer            = 0x12,
     73     id_dynamic_keymap_set_buffer            = 0x13,
     74     id_dynamic_keymap_get_encoder           = 0x14,
     75     id_dynamic_keymap_set_encoder           = 0x15,
     76     id_unhandled                            = 0xFF,
     77 };
     78 
     79 enum via_keyboard_value_id {
     80     id_uptime              = 0x01,
     81     id_layout_options      = 0x02,
     82     id_switch_matrix_state = 0x03,
     83     id_firmware_version    = 0x04,
     84     id_device_indication   = 0x05,
     85 };
     86 
     87 enum via_channel_id {
     88     id_custom_channel         = 0,
     89     id_qmk_backlight_channel  = 1,
     90     id_qmk_rgblight_channel   = 2,
     91     id_qmk_rgb_matrix_channel = 3,
     92     id_qmk_audio_channel      = 4,
     93     id_qmk_led_matrix_channel = 5,
     94 };
     95 
     96 enum via_qmk_backlight_value {
     97     id_qmk_backlight_brightness = 1,
     98     id_qmk_backlight_effect     = 2,
     99 };
    100 
    101 enum via_qmk_rgblight_value {
    102     id_qmk_rgblight_brightness   = 1,
    103     id_qmk_rgblight_effect       = 2,
    104     id_qmk_rgblight_effect_speed = 3,
    105     id_qmk_rgblight_color        = 4,
    106 };
    107 
    108 enum via_qmk_rgb_matrix_value {
    109     id_qmk_rgb_matrix_brightness   = 1,
    110     id_qmk_rgb_matrix_effect       = 2,
    111     id_qmk_rgb_matrix_effect_speed = 3,
    112     id_qmk_rgb_matrix_color        = 4,
    113 };
    114 
    115 enum via_qmk_led_matrix_value {
    116     id_qmk_led_matrix_brightness   = 1,
    117     id_qmk_led_matrix_effect       = 2,
    118     id_qmk_led_matrix_effect_speed = 3,
    119 };
    120 
    121 enum via_qmk_audio_value {
    122     id_qmk_audio_enable        = 1,
    123     id_qmk_audio_clicky_enable = 2,
    124 };
    125 
    126 // Can be called in an overriding via_init_kb() to test if keyboard level code usage of
    127 // EEPROM is invalid and use/save defaults.
    128 bool via_eeprom_is_valid(void);
    129 
    130 // Sets VIA/keyboard level usage of EEPROM to valid/invalid
    131 // Keyboard level code (eg. via_init_kb()) should not call this
    132 void via_eeprom_set_valid(bool valid);
    133 
    134 // Called by QMK core to initialize dynamic keymaps etc.
    135 void eeconfig_init_via(void);
    136 void via_init(void);
    137 
    138 // Used by VIA to store and retrieve the layout options.
    139 uint32_t via_get_layout_options(void);
    140 void     via_set_layout_options(uint32_t value);
    141 void     via_set_layout_options_kb(uint32_t value);
    142 
    143 #if VIA_EEPROM_CUSTOM_CONFIG_SIZE > 0
    144 uint32_t via_read_custom_config(void *buf, uint32_t offset, uint32_t length);
    145 uint32_t via_update_custom_config(const void *buf, uint32_t offset, uint32_t length);
    146 #endif
    147 
    148 // Used by VIA to tell a device to flash LEDs (or do something else) when that
    149 // device becomes the active device being configured, on startup or switching
    150 // between devices.
    151 void via_set_device_indication(uint8_t value);
    152 
    153 // Called by QMK core to process VIA-specific keycodes.
    154 bool process_record_via(uint16_t keycode, keyrecord_t *record);
    155 
    156 // These are made external so that keyboard level custom value handlers can use them.
    157 #if defined(BACKLIGHT_ENABLE)
    158 void via_qmk_backlight_command(uint8_t *data, uint8_t length);
    159 void via_qmk_backlight_set_value(uint8_t *data);
    160 void via_qmk_backlight_get_value(uint8_t *data);
    161 void via_qmk_backlight_save(void);
    162 #endif
    163 
    164 #if defined(RGBLIGHT_ENABLE)
    165 void via_qmk_rgblight_command(uint8_t *data, uint8_t length);
    166 void via_qmk_rgblight_set_value(uint8_t *data);
    167 void via_qmk_rgblight_get_value(uint8_t *data);
    168 void via_qmk_rgblight_save(void);
    169 #endif
    170 
    171 #if defined(RGB_MATRIX_ENABLE)
    172 void via_qmk_rgb_matrix_command(uint8_t *data, uint8_t length);
    173 void via_qmk_rgb_matrix_set_value(uint8_t *data);
    174 void via_qmk_rgb_matrix_get_value(uint8_t *data);
    175 void via_qmk_rgb_matrix_save(void);
    176 #endif
    177 
    178 #if defined(LED_MATRIX_ENABLE)
    179 void via_qmk_led_matrix_command(uint8_t *data, uint8_t length);
    180 void via_qmk_led_matrix_set_value(uint8_t *data);
    181 void via_qmk_led_matrix_get_value(uint8_t *data);
    182 void via_qmk_led_matrix_save(void);
    183 #endif
    184 
    185 #if defined(AUDIO_ENABLE)
    186 void via_qmk_audio_command(uint8_t *data, uint8_t length);
    187 void via_qmk_audio_set_value(uint8_t *data);
    188 void via_qmk_audio_get_value(uint8_t *data);
    189 void via_qmk_audio_save(void);
    190 #endif