From fec7b6694c7e04d499a3620fc411cc9000413b6c Mon Sep 17 00:00:00 2001 From: Simon Hughes Date: Fri, 17 Jun 2016 10:23:49 +0100 Subject: [PATCH] cfstore flash integration changes for supporting storage flash sync/async mode configuration. --- .../storage/TESTS/cfstore/add_del/add_del.cpp | 31 +++-- .../storage/TESTS/cfstore/close/close.cpp | 17 +-- .../storage/TESTS/cfstore/create/create.cpp | 35 ++--- .../TESTS/cfstore/example1/example1.cpp | 52 ++++++-- .../TESTS/cfstore/example2/example2.cpp | 16 +-- .../TESTS/cfstore/example3/example3.cpp | 15 +-- .../TESTS/cfstore/example4/example4.cpp | 18 ++- .../TESTS/cfstore/example5/example5.cpp | 57 ++++++--- features/storage/TESTS/cfstore/find/find.cpp | 16 +-- .../storage/TESTS/cfstore/find2/find2.cpp | 21 +-- .../storage/TESTS/cfstore/flash/flash.cpp | 38 ++++-- .../storage/TESTS/cfstore/flush/flush.cpp | 16 +-- .../storage/TESTS/cfstore/flush2/flush2.cpp | 16 +-- features/storage/TESTS/cfstore/init/init.cpp | 16 +-- features/storage/TESTS/cfstore/misc/misc.cpp | 20 ++- features/storage/TESTS/cfstore/open/open.cpp | 25 ++-- features/storage/TESTS/cfstore/read/read.cpp | 16 +-- .../storage/TESTS/cfstore/write/write.cpp | 16 +-- .../configuration-store/configuration_store.h | 7 +- features/storage/cfstore/mbed_lib.json | 10 ++ .../storage/cfstore/source/cfstore_config.h | 29 ++--- .../storage/cfstore/source/cfstore_debug.h | 2 +- .../storage/cfstore/source/cfstore_fnmatch.c | 15 +-- .../storage/cfstore/source/cfstore_test.c | 46 ++++++- .../storage/cfstore/source/cfstore_test.h | 3 +- .../cfstore/source/configuration_store.c | 120 +++++++++--------- 26 files changed, 379 insertions(+), 294 deletions(-) create mode 100644 features/storage/cfstore/mbed_lib.json diff --git a/features/storage/TESTS/cfstore/add_del/add_del.cpp b/features/storage/TESTS/cfstore/add_del/add_del.cpp index 9b74383238..01d9e64682 100644 --- a/features/storage/TESTS/cfstore/add_del/add_del.cpp +++ b/features/storage/TESTS/cfstore/add_del/add_del.cpp @@ -20,18 +20,16 @@ #if defined __MBED__ && ! defined TOOLCHAIN_GCC_ARM -#ifdef TARGET_LIKE_FRDM_K64F_GCC -#include -#endif - +#include "mbed-drivers/mbed.h" #include "cfstore_config.h" #include "Driver_Common.h" #include "cfstore_debug.h" #include "cfstore_test.h" -#include "configuration-store/configuration_store.h" +#include "configuration_store.h" #include "utest/utest.h" #include "unity/unity.h" #include "greentea-client/test_env.h" + #ifdef YOTTA_CFG_CFSTORE_UVISOR #include "uvisor-lib/uvisor-lib.h" #include "cfstore_uvisor.h" @@ -77,15 +75,12 @@ int main() #else -#ifdef TARGET_LIKE_FRDM_K64F_GCC #include "mbed-drivers/mbed.h" -#endif - #include "cfstore_config.h" #include "Driver_Common.h" #include "cfstore_debug.h" #include "cfstore_test.h" -#include "configuration-store/configuration_store.h" +#include "configuration_store.h" #include "utest/utest.h" #include "unity/unity.h" #include "greentea-client/test_env.h" @@ -123,9 +118,12 @@ static cfstore_kv_data_t cfstore_add_del_test_07_data[] = { /* report whether built/configured for flash sync or async mode */ static control_t cfstore_add_del_test_00(const size_t call_count) { + int32_t ret = ARM_DRIVER_ERROR; + (void) call_count; - ARM_CFSTORE_CAPABILITIES caps = cfstore_driver.GetCapabilities(); - CFSTORE_LOG("INITIALIZING: caps.asynchronous_ops=%lu\n", caps.asynchronous_ops); + ret = cfstore_test_startup(); + CFSTORE_TEST_UTEST_MESSAGE(cfstore_add_del_utest_msg_g, CFSTORE_UTEST_MSG_BUF_SIZE, "%s:Error: failed to perform test startup (ret=%d).\n", __func__, (int) ret); + TEST_ASSERT_MESSAGE(ret >= ARM_DRIVER_OK, cfstore_add_del_utest_msg_g); return CaseNext; } @@ -149,7 +147,6 @@ static control_t cfstore_add_del_test_01_end(const size_t call_count) CFSTORE_FENTRYLOG("%s:entered\n", __func__); (void) call_count; - CFSTORE_LOG("cfstore_add_del_test_07: Start%s", "\n"); memset(&kdesc, 0, sizeof(kdesc)); memset(&flags, 0, sizeof(flags)); @@ -217,7 +214,6 @@ static control_t cfstore_add_del_test_02_end(const size_t call_count) CFSTORE_FENTRYLOG("%s:entered\n", __func__); (void) call_count; - CFSTORE_LOG("%s: Start\n", __func__); memset(&kdesc, 0, sizeof(kdesc)); /* create */ @@ -229,7 +225,8 @@ static control_t cfstore_add_del_test_02_end(const size_t call_count) ret = cfstore_test_create(node->key_name, (char*) node->value, &len, &kdesc); CFSTORE_TEST_UTEST_MESSAGE(cfstore_add_del_utest_msg_g, CFSTORE_UTEST_MSG_BUF_SIZE, "%s:Error: failed to create kv (key_name=%s.\n", __func__, node->key_name); TEST_ASSERT_MESSAGE(ret >= ARM_DRIVER_OK, cfstore_add_del_utest_msg_g); - CFSTORE_LOG("Created KV successfully (key_name=\"%s\", value=\"%s\")\n", node->key_name, node->value); + /* revert CFSTORE_LOG for more trace */ + CFSTORE_DBGLOG("Created KV successfully (key_name=\"%s\", value=\"%s\")\n", node->key_name, node->value); node++; } @@ -245,7 +242,8 @@ static control_t cfstore_add_del_test_02_end(const size_t call_count) ret = cfstore_test_kv_is_found(node->key_name, &bResult); CFSTORE_TEST_UTEST_MESSAGE(cfstore_add_del_utest_msg_g, CFSTORE_UTEST_MSG_BUF_SIZE, "%s:Error: found key when should not be present.\n", __func__); TEST_ASSERT_MESSAGE(ret == ARM_CFSTORE_DRIVER_ERROR_KEY_NOT_FOUND && bResult == false, cfstore_add_del_utest_msg_g); - CFSTORE_LOG("Found KV successfully (key_name=\"%s\")\n", node->key_name); + /* revert CFSTORE_LOG for more trace */ + CFSTORE_DBGLOG("Found KV successfully (key_name=\"%s\")\n", node->key_name); node++; } ret = drv->Uninitialize(); @@ -286,7 +284,8 @@ static control_t cfstore_add_del_test_03_end(const size_t call_count) cfstore_test_delete(node->key_name); CFSTORE_TEST_UTEST_MESSAGE(cfstore_add_del_utest_msg_g, CFSTORE_UTEST_MSG_BUF_SIZE, "%s:Error failed to delete a key (ret=%" PRId32 ").\n", __func__, ret); TEST_ASSERT_MESSAGE(ret >= ARM_DRIVER_OK, cfstore_add_del_utest_msg_g); - CFSTORE_LOG("Deleted KV successfully (key_name=\"%s\")\n", node->key_name); + /* revert CFSTORE_LOG for more trace */ + CFSTORE_DBGLOG("Deleted KV successfully (key_name=\"%s\")\n", node->key_name); node++; } /* check the keys have been deleted */ diff --git a/features/storage/TESTS/cfstore/close/close.cpp b/features/storage/TESTS/cfstore/close/close.cpp index 5023a64bd2..0a61511272 100644 --- a/features/storage/TESTS/cfstore/close/close.cpp +++ b/features/storage/TESTS/cfstore/close/close.cpp @@ -21,15 +21,12 @@ #if defined __MBED__ && ! defined TOOLCHAIN_GCC_ARM -#ifdef TARGET_LIKE_FRDM_K64F_GCC #include "mbed-drivers/mbed.h" -#endif - #include "cfstore_config.h" #include "Driver_Common.h" #include "cfstore_debug.h" #include "cfstore_test.h" -#include "configuration-store/configuration_store.h" +#include "configuration_store.h" #include "utest/utest.h" #include "unity/unity.h" #include "greentea-client/test_env.h" @@ -78,13 +75,10 @@ int main() #else -#ifdef TARGET_LIKE_FRDM_K64F_GCC #include "mbed-drivers/mbed.h" -#endif - #include "cfstore_config.h" #include "Driver_Common.h" -#include "configuration-store/configuration_store.h" +#include "configuration_store.h" #include "cfstore_test.h" #include "cfstore_debug.h" #include "utest/utest.h" @@ -120,9 +114,12 @@ static cfstore_kv_data_t cfstore_close_test_01_kv_data[] = { /* report whether built/configured for flash sync or async mode */ static control_t cfstore_close_test_00(const size_t call_count) { + int32_t ret = ARM_DRIVER_ERROR; + (void) call_count; - ARM_CFSTORE_CAPABILITIES caps = cfstore_driver.GetCapabilities(); - CFSTORE_LOG("INITIALIZING: caps.asynchronous_ops=%lu\n", caps.asynchronous_ops); + ret = cfstore_test_startup(); + CFSTORE_TEST_UTEST_MESSAGE(cfstore_close_utest_msg_g, CFSTORE_UTEST_MSG_BUF_SIZE, "%s:Error: failed to perform test startup (ret=%d).\n", __func__, (int) ret); + TEST_ASSERT_MESSAGE(ret >= ARM_DRIVER_OK, cfstore_close_utest_msg_g); return CaseNext; } diff --git a/features/storage/TESTS/cfstore/create/create.cpp b/features/storage/TESTS/cfstore/create/create.cpp index f59fa72575..8284bba237 100644 --- a/features/storage/TESTS/cfstore/create/create.cpp +++ b/features/storage/TESTS/cfstore/create/create.cpp @@ -20,15 +20,12 @@ #if defined __MBED__ && ! defined TOOLCHAIN_GCC_ARM -#ifdef TARGET_LIKE_FRDM_K64F_GCC #include "mbed-drivers/mbed.h" -#endif - #include "cfstore_config.h" #include "Driver_Common.h" #include "cfstore_debug.h" #include "cfstore_test.h" -#include "configuration-store/configuration_store.h" +#include "configuration_store.h" #include "utest/utest.h" #include "unity/unity.h" #include "greentea-client/test_env.h" @@ -78,15 +75,12 @@ int main() #else -#ifdef TARGET_LIKE_FRDM_K64F_GCC #include "mbed-drivers/mbed.h" -#endif - #include "cfstore_config.h" #include "cfstore_debug.h" #include "cfstore_test.h" #include "Driver_Common.h" -#include "configuration-store/configuration_store.h" +#include "configuration_store.h" #include "utest/utest.h" #include "unity/unity.h" #include "greentea-client/test_env.h" @@ -314,8 +308,12 @@ out1: /* report whether built/configured for flash sync or async mode */ static control_t cfstore_create_test_00(const size_t call_count) { + int32_t ret = ARM_DRIVER_ERROR; + (void) call_count; - CFSTORE_LOG("INITIALIZING: caps.asynchronous_ops=%lu\n", cfstore_driver.GetCapabilities().asynchronous_ops); + ret = cfstore_test_startup(); + CFSTORE_TEST_UTEST_MESSAGE(cfstore_create_utest_msg_g, CFSTORE_UTEST_MSG_BUF_SIZE, "%s:Error: failed to perform test startup (ret=%d).\n", __func__, (int) ret); + TEST_ASSERT_MESSAGE(ret >= ARM_DRIVER_OK, cfstore_create_utest_msg_g); return CaseNext; } @@ -368,7 +366,8 @@ static control_t cfstore_create_test_01_end(const size_t call_count) TEST_ASSERT_MESSAGE(ret >= ARM_DRIVER_OK, cfstore_create_utest_msg_g); node++; } - CFSTORE_LOG("KV successfully increased in size and other KVs remained unchanged.%s", "\n"); + /* revert CFSTORE_LOG for more trace */ + CFSTORE_DBGLOG("KV successfully increased in size and other KVs remained unchanged.%s", "\n"); /* Shrink the KV from KV MID_ENTRY_02 to MID_ENTRY_03 */ ret = cfstore_create_test_KV_change(&cfstore_create_test_01_data[1], &cfstore_create_test_01_data[2]); CFSTORE_TEST_UTEST_MESSAGE(cfstore_create_utest_msg_g, CFSTORE_UTEST_MSG_BUF_SIZE, "%s:Failed to decrease size of KV (ret=%" PRId32 ").\n", __func__, ret); @@ -383,7 +382,8 @@ static control_t cfstore_create_test_01_end(const size_t call_count) TEST_ASSERT_MESSAGE(ret >= ARM_DRIVER_OK, cfstore_create_utest_msg_g); node++; } - CFSTORE_LOG("KV successfully decreased in size and other KVs remained unchanged.%s", "\n"); + /* revert CFSTORE_LOG for more trace */ + CFSTORE_DBGLOG("KV successfully decreased in size and other KVs remained unchanged.%s", "\n"); /* Delete the KV */ ret = cfstore_test_delete(cfstore_create_test_01_data[2].key_name); @@ -486,7 +486,8 @@ static control_t cfstore_create_test_03_end(const size_t call_count) ret = cfstore_create_test_02_core(call_count); CFSTORE_TEST_UTEST_MESSAGE(cfstore_create_utest_msg_g, CFSTORE_UTEST_MSG_BUF_SIZE, "%s:Error: something went wrong (ret=%" PRId32 ").\n", __func__, ret); TEST_ASSERT_MESSAGE(ret >= ARM_DRIVER_OK, cfstore_create_utest_msg_g); - CFSTORE_LOG("Successfully completed create/destroy loop %" PRId32 ".\n", i); + /* revert CFSTORE_LOG for more trace */ + CFSTORE_DBGLOG("Successfully completed create/destroy loop %" PRId32 ".\n", i); } CFSTORE_TEST_UTEST_MESSAGE(cfstore_create_utest_msg_g, CFSTORE_UTEST_MSG_BUF_SIZE, "%s:Error: Uninitialize() call failed.\n", __func__); TEST_ASSERT_MESSAGE(drv->Uninitialize() >= ARM_DRIVER_OK, cfstore_create_utest_msg_g); @@ -531,10 +532,11 @@ static control_t cfstore_create_test_04_end(const size_t call_count) bytes_stored += kv_value_min_len/8 * (i+1); /* kv value blob */ bytes_stored += 8; /* kv overhead */ if(ret == ARM_CFSTORE_DRIVER_ERROR_OUT_OF_MEMORY){ - CFSTORE_LOG("Out of memory on %" PRId32 "-th KV, trying to allocate memory totalling %" PRIu32 ".\n", i, bytes_stored); + CFSTORE_ERRLOG("Out of memory on %" PRId32 "-th KV, trying to allocate memory totalling %" PRIu32 ".\n", i, bytes_stored); break; } - CFSTORE_LOG("Successfully stored %" PRId32 "-th KV bytes, totalling %" PRIu32 ".\n", i, bytes_stored); + /* revert CFSTORE_LOG for more trace */ + CFSTORE_DBGLOG("Successfully stored %" PRId32 "-th KV bytes, totalling %" PRIu32 ".\n", i, bytes_stored); } ret = cfstore_test_delete_all(); CFSTORE_TEST_UTEST_MESSAGE(cfstore_create_utest_msg_g, CFSTORE_UTEST_MSG_BUF_SIZE, "%s:Error: failed to delete_all() attributes to clean up after test (ret=%" PRId32 ").\n", __func__, ret); @@ -585,10 +587,11 @@ static control_t cfstore_create_test_05_end(const size_t call_count) bytes_stored += kv_value_min_len/64 * (i+1); /* kv value blob */ bytes_stored += 8; /* kv overhead */ if(ret == ARM_CFSTORE_DRIVER_ERROR_OUT_OF_MEMORY){ - CFSTORE_LOG("Out of memory on %" PRId32 "-th KV, trying to allocate memory totalling %" PRIu32 ".\n", i, bytes_stored); + CFSTORE_ERRLOG("Out of memory on %" PRId32 "-th KV, trying to allocate memory totalling %" PRIu32 ".\n", i, bytes_stored); break; } - CFSTORE_LOG("Successfully stored %" PRId32 "-th KV bytes, totalling %" PRIu32 ".\n", i, bytes_stored); + /* revert CFSTORE_LOG for more trace */ + CFSTORE_DBGLOG("Successfully stored %" PRId32 "-th KV bytes, totalling %" PRIu32 ".\n", i, bytes_stored); } ret = cfstore_test_delete_all(); CFSTORE_TEST_UTEST_MESSAGE(cfstore_create_utest_msg_g, CFSTORE_UTEST_MSG_BUF_SIZE, "%s:Error: failed to delete_all() attributes to clean up after test.\n", __func__); diff --git a/features/storage/TESTS/cfstore/example1/example1.cpp b/features/storage/TESTS/cfstore/example1/example1.cpp index a81ab526e2..f059a2aa39 100644 --- a/features/storage/TESTS/cfstore/example1/example1.cpp +++ b/features/storage/TESTS/cfstore/example1/example1.cpp @@ -55,15 +55,12 @@ #if defined __MBED__ && ! defined TOOLCHAIN_GCC_ARM -#ifdef TARGET_LIKE_FRDM_K64F_GCC #include "mbed-drivers/mbed.h" -#endif - #include "cfstore_config.h" #include "Driver_Common.h" #include "cfstore_debug.h" #include "cfstore_test.h" -#include "configuration-store/configuration_store.h" +#include "configuration_store.h" #include "utest/utest.h" #include "unity/unity.h" #include "greentea-client/test_env.h" @@ -112,14 +109,14 @@ int main() #else -#ifdef TARGET_LIKE_FRDM_K64F_GCC #include "mbed-drivers/mbed.h" -#endif + #ifndef YOTTA_CONFIGURATION_STORE_EXAMPLE1_VERSION_STRING /* when built as Configuration-Store example, include greentea support otherwise omit */ #include "utest/utest.h" #include "unity/unity.h" #include "greentea-client/test_env.h" + #else // YOTTA_CONFIGURATION_STORE_EXAMPLE1_VERSION_STRING // map utest types for building as stand alone example #define control_t void @@ -127,7 +124,14 @@ int main() #endif // YOTTA_CONFIGURATION_STORE_EXAMPLE1_VERSION_STRING #include "cfstore_config.h" -#include "configuration-store/configuration_store.h" +#include "configuration_store.h" + +#ifdef CFSTORE_CONFIG_BACKEND_FLASH_ENABLED +#include "flash_journal_strategy_sequential.h" +#include "flash_journal.h" +#include "Driver_Common.h" +#endif /* CFSTORE_CONFIG_BACKEND_FLASH_ENABLED */ + #ifdef YOTTA_CFG_CONFIG_UVISOR #include "uvisor-lib/uvisor-lib.h" #endif /* YOTTA_CFG_CONFIG_UVISOR */ @@ -136,8 +140,6 @@ int main() #include #include - - #ifndef YOTTA_CONFIGURATION_STORE_EXAMPLE1_VERSION_STRING using namespace utest::v1; #endif @@ -254,6 +256,31 @@ ARM_CFSTORE_DRIVER *cfstore_drv = &cfstore_driver; static void cfstore_ex_fms_update(cfstore_example1_ctx_t* ctx); +/* @brief test startup code to reset flash + */ +int32_t cfstore_test_startup(void) +{ + ARM_CFSTORE_CAPABILITIES caps = cfstore_driver.GetCapabilities(); + CFSTORE_EX1_LOG("INITIALIZING: caps.asynchronous_ops=%d\n", (int) caps.asynchronous_ops); + +#ifdef CFSTORE_CONFIG_BACKEND_FLASH_ENABLED + + int32_t ret = ARM_DRIVER_ERROR; + FlashJournal_t jrnl; + extern ARM_DRIVER_STORAGE ARM_Driver_Storage_(0); + const ARM_DRIVER_STORAGE *drv = &ARM_Driver_Storage_(0); + + ret = FlashJournal_initialize(&jrnl, drv, &FLASH_JOURNAL_STRATEGY_SEQUENTIAL, NULL); + CFSTORE_EX1_TEST_ASSERT_MSG(ret >= JOURNAL_STATUS_OK, "%s:Error: FlashJournal_initialize() failed (ret=%d)\r\n", __func__, (int) ret); + + ret = FlashJournal_reset(&jrnl); + CFSTORE_EX1_TEST_ASSERT_MSG(ret >= JOURNAL_STATUS_OK, "%s:Error: FlashJournal_reset() failed (ret=%d)\r\n", __func__, (int) ret); +#endif /* CFSTORE_CONFIG_BACKEND_FLASH_ENABLED */ + + return ARM_DRIVER_OK; +} + + static void cfstore_ex_callback(int32_t status, ARM_CFSTORE_OPCODE cmd_code, void *client_context, ARM_CFSTORE_HANDLE handle) { (void) handle; @@ -768,6 +795,7 @@ static void cfstore_ex_fms_update(cfstore_example1_ctx_t* ctx) static control_t cfstore_example1_app_start(const size_t call_count) { + int32_t ret = ARM_DRIVER_ERROR; cfstore_example1_ctx_t* ctx = &cfstore_example1_ctx_g; (void) call_count; @@ -780,7 +808,6 @@ static control_t cfstore_example1_app_start(const size_t call_count) ctx->callback_status = ARM_DRIVER_ERROR; ctx->state = CFSTORE_EX_STATE_INITIALIZING; ctx->caps = cfstore_drv->GetCapabilities(); - CFSTORE_EX1_LOG("%s:INITIALIZING: caps.asynchronous_ops=%lu\n", __func__, ctx->caps.asynchronous_ops); cfstore_ex_fms_update(ctx); /* main application worker loop */ @@ -809,8 +836,11 @@ static control_t cfstore_example1_app_start(const size_t call_count) /* report whether built/configured for flash sync or async mode */ static control_t cfstore_example1_test_00(const size_t call_count) { + int32_t ret = ARM_DRIVER_ERROR; (void) call_count; - CFSTORE_EX1_LOG("INITIALIZING: caps.asynchronous_ops=%lu\n", cfstore_driver.GetCapabilities().asynchronous_ops); + + ret = cfstore_test_startup(); + CFSTORE_EX1_TEST_ASSERT_MSG(ret >= ARM_DRIVER_OK, "%s:Error: failed to perform test startup (ret=%d).\n", __func__, (int) ret); return CaseNext; } diff --git a/features/storage/TESTS/cfstore/example2/example2.cpp b/features/storage/TESTS/cfstore/example2/example2.cpp index 6949c98989..bebcacd4f5 100644 --- a/features/storage/TESTS/cfstore/example2/example2.cpp +++ b/features/storage/TESTS/cfstore/example2/example2.cpp @@ -35,15 +35,12 @@ #if defined __MBED__ && ! defined TOOLCHAIN_GCC_ARM -#ifdef TARGET_LIKE_FRDM_K64F_GCC #include "mbed-drivers/mbed.h" -#endif - #include "cfstore_config.h" #include "Driver_Common.h" #include "cfstore_debug.h" #include "cfstore_test.h" -#include "configuration-store/configuration_store.h" +#include "configuration_store.h" #include "utest/utest.h" #include "unity/unity.h" #include "greentea-client/test_env.h" @@ -93,15 +90,12 @@ int main() #else -#ifdef TARGET_LIKE_FRDM_K64F_GCC #include "mbed-drivers/mbed.h" -#endif - #include "cfstore_config.h" #include "cfstore_test.h" #include "cfstore_debug.h" #include "Driver_Common.h" -#include "configuration-store/configuration_store.h" +#include "configuration_store.h" #include "utest/utest.h" #include "unity/unity.h" #include "greentea-client/test_env.h" @@ -126,8 +120,12 @@ static char cfstore_example2_utest_msg_g[CFSTORE_UTEST_MSG_BUF_SIZE]; /* report whether built/configured for flash sync or async mode */ static control_t cfstore_example2_test_00(const size_t call_count) { + int32_t ret = ARM_DRIVER_ERROR; + (void) call_count; - CFSTORE_LOG("INITIALIZING: caps.asynchronous_ops=%lu\n", cfstore_driver.GetCapabilities().asynchronous_ops); + ret = cfstore_test_startup(); + CFSTORE_TEST_UTEST_MESSAGE(cfstore_example2_utest_msg_g, CFSTORE_UTEST_MSG_BUF_SIZE, "%s:Error: failed to perform test startup (ret=%d).\n", __func__, (int) ret); + TEST_ASSERT_MESSAGE(ret >= ARM_DRIVER_OK, cfstore_example2_utest_msg_g); return CaseNext; } diff --git a/features/storage/TESTS/cfstore/example3/example3.cpp b/features/storage/TESTS/cfstore/example3/example3.cpp index 83d86459f0..fc0e99e127 100644 --- a/features/storage/TESTS/cfstore/example3/example3.cpp +++ b/features/storage/TESTS/cfstore/example3/example3.cpp @@ -50,15 +50,12 @@ #if defined __MBED__ && ! defined TOOLCHAIN_GCC_ARM -#ifdef TARGET_LIKE_FRDM_K64F_GCC #include "mbed-drivers/mbed.h" -#endif - #include "cfstore_config.h" #include "Driver_Common.h" #include "cfstore_debug.h" #include "cfstore_test.h" -#include "configuration-store/configuration_store.h" +#include "configuration_store.h" #include "utest/utest.h" #include "unity/unity.h" #include "greentea-client/test_env.h" @@ -108,9 +105,7 @@ int main() #else -#ifdef TARGET_LIKE_FRDM_K64F_GCC #include "mbed-drivers/mbed.h" -#endif #ifndef YOTTA_CONFIGURATION_STORE_EXAMPLE3_VERSION_STRING /* when built as Configuration-Store example, include greentea support otherwise omit */ #include "utest/utest.h" @@ -123,7 +118,8 @@ int main() #endif // YOTTA_CONFIGURATION_STORE_EXAMPLE3_VERSION_STRING #include "cfstore_config.h" -#include "configuration-store/configuration_store.h" +#include "cfstore_test.h" +#include "configuration_store.h" #ifdef YOTTA_CFG_CONFIG_UVISOR #include "uvisor-lib/uvisor-lib.h" @@ -336,8 +332,11 @@ static control_t cfstore_example3_app_start(const size_t call_count) /* report whether built/configured for flash sync or async mode */ static control_t cfstore_example3_test_00(const size_t call_count) { + int32_t ret = ARM_DRIVER_ERROR; + (void) call_count; - CFSTORE_EX1_LOG("INITIALIZING: caps.asynchronous_ops=%lu\n", cfstore_driver.GetCapabilities().asynchronous_ops); + ret = cfstore_test_startup(); + CFSTORE_EX1_TEST_ASSERT_MSG(ret >= ARM_DRIVER_OK, "%s:Error: failed to perform test startup (ret=%d).\n", __func__, (int) ret); return CaseNext; } diff --git a/features/storage/TESTS/cfstore/example4/example4.cpp b/features/storage/TESTS/cfstore/example4/example4.cpp index a42fa6526f..bf8040d783 100644 --- a/features/storage/TESTS/cfstore/example4/example4.cpp +++ b/features/storage/TESTS/cfstore/example4/example4.cpp @@ -20,15 +20,12 @@ #if defined __MBED__ && ! defined TOOLCHAIN_GCC_ARM -#ifdef TARGET_LIKE_FRDM_K64F_GCC #include "mbed-drivers/mbed.h" -#endif - #include "cfstore_config.h" #include "Driver_Common.h" #include "cfstore_debug.h" #include "cfstore_test.h" -#include "configuration-store/configuration_store.h" +#include "configuration_store.h" #include "utest/utest.h" #include "unity/unity.h" #include "greentea-client/test_env.h" @@ -78,15 +75,12 @@ int main() #else -#ifdef TARGET_LIKE_FRDM_K64F_GCC #include "mbed-drivers/mbed.h" -#endif - #include "cfstore_config.h" #include "cfstore_test.h" #include "cfstore_debug.h" #include "Driver_Common.h" -#include "configuration-store/configuration_store.h" +#include "configuration_store.h" #include "utest/utest.h" #include "unity/unity.h" #include "greentea-client/test_env.h" @@ -136,6 +130,7 @@ static const PvKeyValue_t testDataKeyValue[] = { static control_t cfstore_example4_test_00(const size_t call_count) { + int32_t ret = ARM_DRIVER_ERROR; ARM_CFSTORE_CAPABILITIES caps;; (void) call_count; @@ -149,6 +144,9 @@ static control_t cfstore_example4_test_00(const size_t call_count) CFSTORE_LOG("*** Skipping test as binary built for flash journal async mode, and this test is sync-only%s", "\n"); return CaseNext; } + ret = cfstore_test_startup(); + CFSTORE_TEST_UTEST_MESSAGE(cfstore_example4_utest_msg_g, CFSTORE_UTEST_MSG_BUF_SIZE, "%s:Error: failed to perform test startup (ret=%d).\n", __func__, (int) ret); + TEST_ASSERT_MESSAGE(ret >= ARM_DRIVER_OK, cfstore_example4_utest_msg_g); return CaseNext; } @@ -246,9 +244,9 @@ Case cases[] = { /* 1 2 3 4 5 6 7 */ /* 1234567890123456789012345678901234567890123456789012345678901234567890 */ Case("EXAMPLE4_test_00", cfstore_example4_test_00), -#if defined YOTTA_CFG_CONFIG_HARDWARE_MTD_ASYNC_OPS && YOTTA_CFG_CONFIG_HARDWARE_MTD_ASYNC_OPS == 0 +#if defined STORAGE_DRIVER_CONFIG_HARDWARE_MTD_ASYNC_OPS && STORAGE_DRIVER_CONFIG_HARDWARE_MTD_ASYNC_OPS==0 Case("EXAMPLE4_test_01", cfstore_example4_test_01), -#endif // YOTTA_CFG_CONFIG_HARDWARE_MTD_ASYNC_OPS +#endif // STORAGE_DRIVER_CONFIG_HARDWARE_MTD_ASYNC_OPS }; diff --git a/features/storage/TESTS/cfstore/example5/example5.cpp b/features/storage/TESTS/cfstore/example5/example5.cpp index 86cbe14980..1d0cacba16 100644 --- a/features/storage/TESTS/cfstore/example5/example5.cpp +++ b/features/storage/TESTS/cfstore/example5/example5.cpp @@ -49,15 +49,12 @@ #if defined __MBED__ && ! defined TOOLCHAIN_GCC_ARM -#ifdef TARGET_LIKE_FRDM_K64F_GCC #include "mbed-drivers/mbed.h" -#endif - #include "cfstore_config.h" #include "Driver_Common.h" #include "cfstore_debug.h" #include "cfstore_test.h" -#include "configuration-store/configuration_store.h" +#include "configuration_store.h" #include "utest/utest.h" #include "unity/unity.h" #include "greentea-client/test_env.h" @@ -106,10 +103,7 @@ int main() #else -#ifdef TARGET_LIKE_FRDM_K64F_GCC #include "mbed-drivers/mbed.h" -#endif - #include "Driver_Common.h" #ifndef YOTTA_CONFIGURATION_STORE_EXAMPLE5_VERSION_STRING @@ -124,7 +118,13 @@ int main() #endif // YOTTA_CONFIGURATION_STORE_EXAMPLE5_VERSION_STRING #include "cfstore_config.h" -#include "configuration-store/configuration_store.h" +#include "configuration_store.h" + +#ifdef CFSTORE_CONFIG_BACKEND_FLASH_ENABLED +#include "flash_journal_strategy_sequential.h" +#include "flash_journal.h" +#include "Driver_Common.h" +#endif /* CFSTORE_CONFIG_BACKEND_FLASH_ENABLED */ #include #include @@ -203,6 +203,30 @@ extern ARM_CFSTORE_DRIVER cfstore_driver; ARM_CFSTORE_DRIVER *cfstore_drv = &cfstore_driver; +/* @brief test startup code to reset flash + */ +int32_t cfstore_test_startup(void) +{ + ARM_CFSTORE_CAPABILITIES caps = cfstore_driver.GetCapabilities(); + CFSTORE_EX5_LOG("INITIALIZING: caps.asynchronous_ops=%d\n", (int) caps.asynchronous_ops); + +#ifdef CFSTORE_CONFIG_BACKEND_FLASH_ENABLED + int32_t ret = ARM_DRIVER_ERROR; + FlashJournal_t jrnl; + extern ARM_DRIVER_STORAGE ARM_Driver_Storage_(0); + const ARM_DRIVER_STORAGE *drv = &ARM_Driver_Storage_(0); + + ret = FlashJournal_initialize(&jrnl, drv, &FLASH_JOURNAL_STRATEGY_SEQUENTIAL, NULL); + CFSTORE_EX5_TEST_ASSERT_MSG(ret >= JOURNAL_STATUS_OK, "%s:Error: FlashJournal_initialize() failed (ret=%d)\r\n", __func__, (int) ret); + + ret = FlashJournal_reset(&jrnl); + CFSTORE_EX5_TEST_ASSERT_MSG(ret >= JOURNAL_STATUS_OK, "%s:Error: FlashJournal_reset() failed (ret=%d)\r\n", __func__, (int) ret); +#endif /* CFSTORE_CONFIG_BACKEND_FLASH_ENABLED */ + + return ARM_DRIVER_OK; +} + + static void cfstore_ex5_test_01(cfstore_EXAMPLE5_ctx_t* ctx) { int32_t ret; @@ -234,13 +258,11 @@ static void cfstore_ex5_test_01(cfstore_EXAMPLE5_ctx_t* ctx) ret = cfstore_drv->Flush(); CFSTORE_EX5_TEST_ASSERT_MSG(ret >= ARM_DRIVER_OK, "%s:Error: Flush() failed (ret=%ld)\r\n", __func__, ret); - /* commenting out the 2nd flush() means the test works.*/ - //CFSTORE_EX5_LOG("FLUSHING2%s", "\r\n"); - //ret = cfstore_drv->Flush(); - //CFSTORE_EX5_TEST_ASSERT_MSG(ret >= ARM_DRIVER_OK, "%s:Error: Flush() failed (ret=%ld)\r\n", __func__, ret); - - /* todo: re-instate when Flush() really persists to flash on mbedOSv3+++. - * currently in the supported sram version Uninitialize() clears the sram +#ifdef CFSTORE_CONFIG_BACKEND_FLASH_ENABLED + /* CFSTORE_CONFIG_BACKEND_FLASH_ENABLED => flash storage support present. + * if this was not the case (i.e. cfstore running SRAM in memory mode) then + * we dont compile in the Uninitialize()/Initialize() as the + * Uninitialize() clears the sram */ CFSTORE_EX5_LOG("UNINITIALIZING1%s", "\r\n"); ret = cfstore_drv->Uninitialize(); CFSTORE_EX5_TEST_ASSERT_MSG(ret >= ARM_DRIVER_OK, "%s:Error: Uninitialize() should return ret >= 0 for synch mode(ret=%ld)\r\n", __func__, ret); @@ -248,7 +270,7 @@ static void cfstore_ex5_test_01(cfstore_EXAMPLE5_ctx_t* ctx) CFSTORE_EX5_LOG("INITIALIZING2%s", "\r\n"); ret = cfstore_drv->Initialize(NULL, NULL); CFSTORE_EX5_TEST_ASSERT_MSG(ret >= ARM_DRIVER_OK, "%s:Error: Initialize() should return ret >= 0 for async/synch modes(ret=%ld)\r\n", __func__, ret); - */ +#endif CFSTORE_EX5_LOG("OPENING%s", "\r\n"); memset(&ctx->flags, 0, sizeof(ctx->flags)); @@ -291,6 +313,7 @@ static void cfstore_ex5_test_01(cfstore_EXAMPLE5_ctx_t* ctx) static control_t cfstore_EXAMPLE5_app_start(const size_t call_count) { + int32_t ret = ARM_DRIVER_ERROR; cfstore_EXAMPLE5_ctx_t* ctx = &cfstore_EXAMPLE5_ctx_g; (void) call_count; @@ -307,6 +330,8 @@ static control_t cfstore_EXAMPLE5_app_start(const size_t call_count) CFSTORE_EX5_LOG("*** Skipping test as binary built for flash journal async mode, and this test is sync-only%s", "\n"); return CaseNext; } + ret = cfstore_test_startup(); + CFSTORE_EX5_TEST_ASSERT_MSG(ret >= ARM_DRIVER_OK, "%s:Error: failed to perform test startup (ret=%d).\n", __func__, (int) ret); cfstore_ex5_test_01(ctx); return CaseNext; } diff --git a/features/storage/TESTS/cfstore/find/find.cpp b/features/storage/TESTS/cfstore/find/find.cpp index 4d79a6c209..3de35bec8f 100644 --- a/features/storage/TESTS/cfstore/find/find.cpp +++ b/features/storage/TESTS/cfstore/find/find.cpp @@ -20,15 +20,12 @@ #if defined __MBED__ && ! defined TOOLCHAIN_GCC_ARM -#ifdef TARGET_LIKE_FRDM_K64F_GCC #include "mbed-drivers/mbed.h" -#endif - #include "cfstore_config.h" #include "Driver_Common.h" #include "cfstore_debug.h" #include "cfstore_test.h" -#include "configuration-store/configuration_store.h" +#include "configuration_store.h" #include "utest/utest.h" #include "unity/unity.h" #include "greentea-client/test_env.h" @@ -78,15 +75,12 @@ int main() #else -#ifdef TARGET_LIKE_FRDM_K64F_GCC #include "mbed-drivers/mbed.h" -#endif - #include "cfstore_config.h" #include "cfstore_test.h" #include "cfstore_debug.h" #include "Driver_Common.h" -#include "configuration-store/configuration_store.h" +#include "configuration_store.h" #include "utest/utest.h" #include "unity/unity.h" #include "greentea-client/test_env.h" @@ -115,8 +109,12 @@ UVISOR_BOX_CONFIG(cfstore_find_box1, UVISOR_BOX_STACK_SIZE); /* report whether built/configured for flash sync or async mode */ static control_t cfstore_find_test_00(const size_t call_count) { + int32_t ret = ARM_DRIVER_ERROR; + (void) call_count; - CFSTORE_LOG("INITIALIZING: caps.asynchronous_ops=%lu\n", cfstore_driver.GetCapabilities().asynchronous_ops); + ret = cfstore_test_startup(); + CFSTORE_TEST_UTEST_MESSAGE(cfstore_find_utest_msg_g, CFSTORE_UTEST_MSG_BUF_SIZE, "%s:Error: failed to perform test startup (ret=%d).\n", __func__, (int) ret); + TEST_ASSERT_MESSAGE(ret >= ARM_DRIVER_OK, cfstore_find_utest_msg_g); return CaseNext; } diff --git a/features/storage/TESTS/cfstore/find2/find2.cpp b/features/storage/TESTS/cfstore/find2/find2.cpp index d190c5b300..daf852e4b8 100644 --- a/features/storage/TESTS/cfstore/find2/find2.cpp +++ b/features/storage/TESTS/cfstore/find2/find2.cpp @@ -20,15 +20,12 @@ #if defined __MBED__ && ! defined TOOLCHAIN_GCC_ARM -#ifdef TARGET_LIKE_FRDM_K64F_GCC #include "mbed-drivers/mbed.h" -#endif - #include "cfstore_config.h" #include "Driver_Common.h" #include "cfstore_debug.h" #include "cfstore_test.h" -#include "configuration-store/configuration_store.h" +#include "configuration_store.h" #include "utest/utest.h" #include "unity/unity.h" #include "greentea-client/test_env.h" @@ -78,15 +75,12 @@ int main() #else -#ifdef TARGET_LIKE_FRDM_K64F_GCC #include "mbed-drivers/mbed.h" -#endif - #include "cfstore_config.h" #include "cfstore_test.h" #include "cfstore_debug.h" #include "Driver_Common.h" -#include "configuration-store/configuration_store.h" +#include "configuration_store.h" #include "utest/utest.h" #include "unity/unity.h" #include "greentea-client/test_env.h" @@ -110,13 +104,8 @@ UVISOR_BOX_NAMESPACE("com.arm.mbed.cfstore.test.find2.box1"); UVISOR_BOX_CONFIG(cfstore_find2_box1, UVISOR_BOX_STACK_SIZE); #endif /* YOTTA_CFG_CFSTORE_UVISOR */ - extern ARM_CFSTORE_DRIVER cfstore_driver; -#ifdef TARGET_LIKE_FRDM_K64F_GCC -#define CFSTORE_FIND_MBED_HOSTTEST_TIMEOUT 60 -#endif - void cfstore_find2_callback(int32_t status, ARM_CFSTORE_OPCODE cmd_code, void *client_context, ARM_CFSTORE_HANDLE handle) { (void) status; @@ -129,8 +118,12 @@ void cfstore_find2_callback(int32_t status, ARM_CFSTORE_OPCODE cmd_code, void *c /* report whether built/configured for flash sync or async mode */ static control_t cfstore_find2_test_00(const size_t call_count) { + int32_t ret = ARM_DRIVER_ERROR; + (void) call_count; - CFSTORE_LOG("INITIALIZING: caps.asynchronous_ops=%lu\n", cfstore_driver.GetCapabilities().asynchronous_ops); + ret = cfstore_test_startup(); + CFSTORE_TEST_UTEST_MESSAGE(cfstore_find2_utest_msg_g, CFSTORE_UTEST_MSG_BUF_SIZE, "%s:Error: failed to perform test startup (ret=%d).\n", __func__, (int) ret); + TEST_ASSERT_MESSAGE(ret >= ARM_DRIVER_OK, cfstore_find2_utest_msg_g); return CaseNext; } diff --git a/features/storage/TESTS/cfstore/flash/flash.cpp b/features/storage/TESTS/cfstore/flash/flash.cpp index 254f53fef1..c1d15a71ea 100644 --- a/features/storage/TESTS/cfstore/flash/flash.cpp +++ b/features/storage/TESTS/cfstore/flash/flash.cpp @@ -20,23 +20,27 @@ #if defined __MBED__ && ! defined TOOLCHAIN_GCC_ARM -#ifdef TARGET_LIKE_FRDM_K64F_GCC #include "mbed-drivers/mbed.h" -#endif - #include "cfstore_config.h" #include "Driver_Common.h" #include "cfstore_debug.h" #include "cfstore_test.h" -#include "configuration-store/configuration_store.h" +#include "configuration_store.h" #include "utest/utest.h" #include "unity/unity.h" #include "greentea-client/test_env.h" + #ifdef YOTTA_CFG_CFSTORE_UVISOR #include "uvisor-lib/uvisor-lib.h" #include "cfstore_uvisor.h" #endif /* YOTTA_CFG_CFSTORE_UVISOR */ +#ifdef CFSTORE_CONFIG_BACKEND_FLASH_ENABLED +#include "flash_journal_strategy_sequential.h" +#include "flash_journal.h" +#include "Driver_Common.h" +#endif /* CFSTORE_CONFIG_BACKEND_FLASH_ENABLED */ + #include #include #include @@ -77,18 +81,21 @@ int main() #else -#if defined CFSTORE_CONFIG_BACKEND_FLASH_ENABLED && CFSTORE_CONFIG_BACKEND_FLASH_ENABLED == 1 -#include -#include -#endif /* CFSTORE_CONFIG_BACKEND_FLASH_ENABLED */ #include "cfstore_config.h" #include "cfstore_test.h" #include "cfstore_debug.h" #include "Driver_Common.h" -#include "configuration-store/configuration_store.h" +#include "configuration_store.h" #include "utest/utest.h" #include "unity/unity.h" #include "greentea-client/test_env.h" + +#ifdef CFSTORE_CONFIG_BACKEND_FLASH_ENABLED +#include "flash_journal_strategy_sequential.h" +#include "flash_journal.h" +#include "Driver_Common.h" +#endif /* CFSTORE_CONFIG_BACKEND_FLASH_ENABLED */ + #ifdef YOTTA_CFG_CFSTORE_UVISOR #include "uvisor-lib/uvisor-lib.h" #endif /* YOTTA_CFG_CFSTORE_UVISOR */ @@ -133,7 +140,7 @@ UVISOR_BOX_CONFIG(cfstore_flash_box1, UVISOR_BOX_STACK_SIZE); * Globals */ -#if defined CFSTORE_CONFIG_BACKEND_FLASH_ENABLED && CFSTORE_CONFIG_BACKEND_FLASH_ENABLED == 1 +#ifdef CFSTORE_CONFIG_BACKEND_FLASH_ENABLED char cfstore_flash_utest_msg_g[CFSTORE_FLASH_UTEST_MSG_BUF_SIZE]; uint16_t cfstore_flash_mtd_async_ops_g = 0; extern ARM_DRIVER_STORAGE ARM_Driver_Storage_(0); @@ -703,9 +710,14 @@ static control_t cfstore_flash_journal_async_test_01(void) /* report whether built/configured for flash sync or async mode */ static control_t cfstore_flash_test_00(const size_t call_count) { + int32_t ret = ARM_DRIVER_ERROR; + (void) call_count; - CFSTORE_LOG("INITIALIZING: caps.asynchronous_ops=%lu\n", cfstore_driver.GetCapabilities().asynchronous_ops); -#ifdef YOTTA_CFG_CFSTORE_BACKEND_SRAM + ret = cfstore_test_startup(); + CFSTORE_TEST_UTEST_MESSAGE(cfstore_flash_utest_msg_g, CFSTORE_UTEST_MSG_BUF_SIZE, "%s:Error: failed to perform test startup (ret=%d).\n", __func__, (int) ret); + TEST_ASSERT_MESSAGE(ret >= ARM_DRIVER_OK, cfstore_flash_utest_msg_g); + +#ifndef CFSTORE_CONFIG_BACKEND_FLASH_ENABLED CFSTORE_LOG("INITIALIZING: BACKEND=SRAM. Skipping flash test%s", "\n"); #endif return CaseNext; @@ -714,7 +726,7 @@ static control_t cfstore_flash_test_00(const size_t call_count) /* Specify all your test cases here */ Case cases[] = { Case("flash_journal_async_test_00", cfstore_flash_test_00), -#if defined CFSTORE_CONFIG_BACKEND_FLASH_ENABLED && CFSTORE_CONFIG_BACKEND_FLASH_ENABLED == 1 +#ifdef CFSTORE_CONFIG_BACKEND_FLASH_ENABLED Case("flash_journal_async_test_01", cfstore_flash_journal_async_test_01), #endif }; diff --git a/features/storage/TESTS/cfstore/flush/flush.cpp b/features/storage/TESTS/cfstore/flush/flush.cpp index 818ae1d45d..fa3b835592 100644 --- a/features/storage/TESTS/cfstore/flush/flush.cpp +++ b/features/storage/TESTS/cfstore/flush/flush.cpp @@ -20,15 +20,12 @@ #if defined __MBED__ && ! defined TOOLCHAIN_GCC_ARM -#ifdef TARGET_LIKE_FRDM_K64F_GCC #include "mbed-drivers/mbed.h" -#endif - #include "cfstore_config.h" #include "Driver_Common.h" #include "cfstore_debug.h" #include "cfstore_test.h" -#include "configuration-store/configuration_store.h" +#include "configuration_store.h" #include "utest/utest.h" #include "unity/unity.h" #include "greentea-client/test_env.h" @@ -78,15 +75,12 @@ int main() -#ifdef TARGET_LIKE_FRDM_K64F_GCC #include "mbed-drivers/mbed.h" -#endif - #include "cfstore_config.h" #include "cfstore_test.h" #include "cfstore_debug.h" #include "Driver_Common.h" -#include "configuration-store/configuration_store.h" +#include "configuration_store.h" #include "utest/utest.h" #include "unity/unity.h" #include "greentea-client/test_env.h" @@ -595,8 +589,12 @@ static control_t cfstore_flush_test_02_k64f(void) /* report whether built/configured for flash sync or async mode */ static control_t cfstore_flush_test_00(const size_t call_count) { + int32_t ret = ARM_DRIVER_ERROR; + (void) call_count; - CFSTORE_LOG("INITIALIZING: caps.asynchronous_ops=%lu\n", cfstore_driver.GetCapabilities().asynchronous_ops); + ret = cfstore_test_startup(); + CFSTORE_TEST_UTEST_MESSAGE(cfstore_flush_utest_msg_g, CFSTORE_UTEST_MSG_BUF_SIZE, "%s:Error: failed to perform test startup (ret=%d).\n", __func__, (int) ret); + TEST_ASSERT_MESSAGE(ret >= ARM_DRIVER_OK, cfstore_flush_utest_msg_g); return CaseNext; } diff --git a/features/storage/TESTS/cfstore/flush2/flush2.cpp b/features/storage/TESTS/cfstore/flush2/flush2.cpp index 31becefc3a..132f5c38c2 100644 --- a/features/storage/TESTS/cfstore/flush2/flush2.cpp +++ b/features/storage/TESTS/cfstore/flush2/flush2.cpp @@ -20,15 +20,12 @@ #if defined __MBED__ && ! defined TOOLCHAIN_GCC_ARM -#ifdef TARGET_LIKE_FRDM_K64F_GCC #include "mbed-drivers/mbed.h" -#endif - #include "cfstore_config.h" #include "Driver_Common.h" #include "cfstore_debug.h" #include "cfstore_test.h" -#include "configuration-store/configuration_store.h" +#include "configuration_store.h" #include "utest/utest.h" #include "unity/unity.h" #include "greentea-client/test_env.h" @@ -78,14 +75,11 @@ int main() #else -#ifdef TARGET_LIKE_FRDM_K64F_GCC #include "mbed-drivers/mbed.h" -#endif - #include "utest/utest.h" #include "unity/unity.h" #include "cfstore_config.h" -#include "configuration-store/configuration_store.h" +#include "configuration_store.h" #include "greentea-client/test_env.h" #include "cfstore_test.h" #include "cfstore_debug.h" @@ -168,8 +162,12 @@ static void cfstore_flush_ctx_init(cfstore_flush_ctx_t* ctx) /* report whether built/configured for flash sync or async mode */ static control_t cfstore_flush2_test_00(const size_t call_count) { + int32_t ret = ARM_DRIVER_ERROR; + (void) call_count; - CFSTORE_LOG("INITIALIZING: caps.asynchronous_ops=%lu\n", cfstore_driver.GetCapabilities().asynchronous_ops); + ret = cfstore_test_startup(); + CFSTORE_TEST_UTEST_MESSAGE(cfstore_flush_utest_msg_g, CFSTORE_UTEST_MSG_BUF_SIZE, "%s:Error: failed to perform test startup (ret=%d).\n", __func__, (int) ret); + TEST_ASSERT_MESSAGE(ret >= ARM_DRIVER_OK, cfstore_flush_utest_msg_g); return CaseNext; } diff --git a/features/storage/TESTS/cfstore/init/init.cpp b/features/storage/TESTS/cfstore/init/init.cpp index 3631f099ce..b65412c11d 100644 --- a/features/storage/TESTS/cfstore/init/init.cpp +++ b/features/storage/TESTS/cfstore/init/init.cpp @@ -20,15 +20,12 @@ #if defined __MBED__ && ! defined TOOLCHAIN_GCC_ARM -#ifdef TARGET_LIKE_FRDM_K64F_GCC #include "mbed-drivers/mbed.h" -#endif - #include "cfstore_config.h" #include "Driver_Common.h" #include "cfstore_debug.h" #include "cfstore_test.h" -#include "configuration-store/configuration_store.h" +#include "configuration_store.h" #include "utest/utest.h" #include "unity/unity.h" #include "greentea-client/test_env.h" @@ -77,15 +74,12 @@ int main() #else -#ifdef TARGET_LIKE_FRDM_K64F_GCC #include "mbed-drivers/mbed.h" -#endif - #include "Driver_Common.h" #include "cfstore_config.h" #include "cfstore_test.h" #include "cfstore_debug.h" -#include "configuration-store/configuration_store.h" +#include "configuration_store.h" #include "utest/utest.h" #include "unity/unity.h" #include "greentea-client/test_env.h" @@ -115,8 +109,12 @@ ARM_CFSTORE_DRIVER *cfstore_drv = &cfstore_driver; /* report whether built/configured for flash sync or async mode */ static control_t cfstore_init_test_00(const size_t call_count) { + int32_t ret = ARM_DRIVER_ERROR; + (void) call_count; - CFSTORE_LOG("INITIALIZING: caps.asynchronous_ops=%lu\n", cfstore_driver.GetCapabilities().asynchronous_ops); + ret = cfstore_test_startup(); + CFSTORE_TEST_UTEST_MESSAGE(cfstore_init_utest_msg_g, CFSTORE_UTEST_MSG_BUF_SIZE, "%s:Error: failed to perform test startup (ret=%d).\n", __func__, (int) ret); + TEST_ASSERT_MESSAGE(ret >= ARM_DRIVER_OK, cfstore_init_utest_msg_g); return CaseNext; } diff --git a/features/storage/TESTS/cfstore/misc/misc.cpp b/features/storage/TESTS/cfstore/misc/misc.cpp index 537463e79e..001a778497 100644 --- a/features/storage/TESTS/cfstore/misc/misc.cpp +++ b/features/storage/TESTS/cfstore/misc/misc.cpp @@ -21,15 +21,12 @@ #if defined __MBED__ && ! defined TOOLCHAIN_GCC_ARM -#ifdef TARGET_LIKE_FRDM_K64F_GCC #include "mbed-drivers/mbed.h" -#endif - #include "cfstore_config.h" #include "Driver_Common.h" #include "cfstore_debug.h" #include "cfstore_test.h" -#include "configuration-store/configuration_store.h" +#include "configuration_store.h" #include "utest/utest.h" #include "unity/unity.h" #include "greentea-client/test_env.h" @@ -79,16 +76,13 @@ int main() #else -#ifdef TARGET_LIKE_FRDM_K64F_GCC #include "mbed-drivers/mbed.h" -#endif - #include "cfstore_config.h" #include "cfstore_test.h" #include "cfstore_debug.h" #include "Driver_Common.h" #include "cfstore_config.h" -#include "configuration-store/configuration_store.h" +#include "configuration_store.h" #include "utest/utest.h" #include "unity/unity.h" #include "greentea-client/test_env.h" @@ -120,8 +114,12 @@ UVISOR_SET_MODE_ACL(UVISOR_ENABLED, cfstore_acl_uvisor_box_misc_g); /* report whether built/configured for flash sync or async mode */ static control_t cfstore_misc_test_00(const size_t call_count) { + int32_t ret = ARM_DRIVER_ERROR; + (void) call_count; - CFSTORE_LOG("INITIALIZING: caps.asynchronous_ops=%lu\n", cfstore_driver.GetCapabilities().asynchronous_ops); + ret = cfstore_test_startup(); + CFSTORE_TEST_UTEST_MESSAGE(cfstore_misc_utest_msg_g, CFSTORE_UTEST_MSG_BUF_SIZE, "%s:Error: failed to perform test startup (ret=%d).\n", __func__, (int) ret); + TEST_ASSERT_MESSAGE(ret >= ARM_DRIVER_OK, cfstore_misc_utest_msg_g); return CaseNext; } @@ -223,10 +221,8 @@ static control_t cfstore_misc_test_02(const size_t call_count) (void) call_count; memset(&caps, 0, sizeof(caps)); caps = drv->GetCapabilities(); - //CFSTORE_TEST_UTEST_MESSAGE(cfstore_misc_utest_msg_g, CFSTORE_UTEST_MSG_BUF_SIZE, "%s:Capabilities() failed to return asynchronous_ops == false.\r\n", __func__); - //TEST_ASSERT_MESSAGE(caps.asynchronous_ops == false, cfstore_misc_utest_msg_g); -#ifdef YOTTA_CFG_CONFIG_HARDWARE_MTD_ASYNC_OPS +#ifdef STORAGE_DRIVER_CONFIG_HARDWARE_MTD_ASYNC_OPS /* sync mode */ printf("%s:sync mode: caps.asynchronous_ops =%" PRIu32 "\n", __func__, caps.asynchronous_ops); CFSTORE_TEST_UTEST_MESSAGE(cfstore_misc_utest_msg_g, CFSTORE_UTEST_MSG_BUF_SIZE, "%s:Error: GetCapabilities() reported caps.asynchronous_ops != false but system built for sync operation.\r\n", __func__); diff --git a/features/storage/TESTS/cfstore/open/open.cpp b/features/storage/TESTS/cfstore/open/open.cpp index cbf18cd68b..5e31e84b7e 100644 --- a/features/storage/TESTS/cfstore/open/open.cpp +++ b/features/storage/TESTS/cfstore/open/open.cpp @@ -21,15 +21,12 @@ #if defined __MBED__ && ! defined TOOLCHAIN_GCC_ARM -#ifdef TARGET_LIKE_FRDM_K64F_GCC #include "mbed-drivers/mbed.h" -#endif - #include "cfstore_config.h" #include "Driver_Common.h" #include "cfstore_debug.h" #include "cfstore_test.h" -#include "configuration-store/configuration_store.h" +#include "configuration_store.h" #include "utest/utest.h" #include "unity/unity.h" #include "greentea-client/test_env.h" @@ -78,15 +75,12 @@ int main() #else -#ifdef TARGET_LIKE_FRDM_K64F_GCC #include "mbed-drivers/mbed.h" -#endif - #include "cfstore_config.h" #include "cfstore_test.h" #include "cfstore_debug.h" #include "Driver_Common.h" -#include "configuration-store/configuration_store.h" +#include "configuration_store.h" #include "utest/utest.h" #include "unity/unity.h" #include "greentea-client/test_env.h" @@ -135,8 +129,12 @@ static cfstore_kv_data_t cfstore_open_test_01_kv_data[] = { /* report whether built/configured for flash sync or async mode */ static control_t cfstore_open_test_00(const size_t call_count) { + int32_t ret = ARM_DRIVER_ERROR; + (void) call_count; - CFSTORE_LOG("INITIALIZING: caps.asynchronous_ops=%lu\n", cfstore_driver.GetCapabilities().asynchronous_ops); + ret = cfstore_test_startup(); + CFSTORE_TEST_UTEST_MESSAGE(cfstore_open_utest_msg_g, CFSTORE_UTEST_MSG_BUF_SIZE, "%s:Error: failed to perform test startup (ret=%d).\n", __func__, (int) ret); + TEST_ASSERT_MESSAGE(ret >= ARM_DRIVER_OK, cfstore_open_utest_msg_g); return CaseNext; } @@ -535,7 +533,9 @@ static control_t cfstore_open_test_05_end(const size_t call_count) { CFSTORE_TEST_UTEST_MESSAGE(cfstore_open_utest_msg_g, CFSTORE_UTEST_MSG_BUF_SIZE, "%s:Error: failed to create KV in store when kv_name contains valid characters (code=%" PRId32 ", ret=%" PRId32 ").\n", __func__, j, ret); TEST_ASSERT_MESSAGE(ret >= ARM_DRIVER_OK, cfstore_open_utest_msg_g); - CFSTORE_LOG("Successfully created a KV with valid keyname containing ascii character code %" PRIu32 " (%c) at the %s of the keyname.\n", j, (int) j, pos_str); + /* revert CFSTORE_LOG for more trace */ + CFSTORE_DBGLOG("Successfully created a KV with valid keyname containing ascii character code %" PRIu32 " (%c) at the %s of the keyname.\n", j, (int) j, pos_str); + CFSTORE_LOG("%c", '.'); ret = cfstore_test_delete(kv_name); CFSTORE_TEST_UTEST_MESSAGE(cfstore_open_utest_msg_g, CFSTORE_UTEST_MSG_BUF_SIZE, "%s:Error: failed to delete KV previously created (code=%" PRId32 ", ret=%" PRId32 ").\n", __func__, j, ret); @@ -545,13 +545,16 @@ static control_t cfstore_open_test_05_end(const size_t call_count) { /*node->f_allowed == false => not allowed to create kv name with ascii code */ CFSTORE_TEST_UTEST_MESSAGE(cfstore_open_utest_msg_g, CFSTORE_UTEST_MSG_BUF_SIZE, "%s:Error: created KV in store when kv_name contains an invalid character (code=%" PRId32 ", ret=%" PRId32 ").\n", __func__, j, ret); TEST_ASSERT_MESSAGE(ret < ARM_DRIVER_OK, cfstore_open_utest_msg_g); - CFSTORE_LOG("Successfully failed to create a KV with an invalid keyname containing ascii character code %" PRId32 " at the %s of the keyname.\n", j, pos_str); + /* revert CFSTORE_LOG for more trace */ + CFSTORE_DBGLOG("Successfully failed to create a KV with an invalid keyname containing ascii character code %" PRId32 " at the %s of the keyname.\n", j, pos_str); + CFSTORE_LOG("%c", '.'); } } } node++; } + CFSTORE_LOG("%c", '\n'); CFSTORE_TEST_UTEST_MESSAGE(cfstore_open_utest_msg_g, CFSTORE_UTEST_MSG_BUF_SIZE, "%s:Error: Uninitialize() call failed.\n", __func__); TEST_ASSERT_MESSAGE(drv->Uninitialize() >= ARM_DRIVER_OK, cfstore_open_utest_msg_g); return CaseNext; diff --git a/features/storage/TESTS/cfstore/read/read.cpp b/features/storage/TESTS/cfstore/read/read.cpp index fff843bb49..75ee73b9ed 100644 --- a/features/storage/TESTS/cfstore/read/read.cpp +++ b/features/storage/TESTS/cfstore/read/read.cpp @@ -20,15 +20,12 @@ #if defined __MBED__ && ! defined TOOLCHAIN_GCC_ARM -#ifdef TARGET_LIKE_FRDM_K64F_GCC #include "mbed-drivers/mbed.h" -#endif - #include "cfstore_config.h" #include "Driver_Common.h" #include "cfstore_debug.h" #include "cfstore_test.h" -#include "configuration-store/configuration_store.h" +#include "configuration_store.h" #include "utest/utest.h" #include "unity/unity.h" #include "greentea-client/test_env.h" @@ -78,15 +75,12 @@ int main() #else -#ifdef TARGET_LIKE_FRDM_K64F_GCC #include "mbed-drivers/mbed.h" -#endif - #include "cfstore_config.h" #include "cfstore_test.h" #include "cfstore_debug.h" #include "Driver_Common.h" -#include "configuration-store/configuration_store.h" +#include "configuration_store.h" #include "utest/utest.h" #include "unity/unity.h" #include "greentea-client/test_env.h" @@ -119,8 +113,12 @@ static cfstore_kv_data_t cfstore_read_test_01_kv_data[] = { /* report whether built/configured for flash sync or async mode */ static control_t cfstore_read_test_00(const size_t call_count) { + int32_t ret = ARM_DRIVER_ERROR; + (void) call_count; - CFSTORE_LOG("INITIALIZING: caps.asynchronous_ops=%lu\n", cfstore_driver.GetCapabilities().asynchronous_ops); + ret = cfstore_test_startup(); + CFSTORE_TEST_UTEST_MESSAGE(cfstore_read_utest_msg_g, CFSTORE_UTEST_MSG_BUF_SIZE, "%s:Error: failed to perform test startup (ret=%d).\n", __func__, (int) ret); + TEST_ASSERT_MESSAGE(ret >= ARM_DRIVER_OK, cfstore_read_utest_msg_g); return CaseNext; } diff --git a/features/storage/TESTS/cfstore/write/write.cpp b/features/storage/TESTS/cfstore/write/write.cpp index 750de913d7..816dc4c72a 100644 --- a/features/storage/TESTS/cfstore/write/write.cpp +++ b/features/storage/TESTS/cfstore/write/write.cpp @@ -20,15 +20,12 @@ #if defined __MBED__ && ! defined TOOLCHAIN_GCC_ARM -#ifdef TARGET_LIKE_FRDM_K64F_GCC #include "mbed-drivers/mbed.h" -#endif - #include "cfstore_config.h" #include "Driver_Common.h" #include "cfstore_debug.h" #include "cfstore_test.h" -#include "configuration-store/configuration_store.h" +#include "configuration_store.h" #include "utest/utest.h" #include "unity/unity.h" #include "greentea-client/test_env.h" @@ -78,15 +75,12 @@ int main() #else -#ifdef TARGET_LIKE_FRDM_K64F_GCC #include "mbed-drivers/mbed.h" -#endif - #include "cfstore_config.h" #include "cfstore_test.h" #include "cfstore_debug.h" #include "Driver_Common.h" -#include "configuration-store/configuration_store.h" +#include "configuration_store.h" #include "utest/utest.h" #include "unity/unity.h" #include "greentea-client/test_env.h" @@ -125,8 +119,12 @@ static cfstore_kv_data_t cfstore_write_test_01_kv_data[] = { /* report whether built/configured for flash sync or async mode */ static control_t cfstore_write_test_00(const size_t call_count) { + int32_t ret = ARM_DRIVER_ERROR; + (void) call_count; - CFSTORE_LOG("INITIALIZING: caps.asynchronous_ops=%lu\n", cfstore_driver.GetCapabilities().asynchronous_ops); + ret = cfstore_test_startup(); + CFSTORE_TEST_UTEST_MESSAGE(cfstore_write_utest_msg_g, CFSTORE_UTEST_MSG_BUF_SIZE, "%s:Error: failed to perform test startup (ret=%d).\n", __func__, (int) ret); + TEST_ASSERT_MESSAGE(ret >= ARM_DRIVER_OK, cfstore_write_utest_msg_g); return CaseNext; } diff --git a/features/storage/cfstore/configuration-store/configuration_store.h b/features/storage/cfstore/configuration-store/configuration_store.h index 560b29753d..fb0b321c3d 100644 --- a/features/storage/cfstore/configuration-store/configuration_store.h +++ b/features/storage/cfstore/configuration-store/configuration_store.h @@ -102,16 +102,11 @@ typedef struct _ARM_CFSTORE_STATUS { * * CFSTORE_HANDLE_BUFSIZE * size of the buffer owned and supplied by client to CFSTORE to hold internal - * data structures, referenced by the key handle. Note this can change on - * different platforms depending on the sizeof types. - * + * data structures, referenced by the key handle. */ #define CFSTORE_KEY_NAME_MAX_LENGTH 220 #define CFSTORE_VALUE_SIZE_MAX (1<<26) - -#ifdef TARGET_LIKE_FRDM_K64F_GCC #define CFSTORE_HANDLE_BUFSIZE 24 -#endif #ifdef TARGET_LIKE_X86_LINUX_NATIVE #define CFSTORE_HANDLE_BUFSIZE 40 diff --git a/features/storage/cfstore/mbed_lib.json b/features/storage/cfstore/mbed_lib.json new file mode 100644 index 0000000000..711906d599 --- /dev/null +++ b/features/storage/cfstore/mbed_lib.json @@ -0,0 +1,10 @@ +{ + "name": "configuration-store", + "config": { + "storage_disable": { + "help": "Configuration parameter to disable flash storage if present. Default = 0, implying that by default flash storage is used if present.", + "macro_name": "CFSTORE_STORAGE_DISABLE", + "value": 0 + } + } +} diff --git a/features/storage/cfstore/source/cfstore_config.h b/features/storage/cfstore/source/cfstore_config.h index 7a4d2702ec..abe9c623b3 100644 --- a/features/storage/cfstore/source/cfstore_config.h +++ b/features/storage/cfstore/source/cfstore_config.h @@ -10,7 +10,6 @@ /* * CFSTORE_CONFIG_BACKEND_FLASH_ENABLED * = 1 >1 build with the flash - * CFSTORE_CONFIG_BACKEND_SRAM_ENABLED * CFSTORE_CONFIG_BACKEND_UVISOR_ENABLED * CFSTORE_CONFIG_MBED_OS_VERSION * 3 => mbedosV3 @@ -18,8 +17,6 @@ */ /* default values */ -#define CFSTORE_CONFIG_BACKEND_FLASH_ENABLED 1 -#define CFSTORE_CONFIG_BACKEND_SRAM_ENABLED 0 #define CFSTORE_CONFIG_BACKEND_UVISOR_ENABLED 0 #define CFSTORE_CONFIG_MBED_OS_VERSION 3 @@ -38,23 +35,25 @@ #ifdef __MBED__ #undef CFSTORE_CONFIG_MBED_OS_VERSION #define CFSTORE_CONFIG_MBED_OS_VERSION 4 -/* currently build only sram version (port flash-journal later) */ -#define YOTTA_CFG_CFSTORE_BACKEND_SRAM - -/* define the symbol that yotta would define for the k64f target */ -#define TARGET_LIKE_FRDM_K64F_GCC /* at present time building for sram so set yotta symbol for sync mode i.e. async_ops = 0*/ #define YOTTA_CFG_CONFIG_HARDWARE_MTD_ASYNC_OPS 0 #endif /* __MBED__ */ -#if defined YOTTA_CFG_CFSTORE_BACKEND_SRAM -#undef CFSTORE_CONFIG_BACKEND_FLASH_ENABLED -#define CFSTORE_CONFIG_BACKEND_FLASH_ENABLED 0 -#undef CFSTORE_CONFIG_BACKEND_SRAM_ENABLED -#define CFSTORE_CONFIG_BACKEND_SRAM_ENABLED 1 -#endif /* YOTTA_CFG_CFSTORE_BACKEND_SRAM */ - +/* DEVICE_STORAGE + * defined by the mbed configuration system if a target supports flash storage + * back-end. See targets.json for target flash support. + * - If a target supports storage then by default cfstore will persist KVs to + * storage. + * - If a target does not support storage then (by default) cfstore will store KVs + * in SRAM only (i.e. operate in SRAM in-memory mode). + * + * CFSTORE_STORAGE_DISABLE + * Disable use of storage support (if present) + */ +#if defined DEVICE_STORAGE && CFSTORE_STORAGE_DISABLE==0 +#define CFSTORE_CONFIG_BACKEND_FLASH_ENABLED +#endif #endif /*__CFSTORE_CONFIG_H*/ diff --git a/features/storage/cfstore/source/cfstore_debug.h b/features/storage/cfstore/source/cfstore_debug.h index dcedc3dd2d..33741a390c 100644 --- a/features/storage/cfstore/source/cfstore_debug.h +++ b/features/storage/cfstore/source/cfstore_debug.h @@ -109,7 +109,7 @@ do #define CFSTORE_ASSERT(_x) do { } while(0) #define CFSTORE_INLINE inline #define CFSTORE_DBGLOG(_fmt, ...) do { } while(0) -#define CFSTORE_ERRLOG(_fmt, ...) do { printf(_fmt, __VA_ARGS__); } while(0) +#define CFSTORE_ERRLOG(_fmt, ...) do { } while(0) #define CFSTORE_FENTRYLOG(_fmt, ...) do { } while(0) #define CFSTORE_TP(_tp, _fmt, ...) do { } while(0) #endif /* CFSTORE_DEBUG */ diff --git a/features/storage/cfstore/source/cfstore_fnmatch.c b/features/storage/cfstore/source/cfstore_fnmatch.c index 77edf721a5..3b0b54c3eb 100644 --- a/features/storage/cfstore/source/cfstore_fnmatch.c +++ b/features/storage/cfstore/source/cfstore_fnmatch.c @@ -33,16 +33,16 @@ #ifndef _NO_FNMATCH #if defined(LIBC_SCCS) && !defined(lint) -static char sccsid[] = "@(#)fnmatch.c 8.2 (Berkeley) 4/16/94"; +static char sccsid[] = "@(#)cfstore_fnmatch.c 8.2 (Berkeley) 4/16/94"; #endif /* LIBC_SCCS and not lint */ /* In order to support ARM toolchain, this have been removed from the original - * fnmatch.c from newlib. + * cfstore_fnmatch.c from newlib. * #include */ /* - * Function fnmatch() as specified in POSIX 1003.2-1992, section B.6. + * Function cfstore_fnmatch() as specified in POSIX 1003.2-1992, section B.6. * Compares a filename or pathname to a pattern. */ @@ -52,7 +52,7 @@ static char sccsid[] = "@(#)fnmatch.c 8.2 (Berkeley) 4/16/94"; #include #include -/* code copied from the original fnmatch.h */ +/* code copied from the original cfstore_fnmatch.h */ #define FNM_NOESCAPE 0x01 /* Disable backslash escaping. */ #define FNM_PATHNAME 0x02 /* Slash must be matched by slash. */ @@ -157,10 +157,7 @@ int __collate_range_cmp (c1, c2) static int rangematch(const char *, char, int, char **); -int -fnmatch(pattern, string, flags) - const char *pattern, *string; - int flags; +int cfstore_fnmatch(const char *pattern, const char *string, int flags) { const char *stringstart; char *newp; @@ -210,7 +207,7 @@ fnmatch(pattern, string, flags) /* General case, use recursion. */ while ((test = *string) != EOS) { - if (!fnmatch(pattern, string, flags & ~FNM_PERIOD)) + if (!cfstore_fnmatch(pattern, string, flags & ~FNM_PERIOD)) return (0); if (test == '/' && flags & FNM_PATHNAME) break; diff --git a/features/storage/cfstore/source/cfstore_test.c b/features/storage/cfstore/source/cfstore_test.c index fbd907d6f1..50897ce6f1 100644 --- a/features/storage/cfstore/source/cfstore_test.c +++ b/features/storage/cfstore/source/cfstore_test.c @@ -17,10 +17,18 @@ * * test support code implementation file. */ + #include "cfstore_config.h" #include "cfstore_debug.h" #include "cfstore_test.h" -#include +#include "configuration_store.h" + +#ifdef CFSTORE_CONFIG_BACKEND_FLASH_ENABLED +#include "flash_journal_strategy_sequential.h" +#include "flash_journal.h" +#include "Driver_Common.h" +#endif /* CFSTORE_CONFIG_BACKEND_FLASH_ENABLED */ + #include #include #include @@ -105,6 +113,39 @@ const char* cfstore_test_opcode_str[] = "CFSTORE_OPCODE_WRITE", "CFSTORE_OPCODE_MAX" }; + + +/* @brief test startup code to reset flash + */ +int32_t cfstore_test_startup(void) +{ + ARM_CFSTORE_CAPABILITIES caps = cfstore_driver.GetCapabilities(); + CFSTORE_LOG("INITIALIZING: caps.asynchronous_ops=%d\n", (int) caps.asynchronous_ops); + +#ifdef CFSTORE_CONFIG_BACKEND_FLASH_ENABLED + + int32_t ret = ARM_DRIVER_ERROR; + FlashJournal_t jrnl; + extern ARM_DRIVER_STORAGE ARM_Driver_Storage_(0); + const ARM_DRIVER_STORAGE *drv = &ARM_Driver_Storage_(0); + + ret = FlashJournal_initialize(&jrnl, drv, &FLASH_JOURNAL_STRATEGY_SEQUENTIAL, NULL); + if(ret < JOURNAL_STATUS_OK){ + CFSTORE_ERRLOG("%s:Error: failed to initialize flash journaling layer (ret=%d)\n", __func__, (int) ret); + return ARM_DRIVER_ERROR; + } + ret = FlashJournal_reset(&jrnl); + if(ret < JOURNAL_STATUS_OK){ + CFSTORE_ERRLOG("%s:Error: failed to reset flash journal (ret=%" PRId32 ")\n", __func__, ret); + return ARM_DRIVER_ERROR; + } + +#endif /* CFSTORE_CONFIG_BACKEND_FLASH_ENABLED */ + + return ARM_DRIVER_OK; +} + + /* @brief test utility function to check a node appears correctly in the cfstore * @note this function expects cfstore to have been initialised with * a call to ARM_CFSTORE_DRIVER::Initialize() @@ -421,7 +462,8 @@ int32_t cfstore_test_init_1(void) drv->Close(hkey); return ARM_DRIVER_ERROR; } - CFSTORE_LOG("Created KV successfully (key_name=\"%s\", value=\"%s\")\r\n", key_name_buf, read_buf); + /* revert CFSTORE_LOG for more trace */ + CFSTORE_DBGLOG("Created KV successfully (key_name=\"%s\", value=\"%s\")\r\n", key_name_buf, read_buf); drv->Close(hkey); node++; } diff --git a/features/storage/cfstore/source/cfstore_test.h b/features/storage/cfstore/source/cfstore_test.h index 056c4ae828..8662d6b61e 100644 --- a/features/storage/cfstore/source/cfstore_test.h +++ b/features/storage/cfstore/source/cfstore_test.h @@ -24,7 +24,7 @@ extern "C" { #endif -#include "configuration-store/configuration_store.h" +#include "configuration_store.h" /* Defines */ #define CFSTORE_INIT_1_TABLE_HEAD { "a", ""} @@ -75,6 +75,7 @@ int32_t cfstore_test_init_1(void); int32_t cfstore_test_kv_is_found(const char* key_name, bool* bfound); int32_t cfstore_test_kv_name_gen(char* name, const size_t len); int32_t cfstore_test_read(const char* key_name, char* data, size_t* len); +int32_t cfstore_test_startup(void); int32_t cfstore_test_write(const char* key_name, const char* data, size_t* len); #ifdef __cplusplus diff --git a/features/storage/cfstore/source/configuration_store.c b/features/storage/cfstore/source/configuration_store.c index f2ebcf1e17..49088f2af7 100644 --- a/features/storage/cfstore/source/configuration_store.c +++ b/features/storage/cfstore/source/configuration_store.c @@ -16,24 +16,25 @@ * limitations under the License. */ -#include +#include "cfstore_config.h" +#include "cfstore_debug.h" +#include "cfstore_list.h" +#include "cfstore_fnmatch.h" +#include "configuration_store.h" #if defined CFSTORE_CONFIG_MBED_OS_VERSION && CFSTORE_CONFIG_MBED_OS_VERSION == 3 #include #endif /* CFSTORE_CONFIG_MBED_OS_VERSION == 3 */ -#include "cfstore_config.h" + #ifdef YOTTA_CFG_CFSTORE_UVISOR #include "uvisor-lib/uvisor-lib.h" #endif /* YOTTA_CFG_CFSTORE_UVISOR */ -#if defined CFSTORE_CONFIG_BACKEND_FLASH_ENABLED && CFSTORE_CONFIG_BACKEND_FLASH_ENABLED == 1 -#include -#include -#include -#endif /* CFSTORE_CONFIG_BACKEND_FLASH_ENABLED */ -#include "cfstore_debug.h" -#include "cfstore_list.h" -#include "configuration-store/configuration_store.h" +#ifdef CFSTORE_CONFIG_BACKEND_FLASH_ENABLED +#include "flash_journal_strategy_sequential.h" +#include "flash_journal.h" +#include "Driver_Common.h" +#endif /* CFSTORE_CONFIG_BACKEND_FLASH_ENABLED */ #include #include @@ -52,7 +53,7 @@ uint32_t cfstore_optLogTracepoint_g = CFSTORE_TP_NONE; /*CFSTORE_TP_NONE|CFSTORE /* * Externs */ -#if defined CFSTORE_CONFIG_BACKEND_FLASH_ENABLED && CFSTORE_CONFIG_BACKEND_FLASH_ENABLED == 1 +#ifdef CFSTORE_CONFIG_BACKEND_FLASH_ENABLED extern ARM_DRIVER_STORAGE ARM_Driver_Storage_(0); ARM_DRIVER_STORAGE *cfstore_storage_drv = &ARM_Driver_Storage_(0); #endif /* CFSTORE_CONFIG_BACKEND_FLASH_ENABLED */ @@ -193,7 +194,7 @@ typedef struct cfstore_fsm_t #ifdef CFSTORE_DEBUG -#if defined CFSTORE_CONFIG_BACKEND_FLASH_ENABLED && CFSTORE_CONFIG_BACKEND_FLASH_ENABLED == 1 +#ifdef CFSTORE_CONFIG_BACKEND_FLASH_ENABLED /* strings used for debug trace */ static const char* cfstore_flash_opcode_str[] = { @@ -234,7 +235,7 @@ static const char* cfstore_flash_event_str[] = /* * Forward decl */ -#if defined CFSTORE_CONFIG_BACKEND_FLASH_ENABLED && CFSTORE_CONFIG_BACKEND_FLASH_ENABLED == 1 +#ifdef CFSTORE_CONFIG_BACKEND_FLASH_ENABLED static int32_t cfstore_fsm_state_handle_event(cfstore_fsm_t* fsm, cfstore_fsm_event_t event, void* context); static int32_t cfstore_fsm_state_set(cfstore_fsm_t* fsm, cfstore_fsm_state_t new_state, void* ctx); #endif /* CFSTORE_CONFIG_BACKEND_FLASH_ENABLED */ @@ -384,7 +385,7 @@ typedef struct cfstore_ctx_t uint32_t area_dirty_flag : 1; uint32_t f_reserved0 : 30; -#if defined CFSTORE_CONFIG_BACKEND_FLASH_ENABLED && CFSTORE_CONFIG_BACKEND_FLASH_ENABLED == 1 +#ifdef CFSTORE_CONFIG_BACKEND_FLASH_ENABLED /* flash journal related data */ FlashJournal_t jrnl; FlashJournal_Info_t info; @@ -439,11 +440,11 @@ typedef struct cfstore_flash_journal_error_code_node /* * Globals */ -#ifndef YOTTA_CFG_CONFIG_HARDWARE_MTD_ASYNC_OPS +#ifndef STORAGE_DRIVER_CONFIG_HARDWARE_MTD_ASYNC_OPS static ARM_CFSTORE_CAPABILITIES cfstore_caps_g = { .asynchronous_ops = 1, .uvisor_support_enabled = 0 }; #else -static ARM_CFSTORE_CAPABILITIES cfstore_caps_g = { .asynchronous_ops = YOTTA_CFG_CONFIG_HARDWARE_MTD_ASYNC_OPS, .uvisor_support_enabled = 0 }; -#endif /* YOTTA_CFG_CONFIG_HARDWARE_MTD_ASYNC_OPS */ +static ARM_CFSTORE_CAPABILITIES cfstore_caps_g = { .asynchronous_ops = STORAGE_DRIVER_CONFIG_HARDWARE_MTD_ASYNC_OPS, .uvisor_support_enabled = 0 }; +#endif /* STORAGE_DRIVER_CONFIG_HARDWARE_MTD_ASYNC_OPS */ static const ARM_DRIVER_VERSION cfstore_driver_version_g = { .api = ARM_CFSTORE_API_VERSION, .drv = ARM_CFSTORE_DRV_VERSION }; @@ -615,7 +616,7 @@ static ARM_CFSTORE_SIZE cfstore_ctx_get_area_len(void) static inline uint32_t cfstore_ctx_get_program_unit(cfstore_ctx_t* ctx) { CFSTORE_ASSERT(ctx!= NULL); -#if defined CFSTORE_CONFIG_BACKEND_FLASH_ENABLED && CFSTORE_CONFIG_BACKEND_FLASH_ENABLED == 1 +#ifdef CFSTORE_CONFIG_BACKEND_FLASH_ENABLED return ctx->info.program_unit; #else /* the program unit is 1 so byte aligned when no flash backend present */ @@ -729,10 +730,45 @@ void *cfstore_realloc(void *ptr, ARM_CFSTORE_SIZE size) #endif /* CFSTORE_YOTTA_CFG_CFSTORE_SRAM_ADDR */ + +#ifdef TARGET_LIKE_X86_LINUX_NATIVE +static inline void cfstore_critical_section_init(CFSTORE_LOCK* lock){ *lock = 0; } +static inline void cfstore_critical_section_lock(CFSTORE_LOCK* lock, const char* tag){ (void) tag; __sync_fetch_and_add(lock, 1); } +static inline void cfstore_critical_section_unlock(CFSTORE_LOCK* lock, const char* tag){(void) tag; __sync_fetch_and_sub(lock, 1); } + +static CFSTORE_INLINE int32_t cfstore_hkvt_refcount_dec(cfstore_area_hkvt_t* hkvt, uint8_t *refcount) +{ + cfstore_area_header_t *hdr = (cfstore_area_header_t*) hkvt->head; + uint32_t __refcount; + + __refcount =__sync_fetch_and_sub(&hdr->refcount, 1); + if(refcount) *refcount = __refcount; + return ARM_DRIVER_OK; +} + +static CFSTORE_INLINE int32_t cfstore_hkvt_refcount_inc(cfstore_area_hkvt_t* hkvt, uint8_t *refcount) +{ + int32_t ret = ARM_CFSTORE_DRIVER_ERROR_HANDLE_COUNT_MAX; + uint32_t __refcount; + cfstore_area_header_t *hdr = (cfstore_area_header_t*) hkvt->head; + + if( (__refcount = __sync_fetch_and_add(&hdr->refcount, 1)) < CFSTORE_LOCK_REFCOUNT_MAX) { + if(refcount) *refcount = __refcount; + ret = ARM_DRIVER_OK; + } else { + /* maximum count reach, back down and return error*/ + __sync_fetch_and_sub(&hdr->refcount, 1); + } + return ret; +} + + +#else + /* * Platform Specific Function Implementations */ -#ifdef TARGET_LIKE_FRDM_K64F_GCC + static inline void cfstore_critical_section_init(CFSTORE_LOCK* lock){ *lock = 0; } static inline void cfstore_critical_section_unlock(CFSTORE_LOCK* lock, const char* tag) { @@ -780,39 +816,6 @@ static CFSTORE_INLINE int32_t cfstore_hkvt_refcount_inc(cfstore_area_hkvt_t* hkv /* todo: put mbedosv3++ critical section exit here */ return ret; } -#endif /* TARGET_LIKE_FRDM_K64F_GCC */ - - -#ifdef TARGET_LIKE_X86_LINUX_NATIVE -static inline void cfstore_critical_section_init(CFSTORE_LOCK* lock){ *lock = 0; } -static inline void cfstore_critical_section_lock(CFSTORE_LOCK* lock, const char* tag){ (void) tag; __sync_fetch_and_add(lock, 1); } -static inline void cfstore_critical_section_unlock(CFSTORE_LOCK* lock, const char* tag){(void) tag; __sync_fetch_and_sub(lock, 1); } - -static CFSTORE_INLINE int32_t cfstore_hkvt_refcount_dec(cfstore_area_hkvt_t* hkvt, uint8_t *refcount) -{ - cfstore_area_header_t *hdr = (cfstore_area_header_t*) hkvt->head; - uint32_t __refcount; - - __refcount =__sync_fetch_and_sub(&hdr->refcount, 1); - if(refcount) *refcount = __refcount; - return ARM_DRIVER_OK; -} - -static CFSTORE_INLINE int32_t cfstore_hkvt_refcount_inc(cfstore_area_hkvt_t* hkvt, uint8_t *refcount) -{ - int32_t ret = ARM_CFSTORE_DRIVER_ERROR_HANDLE_COUNT_MAX; - uint32_t __refcount; - cfstore_area_header_t *hdr = (cfstore_area_header_t*) hkvt->head; - - if( (__refcount = __sync_fetch_and_add(&hdr->refcount, 1)) < CFSTORE_LOCK_REFCOUNT_MAX) { - if(refcount) *refcount = __refcount; - ret = ARM_DRIVER_OK; - } else { - /* maximum count reach, back down and return error*/ - __sync_fetch_and_sub(&hdr->refcount, 1); - } - return ret; -} #endif /* TARGET_LIKE_X86_LINUX_NATIVE */ @@ -1336,7 +1339,7 @@ static int32_t cfstore_flash_set_tail(void) return ret; } -#if defined CFSTORE_CONFIG_BACKEND_FLASH_ENABLED && CFSTORE_CONFIG_BACKEND_FLASH_ENABLED == 1 +#ifdef CFSTORE_CONFIG_BACKEND_FLASH_ENABLED /* * flash helper functions @@ -1615,8 +1618,6 @@ static int32_t cfstore_fsm_reading(void* context) memset(&ctx->info, 0, sizeof(ctx->info)); goto out; } - /* clear info data */ - memset(&ctx->info, 0, sizeof(ctx->info)); ret = cfstore_fsm_state_set(&ctx->fsm, cfstore_fsm_state_ready, ctx); if(ret < ARM_DRIVER_OK){ CFSTORE_ERRLOG("%s:Error: cfstore_fsm_state_set() failed (ret=%" PRId32 ")\n", __func__, ret); @@ -2970,14 +2971,14 @@ static int32_t cfstore_find_ex(const char* key_name_query, cfstore_area_hkvt_t * next_key_len = cfstore_hkvt_get_key_len(next); next_key_len++; cfstore_get_key_name_ex(next, key_name, &next_key_len); - ret = fnmatch(key_name_query, key_name, 0); + ret = cfstore_fnmatch(key_name_query, key_name, 0); if(ret == 0){ /* found the entry in the store. return handle */ CFSTORE_TP(CFSTORE_TP_FIND, "%s:Found matching key (key_name_query = \"%s\", next->key = \"%s\"),next_key_len=%d\n", __func__, key_name_query, key_name, (int) next_key_len); cfstore_hkvt_dump(next, __func__); return ARM_DRIVER_OK; } else if(ret != CFSTORE_FNM_NOMATCH){ - CFSTORE_ERRLOG("%s:Error: fnmatch() error (ret=%" PRId32 ").\n", __func__, ret); + CFSTORE_ERRLOG("%s:Error: cfstore_fnmatch() error (ret=%" PRId32 ").\n", __func__, ret); return ARM_DRIVER_ERROR; } /* CFSTORE_FNM_NOMATCH => get the next hkvt if any */ @@ -3721,7 +3722,7 @@ static int32_t cfstore_initialise(ARM_CFSTORE_CALLBACK callback, void* client_co { int ret = ARM_DRIVER_ERROR; cfstore_ctx_t* ctx = cfstore_ctx_get(); -#if defined CFSTORE_CONFIG_BACKEND_FLASH_ENABLED && CFSTORE_CONFIG_BACKEND_FLASH_ENABLED == 1 +#ifdef CFSTORE_CONFIG_BACKEND_FLASH_ENABLED ARM_STORAGE_CAPABILITIES storage_caps; #endif /* CFSTORE_CONFIG_BACKEND_FLASH_ENABLED */ @@ -3757,8 +3758,7 @@ static int32_t cfstore_initialise(ARM_CFSTORE_CALLBACK callback, void* client_co ctx->power_state = ARM_POWER_FULL; ctx->status = ARM_DRIVER_OK; -#if defined CFSTORE_CONFIG_BACKEND_FLASH_ENABLED && CFSTORE_CONFIG_BACKEND_FLASH_ENABLED == 1 - // todo: put in cfstore_flash_init() ? +#ifdef CFSTORE_CONFIG_BACKEND_FLASH_ENABLED /* set the cfstore async flag according to the storage driver mode */ storage_caps = cfstore_storage_drv->GetCapabilities(); cfstore_caps_g.asynchronous_ops = storage_caps.asynchronous_ops;