diff --git a/docs/feature_eeprom.md b/docs/feature_eeprom.md index 5cdd6d99818..c11ad2445b0 100644 --- a/docs/feature_eeprom.md +++ b/docs/feature_eeprom.md @@ -191,7 +191,9 @@ void eeconfig_init_user_datablock(void); ::::: -### Example +### Examples + +#### Basic This is an example of how to add settings, and read and write it. We're using the user keymap for the example here. @@ -215,10 +217,6 @@ typedef struct my_config_t { static my_config_t config; void keyboard_post_init_user(void) { - if (!eeconfig_is_user_datablock_valid()) { - eeconfig_init_user_datablock(); - } - eeconfig_read_user_datablock(&config, 0, sizeof(my_config_t)); } @@ -240,3 +238,20 @@ void housekeeping_task_user(void) { } } ``` + +#### Default Values + +Extending the above example, a default value for the datablock can be configured as follows: + +```c +void eeconfig_init_user_datablock(void) { + my_config_t default_config = { + .data = 42, + }; + eeconfig_update_user_datablock(&default_config, 0, sizeof(my_config_t)); +} +``` + +::: tip +For large datablocks, you might need to manually update in chunks to avoid memory issues. +::: diff --git a/lib/python/qmk/cli/generate/community_modules.py b/lib/python/qmk/cli/generate/community_modules.py index ee7aae28bb0..9e369581e5a 100644 --- a/lib/python/qmk/cli/generate/community_modules.py +++ b/lib/python/qmk/cli/generate/community_modules.py @@ -213,6 +213,7 @@ def _render_eeconfig_declarations(modules): lines.append('bool eeconfig_is_modules_datablock_valid(void);') lines.append('void eeconfig_init_modules_datablock(void);') + lines.append('void eeconfig_prepare_modules_datablocks(void);') lines.append('') return lines @@ -223,10 +224,10 @@ def _render_eeconfig_implementation(modules): lines.append('') lines.append('// nvm eeconfig') - lines.append('#if defined(NVM_DRIVER_EEPROM)'), + lines.append('#if defined(NVM_DRIVER_EEPROM)') lines.append('# include "nvm_eeprom_eeconfig_internal.h"') lines.append('# include "eeprom.h"') - lines.append('#endif // defined(NVM_DRIVER_EEPROM)'), + lines.append('#endif // defined(NVM_DRIVER_EEPROM)') lines.append('') for module_slug in _module_slugs(modules): @@ -235,7 +236,7 @@ def _render_eeconfig_implementation(modules): f'bool eeconfig_is_{module_slug}_datablock_valid(void) {{ return nvm_eeconfig_is_{module_slug}_datablock_valid(); }}', f'uint32_t eeconfig_read_{module_slug}_datablock(void *data, uint32_t offset, uint32_t length) {{ return nvm_eeconfig_read_{module_slug}_datablock(data, offset, length); }}', f'uint32_t eeconfig_update_{module_slug}_datablock(const void *data, uint32_t offset, uint32_t length) {{ return nvm_eeconfig_update_{module_slug}_datablock(data, offset, length); }}', - f'void eeconfig_init_{module_slug}_datablock(void) {{ nvm_eeconfig_init_{module_slug}_datablock(); }}', + f'__attribute__((weak)) void eeconfig_init_{module_slug}_datablock(void) {{ nvm_eeconfig_init_{module_slug}_datablock(); }}', '', '# if defined(NVM_DRIVER_EEPROM)', f'bool nvm_eeconfig_is_{module_slug}_datablock_valid(void) {{', @@ -289,7 +290,7 @@ def _render_eeconfig_implementation(modules): lines.append('}') lines.append('') - lines.append('void eeconfig_init_modules_datablock(void) {'), + lines.append('void eeconfig_init_modules_datablock(void) {') for module_slug in _module_slugs(modules): lines.extend([ f'#if (EECONFIG_MODULE_{module_slug.upper()}_DATA_SIZE) > 0', @@ -299,6 +300,16 @@ def _render_eeconfig_implementation(modules): lines.append('}') lines.append('') + lines.append('void eeconfig_prepare_modules_datablocks(void) {') + for module_slug in _module_slugs(modules): + lines.extend([ + f'#if (EECONFIG_MODULE_{module_slug.upper()}_DATA_SIZE) > 0', + f' if (!eeconfig_is_{module_slug}_datablock_valid()) {{ eeconfig_init_{module_slug}_datablock(); }}', + f'#endif // (EECONFIG_MODULE_{module_slug.upper()}_DATA_SIZE) > 0', + ]) + lines.append('}') + lines.append('') + return lines diff --git a/modules/qmk/nvm_test/nvm_test.c b/modules/qmk/nvm_test/nvm_test.c index e35790fc8ff..46efa0c3dfd 100644 --- a/modules/qmk/nvm_test/nvm_test.c +++ b/modules/qmk/nvm_test/nvm_test.c @@ -24,11 +24,14 @@ void eeconfig_update_my_config(my_config_t *value) { EECONFIG_DEBOUNCE_HELPER(my_config, config); -void keyboard_post_init_nvm_test(void) { - if (!eeconfig_is_nvm_test_datablock_valid()) { - eeconfig_init_nvm_test_datablock(); - } +void eeconfig_init_nvm_test_datablock(void) { + my_config_t default_config = { + .data = 42, + }; + eeconfig_update_nvm_test_datablock(&default_config, 0, sizeof(my_config_t)); +} +void keyboard_post_init_nvm_test(void) { eeconfig_init_my_config(); } diff --git a/quantum/eeconfig.c b/quantum/eeconfig.c index cb6dbcfa396..8f8f91cea1c 100644 --- a/quantum/eeconfig.c +++ b/quantum/eeconfig.c @@ -376,3 +376,21 @@ __attribute__((weak)) void eeconfig_init_user_datablock(void) { nvm_eeconfig_init_user_datablock(); } #endif // (EECONFIG_USER_DATA_SIZE) > 0 + +void eeconfig_prepare_datablocks(void) { +#if (EECONFIG_KB_DATA_SIZE) > 0 + if (!eeconfig_is_kb_datablock_valid()) { + eeconfig_init_kb_datablock(); + } +#endif // (EECONFIG_KB_DATA_SIZE) > 0 + +#if (EECONFIG_USER_DATA_SIZE) > 0 + if (!eeconfig_is_user_datablock_valid()) { + eeconfig_init_user_datablock(); + } +#endif // (EECONFIG_USER_DATA_SIZE) > 0 + +#ifdef COMMUNITY_MODULES_ENABLE + eeconfig_prepare_modules_datablocks(); +#endif // COMMUNITY_MODULES_ENABLE +} diff --git a/quantum/eeconfig.h b/quantum/eeconfig.h index 66f8934a99e..f23de1d6570 100644 --- a/quantum/eeconfig.h +++ b/quantum/eeconfig.h @@ -63,6 +63,8 @@ void eeconfig_init_user(void); void eeconfig_enable(void); void eeconfig_disable(void); +void eeconfig_prepare_datablocks(void); + typedef union debug_config_t debug_config_t; void eeconfig_read_debug(debug_config_t *debug_config) __attribute__((nonnull)); void eeconfig_update_debug(const debug_config_t *debug_config) __attribute__((nonnull)); diff --git a/quantum/keyboard.c b/quantum/keyboard.c index 5a80facf57f..c24d4d3a0c9 100644 --- a/quantum/keyboard.c +++ b/quantum/keyboard.c @@ -449,6 +449,8 @@ void quantum_init(void) { /* Also initialize layer state to trigger callback functions for layer_state */ layer_state_set_kb((layer_state_t)layer_state); + + eeconfig_prepare_datablocks(); } /** \brief keyboard_init