Explorar el Código

[dfs_v2][elmfat] Re-apply RT-Thread modifications to R0.16

Co-authored-by: BernardXiong <1241087+BernardXiong@users.noreply.github.com>
copilot-swe-agent[bot] hace 2 meses
padre
commit
f9e56760e9

+ 35 - 2
components/dfs/dfs_v2/filesystems/elmfat/ff.c

@@ -4840,7 +4840,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
 /*-----------------------------------------------------------------------*/
@@ -4917,7 +4934,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);
 			}
@@ -7247,3 +7264,19 @@ FRESULT f_setcp (
 }
 #endif	/* FF_CODE_PAGE == 0 */
 
+#include <rtthread.h>
+#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
+
+

+ 2 - 0
components/dfs/dfs_v2/filesystems/elmfat/ff.h

@@ -26,6 +26,7 @@
 extern "C" {
 #endif
 
+#include <rtthread.h>
 #if !defined(FFCONF_DEF)
 #include "ffconf.h"		/* FatFs configuration options */
 #endif
@@ -330,6 +331,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 */

+ 56 - 13
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(). (0:Disable or 1:Enable) */
 
 
-#define FF_USE_FASTSEEK	0
+#define FF_USE_FASTSEEK	1
 /* This option switches fast seek feature. (0:Disable or 1:Enable) */
 
 
@@ -59,7 +59,7 @@
 #define FF_USE_STRFUNC	0
 #define FF_PRINT_LLI	0
 #define FF_PRINT_FLOAT	0
-#define FF_STRF_ENCODE	0
+#define FF_STRF_ENCODE	3
 /* FF_USE_STRFUNC switches string API 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)
@@ -178,7 +200,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) */
 
 
@@ -206,7 +232,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
@@ -242,8 +272,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. */
@@ -292,8 +325,18 @@
 /      lock control is independent of re-entrancy. */
 
 
-#define FF_FS_REENTRANT	0
-#define FF_FS_TIMEOUT	1000
+/* #include <somertos.h>	// O/S definitions */
+#include <rtdef.h>
+#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()