From 34ad73e0955e2d41d0be684fe57d0a36997b741b Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Tue, 28 Oct 2025 23:45:00 +0000 Subject: [PATCH] [dfs_v2][elmfat] Re-apply RT-Thread modifications to R0.15 Co-authored-by: BernardXiong <1241087+BernardXiong@users.noreply.github.com> --- components/dfs/dfs_v2/filesystems/elmfat/ff.c | 35 ++++++++- components/dfs/dfs_v2/filesystems/elmfat/ff.h | 2 + .../dfs/dfs_v2/filesystems/elmfat/ffconf.h | 71 +++++++++++++++---- 3 files changed, 93 insertions(+), 15 deletions(-) diff --git a/components/dfs/dfs_v2/filesystems/elmfat/ff.c b/components/dfs/dfs_v2/filesystems/elmfat/ff.c index 5c294c8939..b50b6e7f14 100644 --- a/components/dfs/dfs_v2/filesystems/elmfat/ff.c +++ b/components/dfs/dfs_v2/filesystems/elmfat/ff.c @@ -4721,7 +4721,24 @@ FRESULT f_readdir ( LEAVE_FF(fs, res); } +FRESULT f_seekdir( + DIR *dj, /* Pointer to the open directory object */ + int offset /* the seek offset */ +) +{ + int i = 0; + if (dir_sdi(dj, 0) != FR_OK || offset < 0) + return FR_INT_ERR; + + while(i < offset) + { + if(dir_read(dj, 0) != FR_OK || dir_next(dj, 0) != FR_OK) + return FR_INT_ERR; + i++; + } + return FR_OK; +} #if FF_USE_FIND /*-----------------------------------------------------------------------*/ @@ -4797,7 +4814,7 @@ FRESULT f_stat ( res = follow_path(&dj, path); /* Follow the file path */ if (res == FR_OK) { /* Follow completed */ if (dj.fn[NSFLAG] & NS_NONAME) { /* It is origin directory */ - res = FR_INVALID_NAME; + fno->fattrib = AM_DIR; } else { /* Found an object */ if (fno) get_fileinfo(&dj, fno); } @@ -7088,3 +7105,19 @@ FRESULT f_setcp ( } #endif /* FF_CODE_PAGE == 0 */ +#include +#if FF_VOLUMES > 1 +int elm_get_vol(FATFS *fat) +{ + int vol; + + for (vol = 0; vol < FF_VOLUMES; vol ++) + { + if (FatFs[vol] == fat) return vol; + } + + return -1; +} +#endif + + diff --git a/components/dfs/dfs_v2/filesystems/elmfat/ff.h b/components/dfs/dfs_v2/filesystems/elmfat/ff.h index e0a77124c7..b01385e981 100644 --- a/components/dfs/dfs_v2/filesystems/elmfat/ff.h +++ b/components/dfs/dfs_v2/filesystems/elmfat/ff.h @@ -26,6 +26,7 @@ extern "C" { #endif +#include #include "ffconf.h" /* FatFs configuration options */ #if FF_DEFINED != FFCONF_DEF @@ -311,6 +312,7 @@ FRESULT f_sync (FIL* fp); /* Flush cached data of the writing file */ FRESULT f_opendir (DIR* dp, const TCHAR* path); /* Open a directory */ FRESULT f_closedir (DIR* dp); /* Close an open directory */ FRESULT f_readdir (DIR* dp, FILINFO* fno); /* Read a directory item */ +FRESULT f_seekdir(DIR *dj, int offset); /* Seek in directory */ FRESULT f_findfirst (DIR* dp, FILINFO* fno, const TCHAR* path, const TCHAR* pattern); /* Find first file */ FRESULT f_findnext (DIR* dp, FILINFO* fno); /* Find next file */ FRESULT f_mkdir (const TCHAR* path); /* Create a sub directory */ diff --git a/components/dfs/dfs_v2/filesystems/elmfat/ffconf.h b/components/dfs/dfs_v2/filesystems/elmfat/ffconf.h index 7f4d7da5f4..b230ca1654 100644 --- a/components/dfs/dfs_v2/filesystems/elmfat/ffconf.h +++ b/components/dfs/dfs_v2/filesystems/elmfat/ffconf.h @@ -30,11 +30,11 @@ / f_findnext(). (0:Disable, 1:Enable 2:Enable with matching altname[] too) */ -#define FF_USE_MKFS 0 +#define FF_USE_MKFS 1 /* This option switches f_mkfs() function. (0:Disable or 1:Enable) */ -#define FF_USE_FASTSEEK 0 +#define FF_USE_FASTSEEK 1 /* This option switches fast seek function. (0:Disable or 1:Enable) */ @@ -57,8 +57,8 @@ #define FF_USE_STRFUNC 0 -#define FF_PRINT_LLI 1 -#define FF_PRINT_FLOAT 1 +#define FF_PRINT_LLI 0 +#define FF_PRINT_FLOAT 0 #define FF_STRF_ENCODE 3 /* FF_USE_STRFUNC switches string functions, f_gets(), f_putc(), f_puts() and / f_printf(). @@ -84,7 +84,11 @@ / Locale and Namespace Configurations /---------------------------------------------------------------------------*/ -#define FF_CODE_PAGE 932 +#ifdef RT_DFS_ELM_CODE_PAGE +# define FF_CODE_PAGE RT_DFS_ELM_CODE_PAGE +#else +# define FF_CODE_PAGE 936 +#endif /* This option specifies the OEM code page to be used on the target system. / Incorrect code page setting can cause a file open failure. / @@ -113,8 +117,13 @@ */ -#define FF_USE_LFN 0 -#define FF_MAX_LFN 255 +#if RT_DFS_ELM_USE_LFN +#define FF_USE_LFN RT_DFS_ELM_USE_LFN +#define FF_MAX_LFN RT_DFS_ELM_MAX_LFN +#else +#define FF_USE_LFN 0 /* 0 to 3 */ +#define FF_MAX_LFN 255 /* Maximum LFN length to handle (12 to 255) */ +#endif /* The FF_USE_LFN switches the support for LFN (long file name). / / 0: Disable LFN. FF_MAX_LFN has no effect. @@ -133,7 +142,20 @@ / ff_memfree() exemplified in ffsystem.c, need to be added to the project. */ -#define FF_LFN_UNICODE 0 +#ifdef RT_DFS_ELM_LFN_UNICODE +/* This option switches the character encoding on the API when LFN is enabled. +/ +/ 0: ANSI/OEM in current CP (TCHAR = char) +/ 1: Unicode in UTF-16 (TCHAR = WCHAR) +/ 2: Unicode in UTF-8 (TCHAR = char) +/ 3: Unicode in UTF-32 (TCHAR = DWORD) +/ +/ Also behavior of string I/O functions will be affected by this option. +/ When LFN is not enabled, this option has no effect. */ +#define FF_LFN_UNICODE RT_DFS_ELM_LFN_UNICODE /* 0:ANSI/OEM or 1:Unicode */ +#else +#define FF_LFN_UNICODE 0 /* 0:ANSI/OEM or 1:Unicode */ +#endif /* This option switches the character encoding on the API when LFN is enabled. / / 0: ANSI/OEM in current CP (TCHAR = char) @@ -166,7 +188,11 @@ / Drive/Volume Configurations /---------------------------------------------------------------------------*/ -#define FF_VOLUMES 1 +#ifdef RT_DFS_ELM_DRIVES +#define FF_VOLUMES RT_DFS_ELM_DRIVES +#else +#define FF_VOLUMES 1 +#endif /* Number of volumes (logical drives) to be used. (1-10) */ @@ -194,7 +220,11 @@ #define FF_MIN_SS 512 -#define FF_MAX_SS 512 +#ifdef RT_DFS_ELM_MAX_SECTOR_SIZE +#define FF_MAX_SS RT_DFS_ELM_MAX_SECTOR_SIZE +#else +#define FF_MAX_SS 512 /* 512, 1024, 2048 or 4096 */ +#endif /* This set of options configures the range of sector size to be supported. (512, / 1024, 2048 or 4096) Always set both 512 for most systems, generic memory card and / harddisk, but a larger value may be required for on-board flash memory and some @@ -230,8 +260,11 @@ / Instead of private sector buffer eliminated from the file object, common sector / buffer in the filesystem object (FATFS) is used for the file data transfer. */ - -#define FF_FS_EXFAT 0 +#ifdef RT_DFS_ELM_USE_EXFAT +#define FF_FS_EXFAT 1 +#else +#define FF_FS_EXFAT 0 +#endif /* This option switches support for exFAT filesystem. (0:Disable or 1:Enable) / To enable exFAT, also LFN needs to be enabled. (FF_USE_LFN >= 1) / Note that enabling exFAT discards ANSI C (C89) compatibility. */ @@ -275,8 +308,18 @@ / lock control is independent of re-entrancy. */ -#define FF_FS_REENTRANT 0 -#define FF_FS_TIMEOUT 1000 +/* #include // O/S definitions */ +#include +#ifdef RT_DFS_ELM_REENTRANT +#define FF_FS_REENTRANT 1 /* 0 or 1 */ +#else +#define FF_FS_REENTRANT 0 /* 0:Disable or 1:Enable */ +#endif +#ifndef RT_DFS_ELM_MUTEX_TIMEOUT +#define RT_DFS_ELM_MUTEX_TIMEOUT 3000 +#endif +#define FF_FS_TIMEOUT RT_DFS_ELM_MUTEX_TIMEOUT +//#define FF_SYNC_t rt_mutex_t /* The option FF_FS_REENTRANT switches the re-entrancy (thread safe) of the FatFs / module itself. Note that regardless of this option, file access to different / volume is always re-entrant and volume control functions, f_mount(), f_mkfs()