SPIFFS_probe_nbr_of_blocks redefined as SPIFFS_probe_fs and made more safe.

New API functions:
  SPIFFS_probe_fs
Deleted API functions:
  SPIFFS_probe_nbr_of_blocks
This commit is contained in:
Peter Andersson
2016-01-25 23:07:15 +01:00
parent 9b69ca264d
commit e7e27e22db
8 changed files with 178 additions and 67 deletions
+30 -19
View File
@@ -29,6 +29,12 @@ MKDIR = mkdir -p
#
###############
NO_TEST ?= 0
CFLAGS = $(FLAGS)
ifeq (1, $(strip $(NO_TEST)))
CFILES_TEST = main.c
CFLAGS += -DNO_TEST
else
CFILES_TEST = main.c \
test_spiffs.c \
test_dev.c \
@@ -37,6 +43,7 @@ CFILES_TEST = main.c \
test_bugreports.c \
testsuites.c \
testrunner.c
endif
include files.mk
INCLUDE_DIRECTIVES = -I./${sourcedir} -I./${sourcedir}/default -I./${sourcedir}/test
COMPILEROPTIONS = $(INCLUDE_DIRECTIVES)
@@ -68,6 +75,10 @@ DEPENDENCIES = $(DEPFILES)
$(BINARY): $(ALLOBJFILES)
@echo "... linking"
@${CC} $(LINKEROPTIONS) -o ${builddir}/$(BINARY) $(ALLOBJFILES) $(LIBS)
ifeq (1, $(strip $(NO_TEST)))
@echo "size: `du -b ${builddir}/${BINARY} | sed 's/\([0-9]*\).*/\1/g '` bytes"
endif
-include $(DEPENDENCIES)
@@ -78,12 +89,12 @@ $(OBJFILES) : ${builddir}/%.o:%.c
$(OBJFILES_TEST) : ${builddir}/%.o:%.c
@echo "... compile $@"
@${CC} -g -c -o $@ $<
@${CC} $(CFLAGS) -g -c -o $@ $<
# make dependencies
# @echo "... depend $@";
$(DEPFILES) : ${builddir}/%.d:%.c
@echo "... depend $@"; \
rm -f $@; \
@rm -f $@; \
${CC} $(COMPILEROPTIONS) -M $< > $@.$$$$; \
sed 's,\($*\)\.o[ :]*, ${builddir}/\1.o $@ : ,g' < $@.$$$$ > $@; \
rm -f $@.$$$$
@@ -113,20 +124,20 @@ clean:
@rm -f ${builddir}/*.elf
build-all:
$(MAKE) clean && $(MAKE) CFLAGS="-DSPIFFS_HAL_CALLBACK_EXTRA=0 -DSPIFFS_SINGLETON=0 -DSPIFFS_CACHE=0 -DSPIFFS_READ_ONLY=0"
$(MAKE) clean && $(MAKE) CFLAGS="-DSPIFFS_HAL_CALLBACK_EXTRA=0 -DSPIFFS_SINGLETON=0 -DSPIFFS_CACHE=1 -DSPIFFS_READ_ONLY=0"
$(MAKE) clean && $(MAKE) CFLAGS="-DSPIFFS_HAL_CALLBACK_EXTRA=0 -DSPIFFS_SINGLETON=1 -DSPIFFS_CACHE=0 -DSPIFFS_READ_ONLY=0"
$(MAKE) clean && $(MAKE) CFLAGS="-DSPIFFS_HAL_CALLBACK_EXTRA=0 -DSPIFFS_SINGLETON=1 -DSPIFFS_CACHE=1 -DSPIFFS_READ_ONLY=0"
$(MAKE) clean && $(MAKE) CFLAGS="-DSPIFFS_HAL_CALLBACK_EXTRA=1 -DSPIFFS_SINGLETON=0 -DSPIFFS_CACHE=0 -DSPIFFS_READ_ONLY=0"
$(MAKE) clean && $(MAKE) CFLAGS="-DSPIFFS_HAL_CALLBACK_EXTRA=1 -DSPIFFS_SINGLETON=0 -DSPIFFS_CACHE=1 -DSPIFFS_READ_ONLY=0"
$(MAKE) clean && $(MAKE) CFLAGS="-DSPIFFS_HAL_CALLBACK_EXTRA=1 -DSPIFFS_SINGLETON=1 -DSPIFFS_CACHE=0 -DSPIFFS_READ_ONLY=0"
$(MAKE) clean && $(MAKE) CFLAGS="-DSPIFFS_HAL_CALLBACK_EXTRA=1 -DSPIFFS_SINGLETON=1 -DSPIFFS_CACHE=1 -DSPIFFS_READ_ONLY=0"
$(MAKE) clean && $(MAKE) CFLAGS="-DSPIFFS_HAL_CALLBACK_EXTRA=0 -DSPIFFS_SINGLETON=0 -DSPIFFS_CACHE=0 -DSPIFFS_READ_ONLY=1"
$(MAKE) clean && $(MAKE) CFLAGS="-DSPIFFS_HAL_CALLBACK_EXTRA=0 -DSPIFFS_SINGLETON=0 -DSPIFFS_CACHE=1 -DSPIFFS_READ_ONLY=1"
$(MAKE) clean && $(MAKE) CFLAGS="-DSPIFFS_HAL_CALLBACK_EXTRA=0 -DSPIFFS_SINGLETON=1 -DSPIFFS_CACHE=0 -DSPIFFS_READ_ONLY=1"
$(MAKE) clean && $(MAKE) CFLAGS="-DSPIFFS_HAL_CALLBACK_EXTRA=0 -DSPIFFS_SINGLETON=1 -DSPIFFS_CACHE=1 -DSPIFFS_READ_ONLY=1"
$(MAKE) clean && $(MAKE) CFLAGS="-DSPIFFS_HAL_CALLBACK_EXTRA=1 -DSPIFFS_SINGLETON=0 -DSPIFFS_CACHE=0 -DSPIFFS_READ_ONLY=1"
$(MAKE) clean && $(MAKE) CFLAGS="-DSPIFFS_HAL_CALLBACK_EXTRA=1 -DSPIFFS_SINGLETON=0 -DSPIFFS_CACHE=1 -DSPIFFS_READ_ONLY=1"
$(MAKE) clean && $(MAKE) CFLAGS="-DSPIFFS_HAL_CALLBACK_EXTRA=1 -DSPIFFS_SINGLETON=1 -DSPIFFS_CACHE=0 -DSPIFFS_READ_ONLY=1"
$(MAKE) clean && $(MAKE) CFLAGS="-DSPIFFS_HAL_CALLBACK_EXTRA=1 -DSPIFFS_SINGLETON=1 -DSPIFFS_CACHE=1 -DSPIFFS_READ_ONLY=1"
$(MAKE) clean && $(MAKE) FLAGS="-DSPIFFS_HAL_CALLBACK_EXTRA=0 -DSPIFFS_SINGLETON=0 -DSPIFFS_CACHE=0 -DSPIFFS_READ_ONLY=0" NO_TEST=1
$(MAKE) clean && $(MAKE) FLAGS="-DSPIFFS_HAL_CALLBACK_EXTRA=0 -DSPIFFS_SINGLETON=0 -DSPIFFS_CACHE=1 -DSPIFFS_READ_ONLY=0" NO_TEST=1
$(MAKE) clean && $(MAKE) FLAGS="-DSPIFFS_HAL_CALLBACK_EXTRA=0 -DSPIFFS_SINGLETON=1 -DSPIFFS_CACHE=0 -DSPIFFS_READ_ONLY=0" NO_TEST=1
$(MAKE) clean && $(MAKE) FLAGS="-DSPIFFS_HAL_CALLBACK_EXTRA=0 -DSPIFFS_SINGLETON=1 -DSPIFFS_CACHE=1 -DSPIFFS_READ_ONLY=0" NO_TEST=1
$(MAKE) clean && $(MAKE) FLAGS="-DSPIFFS_HAL_CALLBACK_EXTRA=1 -DSPIFFS_SINGLETON=0 -DSPIFFS_CACHE=0 -DSPIFFS_READ_ONLY=0" NO_TEST=1
$(MAKE) clean && $(MAKE) FLAGS="-DSPIFFS_HAL_CALLBACK_EXTRA=1 -DSPIFFS_SINGLETON=0 -DSPIFFS_CACHE=1 -DSPIFFS_READ_ONLY=0" NO_TEST=1
$(MAKE) clean && $(MAKE) FLAGS="-DSPIFFS_HAL_CALLBACK_EXTRA=1 -DSPIFFS_SINGLETON=1 -DSPIFFS_CACHE=0 -DSPIFFS_READ_ONLY=0" NO_TEST=1
$(MAKE) clean && $(MAKE) FLAGS="-DSPIFFS_HAL_CALLBACK_EXTRA=1 -DSPIFFS_SINGLETON=1 -DSPIFFS_CACHE=1 -DSPIFFS_READ_ONLY=0" NO_TEST=1
$(MAKE) clean && $(MAKE) FLAGS="-DSPIFFS_HAL_CALLBACK_EXTRA=0 -DSPIFFS_SINGLETON=0 -DSPIFFS_CACHE=0 -DSPIFFS_READ_ONLY=1" NO_TEST=1
$(MAKE) clean && $(MAKE) FLAGS="-DSPIFFS_HAL_CALLBACK_EXTRA=0 -DSPIFFS_SINGLETON=0 -DSPIFFS_CACHE=1 -DSPIFFS_READ_ONLY=1" NO_TEST=1
$(MAKE) clean && $(MAKE) FLAGS="-DSPIFFS_HAL_CALLBACK_EXTRA=0 -DSPIFFS_SINGLETON=1 -DSPIFFS_CACHE=0 -DSPIFFS_READ_ONLY=1" NO_TEST=1
$(MAKE) clean && $(MAKE) FLAGS="-DSPIFFS_HAL_CALLBACK_EXTRA=0 -DSPIFFS_SINGLETON=1 -DSPIFFS_CACHE=1 -DSPIFFS_READ_ONLY=1" NO_TEST=1
$(MAKE) clean && $(MAKE) FLAGS="-DSPIFFS_HAL_CALLBACK_EXTRA=1 -DSPIFFS_SINGLETON=0 -DSPIFFS_CACHE=0 -DSPIFFS_READ_ONLY=1" NO_TEST=1
$(MAKE) clean && $(MAKE) FLAGS="-DSPIFFS_HAL_CALLBACK_EXTRA=1 -DSPIFFS_SINGLETON=0 -DSPIFFS_CACHE=1 -DSPIFFS_READ_ONLY=1" NO_TEST=1
$(MAKE) clean && $(MAKE) FLAGS="-DSPIFFS_HAL_CALLBACK_EXTRA=1 -DSPIFFS_SINGLETON=1 -DSPIFFS_CACHE=0 -DSPIFFS_READ_ONLY=1" NO_TEST=1
$(MAKE) clean && $(MAKE) FLAGS="-DSPIFFS_HAL_CALLBACK_EXTRA=1 -DSPIFFS_SINGLETON=1 -DSPIFFS_CACHE=1 -DSPIFFS_READ_ONLY=1" NO_TEST=1
+26 -18
View File
@@ -52,7 +52,8 @@ extern "C" {
#define SPIFFS_ERR_NOT_A_FILE -10031
#define SPIFFS_ERR_RO_NOT_IMPL -10032
#define SPIFFS_ERR_RO_ABORTED_OPERATION -10033
#define SPIFFS_ERR_PROBE_TOO_FEW_BLOCKS -10034
#define SPIFFS_ERR_PROBE_NOT_A_FS -10035
#define SPIFFS_ERR_INTERNAL -10050
#define SPIFFS_ERR_TEST -10100
@@ -284,32 +285,39 @@ typedef struct {
// functions
#if SPIFFS_USE_MAGIC && SPIFFS_USE_MAGIC_LENGTH
#if SPIFFS_USE_MAGIC && SPIFFS_USE_MAGIC_LENGTH && SPIFFS_SINGLETON==0
/**
* Special function. This takes a spiffs config struct and returns
* the number of blocks this file system was formatted with.
* This function relies on following in the passed config struct:
* hal_read_f, phys_addr, and log_page_size.
* Special function. This takes a spiffs config struct and returns the number
* of blocks this file system was formatted with. This function relies on
* that following info is set correctly in given config struct:
*
* Do note, that caution should be taken with the value returned here.
* phys_addr, log_page_size, and log_block_size.
*
* There is no check whatsoever that the flash actually contains a file
* system - meaning that just any number could be returned.
* Also, hal_read_f must be set in the config struct.
*
* There is neither any check that the configuration is set correctly.
* The block size may for instance differ.
* One must be sure of the correct page size and that the physical address is
* correct in the probed file system when calling this function. It is not
* checked if the phys_addr actually points to the start of the file system,
* so one might get a false positive if entering a phys_addr somewhere in the
* middle of the file system at block boundary. In addition, it is not checked
* if the page size is actually correct. If it is not, weird file system sizes
* will be returned.
*
* One must be sure of the page size and the physical address when
* calling this function.
* If this function detects a file system it returns the assumed file system
* size, which can be used to set the phys_size.
*
* The resulting value can then be used to set the config structs
* phys_size by multiplying it with the known block size.
* Otherwise, it returns an error indicating why it is not regarded as a file
* system.
*
* Note: this function is not protected with SPIFFS_LOCK and SPIFFS_UNLOCK
* macros. It returns the error code directly, instead of as read by
* SPIFFS_errno.
*
* @param config essential parts of the physical and logical
* configuration of the file system
* configuration of the file system.
*/
s32_t SPIFFS_probe_nbr_of_blocks(spiffs_config *config);
#endif // SPIFFS_USE_MAGIC && SPIFFS_USE_MAGIC_LENGTH
s32_t SPIFFS_probe_fs(spiffs_config *config);
#endif // SPIFFS_USE_MAGIC && SPIFFS_USE_MAGIC_LENGTH && SPIFFS_SINGLETON==0
/**
* Initializes the file system dynamic parameters and mounts the filesystem.
+5 -7
View File
@@ -66,16 +66,14 @@ s32_t SPIFFS_format(spiffs *fs) {
#endif // SPIFFS_READ_ONLY
}
#if SPIFFS_USE_MAGIC && SPIFFS_USE_MAGIC_LENGTH
#if SPIFFS_USE_MAGIC && SPIFFS_USE_MAGIC_LENGTH && SPIFFS_SINGLETON==0
s32_t SPIFFS_probe_nbr_of_blocks(spiffs_config *config) {
SPIFFS_LOCK(fs);
s32_t block_count = spiffs_probe(config);
SPIFFS_UNLOCK(fs);
return block_count;
s32_t SPIFFS_probe_fs(spiffs_config *config) {
s32_t res = spiffs_probe(config);
return res;
}
#endif // SPIFFS_USE_MAGIC && SPIFFS_USE_MAGIC_LENGTH
#endif // SPIFFS_USE_MAGIC && SPIFFS_USE_MAGIC_LENGTH && SPIFFS_SINGLETON==0
s32_t SPIFFS_mount(spiffs *fs, spiffs_config *config, u8_t *work,
u8_t *fd_space, u32_t fd_space_size,
+44 -15
View File
@@ -264,28 +264,57 @@ s32_t spiffs_erase_block(
}
#endif // !SPIFFS_READ_ONLY
#if SPIFFS_USE_MAGIC && SPIFFS_USE_MAGIC_LENGTH
#if SPIFFS_USE_MAGIC && SPIFFS_USE_MAGIC_LENGTH && SPIFFS_SINGLETON==0
s32_t spiffs_probe(
spiffs_config *cfg) {
s32_t res;
u32_t paddr;
spiffs dummy_fs; // create a dummy fs struct just to be able to use macros
memcpy(&dummy_fs.cfg, cfg, sizeof(spiffs_config));
spiffs_obj_id magic;
u32_t paddr = SPIFFS_MAGIC_PADDR(&dummy_fs, (spiffs_block_ix)0);
#if SPIFFS_HAL_CALLBACK_EXTRA
// not any proper fs to report here, so callback with null
// (cross fingers that no-one gets angry)
res = cfg->hal_read_f((void *)0, paddr, sizeof(spiffs_obj_id), (u8_t *)&magic);
#else
res = cfg->hal_read_f(paddr, sizeof(spiffs_obj_id), (u8_t *)&magic);
#endif
SPIFFS_CHECK_RES(res);
// unwind the magic crap to get nbr of blocks
dummy_fs.block_count = 0;
return SPIFFS_MAGIC(&dummy_fs, 0) ^ magic;
// Read three magics, as one block may be in an aborted erase state.
// At least two of these must contain magic and be in decreasing order.
spiffs_obj_id magic[3];
spiffs_obj_id bix_count[3];
spiffs_block_ix bix;
for (bix = 0; bix < 3; bix++) {
paddr = SPIFFS_MAGIC_PADDR(&dummy_fs, bix);
#if SPIFFS_HAL_CALLBACK_EXTRA
// not any proper fs to report here, so callback with null
// (cross fingers that no-one gets angry)
res = cfg->hal_read_f((void *)0, paddr, sizeof(spiffs_obj_id), (u8_t *)&magic[bix]);
#else
res = cfg->hal_read_f(paddr, sizeof(spiffs_obj_id), (u8_t *)&magic[bix]);
#endif
bix_count[bix] = magic[bix] ^ SPIFFS_MAGIC(&dummy_fs, 0);
SPIFFS_CHECK_RES(res);
}
// check that we have sane number of blocks
if (bix_count[0] < 3) return SPIFFS_ERR_PROBE_TOO_FEW_BLOCKS;
// check that the order is correct, take aborted erases in calculation
// first block aborted erase
if (magic[0] == (spiffs_obj_id)(-1) && bix_count[1] - bix_count[2] == 1) {
return (bix_count[1]+1) * cfg->log_block_size;
}
// second block aborted erase
if (magic[1] == (spiffs_obj_id)(-1) && bix_count[0] - bix_count[2] == 2) {
return bix_count[0] * cfg->log_block_size;
}
// third block aborted erase
if (magic[2] == (spiffs_obj_id)(-1) && bix_count[0] - bix_count[1] == 1) {
return bix_count[0] * cfg->log_block_size;
}
// no block has aborted erase
if (bix_count[0] - bix_count[1] == 1 && bix_count[1] - bix_count[2] == 1) {
return bix_count[0] * cfg->log_block_size;
}
return SPIFFS_ERR_PROBE_NOT_A_FS;
}
#endif // SPIFFS_USE_MAGIC && SPIFFS_USE_MAGIC_LENGTH
#endif // SPIFFS_USE_MAGIC && SPIFFS_USE_MAGIC_LENGTH && SPIFFS_SINGLETON==0
static s32_t spiffs_obj_lu_scan_v(
+6 -1
View File
@@ -1,7 +1,12 @@
#include "testrunner.h"
#include <stdlib.h>
#ifndef NO_TEST
#include "testrunner.h"
#endif
int main(int argc, char **args) {
#ifndef NO_TEST
run_tests(argc, args);
#endif
exit(EXIT_SUCCESS);
}
+59 -6
View File
@@ -80,28 +80,81 @@ TEST(magic_length)
}
TEST_END(magic_length)
#if SPIFFS_SINGLETON==0
TEST(magic_length_probe)
{
fs_reset_specific(0, 0, 65536*16, 65536, 65536, 256);
TEST_CHECK_EQ(SPIFFS_probe_nbr_of_blocks(&__fs.cfg), 16);
TEST_CHECK_EQ(SPIFFS_probe_fs(&__fs.cfg), 65536*16);
fs_reset_specific(0, 0, 65536*24, 65536, 65536, 256);
TEST_CHECK_EQ(SPIFFS_probe_nbr_of_blocks(&__fs.cfg), 24);
TEST_CHECK_EQ(SPIFFS_probe_fs(&__fs.cfg), 65536*24);
fs_reset_specific(0, 0, 32768*16, 32768, 32768, 128);
TEST_CHECK_EQ(SPIFFS_probe_nbr_of_blocks(&__fs.cfg), 16);
TEST_CHECK_EQ(SPIFFS_probe_fs(&__fs.cfg), 32768*16);
fs_reset_specific(0, 0, 16384*37, 16384, 16384, 128);
TEST_CHECK_EQ(SPIFFS_probe_nbr_of_blocks(&__fs.cfg), 37);
TEST_CHECK_EQ(SPIFFS_probe_fs(&__fs.cfg), 16384*37);
fs_reset_specific(0, 0, 4096*11, 4096, 4096, 256);
TEST_CHECK_EQ(SPIFFS_probe_nbr_of_blocks(&__fs.cfg), 11);
TEST_CHECK_EQ(SPIFFS_probe_fs(&__fs.cfg), 4096*11);
fs_reset_specific(0, 0, 4096*8, 4096, 4096, 256);
__fs.cfg.log_page_size = 128;
TEST_CHECK_EQ(SPIFFS_probe_fs(&__fs.cfg), SPIFFS_ERR_PROBE_NOT_A_FS);
__fs.cfg.log_page_size = 512;
TEST_CHECK_EQ(SPIFFS_probe_fs(&__fs.cfg), SPIFFS_ERR_PROBE_NOT_A_FS);
__fs.cfg.log_page_size = 256;
__fs.cfg.log_block_size = 8192;
TEST_CHECK_EQ(SPIFFS_probe_fs(&__fs.cfg), SPIFFS_ERR_PROBE_NOT_A_FS);
__fs.cfg.log_block_size = 2048;
TEST_CHECK_EQ(SPIFFS_probe_fs(&__fs.cfg), SPIFFS_ERR_PROBE_NOT_A_FS);
__fs.cfg.log_block_size = 4096;
__fs.cfg.phys_addr += 2;
TEST_CHECK_EQ(SPIFFS_probe_fs(&__fs.cfg), SPIFFS_ERR_PROBE_NOT_A_FS);
fs_reset_specific(0, 0, 4096*8, 4096, 4096, 256);
__fs.cfg.phys_addr += 4096*6;
TEST_CHECK_EQ(SPIFFS_probe_fs(&__fs.cfg), SPIFFS_ERR_PROBE_TOO_FEW_BLOCKS);
fs_reset_specific(0, 0, 4096*8, 4096, 4096, 256);
area_set(4096*0, 0xff, 4096); // "erase" block 0
TEST_CHECK_EQ(SPIFFS_probe_fs(&__fs.cfg), 4096*8);
fs_reset_specific(0, 0, 4096*8, 4096, 4096, 256);
area_set(4096*0, 0xff, 4096); // "erase" block 1
TEST_CHECK_EQ(SPIFFS_probe_fs(&__fs.cfg), 4096*8);
fs_reset_specific(0, 0, 4096*8, 4096, 4096, 256);
area_set(4096*0, 0xff, 4096); // "erase" block 2
TEST_CHECK_EQ(SPIFFS_probe_fs(&__fs.cfg), 4096*8);
fs_reset_specific(0, 0, 4096*8, 4096, 4096, 256);
area_set(4096*0, 0xff, 4096*2); // "erase" block 0 & 1
TEST_CHECK_EQ(SPIFFS_probe_fs(&__fs.cfg), SPIFFS_ERR_PROBE_NOT_A_FS);
fs_reset_specific(0, 0, 4096*8, 4096, 4096, 256);
area_set(4096*0, 0xff, 4096*2); // "erase" block 0
area_set(4096*0, 0xff, 4096); // "erase" block 2
TEST_CHECK_EQ(SPIFFS_probe_fs(&__fs.cfg), SPIFFS_ERR_PROBE_NOT_A_FS);
fs_reset_specific(0, 0, 4096*8, 4096, 4096, 256);
area_set(4096*1, 0xff, 4096*2); // "erase" block 1 & 2
TEST_CHECK_EQ(SPIFFS_probe_fs(&__fs.cfg), SPIFFS_ERR_PROBE_NOT_A_FS);
fs_reset_specific(0, 0, 4096*8, 4096, 4096, 256);
area_set(4096*0, 0xff, 4096*8); // "erase" all
TEST_CHECK_EQ(SPIFFS_probe_fs(&__fs.cfg), SPIFFS_ERR_PROBE_NOT_A_FS);
fs_reset_specific(0, 0, 4096*8, 4096, 4096, 256);
area_set(4096*0, 0xdd, 4096*8); // garble all
TEST_CHECK_EQ(SPIFFS_probe_fs(&__fs.cfg), SPIFFS_ERR_PROBE_NOT_A_FS);
return TEST_RES_OK;
}
TEST_END(magic_length_probe)
#endif // SPIFFS_SINGLETON==0
#endif // SPIFFS_USE_MAGIC_LENGTH
#endif // SPIFFS_USE_MAGIC
+7 -1
View File
@@ -131,7 +131,6 @@ static s32_t _write(spiffs *fs, u32_t addr, u32_t size, u8_t *src) {
}
return 0;
}
static s32_t _erase(spiffs *fs, u32_t addr, u32_t size) {
if (addr & (__fs.cfg.phys_erase_block-1)) {
printf("trying to erase at addr %08x, out of boundary\n", addr);
@@ -235,6 +234,13 @@ void area_write(u32_t addr, u8_t *buf, u32_t size) {
}
}
void area_set(u32_t addr, u8_t d, u32_t size) {
int i;
for (i = 0; i < size; i++) {
AREA(addr + i) = d;
}
}
void area_read(u32_t addr, u8_t *buf, u32_t size) {
int i;
for (i = 0; i < size; i++) {
+1
View File
@@ -71,6 +71,7 @@ void hexdump(u32_t addr, u32_t len);
char *make_test_fname(const char *name);
void clear_test_path();
void area_write(u32_t addr, u8_t *buf, u32_t size);
void area_set(u32_t addr, u8_t d, u32_t size);
void area_read(u32_t addr, u8_t *buf, u32_t size);
void dump_erase_counts(spiffs *fs);
void dump_flash_access_stats();