|
|
@ -56,12 +56,14 @@ lfs_t g_lfs; |
|
|
lfs_flashbd_t g_bd; |
|
|
lfs_flashbd_t g_bd; |
|
|
struct lfs_flashbd_config g_bd_cfg; |
|
|
struct lfs_flashbd_config g_bd_cfg; |
|
|
struct lfs_config g_cfg; |
|
|
struct lfs_config g_cfg; |
|
|
|
|
|
static uint8_t g_lfs_ready = 0; /* mount 成功后才允许读写,防止 mount 失败后继续写坏盘 */ |
|
|
#endif |
|
|
#endif |
|
|
|
|
|
|
|
|
#ifndef WIN32 |
|
|
#ifndef WIN32 |
|
|
WEAK void *Rd_Fopen(const char *path, const char *mode) |
|
|
WEAK void *Rd_Fopen(const char *path, const char *mode) |
|
|
{ |
|
|
{ |
|
|
#ifdef USE_W25QXX |
|
|
#ifdef USE_W25QXX |
|
|
|
|
|
if (!g_lfs_ready) return NULL; |
|
|
#if LV_USE_FS_LITTLEFS |
|
|
#if LV_USE_FS_LITTLEFS |
|
|
lv_fs_mode_t lv_mode; |
|
|
lv_fs_mode_t lv_mode; |
|
|
if (strchr(mode, 'r') != NULL) lv_mode = LV_FS_MODE_RD; |
|
|
if (strchr(mode, 'r') != NULL) lv_mode = LV_FS_MODE_RD; |
|
|
@ -144,6 +146,7 @@ WEAK ssize_t Rd_Mread(void *buf, size_t count, void *file) |
|
|
WEAK ssize_t Rd_Mwrite(const void *buf, size_t count, void *file) |
|
|
WEAK ssize_t Rd_Mwrite(const void *buf, size_t count, void *file) |
|
|
{ |
|
|
{ |
|
|
#ifdef USE_W25QXX |
|
|
#ifdef USE_W25QXX |
|
|
|
|
|
if (!g_lfs_ready) return RD_FAILURE; |
|
|
#if LV_USE_FS_LITTLEFS |
|
|
#if LV_USE_FS_LITTLEFS |
|
|
uint32_t size = 0; |
|
|
uint32_t size = 0; |
|
|
lv_fs_file_t *fp = (lv_fs_file_t *)file; |
|
|
lv_fs_file_t *fp = (lv_fs_file_t *)file; |
|
|
@ -244,7 +247,7 @@ WEAK char *Rd_Mgets(char *buf, int size, void *file) |
|
|
while (i < size - 1) |
|
|
while (i < size - 1) |
|
|
{ |
|
|
{ |
|
|
ssize_t n = Rd_Mread(&c, 1, file); |
|
|
ssize_t n = Rd_Mread(&c, 1, file); |
|
|
if (n != 0) |
|
|
if (n != 1) |
|
|
{ |
|
|
{ |
|
|
// 读到 EOF 或 错误(Rd_Mread 返回 0 表示读满请求的字节数)
|
|
|
// 读到 EOF 或 错误(Rd_Mread 返回 0 表示读满请求的字节数)
|
|
|
if (i == 0) return NULL; // 什么都没读到
|
|
|
if (i == 0) return NULL; // 什么都没读到
|
|
|
@ -334,6 +337,7 @@ WEAK int Rd_fflush(void *file) |
|
|
WEAK int Rd_remove(const char *filename) |
|
|
WEAK int Rd_remove(const char *filename) |
|
|
{ |
|
|
{ |
|
|
#ifdef USE_W25QXX |
|
|
#ifdef USE_W25QXX |
|
|
|
|
|
if (!g_lfs_ready) return RD_FAILURE; |
|
|
const char *p = filename; |
|
|
const char *p = filename; |
|
|
if (strlen(filename) >= 2 && filename[1] == ':') p = filename + 2; |
|
|
if (strlen(filename) >= 2 && filename[1] == ':') p = filename + 2; |
|
|
int err = lfs_remove(&g_lfs, p); |
|
|
int err = lfs_remove(&g_lfs, p); |
|
|
@ -347,6 +351,7 @@ WEAK int Rd_remove(const char *filename) |
|
|
WEAK int Rd_rename(const char *oldpath, const char *newpath) |
|
|
WEAK int Rd_rename(const char *oldpath, const char *newpath) |
|
|
{ |
|
|
{ |
|
|
#ifdef USE_W25QXX |
|
|
#ifdef USE_W25QXX |
|
|
|
|
|
if (!g_lfs_ready) return RD_FAILURE; |
|
|
const char *o = oldpath, *n = newpath; |
|
|
const char *o = oldpath, *n = newpath; |
|
|
if (strlen(oldpath) >= 2 && oldpath[1] == ':') o = oldpath + 2; |
|
|
if (strlen(oldpath) >= 2 && oldpath[1] == ':') o = oldpath + 2; |
|
|
if (strlen(newpath) >= 2 && newpath[1] == ':') n = newpath + 2; |
|
|
if (strlen(newpath) >= 2 && newpath[1] == ':') n = newpath + 2; |
|
|
@ -375,12 +380,32 @@ WEAK void Rd_LittleFSInit(void) |
|
|
lfs_flashbd_default_config(&g_cfg, &g_bd, &g_bd_cfg, 1 * 1024 * 1024, 12 * 256, NULL, NULL, NULL); |
|
|
lfs_flashbd_default_config(&g_cfg, &g_bd, &g_bd_cfg, 1 * 1024 * 1024, 12 * 256, NULL, NULL, NULL); |
|
|
|
|
|
|
|
|
int err = lfs_mount(&g_lfs, &g_cfg); |
|
|
int err = lfs_mount(&g_lfs, &g_cfg); |
|
|
if (err) |
|
|
if (err == LFS_ERR_CORRUPT) |
|
|
{ |
|
|
{ |
|
|
printf("mount error format...\n"); |
|
|
/* 只有真正的“无文件系统/损坏”才格式化;IO/内存错误格式化只会越弄越糟 */ |
|
|
(void)Rd_Lfs_Mount(); |
|
|
printf("lfs: no fs / corrupt, formatting...\n"); |
|
|
|
|
|
err = lfs_format(&g_lfs, &g_cfg); |
|
|
|
|
|
if (err == LFS_ERR_OK) |
|
|
|
|
|
{ |
|
|
|
|
|
err = lfs_mount(&g_lfs, &g_cfg); |
|
|
|
|
|
} |
|
|
|
|
|
else |
|
|
|
|
|
{ |
|
|
|
|
|
printf("lfs: format failed, err=%d\n", err); |
|
|
|
|
|
} |
|
|
} |
|
|
} |
|
|
|
|
|
else if (err != LFS_ERR_OK) |
|
|
|
|
|
{ |
|
|
|
|
|
/* LFS_ERR_IO / LFS_ERR_NOMEM 等:不格式化,避免破坏已有数据 */ |
|
|
|
|
|
printf("lfs: mount failed, err=%d (not formatted)\n", err); |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
if (err != LFS_ERR_OK) |
|
|
|
|
|
{ |
|
|
|
|
|
g_lfs_ready = 0; |
|
|
return; |
|
|
return; |
|
|
|
|
|
} |
|
|
|
|
|
g_lfs_ready = 1; |
|
|
#else |
|
|
#else |
|
|
return; |
|
|
return; |
|
|
#endif |
|
|
#endif |
|
|
|