Skip to content

Commit

Permalink
Fix issues with VIA EEPROM init and bring in line with eeconfig funct…
Browse files Browse the repository at this point in the history
…ionality (qmk#13243)

Co-authored-by: Ryan <[email protected]>
  • Loading branch information
drashna and fauxpark authored Aug 21, 2021
1 parent 7a32b39 commit f55650e
Show file tree
Hide file tree
Showing 5 changed files with 58 additions and 37 deletions.
8 changes: 1 addition & 7 deletions quantum/bootmagic/bootmagic_lite.c
Original file line number Diff line number Diff line change
Expand Up @@ -19,13 +19,7 @@
*
* ...just incase someone wants to only change the eeprom behaviour
*/
__attribute__((weak)) void bootmagic_lite_reset_eeprom(void) {
#if defined(VIA_ENABLE)
via_eeprom_reset();
#else
eeconfig_disable();
#endif
}
__attribute__((weak)) void bootmagic_lite_reset_eeprom(void) { eeconfig_disable(); }

/** \brief The lite version of TMK's bootmagic based on Wilba.
*
Expand Down
33 changes: 31 additions & 2 deletions quantum/eeconfig.c
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,12 @@
# include "haptic.h"
#endif

#if defined(VIA_ENABLE)
bool via_eeprom_is_valid(void);
void via_eeprom_set_valid(bool valid);
void eeconfig_init_via(void);
#endif

/** \brief eeconfig enable
*
* FIXME: needs doc
Expand Down Expand Up @@ -77,6 +83,13 @@ void eeconfig_init_quantum(void) {
// when a haptic-enabled firmware is loaded onto the keyboard.
eeprom_update_dword(EECONFIG_HAPTIC, 0);
#endif
#if defined(VIA_ENABLE)
// Invalidate VIA eeprom config, and then reset.
// Just in case if power is lost mid init, this makes sure that it pets
// properly re-initialized.
via_eeprom_set_valid(false);
eeconfig_init_via();
#endif

eeconfig_init_kb();
}
Expand Down Expand Up @@ -111,13 +124,29 @@ void eeconfig_disable(void) {
*
* FIXME: needs doc
*/
bool eeconfig_is_enabled(void) { return (eeprom_read_word(EECONFIG_MAGIC) == EECONFIG_MAGIC_NUMBER); }
bool eeconfig_is_enabled(void) {
bool is_eeprom_enabled = (eeprom_read_word(EECONFIG_MAGIC) == EECONFIG_MAGIC_NUMBER);
#ifdef VIA_ENABLE
if (is_eeprom_enabled) {
is_eeprom_enabled = via_eeprom_is_valid();
}
#endif
return is_eeprom_enabled;
}

/** \brief eeconfig is disabled
*
* FIXME: needs doc
*/
bool eeconfig_is_disabled(void) { return (eeprom_read_word(EECONFIG_MAGIC) == EECONFIG_MAGIC_NUMBER_OFF); }
bool eeconfig_is_disabled(void) {
bool is_eeprom_disabled = (eeprom_read_word(EECONFIG_MAGIC) == EECONFIG_MAGIC_NUMBER_OFF);
#ifdef VIA_ENABLE
if (!is_eeprom_disabled) {
is_eeprom_disabled = !via_eeprom_is_valid();
}
#endif
return is_eeprom_disabled;
}

/** \brief eeconfig read debug
*
Expand Down
6 changes: 3 additions & 3 deletions quantum/keyboard.c
Original file line number Diff line number Diff line change
Expand Up @@ -309,13 +309,13 @@ void housekeeping_task(void) {
void keyboard_init(void) {
timer_init();
sync_timer_init();
#ifdef VIA_ENABLE
via_init();
#endif
matrix_init();
#if defined(CRC_ENABLE)
crc_init();
#endif
#ifdef VIA_ENABLE
via_init();
#endif
#ifdef QWIIC_ENABLE
qwiic_init();
#endif
Expand Down
42 changes: 22 additions & 20 deletions quantum/via.c
Original file line number Diff line number Diff line change
Expand Up @@ -83,16 +83,6 @@ void via_eeprom_set_valid(bool valid) {
eeprom_update_byte((void *)VIA_EEPROM_MAGIC_ADDR + 2, valid ? magic2 : 0xFF);
}

// Flag QMK and VIA/keyboard level EEPROM as invalid.
// Used in bootmagic_lite() and VIA command handler.
// Keyboard level code should not need to call this.
void via_eeprom_reset(void) {
// Set the VIA specific EEPROM state as invalid.
via_eeprom_set_valid(false);
// Set the TMK/QMK EEPROM state as invalid.
eeconfig_disable();
}

// Override this at the keyboard code level to check
// VIA's EEPROM valid state and reset to defaults as needed.
// Used by keyboards that store their own state in EEPROM,
Expand All @@ -109,19 +99,24 @@ void via_init(void) {

// If the EEPROM has the magic, the data is good.
// OK to load from EEPROM.
if (via_eeprom_is_valid()) {
} else {
// This resets the layout options
via_set_layout_options(VIA_EEPROM_LAYOUT_OPTIONS_DEFAULT);
// This resets the keymaps in EEPROM to what is in flash.
dynamic_keymap_reset();
// This resets the macros in EEPROM to nothing.
dynamic_keymap_macro_reset();
// Save the magic number last, in case saving was interrupted
via_eeprom_set_valid(true);
if (!via_eeprom_is_valid()) {
eeconfig_init_via();
}
}

void eeconfig_init_via(void) {
// set the magic number to false, in case this gets interrupted
via_eeprom_set_valid(false);
// This resets the layout options
via_set_layout_options(VIA_EEPROM_LAYOUT_OPTIONS_DEFAULT);
// This resets the keymaps in EEPROM to what is in flash.
dynamic_keymap_reset();
// This resets the macros in EEPROM to nothing.
dynamic_keymap_macro_reset();
// Save the magic number last, in case saving was interrupted
via_eeprom_set_valid(true);
}

// This is generalized so the layout options EEPROM usage can be
// variable, between 1 and 4 bytes.
uint32_t via_get_layout_options(void) {
Expand Down Expand Up @@ -329,6 +324,13 @@ void raw_hid_receive(uint8_t *data, uint8_t length) {
#endif
break;
}
#ifdef VIA_EEPROM_ALLOW_RESET
case id_eeprom_reset: {
via_eeprom_set_valid(false);
eeconfig_init_via();
break;
}
#endif
case id_dynamic_keymap_macro_get_count: {
command_data[0] = dynamic_keymap_macro_get_count();
break;
Expand Down
6 changes: 1 addition & 5 deletions quantum/via.h
Original file line number Diff line number Diff line change
Expand Up @@ -152,12 +152,8 @@ bool via_eeprom_is_valid(void);
// Keyboard level code (eg. via_init_kb()) should not call this
void via_eeprom_set_valid(bool valid);

// Flag QMK and VIA/keyboard level EEPROM as invalid.
// Used in bootmagic_lite() and VIA command handler.
// Keyboard level code should not need to call this.
void via_eeprom_reset(void);

// 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.
Expand Down

0 comments on commit f55650e

Please sign in to comment.