From d9c6ac080c1368acfbed987f8e78bc098ec2ed91 Mon Sep 17 00:00:00 2001 From: Giulio Dalla Vecchia Date: Thu, 20 Jan 2022 15:42:19 +0100 Subject: [PATCH 1/3] Added littlefs support --- inc/fdb_cfg.h | 18 +++----- inc/fdb_def.h | 10 ++++- src/fdb.c | 14 ++++-- src/fdb_file.c | 117 +++++++++++++++++++++++++++++++++++++++++++++++- src/fdb_utils.c | 1 + 5 files changed, 144 insertions(+), 16 deletions(-) diff --git a/inc/fdb_cfg.h b/inc/fdb_cfg.h index 48d92af..91c6f9c 100644 --- a/inc/fdb_cfg.h +++ b/inc/fdb_cfg.h @@ -12,6 +12,8 @@ #ifndef _FDB_CFG_H_ #define _FDB_CFG_H_ +#include "SEGGER_RTT.h" + /* using KVDB feature */ #define FDB_USING_KVDB @@ -21,20 +23,14 @@ #endif /* using TSDB (Time series database) feature */ -#define FDB_USING_TSDB - -/* Using FAL storage mode */ -#define FDB_USING_FAL_MODE - -#ifdef FDB_USING_FAL_MODE -/* the flash write granularity, unit: bit - * only support 1(nor flash)/ 8(stm32f2/f4)/ 32(stm32f1) */ -#define FDB_WRITE_GRAN /* @note you must define it for a value */ -#endif +//#define FDB_USING_TSDB /* Using file storage mode by LIBC file API, like fopen/fread/fwrte/fclose */ /* #define FDB_USING_FILE_LIBC_MODE */ +/* Using file storage mode by LIBC file API, like fopen/fread/fwrte/fclose */ +#define FDB_USING_FILE_LITTLEFS_MODE + /* Using file storage mode by POSIX file API, like open/read/write/close */ /* #define FDB_USING_FILE_POSIX_MODE */ @@ -42,7 +38,7 @@ /* #define FDB_BIG_ENDIAN */ /* log print macro. default EF_PRINT macro is printf() */ -/* #define FDB_PRINT(...) my_printf(__VA_ARGS__) */ +#define FDB_PRINT(...) SEGGER_RTT_printf(0U, __VA_ARGS__) /* print debug information */ #define FDB_DEBUG_ENABLE diff --git a/inc/fdb_def.h b/inc/fdb_def.h index 0e67321..5d8482e 100644 --- a/inc/fdb_def.h +++ b/inc/fdb_def.h @@ -12,6 +12,10 @@ #ifndef _FDB_DEF_H_ #define _FDB_DEF_H_ +#if defined(FDB_USING_FILE_LITTLEFS_MODE) +#include "lfs.h" +#endif + #ifdef __cplusplus extern "C" { #endif @@ -39,7 +43,7 @@ extern "C" { #define FDB_KV_USING_CACHE #endif -#if defined(FDB_USING_FILE_LIBC_MODE) || defined(FDB_USING_FILE_POSIX_MODE) +#if defined(FDB_USING_FILE_LIBC_MODE) || defined(FDB_USING_FILE_POSIX_MODE) || defined(FDB_USING_FILE_LITTLEFS_MODE) #define FDB_USING_FILE_MODE #endif @@ -272,6 +276,10 @@ struct fdb_db { int cur_file; /**< current file object */ #elif defined(FDB_USING_FILE_LIBC_MODE) FILE *cur_file; /**< current file object */ +#elif defined(FDB_USING_FILE_LITTLEFS_MODE) + lfs_file_t *cur_file; /**< current file object */ + lfs_t *cur_lfs; /**< current partition object */ + struct lfs_file_config cur_file_config; /**< current file object config */ #endif uint32_t cur_sec; /**< current operate sector address */ #endif diff --git a/src/fdb.c b/src/fdb.c index f220827..ed0496c 100644 --- a/src/fdb.c +++ b/src/fdb.c @@ -40,9 +40,13 @@ fdb_err_t _fdb_init_ex(fdb_db_t db, const char *name, const char *path, fdb_db_t /* must set when using file mode */ FDB_ASSERT(db->sec_size != 0); FDB_ASSERT(db->max_size != 0); -#ifdef FDB_USING_FILE_POSIX_MODE +#if defined(FDB_USING_FILE_POSIX_MODE) db->cur_file = -1; -#else +#elif defined(FDB_USING_FILE_LITTLEFS_MODE) + db->cur_file = 0; + db->cur_lfs = 0; + memset(&db->cur_file_config, 0, sizeof(db->cur_file_config)); +#else db->cur_file = 0; #endif db->storage.dir = path; @@ -102,13 +106,17 @@ void _fdb_deinit(fdb_db_t db) if (db->init_ok) { #ifdef FDB_USING_FILE_MODE -#ifdef FDB_USING_FILE_POSIX_MODE +#if defined(FDB_USING_FILE_POSIX_MODE) if (db->cur_file > 0) { #if !defined(_MSC_VER) #include #endif close(db->cur_file); } +#elif defined(FDB_USING_FILE_LITTLEFS_MODE ) + if (db->cur_file != 0) { + lfs_file_close(db->cur_lfs, db->cur_file); + } #else if (db->cur_file != 0) { fclose(db->cur_file); diff --git a/src/fdb_file.c b/src/fdb_file.c index 7744ca9..ceb9c93 100644 --- a/src/fdb_file.c +++ b/src/fdb_file.c @@ -9,6 +9,7 @@ #include #include #include +#include "flash_manager.h" #define FDB_LOG_TAG "[file]" @@ -215,7 +216,121 @@ fdb_err_t _fdb_file_erase(fdb_db_t db, uint32_t addr, size_t size) } return result; } -#endif /* defined(FDB_USING_FILE_LIBC_MODE) */ +#elif defined(FDB_USING_FILE_LITTLEFS_MODE) +static lfs_file_t *open_db_file(fdb_db_t db, uint32_t addr, bool clean) +{ + uint32_t sec_addr = FDB_ALIGN_DOWN(addr, db->sec_size); + lfs_file_t *fd = db->cur_file; + char path[DB_PATH_MAX]; + + static uint8_t ui8_file_buffer[FILE_CACHE_SIZE]; + static lfs_file_t file; + + /* check if partition is selected */ + if(db->cur_lfs == 0) { + db->cur_lfs = &lfs; /* store partition from external variable */ + } + + /* check if file buffer is configured */ + if(db->cur_file_config.buffer == 0) { + db->cur_file_config.buffer = &ui8_file_buffer[0]; + } + + if (sec_addr != db->cur_sec || fd <= 0 || clean) { + get_db_file_path(db, addr, path, DB_PATH_MAX); + + if (fd > 0) { + lfs_file_close(db->cur_lfs, fd); + fd = 0; + } + if (clean) { + /* clean the old file */ + if(fd == 0) { + fd = &file; + } + + if(lfs_file_opencfg(db->cur_lfs, fd, path, + LFS_O_RDWR | LFS_O_CREAT | LFS_O_TRUNC, &db->cur_file_config) < 0) { + FDB_INFO("Error: open (%s) file failed.\n", path); + } else { + lfs_file_close(db->cur_lfs, fd); + fd = 0; + } + } + + /* open the database file */ + if(fd == 0) { + fd = &file; + } + + if(lfs_file_opencfg(db->cur_lfs, fd, path, + LFS_O_RDWR, &db->cur_file_config) < 0) { + fd = 0; + } + db->cur_sec = sec_addr; + } + db->cur_file = fd; + + return db->cur_file; +} + +fdb_err_t _fdb_file_read(fdb_db_t db, uint32_t addr, void *buf, size_t size) +{ + fdb_err_t result = FDB_NO_ERR; + lfs_file_t *fp = open_db_file(db, addr, false); + if (fp) { + addr = addr % db->sec_size; + lfs_file_seek(db->cur_lfs, fp, addr, LFS_SEEK_SET); + lfs_file_read(db->cur_lfs, fp, buf, size); + } else { + result = FDB_READ_ERR; + } + return result; +} + +fdb_err_t _fdb_file_write(fdb_db_t db, uint32_t addr, const void *buf, size_t size, bool sync) +{ + fdb_err_t result = FDB_NO_ERR; + lfs_file_t *fp = open_db_file(db, addr, false); + if (fp) { + addr = addr % db->sec_size; + lfs_file_seek(db->cur_lfs, fp, addr, LFS_SEEK_SET); + lfs_file_write(db->cur_lfs, fp, buf, size); + if(sync) { + lfs_file_sync(db->cur_lfs, fp); + } + } else { + result = FDB_READ_ERR; + } + + return result; +} + +fdb_err_t _fdb_file_erase(fdb_db_t db, uint32_t addr, size_t size) +{ + fdb_err_t result = FDB_NO_ERR; + + lfs_file_t *fp = open_db_file(db, addr, true); + if (fp != NULL) { +#define BUF_SIZE 32 + uint8_t buf[BUF_SIZE]; + size_t i; + lfs_file_seek(db->cur_lfs, fp, 0, LFS_SEEK_SET); + for (i = 0; i * BUF_SIZE < size; i++) + { + memset(buf, 0xFF, BUF_SIZE); + lfs_file_write(db->cur_lfs, fp, buf, BUF_SIZE); + } + memset(buf, 0xFF, BUF_SIZE); + + lfs_file_write(db->cur_lfs, fp, buf, size - i * BUF_SIZE); + lfs_file_sync(db->cur_lfs, fp); + } else { + result = FDB_ERASE_ERR; + } + return result; +} +#endif /* defined(FDB_USING_FILE_LITTLEFS_MODE) */ #endif /* FDB_USING_FILE_MODE */ diff --git a/src/fdb_utils.c b/src/fdb_utils.c index f80698e..fa81b60 100644 --- a/src/fdb_utils.c +++ b/src/fdb_utils.c @@ -241,6 +241,7 @@ size_t fdb_blob_read(fdb_db_t db, fdb_blob_t blob) extern fdb_err_t _fdb_file_read(fdb_db_t db, uint32_t addr, void *buf, size_t size); extern fdb_err_t _fdb_file_write(fdb_db_t db, uint32_t addr, const void *buf, size_t size, bool sync); extern fdb_err_t _fdb_file_erase(fdb_db_t db, uint32_t addr, size_t size); +extern fdb_err_t _fdb_file_close(fdb_db_t db); #endif /* FDB_USING_FILE_LIBC */ fdb_err_t _fdb_flash_read(fdb_db_t db, uint32_t addr, void *buf, size_t size) From 22809077dd14de60b9da900ebd6feec10076d97d Mon Sep 17 00:00:00 2001 From: Giulio Dalla Vecchia Date: Mon, 24 Jan 2022 10:25:35 +0100 Subject: [PATCH 2/3] Improve littlefs integration --- inc/fdb_def.h | 2 +- src/fdb.c | 4 ++-- src/fdb_file.c | 3 +-- 3 files changed, 4 insertions(+), 5 deletions(-) diff --git a/inc/fdb_def.h b/inc/fdb_def.h index 5d8482e..91cc315 100644 --- a/inc/fdb_def.h +++ b/inc/fdb_def.h @@ -279,7 +279,7 @@ struct fdb_db { #elif defined(FDB_USING_FILE_LITTLEFS_MODE) lfs_file_t *cur_file; /**< current file object */ lfs_t *cur_lfs; /**< current partition object */ - struct lfs_file_config cur_file_config; /**< current file object config */ + struct lfs_file_config cur_file_config; /**< current file object config usefull for file buffer static allocation */ #endif uint32_t cur_sec; /**< current operate sector address */ #endif diff --git a/src/fdb.c b/src/fdb.c index ed0496c..e3ea134 100644 --- a/src/fdb.c +++ b/src/fdb.c @@ -42,12 +42,12 @@ fdb_err_t _fdb_init_ex(fdb_db_t db, const char *name, const char *path, fdb_db_t FDB_ASSERT(db->max_size != 0); #if defined(FDB_USING_FILE_POSIX_MODE) db->cur_file = -1; +#elif defined(FDB_USING_FILE_LIBC_MODE) + db->cur_file = 0; #elif defined(FDB_USING_FILE_LITTLEFS_MODE) db->cur_file = 0; db->cur_lfs = 0; memset(&db->cur_file_config, 0, sizeof(db->cur_file_config)); -#else - db->cur_file = 0; #endif db->storage.dir = path; FDB_ASSERT(strlen(path) != 0) diff --git a/src/fdb_file.c b/src/fdb_file.c index ceb9c93..17b3e51 100644 --- a/src/fdb_file.c +++ b/src/fdb_file.c @@ -221,8 +221,7 @@ static lfs_file_t *open_db_file(fdb_db_t db, uint32_t addr, bool clean) { uint32_t sec_addr = FDB_ALIGN_DOWN(addr, db->sec_size); lfs_file_t *fd = db->cur_file; - char path[DB_PATH_MAX]; - + char path[DB_PATH_MAX]; static uint8_t ui8_file_buffer[FILE_CACHE_SIZE]; static lfs_file_t file; From 335a352139c1c8286748cbb5735435289ee8ef64 Mon Sep 17 00:00:00 2001 From: Giulio Dalla Vecchia Date: Wed, 26 Jan 2022 13:49:30 +0100 Subject: [PATCH 3/3] Renamed fdb_cfg.h file to fdb_cfg_template.h --- inc/{fdb_cfg.h => fdb_cfg_template.h} | 4 ++++ 1 file changed, 4 insertions(+) rename inc/{fdb_cfg.h => fdb_cfg_template.h} (96%) diff --git a/inc/fdb_cfg.h b/inc/fdb_cfg_template.h similarity index 96% rename from inc/fdb_cfg.h rename to inc/fdb_cfg_template.h index 91c6f9c..62decca 100644 --- a/inc/fdb_cfg.h +++ b/inc/fdb_cfg_template.h @@ -38,7 +38,11 @@ /* #define FDB_BIG_ENDIAN */ /* log print macro. default EF_PRINT macro is printf() */ +#if DEBUG_ #define FDB_PRINT(...) SEGGER_RTT_printf(0U, __VA_ARGS__) +#else +#define FDB_PRINT(...) +#endif /* print debug information */ #define FDB_DEBUG_ENABLE