Просмотр исходного кода

[dfs_v1][elmfat] Re-apply RT-Thread modifications to R0.15

Co-authored-by: BernardXiong <1241087+BernardXiong@users.noreply.github.com>
copilot-swe-agent[bot] 2 месяцев назад
Родитель
Сommit
3e178dad07

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

@@ -4721,7 +4721,24 @@ FRESULT f_readdir (
 	LEAVE_FF(fs, res);
 	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
 #if FF_USE_FIND
 /*-----------------------------------------------------------------------*/
 /*-----------------------------------------------------------------------*/
@@ -4797,7 +4814,7 @@ FRESULT f_stat (
 		res = follow_path(&dj, path);	/* Follow the file path */
 		res = follow_path(&dj, path);	/* Follow the file path */
 		if (res == FR_OK) {				/* Follow completed */
 		if (res == FR_OK) {				/* Follow completed */
 			if (dj.fn[NSFLAG] & NS_NONAME) {	/* It is origin directory */
 			if (dj.fn[NSFLAG] & NS_NONAME) {	/* It is origin directory */
-				res = FR_INVALID_NAME;
+				fno->fattrib = AM_DIR;
 			} else {							/* Found an object */
 			} else {							/* Found an object */
 				if (fno) get_fileinfo(&dj, fno);
 				if (fno) get_fileinfo(&dj, fno);
 			}
 			}
@@ -7088,3 +7105,19 @@ FRESULT f_setcp (
 }
 }
 #endif	/* FF_CODE_PAGE == 0 */
 #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_v1/filesystems/elmfat/ff.h

@@ -26,6 +26,7 @@
 extern "C" {
 extern "C" {
 #endif
 #endif
 
 
+#include <rtthread.h>
 #include "ffconf.h"		/* FatFs configuration options */
 #include "ffconf.h"		/* FatFs configuration options */
 
 
 #if FF_DEFINED != FFCONF_DEF
 #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_opendir (DIR* dp, const TCHAR* path);						/* Open a directory */
 FRESULT f_closedir (DIR* dp);										/* Close an open directory */
 FRESULT f_closedir (DIR* dp);										/* Close an open directory */
 FRESULT f_readdir (DIR* dp, FILINFO* fno);							/* Read a directory item */
 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_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_findnext (DIR* dp, FILINFO* fno);							/* Find next file */
 FRESULT f_mkdir (const TCHAR* path);								/* Create a sub directory */
 FRESULT f_mkdir (const TCHAR* path);								/* Create a sub directory */

+ 57 - 14
components/dfs/dfs_v1/filesystems/elmfat/ffconf.h

@@ -30,11 +30,11 @@
 /  f_findnext(). (0:Disable, 1:Enable 2:Enable with matching altname[] too) */
 /  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) */
 /* 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) */
 /* This option switches fast seek function. (0:Disable or 1:Enable) */
 
 
 
 
@@ -57,8 +57,8 @@
 
 
 
 
 #define FF_USE_STRFUNC	0
 #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
 #define FF_STRF_ENCODE	3
 /* FF_USE_STRFUNC switches string functions, f_gets(), f_putc(), f_puts() and
 /* FF_USE_STRFUNC switches string functions, f_gets(), f_putc(), f_puts() and
 /  f_printf().
 /  f_printf().
@@ -84,7 +84,11 @@
 / Locale and Namespace Configurations
 / 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.
 /* This option specifies the OEM code page to be used on the target system.
 /  Incorrect code page setting can cause a file open failure.
 /  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).
 /* The FF_USE_LFN switches the support for LFN (long file name).
 /
 /
 /   0: Disable LFN. FF_MAX_LFN has no effect.
 /   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. */
 /  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.
 /* This option switches the character encoding on the API when LFN is enabled.
 /
 /
 /   0: ANSI/OEM in current CP (TCHAR = char)
 /   0: ANSI/OEM in current CP (TCHAR = char)
@@ -166,7 +188,11 @@
 / Drive/Volume Configurations
 / 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) */
 /* Number of volumes (logical drives) to be used. (1-10) */
 
 
 
 
@@ -194,7 +220,11 @@
 
 
 
 
 #define FF_MIN_SS		512
 #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,
 /* 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
 /  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
 /  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
 /  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. */
 /  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)
 /* 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)
 /  To enable exFAT, also LFN needs to be enabled. (FF_USE_LFN >= 1)
 /  Note that enabling exFAT discards ANSI C (C89) compatibility. */
 /  Note that enabling exFAT discards ANSI C (C89) compatibility. */
@@ -275,8 +308,18 @@
 /      lock control is independent of re-entrancy. */
 /      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
 /* 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
 /  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()
 /  volume is always re-entrant and volume control functions, f_mount(), f_mkfs()