feat: Add function to erase all settings

Added a zmk_settings_erase() function to clear all saved settings. This
does not go through Zephyr's settings subsystem, but instead directly
clears the data from the setting storage backend, so a reboot is needed
for it to take effect.
This commit is contained in:
Joel Spadin 2023-11-26 12:27:12 -06:00 committed by Pete Johanson
parent 2adaa00d10
commit 610a806c84
7 changed files with 112 additions and 0 deletions

View File

@ -99,5 +99,6 @@ target_sources_ifdef(CONFIG_ZMK_LOW_PRIORITY_WORK_QUEUE app PRIVATE src/workqueu
target_sources(app PRIVATE src/main.c)
add_subdirectory(src/display/)
add_subdirectory_ifdef(CONFIG_SETTINGS src/settings/)
zephyr_cc_option(-Wfatal-errors)

View File

@ -0,0 +1,15 @@
/*
* Copyright (c) 2023 The ZMK Contributors
*
* SPDX-License-Identifier: MIT
*/
#pragma once
/**
* Erases all saved settings.
*
* @note This does not automatically update any code using Zephyr's settings
* subsystem. This should typically be followed by a call to sys_reboot().
*/
int zmk_settings_erase(void);

View File

@ -0,0 +1,7 @@
# Copyright (c) 2023 The ZMK Contributors
# SPDX-License-Identifier: MIT
target_sources_ifdef(CONFIG_SETTINGS_NONE app PRIVATE reset_settings_none.c)
target_sources_ifdef(CONFIG_SETTINGS_FCB app PRIVATE reset_settings_fcb.c)
target_sources_ifdef(CONFIG_SETTINGS_FILE app PRIVATE reset_settings_file.c)
target_sources_ifdef(CONFIG_SETTINGS_NVS app PRIVATE reset_settings_nvs.c)

View File

@ -0,0 +1,15 @@
/*
* Copyright (c) 2023 The ZMK Contributors
*
* SPDX-License-Identifier: MIT
*/
#include <zmk/settings.h>
#include <zephyr/logging/log.h>
LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL);
int zmk_settings_erase(void) {
LOG_ERR("Settings reset is not implemented for deprecated FCB backend.");
return -ENOSYS;
}

View File

@ -0,0 +1,23 @@
/*
* Copyright (c) 2023 The ZMK Contributors
*
* SPDX-License-Identifier: MIT
*/
#include <zephyr/fs/fs.h>
#include <zmk/settings.h>
#include <zephyr/logging/log.h>
LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL);
int zmk_settings_erase(void) {
LOG_INF("Erasing settings file");
int rc = fs_unlink(CONFIG_SETTINGS_FS_FILE);
if (rc) {
LOG_ERR("Failed to unlink '%s': %d", CONFIG_SETTINGS_FS_FILE, rc);
}
return rc;
}

View File

@ -0,0 +1,12 @@
/*
* Copyright (c) 2023 The ZMK Contributors
*
* SPDX-License-Identifier: MIT
*/
#include <zmk/settings.h>
int zmk_settings_erase(void) {
// No storage backend; nothing to do
return 0;
}

View File

@ -0,0 +1,39 @@
/*
* Copyright (c) 2023 The ZMK Contributors
*
* SPDX-License-Identifier: MIT
*/
#include <zephyr/device.h>
#include <zephyr/devicetree.h>
#include <zephyr/storage/flash_map.h>
#include <zephyr/logging/log.h>
LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL);
// SETTINGS_PARTITION must match settings_nvs.c
#if DT_HAS_CHOSEN(zephyr_settings_partition)
#define SETTINGS_PARTITION DT_FIXED_PARTITION_ID(DT_CHOSEN(zephyr_settings_partition))
#else
#define SETTINGS_PARTITION FIXED_PARTITION_ID(storage_partition)
#endif
int zmk_settings_erase(void) {
LOG_INF("Erasing settings flash partition");
const struct flash_area *fa;
int rc = flash_area_open(SETTINGS_PARTITION, &fa);
if (rc) {
LOG_ERR("Failed to open settings flash: %d", rc);
return rc;
}
rc = flash_area_erase(fa, 0, fa->fa_size);
if (rc) {
LOG_ERR("Failed to erase settings flash: %d", rc);
}
flash_area_close(fa);
return rc;
}