forked from microsoft/devicescript
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathsettingsflash.c
More file actions
90 lines (75 loc) · 2.47 KB
/
Copy pathsettingsflash.c
File metadata and controls
90 lines (75 loc) · 2.47 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
#include "services/jd_services.h"
#include "services/interfaces/jd_flash.h"
#include "jd_client.h"
#include "devicescript.h"
#ifndef JD_FLASH_IN_SETTINGS
#define JD_FLASH_IN_SETTINGS 0
#endif
#if JD_FLASH_IN_SETTINGS
static devsmgr_cfg_t cfg;
static bool is_erased;
static uint8_t *max_write;
#define KEY "devs_prog"
void flash_program(void *dst, const void *src, uint32_t len) {
JD_ASSERT(cfg.program_base != NULL);
ptrdiff_t diff = (uint8_t *)dst - (uint8_t *)cfg.program_base;
JD_ASSERT(((uintptr_t)src & 3) == 0);
JD_ASSERT(0 <= diff && diff + len <= cfg.max_program_size);
JD_ASSERT((diff & 7) == 0);
for (unsigned i = 0; i < len; ++i)
JD_ASSERT(((uint8_t *)dst)[i] == 0xff);
memcpy(dst, src, len);
uint8_t *endp = (uint8_t *)dst + len;
if (!max_write || endp > max_write)
max_write = endp;
}
void flash_erase(void *page_addr) {
JD_ASSERT(cfg.program_base != NULL);
ptrdiff_t diff = (uint8_t *)page_addr - (uint8_t *)cfg.program_base;
JD_ASSERT(0 <= diff && diff <= cfg.max_program_size - JD_FLASH_PAGE_SIZE);
JD_ASSERT((diff & (JD_FLASH_PAGE_SIZE - 1)) == 0);
memset(page_addr, 0xff, JD_FLASH_PAGE_SIZE);
if (!is_erased) {
is_erased = 1;
max_write = cfg.program_base;
DMESG("removing flash entry");
jd_settings_set_bin(KEY, NULL, 0);
}
}
const devsmgr_cfg_t *devsmgr_init_mem(unsigned size) {
cfg.max_program_size = size;
cfg.program_base = jd_alloc(cfg.max_program_size);
jd_settings_get_bin(KEY, cfg.program_base, cfg.max_program_size);
return &cfg;
}
void flash_sync(void) {
unsigned sz = max_write - (uint8_t *)cfg.program_base;
DMESG("writing %d bytes to flash", sz);
jd_settings_set_bin(KEY, cfg.program_base, sz);
is_erased = 0;
}
#endif
uint8_t *jd_settings_get_bin_a(const char *key, unsigned *sizep) {
uint8_t tmp[32];
int size = jd_settings_get_bin(key, tmp, sizeof(tmp));
if (size < 0) {
if (sizep)
*sizep = 0;
return NULL;
}
uint8_t *r = jd_alloc(size + 1);
if (size <= (int)sizeof(tmp)) {
memcpy(r, tmp, size);
} else {
jd_settings_get_bin(key, r, size);
}
if (sizep)
*sizep = size;
return r;
}
__attribute__((weak)) char *jd_settings_get(const char *key) {
return (char *)jd_settings_get_bin_a(key, NULL);
}
__attribute__((weak)) int jd_settings_set(const char *key, const char *val) {
return jd_settings_set_bin(key, val, val ? strlen(val) : 0);
}