storage impl for modes
This commit is contained in:
parent
1318e0f9c2
commit
9d2a970161
|
@ -3,6 +3,7 @@
|
||||||
#include <tusb.h>
|
#include <tusb.h>
|
||||||
|
|
||||||
#include "mode.h"
|
#include "mode.h"
|
||||||
|
#include "storage.h"
|
||||||
#include "thread.h"
|
#include "thread.h"
|
||||||
#include "usbstdio.h"
|
#include "usbstdio.h"
|
||||||
#include "vnd_cfg.h"
|
#include "vnd_cfg.h"
|
||||||
|
@ -35,6 +36,8 @@ enum m_default_feature {
|
||||||
mdef_feat_tempsense = 1<<4,
|
mdef_feat_tempsense = 1<<4,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static bool data_dirty = false;
|
||||||
|
|
||||||
#ifdef DBOARD_HAS_UART
|
#ifdef DBOARD_HAS_UART
|
||||||
static cothread_t uartthread;
|
static cothread_t uartthread;
|
||||||
static uint8_t uartstack[THREAD_STACK_SIZE];
|
static uint8_t uartstack[THREAD_STACK_SIZE];
|
||||||
|
@ -81,6 +84,17 @@ static void enter_cb(void) {
|
||||||
serprogthread = co_derive(serprogstack, sizeof serprogstack, serprog_thread_fn);
|
serprogthread = co_derive(serprogstack, sizeof serprogstack, serprog_thread_fn);
|
||||||
thread_enter(serprogthread); // will call cdc_serprog_init() on correct thread
|
thread_enter(serprogthread); // will call cdc_serprog_init() on correct thread
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
if (!data_dirty) { // only read when not read yet
|
||||||
|
struct mode_info mi = storage_mode_get_info(1);
|
||||||
|
if (mi.size != 0 && mi.version == 0x0010 /* TODO: version migration? */) {
|
||||||
|
uint8_t dst[2];
|
||||||
|
storage_mode_read(1, dst, 0, 2);
|
||||||
|
|
||||||
|
cdc_uart_set_hwflow(dst[0]);
|
||||||
|
tempsense_set_addr(dst[1]);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
static void leave_cb(void) {
|
static void leave_cb(void) {
|
||||||
// TODO: CMSISDAP?
|
// TODO: CMSISDAP?
|
||||||
|
@ -144,7 +158,12 @@ static void handle_cmd_cb(uint8_t cmd) {
|
||||||
break;
|
break;
|
||||||
case mdef_cmd_tempsense:
|
case mdef_cmd_tempsense:
|
||||||
#ifdef DBOARD_HAS_TEMPSENSOR
|
#ifdef DBOARD_HAS_TEMPSENSOR
|
||||||
|
{
|
||||||
|
uint8_t addra = tempsense_get_addr();
|
||||||
tempsense_bulk_cmd();
|
tempsense_bulk_cmd();
|
||||||
|
uint8_t addrb = tempsense_get_addr();
|
||||||
|
data_dirty |= addra != addrb;
|
||||||
|
}
|
||||||
#else
|
#else
|
||||||
vnd_cfg_write_str(cfg_resp_illcmd, "temperature sensor not implemented on this device");
|
vnd_cfg_write_str(cfg_resp_illcmd, "temperature sensor not implemented on this device");
|
||||||
#endif
|
#endif
|
||||||
|
@ -156,9 +175,10 @@ static void handle_cmd_cb(uint8_t cmd) {
|
||||||
resp = cdc_uart_get_hwflow() ? 1 : 0;
|
resp = cdc_uart_get_hwflow() ? 1 : 0;
|
||||||
vnd_cfg_write_resp(cfg_resp_ok, 1, &resp);
|
vnd_cfg_write_resp(cfg_resp_ok, 1, &resp);
|
||||||
} else {
|
} else {
|
||||||
if (cdc_uart_set_hwflow(resp != 0))
|
if (cdc_uart_set_hwflow(resp != 0)) {
|
||||||
vnd_cfg_write_resp(cfg_resp_ok, 0, NULL);
|
vnd_cfg_write_resp(cfg_resp_ok, 0, NULL);
|
||||||
else
|
data_dirty = true;
|
||||||
|
} else
|
||||||
vnd_cfg_write_str(cfg_resp_illcmd, "UART flow control setting not supported on this device");
|
vnd_cfg_write_str(cfg_resp_illcmd, "UART flow control setting not supported on this device");
|
||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
|
@ -387,6 +407,19 @@ static bool my_vendor_control_xfer_cb(uint8_t rhport, uint8_t ep_addr,
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
static uint16_t my_get_size(void) { return 2; }
|
||||||
|
static void my_get_data(void* dst, size_t offset, size_t maxsize) {
|
||||||
|
(void)offset; (void)maxsize;
|
||||||
|
|
||||||
|
uint8_t* d = dst;
|
||||||
|
|
||||||
|
d[0] = cdc_uart_get_hwflow() ? 1 : 0;
|
||||||
|
d[1] = tempsense_get_addr();
|
||||||
|
|
||||||
|
data_dirty = false;
|
||||||
|
}
|
||||||
|
static bool my_is_dirty(void) { return data_dirty; }
|
||||||
|
|
||||||
extern struct mode m_01_default;
|
extern struct mode m_01_default;
|
||||||
// clang-format off
|
// clang-format off
|
||||||
struct mode m_01_default = {
|
struct mode m_01_default = {
|
||||||
|
@ -402,6 +435,13 @@ struct mode m_01_default = {
|
||||||
.task = task_cb,
|
.task = task_cb,
|
||||||
.handle_cmd = handle_cmd_cb,
|
.handle_cmd = handle_cmd_cb,
|
||||||
|
|
||||||
|
.storage = {
|
||||||
|
.stclass = mode_storage_32b,
|
||||||
|
.get_size = my_get_size,
|
||||||
|
.get_data = my_get_data,
|
||||||
|
.is_dirty = my_is_dirty
|
||||||
|
},
|
||||||
|
|
||||||
#if defined(DBOARD_HAS_CMSISDAP) && CFG_TUD_HID > 0
|
#if defined(DBOARD_HAS_CMSISDAP) && CFG_TUD_HID > 0
|
||||||
#if 0
|
#if 0
|
||||||
.tud_hid_get_report_cb = my_hid_get_report_cb,
|
.tud_hid_get_report_cb = my_hid_get_report_cb,
|
||||||
|
|
|
@ -3,6 +3,7 @@
|
||||||
#include <tusb.h>
|
#include <tusb.h>
|
||||||
|
|
||||||
#include "mode.h"
|
#include "mode.h"
|
||||||
|
#include "storage.h"
|
||||||
#include "thread.h"
|
#include "thread.h"
|
||||||
#include "usbstdio.h"
|
#include "usbstdio.h"
|
||||||
#include "vnd_cfg.h"
|
#include "vnd_cfg.h"
|
||||||
|
@ -20,6 +21,8 @@ enum m_sump_feature {
|
||||||
msump_feat_sump = 1<<0,
|
msump_feat_sump = 1<<0,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static bool data_dirty = false;
|
||||||
|
|
||||||
#ifdef DBOARD_HAS_SUMP
|
#ifdef DBOARD_HAS_SUMP
|
||||||
static cothread_t sumpthread;
|
static cothread_t sumpthread;
|
||||||
static uint8_t sumpstack[THREAD_STACK_SIZE];
|
static uint8_t sumpstack[THREAD_STACK_SIZE];
|
||||||
|
@ -44,6 +47,16 @@ static void enter_cb(void) {
|
||||||
sumpthread = co_derive(sumpstack, sizeof sumpstack, sump_thread_fn);
|
sumpthread = co_derive(sumpstack, sizeof sumpstack, sump_thread_fn);
|
||||||
thread_enter(sumpthread);
|
thread_enter(sumpthread);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
if (!data_dirty) { // only read when not read yet
|
||||||
|
struct mode_info mi = storage_mode_get_info(4);
|
||||||
|
if (mi.size != 0 && mi.version == 0x0010 /* TODO: version migration? */) {
|
||||||
|
uint8_t dst[1];
|
||||||
|
storage_mode_read(4, dst, 0, 1);
|
||||||
|
|
||||||
|
sump_hw_set_overclock(dst[0]);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
static void leave_cb(void) {
|
static void leave_cb(void) {
|
||||||
#ifdef DBOARD_HAS_SUMP
|
#ifdef DBOARD_HAS_SUMP
|
||||||
|
@ -133,7 +146,6 @@ enum {
|
||||||
#define EPNUM_CDC_STDIO_NOTIF 0x85
|
#define EPNUM_CDC_STDIO_NOTIF 0x85
|
||||||
|
|
||||||
// clang-format off
|
// clang-format off
|
||||||
// TODO: replace magic 64s by actual buffer size macros
|
|
||||||
static const uint8_t desc_configuration[] = {
|
static const uint8_t desc_configuration[] = {
|
||||||
TUD_CONFIG_DESCRIPTOR(1, ITF_NUM__TOTAL, STRID_CONFIG, CONFIG_TOTAL_LEN,
|
TUD_CONFIG_DESCRIPTOR(1, ITF_NUM__TOTAL, STRID_CONFIG, CONFIG_TOTAL_LEN,
|
||||||
TUSB_DESC_CONFIG_ATT_REMOTE_WAKEUP, 100),
|
TUSB_DESC_CONFIG_ATT_REMOTE_WAKEUP, 100),
|
||||||
|
@ -178,6 +190,17 @@ static void my_cdc_line_coding_cb(uint8_t itf, cdc_line_coding_t const* line_cod
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
static uint16_t my_get_size(void) { return 1; }
|
||||||
|
static void my_get_data(void* dst, size_t offset, size_t maxsize) {
|
||||||
|
(void)offset; (void)maxsize;
|
||||||
|
|
||||||
|
uint8_t* d = dst;
|
||||||
|
d[0] = sump_hw_get_overclock();
|
||||||
|
|
||||||
|
data_dirty = false;
|
||||||
|
}
|
||||||
|
static bool my_is_dirty(void) { return data_dirty; }
|
||||||
|
|
||||||
extern struct mode m_04_sump;
|
extern struct mode m_04_sump;
|
||||||
// clang-format off
|
// clang-format off
|
||||||
struct mode m_04_sump = {
|
struct mode m_04_sump = {
|
||||||
|
@ -188,6 +211,13 @@ struct mode m_04_sump = {
|
||||||
.usb_desc = desc_configuration,
|
.usb_desc = desc_configuration,
|
||||||
.string_desc = string_desc_arr,
|
.string_desc = string_desc_arr,
|
||||||
|
|
||||||
|
.storage = {
|
||||||
|
.stclass = mode_storage_32b,
|
||||||
|
.get_size = my_get_size,
|
||||||
|
.get_data = my_get_data,
|
||||||
|
.is_dirty = my_is_dirty
|
||||||
|
},
|
||||||
|
|
||||||
.enter = enter_cb,
|
.enter = enter_cb,
|
||||||
.leave = leave_cb,
|
.leave = leave_cb,
|
||||||
.task = task_cb,
|
.task = task_cb,
|
||||||
|
|
|
@ -6,14 +6,14 @@
|
||||||
#include "storage.h"
|
#include "storage.h"
|
||||||
|
|
||||||
#if !defined(PERSISTENT_STORAGE) || !defined(DBOARD_HAS_STORAGE)
|
#if !defined(PERSISTENT_STORAGE) || !defined(DBOARD_HAS_STORAGE)
|
||||||
/*int storage_init(void) { return -1; }
|
int storage_init(void) { return -1; }
|
||||||
bool storage_flush_data(void) { return false; }
|
bool storage_flush_data(void) { return false; }
|
||||||
struct mode_info storage_mode_get_size(int _) {
|
struct mode_info storage_mode_get_info(int _) {
|
||||||
(void)_; return (struct mode_info){ .size = 0, .version = 0 };
|
(void)_; return (struct mode_info){ .size = 0, .version = 0 };
|
||||||
}
|
}
|
||||||
void storage_mode_read(int _, void* __, size_t ___, size_t ____) {
|
void storage_mode_read(int _, void* __, size_t ___, size_t ____) {
|
||||||
(void)_; (void)__; (void)___; (void)____;
|
(void)_; (void)__; (void)___; (void)____;
|
||||||
}*/
|
}
|
||||||
#else
|
#else
|
||||||
|
|
||||||
#include "storage_internal.h"
|
#include "storage_internal.h"
|
||||||
|
|
|
@ -20,6 +20,7 @@ enum mode_storage_class {
|
||||||
struct mode_storage {
|
struct mode_storage {
|
||||||
enum mode_storage_class stclass;
|
enum mode_storage_class stclass;
|
||||||
uint16_t (*get_size)(void);
|
uint16_t (*get_size)(void);
|
||||||
|
// if stclass < 512b, offset & maxsize can be ignored
|
||||||
void (*get_data)(void* dst, size_t offset, size_t maxsize);
|
void (*get_data)(void* dst, size_t offset, size_t maxsize);
|
||||||
bool (*is_dirty)(void); // if data was changed since last mode_read/get_data call
|
bool (*is_dirty)(void); // if data was changed since last mode_read/get_data call
|
||||||
};
|
};
|
||||||
|
|
|
@ -48,7 +48,7 @@ static size_t storage_allocate_new(void) {
|
||||||
uint16_t dsize = mode_list[mode]->storage.get_size();
|
uint16_t dsize = mode_list[mode]->storage.get_size();
|
||||||
if (dsize > stclass_sz[stcls]) continue;
|
if (dsize > stclass_sz[stcls]) continue;
|
||||||
|
|
||||||
if (current_wrhead + dsize > current_page_end) { // welp
|
if (current_wrhead + dsize > current_page_end) { // FIXME: data that is >1 page size (do we want to support this?)
|
||||||
current_page_end = current_page;
|
current_page_end = current_page;
|
||||||
current_page -= STORAGE_ERASEWRITE_ALIGN;
|
current_page -= STORAGE_ERASEWRITE_ALIGN;
|
||||||
current_wrhead = current_page;
|
current_wrhead = current_page;
|
||||||
|
|
Loading…
Reference in New Issue