From a31c2d156d52c3322fe5fa4714a2dadf58601c6c Mon Sep 17 00:00:00 2001 From: Brad Campbell Date: Thu, 22 Feb 2024 00:13:28 -0500 Subject: [PATCH] libtock: add higher-level nonvolatile_storage --- libtock/nonvolatile_storage.c | 101 ++++++++++++++++++++++++++++++++++ libtock/nonvolatile_storage.h | 26 +++++++++ 2 files changed, 127 insertions(+) create mode 100644 libtock/nonvolatile_storage.c create mode 100644 libtock/nonvolatile_storage.h diff --git a/libtock/nonvolatile_storage.c b/libtock/nonvolatile_storage.c new file mode 100644 index 000000000..b292d3026 --- /dev/null +++ b/libtock/nonvolatile_storage.c @@ -0,0 +1,101 @@ +#include +#include + +#include +#include + + + + + + + +static void read_done(int length, + __attribute__ ((unused)) int arg1, + __attribute__ ((unused)) int arg2, + void* opaque) { + nonvolatile_storage_callback cb = (nonvolatile_storage_callback) opaque; + cb(RETURNCODE_SUCCESS, length); +} + +static void write_done(int length, + __attribute__ ((unused)) int arg1, + __attribute__ ((unused)) int arg2, + void* opaque) { + nonvolatile_storage_callback cb = (nonvolatile_storage_callback) opaque; + cb(RETURNCODE_SUCCESS, length); +} + + +returncode_t nonvolatile_storage_read(uint8_t* buffer, uint32_t length, uint32_t address, nonvolatile_storage_callback cb) { + returncode_t ret; + + ret = nonvolatile_storage_internal_read_buffer(buffer, length); + if (ret != RETURNCODE_SUCCESS) return ret; + + ret = nonvolatile_storage_internal_read_done_subscribe(read_done, cb); + if (ret != RETURNCODE_SUCCESS) return ret; + + ret = nonvolatile_storage_internal_read(address, length); + return ret; +} + +returncode_t nonvolatile_storage_write(uint8_t* buffer, uint32_t length, uint32_t address, nonvolatile_storage_callback cb) { + returncode_t ret; + + ret = nonvolatile_storage_internal_write_buffer(buffer, length); + if (ret != RETURNCODE_SUCCESS) return ret; + + ret = nonvolatile_storage_internal_write_done_subscribe(write_done, cb); + if (ret != RETURNCODE_SUCCESS) return ret; + + ret = nonvolatile_storage_internal_write(address, length); + return ret; +} + + + +struct data { + bool fired; + int length; + returncode_t result; +}; + +static struct data result = { .fired = false }; + + +static void nv_storage_done(returncode_t ret, int length) { + result.fired = true; + result.length = length; + result.result = ret; +} + + + +returncode_t nonvolatile_storage_read_sync(uint8_t* buffer, uint32_t length, uint32_t address) { + returncode_t ret; + result.fired = false; + + + ret = nonvolatile_storage_read(buffer, length, address, nv_storage_done); + if (ret != RETURNCODE_SUCCESS) return ret; + + + yield_for(&result.fired); + return RETURNCODE_SUCCESS; +} + +returncode_t nonvolatile_storage_write_sync(uint8_t* buffer, uint32_t length, uint32_t address) { + returncode_t ret; + result.fired = false; + + + ret = nonvolatile_storage_write(buffer, length, address, nv_storage_done); + if (ret != RETURNCODE_SUCCESS) return ret; + + + yield_for(&result.fired); + return RETURNCODE_SUCCESS; +} + + diff --git a/libtock/nonvolatile_storage.h b/libtock/nonvolatile_storage.h new file mode 100644 index 000000000..085a536de --- /dev/null +++ b/libtock/nonvolatile_storage.h @@ -0,0 +1,26 @@ +#pragma once + +#include "tock.h" + + + +#ifdef __cplusplus +extern "C" { +#endif + + +// Function signature for button press callbacks. +// +// - `arg1` (`returncode_t`): Returncode indicating status of the operation. +// - `arg2` (`int`): Length. +typedef void (*nonvolatile_storage_callback)(returncode_t, int); + +returncode_t nonvolatile_storage_read(uint8_t* buffer, uint32_t length, uint32_t address, nonvolatile_storage_callback cb); +returncode_t nonvolatile_storage_write(uint8_t* buffer, uint32_t length, uint32_t address, nonvolatile_storage_callback cb); +returncode_t nonvolatile_storage_read_sync(uint8_t* buffer, uint32_t length, uint32_t address); +returncode_t nonvolatile_storage_write_sync(uint8_t* buffer, uint32_t length, uint32_t address); + + +#ifdef __cplusplus +} +#endif