|
@@ -21,6 +21,36 @@ u32_t SPIFFS_buffer_bytes_for_cache(spiffs *fs, u32_t num_pages) {
|
|
|
#endif
|
|
|
#endif
|
|
|
|
|
|
+u8_t SPIFFS_mounted(spiffs *fs) {
|
|
|
+ return SPIFFS_CHECK_MOUNT(fs);
|
|
|
+}
|
|
|
+
|
|
|
+s32_t SPIFFS_format(spiffs *fs) {
|
|
|
+ SPIFFS_API_CHECK_CFG(fs);
|
|
|
+ if (SPIFFS_CHECK_MOUNT(fs)) {
|
|
|
+ fs->err_code = SPIFFS_ERR_MOUNTED;
|
|
|
+ return -1;
|
|
|
+ }
|
|
|
+
|
|
|
+ s32_t res;
|
|
|
+ SPIFFS_LOCK(fs);
|
|
|
+
|
|
|
+ spiffs_block_ix bix = 0;
|
|
|
+ while (bix < fs->block_count) {
|
|
|
+ fs->max_erase_count = 0;
|
|
|
+ res = spiffs_erase_block(fs, bix);
|
|
|
+ if (res != SPIFFS_OK) {
|
|
|
+ res = SPIFFS_ERR_ERASE_FAIL;
|
|
|
+ }
|
|
|
+ SPIFFS_API_CHECK_RES_UNLOCK(fs, res);
|
|
|
+ bix++;
|
|
|
+ }
|
|
|
+
|
|
|
+ SPIFFS_UNLOCK(fs);
|
|
|
+
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+
|
|
|
s32_t SPIFFS_mount(spiffs *fs, spiffs_config *config, u8_t *work,
|
|
|
u8_t *fd_space, u32_t fd_space_size,
|
|
|
void *cache, u32_t cache_size,
|
|
@@ -34,10 +64,10 @@ s32_t SPIFFS_mount(spiffs *fs, spiffs_config *config, u8_t *work,
|
|
|
c_memset(fd_space, 0, fd_space_size);
|
|
|
// align fd_space pointer to pointer size byte boundary, below is safe
|
|
|
u8_t ptr_size = sizeof(void*);
|
|
|
-// #pragma GCC diagnostic push
|
|
|
-// #pragma GCC diagnostic ignored "-Wpointer-to-int-cast"
|
|
|
- u8_t addr_lsb = (u8_t)(((u32_t)fd_space) & (ptr_size-1));
|
|
|
-// #pragma GCC diagnostic pop
|
|
|
+#pragma GCC diagnostic push
|
|
|
+#pragma GCC diagnostic ignored "-Wpointer-to-int-cast"
|
|
|
+ u8_t addr_lsb = ((u8_t)fd_space) & (ptr_size-1);
|
|
|
+#pragma GCC diagnostic pop
|
|
|
if (addr_lsb) {
|
|
|
fd_space += (ptr_size-addr_lsb);
|
|
|
fd_space_size -= (ptr_size-addr_lsb);
|
|
@@ -46,10 +76,10 @@ s32_t SPIFFS_mount(spiffs *fs, spiffs_config *config, u8_t *work,
|
|
|
fs->fd_count = (fd_space_size/sizeof(spiffs_fd));
|
|
|
|
|
|
// align cache pointer to 4 byte boundary, below is safe
|
|
|
-// #pragma GCC diagnostic push
|
|
|
-// #pragma GCC diagnostic ignored "-Wpointer-to-int-cast"
|
|
|
- addr_lsb = (u8_t)(((u32_t)cache) & (ptr_size-1));
|
|
|
-// #pragma GCC diagnostic pop
|
|
|
+#pragma GCC diagnostic push
|
|
|
+#pragma GCC diagnostic ignored "-Wpointer-to-int-cast"
|
|
|
+ addr_lsb = ((u8_t)cache) & (ptr_size-1);
|
|
|
+#pragma GCC diagnostic pop
|
|
|
if (addr_lsb) {
|
|
|
u8_t *cache_8 = (u8_t *)cache;
|
|
|
cache_8 += (ptr_size-addr_lsb);
|
|
@@ -61,11 +91,20 @@ s32_t SPIFFS_mount(spiffs *fs, spiffs_config *config, u8_t *work,
|
|
|
}
|
|
|
#if SPIFFS_CACHE
|
|
|
fs->cache = cache;
|
|
|
- fs->cache_size = cache_size;
|
|
|
+ fs->cache_size = (cache_size > (config->log_page_size*32)) ? config->log_page_size*32 : cache_size;
|
|
|
spiffs_cache_init(fs);
|
|
|
#endif
|
|
|
|
|
|
- s32_t res = spiffs_obj_lu_scan(fs);
|
|
|
+ s32_t res;
|
|
|
+
|
|
|
+#if SPIFFS_USE_MAGIC
|
|
|
+ res = SPIFFS_CHECK_MAGIC_POSSIBLE(fs) ? SPIFFS_OK : SPIFFS_ERR_MAGIC_NOT_POSSIBLE;
|
|
|
+ SPIFFS_API_CHECK_RES_UNLOCK(fs, res);
|
|
|
+#endif
|
|
|
+
|
|
|
+ fs->config_magic = SPIFFS_CONFIG_MAGIC;
|
|
|
+
|
|
|
+ res = spiffs_obj_lu_scan(fs);
|
|
|
SPIFFS_API_CHECK_RES_UNLOCK(fs, res);
|
|
|
|
|
|
SPIFFS_DBG("page index byte len: %i\n", SPIFFS_CFG_LOG_PAGE_SZ(fs));
|
|
@@ -79,13 +118,15 @@ s32_t SPIFFS_mount(spiffs *fs, spiffs_config *config, u8_t *work,
|
|
|
|
|
|
fs->check_cb_f = check_cb_f;
|
|
|
|
|
|
+ fs->mounted = 1;
|
|
|
+
|
|
|
SPIFFS_UNLOCK(fs);
|
|
|
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
void SPIFFS_unmount(spiffs *fs) {
|
|
|
- if (!SPIFFS_CHECK_MOUNT(fs)) return;
|
|
|
+ if (!SPIFFS_CHECK_CFG(fs) || !SPIFFS_CHECK_MOUNT(fs)) return;
|
|
|
SPIFFS_LOCK(fs);
|
|
|
u32_t i;
|
|
|
spiffs_fd *fds = (spiffs_fd *)fs->fd_space;
|
|
@@ -98,7 +139,8 @@ void SPIFFS_unmount(spiffs *fs) {
|
|
|
spiffs_fd_return(fs, cur_fd->file_nbr);
|
|
|
}
|
|
|
}
|
|
|
- fs->block_count = 0;
|
|
|
+ fs->mounted = 0;
|
|
|
+
|
|
|
SPIFFS_UNLOCK(fs);
|
|
|
}
|
|
|
|
|
@@ -112,6 +154,7 @@ void SPIFFS_clearerr(spiffs *fs) {
|
|
|
|
|
|
s32_t SPIFFS_creat(spiffs *fs, char *path, spiffs_mode mode) {
|
|
|
(void)mode;
|
|
|
+ SPIFFS_API_CHECK_CFG(fs);
|
|
|
SPIFFS_API_CHECK_MOUNT(fs);
|
|
|
SPIFFS_LOCK(fs);
|
|
|
spiffs_obj_id obj_id;
|
|
@@ -127,6 +170,7 @@ s32_t SPIFFS_creat(spiffs *fs, char *path, spiffs_mode mode) {
|
|
|
|
|
|
spiffs_file SPIFFS_open(spiffs *fs, char *path, spiffs_flags flags, spiffs_mode mode) {
|
|
|
(void)mode;
|
|
|
+ SPIFFS_API_CHECK_CFG(fs);
|
|
|
SPIFFS_API_CHECK_MOUNT(fs);
|
|
|
SPIFFS_LOCK(fs);
|
|
|
|
|
@@ -185,6 +229,7 @@ spiffs_file SPIFFS_open(spiffs *fs, char *path, spiffs_flags flags, spiffs_mode
|
|
|
}
|
|
|
|
|
|
spiffs_file SPIFFS_open_by_dirent(spiffs *fs, struct spiffs_dirent *e, spiffs_flags flags, spiffs_mode mode) {
|
|
|
+ SPIFFS_API_CHECK_CFG(fs);
|
|
|
SPIFFS_API_CHECK_MOUNT(fs);
|
|
|
SPIFFS_LOCK(fs);
|
|
|
|
|
@@ -213,7 +258,8 @@ spiffs_file SPIFFS_open_by_dirent(spiffs *fs, struct spiffs_dirent *e, spiffs_fl
|
|
|
return fd->file_nbr;
|
|
|
}
|
|
|
|
|
|
-s32_t SPIFFS_read(spiffs *fs, spiffs_file fh, void *buf, u32_t len) {
|
|
|
+s32_t SPIFFS_read(spiffs *fs, spiffs_file fh, void *buf, s32_t len) {
|
|
|
+ SPIFFS_API_CHECK_CFG(fs);
|
|
|
SPIFFS_API_CHECK_MOUNT(fs);
|
|
|
SPIFFS_LOCK(fs);
|
|
|
|
|
@@ -281,7 +327,8 @@ static s32_t spiffs_hydro_write(spiffs *fs, spiffs_fd *fd, void *buf, u32_t offs
|
|
|
|
|
|
}
|
|
|
|
|
|
-s32_t SPIFFS_write(spiffs *fs, spiffs_file fh, void *buf, u32_t len) {
|
|
|
+s32_t SPIFFS_write(spiffs *fs, spiffs_file fh, void *buf, s32_t len) {
|
|
|
+ SPIFFS_API_CHECK_CFG(fs);
|
|
|
SPIFFS_API_CHECK_MOUNT(fs);
|
|
|
SPIFFS_LOCK(fs);
|
|
|
|
|
@@ -400,6 +447,7 @@ s32_t SPIFFS_write(spiffs *fs, spiffs_file fh, void *buf, u32_t len) {
|
|
|
}
|
|
|
|
|
|
s32_t SPIFFS_lseek(spiffs *fs, spiffs_file fh, s32_t offs, int whence) {
|
|
|
+ SPIFFS_API_CHECK_CFG(fs);
|
|
|
SPIFFS_API_CHECK_MOUNT(fs);
|
|
|
SPIFFS_LOCK(fs);
|
|
|
|
|
@@ -440,10 +488,11 @@ s32_t SPIFFS_lseek(spiffs *fs, spiffs_file fh, s32_t offs, int whence) {
|
|
|
|
|
|
SPIFFS_UNLOCK(fs);
|
|
|
|
|
|
- return 0;
|
|
|
+ return offs;
|
|
|
}
|
|
|
|
|
|
s32_t SPIFFS_remove(spiffs *fs, char *path) {
|
|
|
+ SPIFFS_API_CHECK_CFG(fs);
|
|
|
SPIFFS_API_CHECK_MOUNT(fs);
|
|
|
SPIFFS_LOCK(fs);
|
|
|
|
|
@@ -477,6 +526,7 @@ s32_t SPIFFS_remove(spiffs *fs, char *path) {
|
|
|
}
|
|
|
|
|
|
s32_t SPIFFS_fremove(spiffs *fs, spiffs_file fh) {
|
|
|
+ SPIFFS_API_CHECK_CFG(fs);
|
|
|
SPIFFS_API_CHECK_MOUNT(fs);
|
|
|
SPIFFS_LOCK(fs);
|
|
|
|
|
@@ -525,6 +575,7 @@ static s32_t spiffs_stat_pix(spiffs *fs, spiffs_page_ix pix, spiffs_file fh, spi
|
|
|
}
|
|
|
|
|
|
s32_t SPIFFS_stat(spiffs *fs, char *path, spiffs_stat *s) {
|
|
|
+ SPIFFS_API_CHECK_CFG(fs);
|
|
|
SPIFFS_API_CHECK_MOUNT(fs);
|
|
|
SPIFFS_LOCK(fs);
|
|
|
|
|
@@ -542,6 +593,7 @@ s32_t SPIFFS_stat(spiffs *fs, char *path, spiffs_stat *s) {
|
|
|
}
|
|
|
|
|
|
s32_t SPIFFS_fstat(spiffs *fs, spiffs_file fh, spiffs_stat *s) {
|
|
|
+ SPIFFS_API_CHECK_CFG(fs);
|
|
|
SPIFFS_API_CHECK_MOUNT(fs);
|
|
|
SPIFFS_LOCK(fs);
|
|
|
|
|
@@ -595,6 +647,7 @@ static s32_t spiffs_fflush_cache(spiffs *fs, spiffs_file fh) {
|
|
|
}
|
|
|
|
|
|
s32_t SPIFFS_fflush(spiffs *fs, spiffs_file fh) {
|
|
|
+ SPIFFS_API_CHECK_CFG(fs);
|
|
|
SPIFFS_API_CHECK_MOUNT(fs);
|
|
|
s32_t res = SPIFFS_OK;
|
|
|
#if SPIFFS_CACHE_WR
|
|
@@ -608,6 +661,11 @@ s32_t SPIFFS_fflush(spiffs *fs, spiffs_file fh) {
|
|
|
}
|
|
|
|
|
|
void SPIFFS_close(spiffs *fs, spiffs_file fh) {
|
|
|
+ if (!SPIFFS_CHECK_CFG((fs))) {
|
|
|
+ (fs)->err_code = SPIFFS_ERR_NOT_CONFIGURED;
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
if (!SPIFFS_CHECK_MOUNT(fs)) {
|
|
|
fs->err_code = SPIFFS_ERR_NOT_MOUNTED;
|
|
|
return;
|
|
@@ -623,6 +681,7 @@ void SPIFFS_close(spiffs *fs, spiffs_file fh) {
|
|
|
}
|
|
|
|
|
|
s32_t SPIFFS_rename(spiffs *fs, char *old, char *new) {
|
|
|
+ SPIFFS_API_CHECK_CFG(fs);
|
|
|
SPIFFS_API_CHECK_MOUNT(fs);
|
|
|
SPIFFS_LOCK(fs);
|
|
|
|
|
@@ -652,9 +711,8 @@ s32_t SPIFFS_rename(spiffs *fs, char *old, char *new) {
|
|
|
res = spiffs_object_update_index_hdr(fs, fd, fd->obj_id, fd->objix_hdr_pix, 0, (u8_t*)new,
|
|
|
0, &pix_dummy);
|
|
|
|
|
|
- if (res != SPIFFS_OK) {
|
|
|
- spiffs_fd_return(fs, fd->file_nbr);
|
|
|
- }
|
|
|
+ spiffs_fd_return(fs, fd->file_nbr);
|
|
|
+
|
|
|
SPIFFS_API_CHECK_RES_UNLOCK(fs, res);
|
|
|
|
|
|
SPIFFS_UNLOCK(fs);
|
|
@@ -664,10 +722,17 @@ s32_t SPIFFS_rename(spiffs *fs, char *old, char *new) {
|
|
|
|
|
|
spiffs_DIR *SPIFFS_opendir(spiffs *fs, char *name, spiffs_DIR *d) {
|
|
|
(void)name;
|
|
|
+
|
|
|
+ if (!SPIFFS_CHECK_CFG((fs))) {
|
|
|
+ (fs)->err_code = SPIFFS_ERR_NOT_CONFIGURED;
|
|
|
+ return 0;
|
|
|
+ }
|
|
|
+
|
|
|
if (!SPIFFS_CHECK_MOUNT(fs)) {
|
|
|
fs->err_code = SPIFFS_ERR_NOT_MOUNTED;
|
|
|
return 0;
|
|
|
}
|
|
|
+
|
|
|
d->fs = fs;
|
|
|
d->block = 0;
|
|
|
d->entry = 0;
|
|
@@ -743,12 +808,14 @@ struct spiffs_dirent *SPIFFS_readdir(spiffs_DIR *d, struct spiffs_dirent *e) {
|
|
|
}
|
|
|
|
|
|
s32_t SPIFFS_closedir(spiffs_DIR *d) {
|
|
|
+ SPIFFS_API_CHECK_CFG(d->fs);
|
|
|
SPIFFS_API_CHECK_MOUNT(d->fs);
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
s32_t SPIFFS_check(spiffs *fs) {
|
|
|
s32_t res;
|
|
|
+ SPIFFS_API_CHECK_CFG(fs);
|
|
|
SPIFFS_API_CHECK_MOUNT(fs);
|
|
|
SPIFFS_LOCK(fs);
|
|
|
|
|
@@ -766,6 +833,7 @@ s32_t SPIFFS_check(spiffs *fs) {
|
|
|
|
|
|
s32_t SPIFFS_info(spiffs *fs, u32_t *total, u32_t *used) {
|
|
|
s32_t res = SPIFFS_OK;
|
|
|
+ SPIFFS_API_CHECK_CFG(fs);
|
|
|
SPIFFS_API_CHECK_MOUNT(fs);
|
|
|
SPIFFS_LOCK(fs);
|
|
|
|
|
@@ -787,7 +855,7 @@ s32_t SPIFFS_info(spiffs *fs, u32_t *total, u32_t *used) {
|
|
|
return res;
|
|
|
}
|
|
|
|
|
|
-s32_t SPIFFS_eof(spiffs *fs, spiffs_file fh) {
|
|
|
+s32_t SPIFFS_tell(spiffs *fs, spiffs_file fh) {
|
|
|
SPIFFS_API_CHECK_MOUNT(fs);
|
|
|
SPIFFS_LOCK(fs);
|
|
|
|
|
@@ -800,13 +868,13 @@ s32_t SPIFFS_eof(spiffs *fs, spiffs_file fh) {
|
|
|
spiffs_fflush_cache(fs, fh);
|
|
|
#endif
|
|
|
|
|
|
- res = (fd->fdoffset == fd->size);
|
|
|
+ res = fd->fdoffset;
|
|
|
|
|
|
SPIFFS_UNLOCK(fs);
|
|
|
return res;
|
|
|
}
|
|
|
|
|
|
-s32_t SPIFFS_tell(spiffs *fs, spiffs_file fh) {
|
|
|
+s32_t SPIFFS_eof(spiffs *fs, spiffs_file fh) {
|
|
|
SPIFFS_API_CHECK_MOUNT(fs);
|
|
|
SPIFFS_LOCK(fs);
|
|
|
|
|
@@ -819,7 +887,7 @@ s32_t SPIFFS_tell(spiffs *fs, spiffs_file fh) {
|
|
|
spiffs_fflush_cache(fs, fh);
|
|
|
#endif
|
|
|
|
|
|
- res = fd->fdoffset;
|
|
|
+ res = (fd->fdoffset == fd->size);
|
|
|
|
|
|
SPIFFS_UNLOCK(fs);
|
|
|
return res;
|
|
@@ -844,9 +912,38 @@ s32_t SPIFFS_size(spiffs *fs, spiffs_file fh) {
|
|
|
return res;
|
|
|
}
|
|
|
|
|
|
+s32_t SPIFFS_gc_quick(spiffs *fs, u16_t max_free_pages) {
|
|
|
+ s32_t res;
|
|
|
+ SPIFFS_API_CHECK_CFG(fs);
|
|
|
+ SPIFFS_API_CHECK_MOUNT(fs);
|
|
|
+ SPIFFS_LOCK(fs);
|
|
|
+
|
|
|
+ res = spiffs_gc_quick(fs, max_free_pages);
|
|
|
+
|
|
|
+ SPIFFS_API_CHECK_RES_UNLOCK(fs, res);
|
|
|
+ SPIFFS_UNLOCK(fs);
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+s32_t SPIFFS_gc(spiffs *fs, u32_t size) {
|
|
|
+ s32_t res;
|
|
|
+ SPIFFS_API_CHECK_CFG(fs);
|
|
|
+ SPIFFS_API_CHECK_MOUNT(fs);
|
|
|
+ SPIFFS_LOCK(fs);
|
|
|
+
|
|
|
+ res = spiffs_gc_check(fs, size);
|
|
|
+
|
|
|
+ SPIFFS_API_CHECK_RES_UNLOCK(fs, res);
|
|
|
+ SPIFFS_UNLOCK(fs);
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
#if SPIFFS_TEST_VISUALISATION
|
|
|
s32_t SPIFFS_vis(spiffs *fs) {
|
|
|
s32_t res = SPIFFS_OK;
|
|
|
+ SPIFFS_API_CHECK_CFG(fs);
|
|
|
SPIFFS_API_CHECK_MOUNT(fs);
|
|
|
SPIFFS_LOCK(fs);
|
|
|
|