via.h 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160
  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. #pragma once
  17. #include <tmk_core/common/eeconfig.h> // for EECONFIG_SIZE
  18. // Keyboard level code can change where VIA stores the magic.
  19. // The magic is the build date YYMMDD encoded as BCD in 3 bytes,
  20. // thus installing firmware built on a different date to the one
  21. // already installed can be detected and the EEPROM data is reset.
  22. // The only reason this is important is in case EEPROM usage changes
  23. // and the EEPROM was not explicitly reset by bootmagic lite.
  24. #ifndef VIA_EEPROM_MAGIC_ADDR
  25. # define VIA_EEPROM_MAGIC_ADDR (EECONFIG_SIZE)
  26. #endif
  27. #define VIA_EEPROM_LAYOUT_OPTIONS_ADDR (VIA_EEPROM_MAGIC_ADDR + 3)
  28. // Changing the layout options size after release will invalidate EEPROM,
  29. // but this is something that should be set correctly on initial implementation.
  30. // 1 byte is enough for most uses (i.e. 8 binary states, or 6 binary + 1 ternary/quaternary )
  31. #ifndef VIA_EEPROM_LAYOUT_OPTIONS_SIZE
  32. # define VIA_EEPROM_LAYOUT_OPTIONS_SIZE 1
  33. #endif
  34. // The end of the EEPROM memory used by VIA
  35. // By default, dynamic keymaps will start at this if there is no
  36. // custom config
  37. #define VIA_EEPROM_CUSTOM_CONFIG_ADDR (VIA_EEPROM_LAYOUT_OPTIONS_ADDR + VIA_EEPROM_LAYOUT_OPTIONS_SIZE)
  38. #ifndef VIA_EEPROM_CUSTOM_CONFIG_SIZE
  39. # define VIA_EEPROM_CUSTOM_CONFIG_SIZE 0
  40. #endif
  41. // This is changed only when the command IDs change,
  42. // so VIA Configurator can detect compatible firmware.
  43. #define VIA_PROTOCOL_VERSION 0x0009
  44. enum via_command_id {
  45. id_get_protocol_version = 0x01, // always 0x01
  46. id_get_keyboard_value = 0x02,
  47. id_set_keyboard_value = 0x03,
  48. id_dynamic_keymap_get_keycode = 0x04,
  49. id_dynamic_keymap_set_keycode = 0x05,
  50. id_dynamic_keymap_reset = 0x06,
  51. id_lighting_set_value = 0x07,
  52. id_lighting_get_value = 0x08,
  53. id_lighting_save = 0x09,
  54. id_eeprom_reset = 0x0A,
  55. id_bootloader_jump = 0x0B,
  56. id_dynamic_keymap_macro_get_count = 0x0C,
  57. id_dynamic_keymap_macro_get_buffer_size = 0x0D,
  58. id_dynamic_keymap_macro_get_buffer = 0x0E,
  59. id_dynamic_keymap_macro_set_buffer = 0x0F,
  60. id_dynamic_keymap_macro_reset = 0x10,
  61. id_dynamic_keymap_get_layer_count = 0x11,
  62. id_dynamic_keymap_get_buffer = 0x12,
  63. id_dynamic_keymap_set_buffer = 0x13,
  64. id_unhandled = 0xFF,
  65. };
  66. enum via_keyboard_value_id {
  67. id_uptime = 0x01, //
  68. id_layout_options = 0x02,
  69. id_switch_matrix_state = 0x03
  70. };
  71. enum via_lighting_value {
  72. // QMK BACKLIGHT
  73. id_qmk_backlight_brightness = 0x09,
  74. id_qmk_backlight_effect = 0x0A,
  75. // QMK RGBLIGHT
  76. id_qmk_rgblight_brightness = 0x80,
  77. id_qmk_rgblight_effect = 0x81,
  78. id_qmk_rgblight_effect_speed = 0x82,
  79. id_qmk_rgblight_color = 0x83,
  80. };
  81. // Can't use SAFE_RANGE here, it might change if someone adds
  82. // new values to enum quantum_keycodes.
  83. // Need to keep checking 0x5F10 is still in the safe range.
  84. // TODO: merge this into quantum_keycodes
  85. // Backlight keycodes are in range 0x5F00-0x5F0F
  86. enum via_keycodes {
  87. FN_MO13 = 0x5F10,
  88. FN_MO23,
  89. MACRO00,
  90. MACRO01,
  91. MACRO02,
  92. MACRO03,
  93. MACRO04,
  94. MACRO05,
  95. MACRO06,
  96. MACRO07,
  97. MACRO08,
  98. MACRO09,
  99. MACRO10,
  100. MACRO11,
  101. MACRO12,
  102. MACRO13,
  103. MACRO14,
  104. MACRO15,
  105. };
  106. enum user_keycodes {
  107. USER00 = 0x5F80,
  108. USER01,
  109. USER02,
  110. USER03,
  111. USER04,
  112. USER05,
  113. USER06,
  114. USER07,
  115. USER08,
  116. USER09,
  117. USER10,
  118. USER11,
  119. USER12,
  120. USER13,
  121. USER14,
  122. USER15,
  123. };
  124. // Can be called in an overriding via_init_kb() to test if keyboard level code usage of
  125. // EEPROM is invalid and use/save defaults.
  126. bool via_eeprom_is_valid(void);
  127. // Sets VIA/keyboard level usage of EEPROM to valid/invalid
  128. // Keyboard level code (eg. via_init_kb()) should not call this
  129. void via_eeprom_set_valid(bool valid);
  130. // Flag QMK and VIA/keyboard level EEPROM as invalid.
  131. // Used in bootmagic_lite() and VIA command handler.
  132. // Keyboard level code should not need to call this.
  133. void via_eeprom_reset(void);
  134. // Called by QMK core to initialize dynamic keymaps etc.
  135. void via_init(void);
  136. // Used by VIA to store and retrieve the layout options.
  137. uint32_t via_get_layout_options(void);
  138. void via_set_layout_options(uint32_t value);
  139. // Called by QMK core to process VIA-specific keycodes.
  140. bool process_record_via(uint16_t keycode, keyrecord_t *record);