Consistently handle datablock init (#26282)

This commit is contained in:
Joel Challis
2026-06-24 20:36:51 +01:00
committed by GitHub
parent ee9354d36e
commit 0ec0cdde81
6 changed files with 64 additions and 13 deletions
+20 -5
View File
@@ -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. 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; static my_config_t config;
void keyboard_post_init_user(void) { 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)); 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.
:::
@@ -213,6 +213,7 @@ def _render_eeconfig_declarations(modules):
lines.append('bool eeconfig_is_modules_datablock_valid(void);') lines.append('bool eeconfig_is_modules_datablock_valid(void);')
lines.append('void eeconfig_init_modules_datablock(void);') lines.append('void eeconfig_init_modules_datablock(void);')
lines.append('void eeconfig_prepare_modules_datablocks(void);')
lines.append('') lines.append('')
return lines return lines
@@ -223,10 +224,10 @@ def _render_eeconfig_implementation(modules):
lines.append('') lines.append('')
lines.append('// nvm eeconfig') 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 "nvm_eeprom_eeconfig_internal.h"')
lines.append('# include "eeprom.h"') lines.append('# include "eeprom.h"')
lines.append('#endif // defined(NVM_DRIVER_EEPROM)'), lines.append('#endif // defined(NVM_DRIVER_EEPROM)')
lines.append('') lines.append('')
for module_slug in _module_slugs(modules): 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'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_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'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)', '# if defined(NVM_DRIVER_EEPROM)',
f'bool nvm_eeconfig_is_{module_slug}_datablock_valid(void) {{', 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('') 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): for module_slug in _module_slugs(modules):
lines.extend([ lines.extend([
f'#if (EECONFIG_MODULE_{module_slug.upper()}_DATA_SIZE) > 0', 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('') 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 return lines
+7 -4
View File
@@ -24,11 +24,14 @@ void eeconfig_update_my_config(my_config_t *value) {
EECONFIG_DEBOUNCE_HELPER(my_config, config); EECONFIG_DEBOUNCE_HELPER(my_config, config);
void keyboard_post_init_nvm_test(void) { void eeconfig_init_nvm_test_datablock(void) {
if (!eeconfig_is_nvm_test_datablock_valid()) { my_config_t default_config = {
eeconfig_init_nvm_test_datablock(); .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(); eeconfig_init_my_config();
} }
+18
View File
@@ -365,3 +365,21 @@ __attribute__((weak)) void eeconfig_init_user_datablock(void) {
nvm_eeconfig_init_user_datablock(); nvm_eeconfig_init_user_datablock();
} }
#endif // (EECONFIG_USER_DATA_SIZE) > 0 #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
}
+2
View File
@@ -63,6 +63,8 @@ void eeconfig_init_user(void);
void eeconfig_enable(void); void eeconfig_enable(void);
void eeconfig_disable(void); void eeconfig_disable(void);
void eeconfig_prepare_datablocks(void);
typedef union debug_config_t debug_config_t; typedef union debug_config_t debug_config_t;
void eeconfig_read_debug(debug_config_t *debug_config) __attribute__((nonnull)); void eeconfig_read_debug(debug_config_t *debug_config) __attribute__((nonnull));
void eeconfig_update_debug(const debug_config_t *debug_config) __attribute__((nonnull)); void eeconfig_update_debug(const debug_config_t *debug_config) __attribute__((nonnull));
+2
View File
@@ -449,6 +449,8 @@ void quantum_init(void) {
/* Also initialize layer state to trigger callback functions for layer_state */ /* Also initialize layer state to trigger callback functions for layer_state */
layer_state_set_kb((layer_state_t)layer_state); layer_state_set_kb((layer_state_t)layer_state);
eeconfig_prepare_datablocks();
} }
/** \brief keyboard_init /** \brief keyboard_init