Browse Source

update elmfat to R0.08b

git-svn-id: https://rt-thread.googlecode.com/svn/trunk@1336 bbd45198-f89e-11dd-88c7-29a3b14d5316
wuyangyong 14 years ago
parent
commit
adc63f2c0a

+ 21 - 4
components/dfs/filesystems/elmfat/00readme.txt

@@ -1,4 +1,4 @@
-FatFs Module Source Files R0.07e                        (C)ChaN, 2009
+FatFs Module Source Files R0.08b                       (C)ChaN, 2011
 
 
 
 
 FILES
 FILES
@@ -7,7 +7,6 @@ FILES
   ff.h       Common include file for FatFs and application module.
   ff.h       Common include file for FatFs and application module.
   ff.c       FatFs module.
   ff.c       FatFs module.
   diskio.h   Common include file for FatFs and disk I/O module.
   diskio.h   Common include file for FatFs and disk I/O module.
-  diskio.c   Skeleton of low level disk I/O module.
   integer.h  Alternative type definitions for integer variables.
   integer.h  Alternative type definitions for integer variables.
   option     Optional external functions.
   option     Optional external functions.
 
 
@@ -24,7 +23,7 @@ AGREEMENTS
  small embedded systems. This is a free software and is opened for education,
  small embedded systems. This is a free software and is opened for education,
  research and commercial developments under license policy of following trems.
  research and commercial developments under license policy of following trems.
 
 
-  Copyright (C) 2009, ChaN, all right reserved.
+  Copyright (C) 2011, ChaN, all right reserved.
 
 
  * The FatFs module is a free software and there is NO WARRANTY.
  * The FatFs module is a free software and there is NO WARRANTY.
  * No restriction on use. You can use, modify and redistribute it for
  * No restriction on use. You can use, modify and redistribute it for
@@ -103,8 +102,26 @@ REVISION HISTORY
                        Added f_chdrive().
                        Added f_chdrive().
                        Added proper case conversion for extended characters.
                        Added proper case conversion for extended characters.
 
 
-  Nov 03,'2009 R0.07e  Separated out configuration options from ff.h to ffconf.h.
+  Nov 03, 2009 R0.07e  Separated out configuration options from ff.h to ffconf.h.
                        Added a configuration option, _LFN_UNICODE.
                        Added a configuration option, _LFN_UNICODE.
                        Fixed f_unlink() fails to remove a sub-dir on _FS_RPATH.
                        Fixed f_unlink() fails to remove a sub-dir on _FS_RPATH.
                        Fixed name matching error on the 13 char boundary.
                        Fixed name matching error on the 13 char boundary.
                        Changed f_readdir() to return the SFN with always upper case on non-LFN cfg.
                        Changed f_readdir() to return the SFN with always upper case on non-LFN cfg.
+
+  May 15, 2010, R0.08  Added a memory configuration option. (_USE_LFN)
+                       Added file lock feature. (_FS_SHARE)
+                       Added fast seek feature. (_USE_FASTSEEK)
+                       Changed some types on the API, XCHAR->TCHAR.
+                       Changed fname member in the FILINFO structure on Unicode cfg.
+                       String functions support UTF-8 encoding files on Unicode cfg.
+
+  Aug 16,'10 R0.08a    Added f_getcwd(). (_FS_RPATH = 2)
+                       Added sector erase feature. (_USE_ERASE)
+                       Moved file lock semaphore table from fs object to the bss.
+                       Fixed a wrong directory entry is created on non-LFN cfg when the given name contains ';'.
+                       Fixed f_mkfs() creates wrong FAT32 volume.
+
+  Jan 15,'11 R0.08b    Fast seek feature is also applied to f_read() and f_write().
+                       f_lseek() reports required table size on creating CLMP.
+                       Extended format syntax of f_printf function.
+                       Ignores duplicated directory separators in given path names.

+ 33 - 33
components/dfs/filesystems/elmfat/dfs_elm.c

@@ -8,7 +8,7 @@
 #include <dfs_fs.h>
 #include <dfs_fs.h>
 #include <dfs_def.h>
 #include <dfs_def.h>
 
 
-static rt_device_t disk[_DRIVES] = {0};
+static rt_device_t disk[_VOLUMES] = {0};
 
 
 static int elm_result_to_dfs(FRESULT result)
 static int elm_result_to_dfs(FRESULT result)
 {
 {
@@ -48,7 +48,7 @@ static int elm_result_to_dfs(FRESULT result)
 	case FR_MKFS_ABORTED:
 	case FR_MKFS_ABORTED:
 		status = -DFS_STATUS_EINVAL;
 		status = -DFS_STATUS_EINVAL;
 		break;
 		break;
-		
+
 	default:
 	default:
 		status = -1;
 		status = -1;
 		break;
 		break;
@@ -64,14 +64,14 @@ int dfs_elm_mount(struct dfs_filesystem* fs, unsigned long rwflag, const void* d
 	rt_uint32_t index;
 	rt_uint32_t index;
 
 
 	/* handle RT-Thread device routine */
 	/* handle RT-Thread device routine */
-	for (index = 0; index < _DRIVES; index ++)
+	for (index = 0; index < _VOLUMES; index ++)
 	{
 	{
 		if (disk[index] == RT_NULL)
 		if (disk[index] == RT_NULL)
 		{
 		{
 			break;
 			break;
 		}
 		}
 	}
 	}
-	if (index == _DRIVES) return -DFS_STATUS_ENOSPC;
+	if (index == _VOLUMES) return -DFS_STATUS_ENOSPC;
 
 
 	/* get device */
 	/* get device */
 	disk[index] = fs->dev_id;
 	disk[index] = fs->dev_id;
@@ -106,7 +106,7 @@ int dfs_elm_unmount(struct dfs_filesystem* fs)
 	RT_ASSERT(fat != RT_NULL);
 	RT_ASSERT(fat != RT_NULL);
 
 
 	/* find the device index and then umount it */
 	/* find the device index and then umount it */
-	for (index = 0; index < _DRIVES; index ++)
+	for (index = 0; index < _VOLUMES; index ++)
 	{
 	{
 		if (disk[index] == fs->dev_id)
 		if (disk[index] == fs->dev_id)
 		{
 		{
@@ -132,7 +132,7 @@ int dfs_elm_mkfs(const char* device_name)
 	FRESULT result;
 	FRESULT result;
 
 
 	/* find device name */
 	/* find device name */
-	for (drv = 0; drv < _DRIVES; drv ++)
+	for (drv = 0; drv < _VOLUMES; drv ++)
 	{
 	{
 		dev = disk[drv];
 		dev = disk[drv];
 		if (rt_strncmp(dev->parent.name, device_name, RT_NAME_MAX) == 0)
 		if (rt_strncmp(dev->parent.name, device_name, RT_NAME_MAX) == 0)
@@ -167,12 +167,12 @@ int dfs_elm_statfs(struct dfs_filesystem* fs, struct statfs *buf)
 
 
 	f = (FATFS*) fs->data;
 	f = (FATFS*) fs->data;
 
 
-	rt_snprintf(driver, sizeof(driver), "%d:", f->drive);
+	rt_snprintf(driver, sizeof(driver), "%d:", f->drv);
 	res = f_getfree(driver, &fre_clust, &f);
 	res = f_getfree(driver, &fre_clust, &f);
 	if (res) return elm_result_to_dfs(res);
 	if (res) return elm_result_to_dfs(res);
-	
+
 	/* Get total sectors and free sectors */
 	/* Get total sectors and free sectors */
-	tot_sect = (f->max_clust - 2) * f->csize;
+	tot_sect = (f->n_fatent - 2) * f->csize;
 	fre_sect = fre_clust * f->csize;
 	fre_sect = fre_clust * f->csize;
 
 
 	buf->f_bfree = fre_sect;
 	buf->f_bfree = fre_sect;
@@ -189,10 +189,10 @@ int dfs_elm_open(struct dfs_fd* file)
 	FRESULT result;
 	FRESULT result;
 	char *drivers_fn;
 	char *drivers_fn;
 
 
-#if (_DRIVES > 1)
+#if (_VOLUMES > 1)
 	int vol;
 	int vol;
 	extern int elm_get_vol(FATFS *fat);
 	extern int elm_get_vol(FATFS *fat);
-	
+
 	/* add path for ELM FatFS driver support */
 	/* add path for ELM FatFS driver support */
 	vol = elm_get_vol((FATFS *)file->fs->data);
 	vol = elm_get_vol((FATFS *)file->fs->data);
 	if (vol < 0) return -DFS_STATUS_ENOENT;
 	if (vol < 0) return -DFS_STATUS_ENOENT;
@@ -213,7 +213,7 @@ int dfs_elm_open(struct dfs_fd* file)
 			result = f_mkdir(drivers_fn);
 			result = f_mkdir(drivers_fn);
 			if (result != FR_OK)
 			if (result != FR_OK)
 			{
 			{
-#if _DRIVES > 1
+#if _VOLUMES > 1
 				rt_free(drivers_fn);
 				rt_free(drivers_fn);
 #endif
 #endif
 				return elm_result_to_dfs(result);
 				return elm_result_to_dfs(result);
@@ -224,14 +224,14 @@ int dfs_elm_open(struct dfs_fd* file)
 		dir = (DIR *)rt_malloc(sizeof(DIR));
 		dir = (DIR *)rt_malloc(sizeof(DIR));
 		if (dir == RT_NULL)
 		if (dir == RT_NULL)
 		{
 		{
-#if _DRIVES > 1
+#if _VOLUMES > 1
 			rt_free(drivers_fn);
 			rt_free(drivers_fn);
 #endif
 #endif
 			return -DFS_STATUS_ENOMEM;
 			return -DFS_STATUS_ENOMEM;
 		}
 		}
 
 
 		result = f_opendir(dir, drivers_fn);
 		result = f_opendir(dir, drivers_fn);
-#if _DRIVES > 1
+#if _VOLUMES > 1
 		rt_free(drivers_fn);
 		rt_free(drivers_fn);
 #endif
 #endif
 		if (result != FR_OK)
 		if (result != FR_OK)
@@ -264,7 +264,7 @@ int dfs_elm_open(struct dfs_fd* file)
 		}
 		}
 
 
 		result = f_open(fd, drivers_fn, mode);
 		result = f_open(fd, drivers_fn, mode);
-#if _DRIVES > 1
+#if _VOLUMES > 1
 		rt_free(drivers_fn);
 		rt_free(drivers_fn);
 #endif
 #endif
 		if (result == FR_OK)
 		if (result == FR_OK)
@@ -464,7 +464,7 @@ int dfs_elm_unlink(struct dfs_filesystem* fs, const char* path)
 {
 {
 	FRESULT result;
 	FRESULT result;
 
 
-#if _DRIVES > 1
+#if _VOLUMES > 1
 	int vol;
 	int vol;
 	char *drivers_fn;
 	char *drivers_fn;
 	extern int elm_get_vol(FATFS *fat);
 	extern int elm_get_vol(FATFS *fat);
@@ -482,7 +482,7 @@ int dfs_elm_unlink(struct dfs_filesystem* fs, const char* path)
 #endif
 #endif
 
 
 	result = f_unlink(drivers_fn);
 	result = f_unlink(drivers_fn);
-#if _DRIVES > 1
+#if _VOLUMES > 1
 	rt_free(drivers_fn);
 	rt_free(drivers_fn);
 #endif
 #endif
 	return elm_result_to_dfs(result);
 	return elm_result_to_dfs(result);
@@ -492,7 +492,7 @@ int dfs_elm_rename(struct dfs_filesystem* fs, const char* oldpath, const char* n
 {
 {
 	FRESULT result;
 	FRESULT result;
 
 
-#if _DRIVES > 1
+#if _VOLUMES > 1
 	char *drivers_oldfn, *drivers_newfn;
 	char *drivers_oldfn, *drivers_newfn;
 	int vol;
 	int vol;
 	extern int elm_get_vol(FATFS *fat);
 	extern int elm_get_vol(FATFS *fat);
@@ -504,7 +504,7 @@ int dfs_elm_rename(struct dfs_filesystem* fs, const char* oldpath, const char* n
 	drivers_oldfn = rt_malloc(256);
 	drivers_oldfn = rt_malloc(256);
 	if (drivers_oldfn == RT_NULL) return -DFS_STATUS_ENOMEM;
 	if (drivers_oldfn == RT_NULL) return -DFS_STATUS_ENOMEM;
 	drivers_newfn = rt_malloc(256);
 	drivers_newfn = rt_malloc(256);
-	if (drivers_newfn == RT_NULL) 
+	if (drivers_newfn == RT_NULL)
 	{
 	{
 		rt_free(drivers_oldfn);
 		rt_free(drivers_oldfn);
 		return -DFS_STATUS_ENOMEM;
 		return -DFS_STATUS_ENOMEM;
@@ -520,7 +520,7 @@ int dfs_elm_rename(struct dfs_filesystem* fs, const char* oldpath, const char* n
 #endif
 #endif
 
 
 	result = f_rename(drivers_oldfn, drivers_newfn);
 	result = f_rename(drivers_oldfn, drivers_newfn);
-#if _DRIVES > 1
+#if _VOLUMES > 1
 	rt_free(drivers_oldfn);
 	rt_free(drivers_oldfn);
 	rt_free(drivers_newfn);
 	rt_free(drivers_newfn);
 #endif
 #endif
@@ -533,7 +533,7 @@ int dfs_elm_stat(struct dfs_filesystem* fs, const char *path, struct stat *st)
 	FRESULT result;
 	FRESULT result;
 
 
 
 
-#if _DRIVES > 1
+#if _VOLUMES > 1
 	int vol;
 	int vol;
 	char *drivers_fn;
 	char *drivers_fn;
 	extern int elm_get_vol(FATFS *fat);
 	extern int elm_get_vol(FATFS *fat);
@@ -557,7 +557,7 @@ int dfs_elm_stat(struct dfs_filesystem* fs, const char *path, struct stat *st)
 #endif
 #endif
 
 
 	result = f_stat(drivers_fn, &file_info);
 	result = f_stat(drivers_fn, &file_info);
-#if _DRIVES > 1
+#if _VOLUMES > 1
 	rt_free(drivers_fn);
 	rt_free(drivers_fn);
 #endif
 #endif
 	if (result == FR_OK)
 	if (result == FR_OK)
@@ -587,7 +587,7 @@ int dfs_elm_stat(struct dfs_filesystem* fs, const char *path, struct stat *st)
 	return elm_result_to_dfs(result);
 	return elm_result_to_dfs(result);
 }
 }
 
 
-static const struct dfs_filesystem_operation dfs_elm = 
+static const struct dfs_filesystem_operation dfs_elm =
 {
 {
 	"elm",
 	"elm",
 	dfs_elm_mount,
 	dfs_elm_mount,
@@ -669,7 +669,7 @@ DRESULT disk_ioctl (BYTE drv, BYTE ctrl, void *buff)
 	rt_device_t device = disk[drv];
 	rt_device_t device = disk[drv];
 
 
 	if (device == RT_NULL) return RES_ERROR;
 	if (device == RT_NULL) return RES_ERROR;
-	
+
 	if (ctrl == GET_SECTOR_COUNT)
 	if (ctrl == GET_SECTOR_COUNT)
 	{
 	{
 		struct rt_device_blk_geometry geometry;
 		struct rt_device_blk_geometry geometry;
@@ -687,7 +687,7 @@ DRESULT disk_ioctl (BYTE drv, BYTE ctrl, void *buff)
 		rt_memset(&geometry, 0, sizeof(geometry));
 		rt_memset(&geometry, 0, sizeof(geometry));
 		rt_device_control(device, RT_DEVICE_CTRL_BLK_GETGEOME, &geometry);
 		rt_device_control(device, RT_DEVICE_CTRL_BLK_GETGEOME, &geometry);
 
 
-		*(DWORD*)buff = geometry.bytes_per_sector;
+		*(WORD*)buff = geometry.bytes_per_sector;
 	}
 	}
 	else if (ctrl == GET_BLOCK_SIZE) /* Get erase block size in unit of sectors (DWORD) */
 	else if (ctrl == GET_BLOCK_SIZE) /* Get erase block size in unit of sectors (DWORD) */
 	{
 	{
@@ -708,7 +708,7 @@ rt_time_t get_fattime()
 }
 }
 
 
 #if _FS_REENTRANT
 #if _FS_REENTRANT
-BOOL ff_cre_syncobj(BYTE drv, _SYNC_t* m)
+int ff_cre_syncobj(BYTE drv, _SYNC_t* m)
 {
 {
     char name[8];
     char name[8];
     rt_mutex_t mutex;
     rt_mutex_t mutex;
@@ -718,24 +718,24 @@ BOOL ff_cre_syncobj(BYTE drv, _SYNC_t* m)
     if (mutex != RT_NULL)
     if (mutex != RT_NULL)
     {
     {
         *m = mutex;
         *m = mutex;
-        return TRUE;
+        return RT_TRUE;
     }
     }
 
 
-    return FALSE;
+    return RT_FALSE;
 }
 }
 
 
-BOOL ff_del_syncobj(_SYNC_t m)
+int ff_del_syncobj(_SYNC_t m)
 {
 {
     rt_mutex_delete(m);
     rt_mutex_delete(m);
 
 
-    return TRUE;
+    return RT_TRUE;
 }
 }
 
 
-BOOL ff_req_grant(_SYNC_t m)
+int ff_req_grant(_SYNC_t m)
 {
 {
-    if (rt_mutex_take(m, _FS_TIMEOUT) == RT_EOK) return TRUE;
+    if (rt_mutex_take(m, _FS_TIMEOUT) == RT_EOK) return RT_TRUE;
 
 
-    return FALSE;
+    return RT_FALSE;
 }
 }
 
 
 void ff_rel_grant(_SYNC_t m)
 void ff_rel_grant(_SYNC_t m)

+ 0 - 202
components/dfs/filesystems/elmfat/diskio.c

@@ -1,202 +0,0 @@
-/*-----------------------------------------------------------------------*/
-/* Low level disk I/O module skeleton for FatFs     (C)ChaN, 2007        */
-/*-----------------------------------------------------------------------*/
-/* This is a stub disk I/O module that acts as front end of the existing */
-/* disk I/O modules and attach it to FatFs module with common interface. */
-/*-----------------------------------------------------------------------*/
-
-#include "diskio.h"
-
-/*-----------------------------------------------------------------------*/
-/* Correspondence between physical drive number and physical drive.      */
-
-#define ATA		0
-#define MMC		1
-#define USB		2
-
-
-
-/*-----------------------------------------------------------------------*/
-/* Inidialize a Drive                                                    */
-
-DSTATUS disk_initialize (
-	BYTE drv				/* Physical drive nmuber (0..) */
-)
-{
-	DSTATUS stat;
-	int result;
-
-	switch (drv) {
-	case ATA :
-		result = ATA_disk_initialize();
-		// translate the reslut code here
-
-		return stat;
-
-	case MMC :
-		result = MMC_disk_initialize();
-		// translate the reslut code here
-
-		return stat;
-
-	case USB :
-		result = USB_disk_initialize();
-		// translate the reslut code here
-
-		return stat;
-	}
-	return STA_NOINIT;
-}
-
-
-
-/*-----------------------------------------------------------------------*/
-/* Return Disk Status                                                    */
-
-DSTATUS disk_status (
-	BYTE drv		/* Physical drive nmuber (0..) */
-)
-{
-	DSTATUS stat;
-	int result;
-
-	switch (drv) {
-	case ATA :
-		result = ATA_disk_status();
-		// translate the reslut code here
-
-		return stat;
-
-	case MMC :
-		result = MMC_disk_status();
-		// translate the reslut code here
-
-		return stat;
-
-	case USB :
-		result = USB_disk_status();
-		// translate the reslut code here
-
-		return stat;
-	}
-	return STA_NOINIT;
-}
-
-
-
-/*-----------------------------------------------------------------------*/
-/* Read Sector(s)                                                        */
-
-DRESULT disk_read (
-	BYTE drv,		/* Physical drive nmuber (0..) */
-	BYTE *buff,		/* Data buffer to store read data */
-	DWORD sector,	/* Sector address (LBA) */
-	BYTE count		/* Number of sectors to read (1..255) */
-)
-{
-	DRESULT res;
-	int result;
-
-	switch (drv) {
-	case ATA :
-		result = ATA_disk_read(buff, sector, count);
-		// translate the reslut code here
-
-		return res;
-
-	case MMC :
-		result = MMC_disk_read(buff, sector, count);
-		// translate the reslut code here
-
-		return res;
-
-	case USB :
-		result = USB_disk_read(buff, sector, count);
-		// translate the reslut code here
-
-		return res;
-	}
-	return RES_PARERR;
-}
-
-
-
-/*-----------------------------------------------------------------------*/
-/* Write Sector(s)                                                       */
-
-#if _READONLY == 0
-DRESULT disk_write (
-	BYTE drv,			/* Physical drive nmuber (0..) */
-	const BYTE *buff,	/* Data to be written */
-	DWORD sector,		/* Sector address (LBA) */
-	BYTE count			/* Number of sectors to write (1..255) */
-)
-{
-	DRESULT res;
-	int result;
-
-	switch (drv) {
-	case ATA :
-		result = ATA_disk_write(buff, sector, count);
-		// translate the reslut code here
-
-		return res;
-
-	case MMC :
-		result = MMC_disk_write(buff, sector, count);
-		// translate the reslut code here
-
-		return res;
-
-	case USB :
-		result = USB_disk_write(buff, sector, count);
-		// translate the reslut code here
-
-		return res;
-	}
-	return RES_PARERR;
-}
-#endif /* _READONLY */
-
-
-
-/*-----------------------------------------------------------------------*/
-/* Miscellaneous Functions                                               */
-
-DRESULT disk_ioctl (
-	BYTE drv,		/* Physical drive nmuber (0..) */
-	BYTE ctrl,		/* Control code */
-	void *buff		/* Buffer to send/receive control data */
-)
-{
-	DRESULT res;
-	int result;
-
-	switch (drv) {
-	case ATA :
-		// pre-process here
-
-		result = ATA_disk_ioctl(ctrl, buff);
-		// post-process here
-
-		return res;
-
-	case MMC :
-		// pre-process here
-
-		result = MMC_disk_ioctl(ctrl, buff);
-		// post-process here
-
-		return res;
-
-	case USB :
-		// pre-process here
-
-		result = USB_disk_ioctl(ctrl, buff);
-		// post-process here
-
-		return res;
-	}
-	return RES_PARERR;
-}
-

+ 30 - 22
components/dfs/filesystems/elmfat/diskio.h

@@ -1,11 +1,11 @@
 /*-----------------------------------------------------------------------
 /*-----------------------------------------------------------------------
-/  Low level disk interface modlue include file  R0.07   (C)ChaN, 2009
+/  Low level disk interface modlue include file
 /-----------------------------------------------------------------------*/
 /-----------------------------------------------------------------------*/
 
 
 #ifndef _DISKIO
 #ifndef _DISKIO
 
 
-#define _READONLY	0	/* 1: Read-only mode */
-#define _USE_IOCTL	1
+#define _READONLY	0	/* 1: Remove write functions */
+#define _USE_IOCTL	1	/* 1: Use disk_ioctl fucntion */
 
 
 #include "integer.h"
 #include "integer.h"
 
 
@@ -26,7 +26,7 @@ typedef enum {
 /*---------------------------------------*/
 /*---------------------------------------*/
 /* Prototypes for disk control functions */
 /* Prototypes for disk control functions */
 
 
-BOOL assign_drives (int argc, char *argv[]);
+int assign_drives (int, int);
 DSTATUS disk_initialize (BYTE);
 DSTATUS disk_initialize (BYTE);
 DSTATUS disk_status (BYTE);
 DSTATUS disk_status (BYTE);
 DRESULT disk_read (BYTE, BYTE*, DWORD, BYTE);
 DRESULT disk_read (BYTE, BYTE*, DWORD, BYTE);
@@ -44,26 +44,34 @@ DRESULT disk_ioctl (BYTE, BYTE, void*);
 #define STA_PROTECT		0x04	/* Write protected */
 #define STA_PROTECT		0x04	/* Write protected */
 
 
 
 
-/* Command code for disk_ioctrl() */
+/* Command code for disk_ioctrl fucntion */
+
+/* Generic command (defined for FatFs) */
+#define CTRL_SYNC			0	/* Flush disk cache (for write functions) */
+#define GET_SECTOR_COUNT	1	/* Get media size (for only f_mkfs()) */
+#define GET_SECTOR_SIZE		2	/* Get sector size (for multiple sector size (_MAX_SS >= 1024)) */
+#define GET_BLOCK_SIZE		3	/* Get erase block size (for only f_mkfs()) */
+#define CTRL_ERASE_SECTOR	4	/* Force erased a block of sectors (for only _USE_ERASE) */
 
 
 /* Generic command */
 /* Generic command */
-#define CTRL_SYNC			0	/* Mandatory for write functions */
-#define GET_SECTOR_COUNT	1	/* Mandatory for only f_mkfs() */
-#define GET_SECTOR_SIZE		2	/* Mandatory for multiple sector size cfg */
-#define GET_BLOCK_SIZE		3	/* Mandatory for only f_mkfs() */
-#define CTRL_POWER			4
-#define CTRL_LOCK			5
-#define CTRL_EJECT			6
-/* MMC/SDC command */
-#define MMC_GET_TYPE		10
-#define MMC_GET_CSD			11
-#define MMC_GET_CID			12
-#define MMC_GET_OCR			13
-#define MMC_GET_SDSTAT		14
-/* ATA/CF command */
-#define ATA_GET_REV			20
-#define ATA_GET_MODEL		21
-#define ATA_GET_SN			22
+#define CTRL_POWER			5	/* Get/Set power status */
+#define CTRL_LOCK			6	/* Lock/Unlock media removal */
+#define CTRL_EJECT			7	/* Eject media */
+
+/* MMC/SDC specific ioctl command */
+#define MMC_GET_TYPE		10	/* Get card type */
+#define MMC_GET_CSD			11	/* Get CSD */
+#define MMC_GET_CID			12	/* Get CID */
+#define MMC_GET_OCR			13	/* Get OCR */
+#define MMC_GET_SDSTAT		14	/* Get SD status */
+
+/* ATA/CF specific ioctl command */
+#define ATA_GET_REV			20	/* Get F/W revision */
+#define ATA_GET_MODEL		21	/* Get model name */
+#define ATA_GET_SN			22	/* Get serial number */
+
+/* NAND specific ioctl command */
+#define NAND_FORMAT			30	/* Create physical format */
 
 
 
 
 #define _DISKIO
 #define _DISKIO

File diff suppressed because it is too large
+ 641 - 127
components/dfs/filesystems/elmfat/ff.c


+ 174 - 435
components/dfs/filesystems/elmfat/ff.h

@@ -1,390 +1,173 @@
 /*---------------------------------------------------------------------------/
 /*---------------------------------------------------------------------------/
-/  FatFs - FAT file system module include file  R0.07e       (C)ChaN, 2009
+/  FatFs - FAT file system module include file  R0.08b    (C)ChaN, 2011
 /----------------------------------------------------------------------------/
 /----------------------------------------------------------------------------/
 / FatFs module is a generic FAT file system module for small embedded systems.
 / FatFs module is a generic FAT file system module for small embedded systems.
 / This is a free software that opened for education, research and commercial
 / This is a free software that opened for education, research and commercial
 / developments under license policy of following trems.
 / developments under license policy of following trems.
 /
 /
-/  Copyright (C) 2009, ChaN, all right reserved.
+/  Copyright (C) 2011, ChaN, all right reserved.
 /
 /
 / * The FatFs module is a free software and there is NO WARRANTY.
 / * The FatFs module is a free software and there is NO WARRANTY.
 / * No restriction on use. You can use, modify and redistribute it for
 / * No restriction on use. You can use, modify and redistribute it for
 /   personal, non-profit or commercial product UNDER YOUR RESPONSIBILITY.
 /   personal, non-profit or commercial product UNDER YOUR RESPONSIBILITY.
 / * Redistributions of source code must retain the above copyright notice.
 / * Redistributions of source code must retain the above copyright notice.
+/
 /----------------------------------------------------------------------------*/
 /----------------------------------------------------------------------------*/
 
 
 #ifndef _FATFS
 #ifndef _FATFS
-#define _FATFS	0x007E
+#define _FATFS	8237	/* Revision ID */
+
+#ifdef __cplusplus
+extern "C" {
+#endif
 
 
 #include <rtthread.h>
 #include <rtthread.h>
 #include "integer.h"	/* Basic integer types */
 #include "integer.h"	/* Basic integer types */
 #include "ffconf.h"		/* FatFs configuration options */
 #include "ffconf.h"		/* FatFs configuration options */
 
 
-#if _FATFS != _FFCONFIG
+#if _FATFS != _FFCONF
 #error Wrong configuration file (ffconf.h).
 #error Wrong configuration file (ffconf.h).
 #endif
 #endif
 
 
 
 
-/* DBCS code ranges and SBCS extend char conversion table */
-
-#if _CODE_PAGE == 932	/* Japanese Shift-JIS */
-#define _DF1S	0x81	/* DBC 1st byte range 1 start */
-#define _DF1E	0x9F	/* DBC 1st byte range 1 end */
-#define _DF2S	0xE0	/* DBC 1st byte range 2 start */
-#define _DF2E	0xFC	/* DBC 1st byte range 2 end */
-#define _DS1S	0x40	/* DBC 2nd byte range 1 start */
-#define _DS1E	0x7E	/* DBC 2nd byte range 1 end */
-#define _DS2S	0x80	/* DBC 2nd byte range 2 start */
-#define _DS2E	0xFC	/* DBC 2nd byte range 2 end */
-
-#elif _CODE_PAGE == 936	/* Simplified Chinese GBK */
-#define _DF1S	0x81
-#define _DF1E	0xFE
-#define _DS1S	0x40
-#define _DS1E	0x7E
-#define _DS2S	0x80
-#define _DS2E	0xFE
-
-#elif _CODE_PAGE == 949	/* Korean */
-#define _DF1S	0x81
-#define _DF1E	0xFE
-#define _DS1S	0x41
-#define _DS1E	0x5A
-#define _DS2S	0x61
-#define _DS2E	0x7A
-#define _DS3S	0x81
-#define _DS3E	0xFE
-
-#elif _CODE_PAGE == 950	/* Traditional Chinese Big5 */
-#define _DF1S	0x81
-#define _DF1E	0xFE
-#define _DS1S	0x40
-#define _DS1E	0x7E
-#define _DS2S	0xA1
-#define _DS2E	0xFE
-
-#elif _CODE_PAGE == 437	/* U.S. (OEM) */
-#define _DF1S	0
-#define _EXCVT {0x80,0x9A,0x90,0x41,0x8E,0x41,0x8F,0x80,0x45,0x45,0x45,0x49,0x49,0x49,0x8E,0x8F,0x90,0x92,0x92,0x4F,0x99,0x4F,0x55,0x55,0x59,0x99,0x9A,0x9B,0x9C,0x9D,0x9E,0x9F, \
-				0x41,0x49,0x4F,0x55,0xA5,0xA5,0xA6,0xA7,0xA8,0xA9,0xAA,0xAB,0xAC,0x21,0xAE,0xAF,0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBE,0xBF, \
-				0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF,0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF, \
-				0xE0,0xE1,0xE2,0xE3,0xE4,0xE5,0xE6,0xE7,0xE8,0xE9,0xEA,0xEB,0xEC,0xED,0xEE,0xEF,0xF0,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF7,0xF8,0xF9,0xFA,0xFB,0xFC,0xFD,0xFE,0xFF}
-
-#elif _CODE_PAGE == 720	/* Arabic (OEM) */
-#define _DF1S	0
-#define _EXCVT {0x80,0x81,0x45,0x41,0x84,0x41,0x86,0x43,0x45,0x45,0x45,0x49,0x49,0x8D,0x8E,0x8F,0x90,0x92,0x92,0x93,0x94,0x95,0x49,0x49,0x98,0x99,0x9A,0x9B,0x9C,0x9D,0x9E,0x9F, \
-				0xA0,0xA1,0xA2,0xA3,0xA4,0xA5,0xA6,0xA7,0xA8,0xA9,0xAA,0xAB,0xAC,0xAD,0xAE,0xAF,0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBE,0xBF, \
-				0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF,0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF, \
-				0xE0,0xE1,0xE2,0xE3,0xE4,0xE5,0xE6,0xE7,0xE8,0xE9,0xEA,0xEB,0xEC,0xED,0xEE,0xEF,0xF0,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF7,0xF8,0xF9,0xFA,0xFB,0xFC,0xFD,0xFE,0xFF}
-
-#elif _CODE_PAGE == 737	/* Greek (OEM) */
-#define _DF1S	0
-#define _EXCVT {0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,0x88,0x89,0x8A,0x8B,0x8C,0x8D,0x8E,0x8F,0x90,0x92,0x92,0x93,0x94,0x95,0x96,0x97,0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87, \
-				0x88,0x89,0x8A,0x8B,0x8C,0x8D,0x8E,0x8F,0x90,0x91,0xAA,0x92,0x93,0x94,0x95,0x96,0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBE,0xBF, \
-				0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF,0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF, \
-				0x97,0xEA,0xEB,0xEC,0xE4,0xED,0xEE,0xE7,0xE8,0xF1,0xEA,0xEB,0xEC,0xED,0xEE,0xEF,0xF0,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF7,0xF8,0xF9,0xFA,0xFB,0xFC,0xFD,0xFE,0xFF}
-
-#elif _CODE_PAGE == 775	/* Baltic (OEM) */
-#define _DF1S	0
-#define _EXCVT {0x80,0x9A,0x91,0xA0,0x8E,0x95,0x8F,0x80,0xAD,0xED,0x8A,0x8A,0xA1,0x8D,0x8E,0x8F,0x90,0x92,0x92,0xE2,0x99,0x95,0x96,0x97,0x97,0x99,0x9A,0x9D,0x9C,0x9D,0x9E,0x9F, \
-				0xA0,0xA1,0xE0,0xA3,0xA3,0xA5,0xA6,0xA7,0xA8,0xA9,0xAA,0xAB,0xAC,0xAD,0xAE,0xAF,0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBE,0xBF, \
-				0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF,0xB5,0xB6,0xB7,0xB8,0xBD,0xBE,0xC6,0xC7,0xA5,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF, \
-				0xE0,0xE1,0xE2,0xE3,0xE5,0xE5,0xE6,0xE3,0xE8,0xE8,0xEA,0xEA,0xEE,0xED,0xEE,0xEF,0xF0,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF7,0xF8,0xF9,0xFA,0xFB,0xFC,0xFD,0xFE,0xFF}
-
-#elif _CODE_PAGE == 850	/* Multilingual Latin 1 (OEM) */
-#define _DF1S	0
-#define _EXCVT {0x80,0x9A,0x90,0xB6,0x8E,0xB7,0x8F,0x80,0xD2,0xD3,0xD4,0xD8,0xD7,0xDE,0x8E,0x8F,0x90,0x92,0x92,0xE2,0x99,0xE3,0xEA,0xEB,0x59,0x99,0x9A,0x9D,0x9C,0x9D,0x9E,0x9F, \
-				0xB5,0xD6,0xE0,0xE9,0xA5,0xA5,0xA6,0xA7,0xA8,0xA9,0xAA,0xAB,0xAC,0x21,0xAE,0xAF,0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBE,0xBF, \
-				0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC7,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF,0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF, \
-				0xE0,0xE1,0xE2,0xE3,0xE5,0xE5,0xE6,0xE7,0xE7,0xE9,0xEA,0xEB,0xED,0xED,0xEE,0xEF,0xF0,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF7,0xF8,0xF9,0xFA,0xFB,0xFC,0xFD,0xFE,0xFF}
-
-#elif _CODE_PAGE == 852	/* Latin 2 (OEM) */
-#define _DF1S	0
-#define _EXCVT {0x80,0x9A,0x90,0xB6,0x8E,0xDE,0x8F,0x80,0x9D,0xD3,0x8A,0x8A,0xD7,0x8D,0x8E,0x8F,0x90,0x91,0x91,0xE2,0x99,0x95,0x95,0x97,0x97,0x99,0x9A,0x9B,0x9B,0x9D,0x9E,0x9F, \
-				0xB5,0xD6,0xE0,0xE9,0xA4,0xA4,0xA6,0xA6,0xA8,0xA8,0xAA,0x8D,0xAC,0xB8,0xAE,0xAF,0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBD,0xBF, \
-				0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC6,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF,0xD1,0xD1,0xD2,0xD3,0xD2,0xD5,0xD6,0xD7,0xB7,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF, \
-				0xE0,0xE1,0xE2,0xE3,0xE3,0xD5,0xE6,0xE6,0xE8,0xE9,0xE8,0xEB,0xED,0xED,0xDD,0xEF,0xF0,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF7,0xF8,0xF9,0xFA,0xEB,0xFC,0xFC,0xFE,0xFF}
-
-#elif _CODE_PAGE == 855	/* Cyrillic (OEM) */
-#define _DF1S	0
-#define _EXCVT {0x81,0x81,0x83,0x83,0x85,0x85,0x87,0x87,0x89,0x89,0x8B,0x8B,0x8D,0x8D,0x8F,0x8F,0x91,0x91,0x93,0x93,0x95,0x95,0x97,0x97,0x99,0x99,0x9B,0x9B,0x9D,0x9D,0x9F,0x9F, \
-				0xA1,0xA1,0xA3,0xA3,0xA5,0xA5,0xA7,0xA7,0xA9,0xA9,0xAB,0xAB,0xAD,0xAD,0xAE,0xAF,0xB0,0xB1,0xB2,0xB3,0xB4,0xB6,0xB6,0xB8,0xB8,0xB9,0xBA,0xBB,0xBC,0xBE,0xBE,0xBF, \
-				0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC7,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF,0xD1,0xD1,0xD3,0xD3,0xD5,0xD5,0xD7,0xD7,0xDD,0xD9,0xDA,0xDB,0xDC,0xDD,0xE0,0xDF, \
-				0xE0,0xE2,0xE2,0xE4,0xE4,0xE6,0xE6,0xE8,0xE8,0xEA,0xEA,0xEC,0xEC,0xEE,0xEE,0xEF,0xF0,0xF2,0xF2,0xF4,0xF4,0xF6,0xF6,0xF8,0xF8,0xFA,0xFA,0xFC,0xFC,0xFD,0xFE,0xFF}
-
-#elif _CODE_PAGE == 857	/* Turkish (OEM) */
-#define _DF1S	0
-#define _EXCVT {0x80,0x9A,0x90,0xB6,0x8E,0xB7,0x8F,0x80,0xD2,0xD3,0xD4,0xD8,0xD7,0x98,0x8E,0x8F,0x90,0x92,0x92,0xE2,0x99,0xE3,0xEA,0xEB,0x98,0x99,0x9A,0x9D,0x9C,0x9D,0x9E,0x9E, \
-				0xB5,0xD6,0xE0,0xE9,0xA5,0xA5,0xA6,0xA6,0xA8,0xA9,0xAA,0xAB,0xAC,0x21,0xAE,0xAF,0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBE,0xBF, \
-				0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC7,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF,0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF, \
-				0xE0,0xE1,0xE2,0xE3,0xE5,0xE5,0xE6,0xE7,0xE8,0xE9,0xEA,0xEB,0xDE,0x59,0xEE,0xEF,0xF0,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF7,0xF8,0xF9,0xFA,0xFB,0xFC,0xFD,0xFE,0xFF}
-
-#elif _CODE_PAGE == 858	/* Multilingual Latin 1 + Euro (OEM) */
-#define _DF1S	0
-#define _EXCVT {0x80,0x9A,0x90,0xB6,0x8E,0xB7,0x8F,0x80,0xD2,0xD3,0xD4,0xD8,0xD7,0xDE,0x8E,0x8F,0x90,0x92,0x92,0xE2,0x99,0xE3,0xEA,0xEB,0x59,0x99,0x9A,0x9D,0x9C,0x9D,0x9E,0x9F, \
-				0xB5,0xD6,0xE0,0xE9,0xA5,0xA5,0xA6,0xA7,0xA8,0xA9,0xAA,0xAB,0xAC,0x21,0xAE,0xAF,0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBE,0xBF, \
-				0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC7,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF,0xD1,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF, \
-				0xE0,0xE1,0xE2,0xE3,0xE5,0xE5,0xE6,0xE7,0xE7,0xE9,0xEA,0xEB,0xED,0xED,0xEE,0xEF,0xF0,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF7,0xF8,0xF9,0xFA,0xFB,0xFC,0xFD,0xFE,0xFF}
-
-#elif _CODE_PAGE == 862	/* Hebrew (OEM) */
-#define _DF1S	0
-#define _EXCVT {0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,0x88,0x89,0x8A,0x8B,0x8C,0x8D,0x8E,0x8F,0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97,0x98,0x99,0x9A,0x9B,0x9C,0x9D,0x9E,0x9F, \
-				0x41,0x49,0x4F,0x55,0xA5,0xA5,0xA6,0xA7,0xA8,0xA9,0xAA,0xAB,0xAC,0x21,0xAE,0xAF,0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBE,0xBF, \
-				0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF,0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF, \
-				0xE0,0xE1,0xE2,0xE3,0xE4,0xE5,0xE6,0xE7,0xE8,0xE9,0xEA,0xEB,0xEC,0xED,0xEE,0xEF,0xF0,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF7,0xF8,0xF9,0xFA,0xFB,0xFC,0xFD,0xFE,0xFF}
-
-#elif _CODE_PAGE == 866	/* Russian (OEM) */
-#define _DF1S	0
-#define _EXCVT {0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,0x88,0x89,0x8A,0x8B,0x8C,0x8D,0x8E,0x8F,0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97,0x98,0x99,0x9A,0x9B,0x9C,0x9D,0x9E,0x9F, \
-				0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,0x88,0x89,0x8A,0x8B,0x8C,0x8D,0x8E,0x8F,0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBE,0xBF, \
-				0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF,0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF, \
-				0x90,0x91,0x92,0x93,0x9d,0x95,0x96,0x97,0x98,0x99,0x9A,0x9B,0x9C,0x9D,0x9E,0x9F,0xF0,0xF0,0xF2,0xF2,0xF4,0xF4,0xF6,0xF6,0xF8,0xF9,0xFA,0xFB,0xFC,0xFD,0xFE,0xFF}
-
-#elif _CODE_PAGE == 874	/* Thai (OEM, Windows) */
-#define _DF1S	0
-#define _EXCVT {0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,0x88,0x89,0x8A,0x8B,0x8C,0x8D,0x8E,0x8F,0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97,0x98,0x99,0x9A,0x9B,0x9C,0x9D,0x9E,0x9F, \
-				0xA0,0xA1,0xA2,0xA3,0xA4,0xA5,0xA6,0xA7,0xA8,0xA9,0xAA,0xAB,0xAC,0xAD,0xAE,0xAF,0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBE,0xBF, \
-				0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF,0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF, \
-				0xE0,0xE1,0xE2,0xE3,0xE4,0xE5,0xE6,0xE7,0xE8,0xE9,0xEA,0xEB,0xEC,0xED,0xEE,0xEF,0xF0,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF7,0xF8,0xF9,0xFA,0xFB,0xFC,0xFD,0xFE,0xFF}
-
-#elif _CODE_PAGE == 1250 /* Central Europe (Windows) */
-#define _DF1S	0
-#define _EXCVT {0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,0x88,0x89,0x8A,0x8B,0x8C,0x8D,0x8E,0x8F,0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97,0x98,0x99,0x8A,0x9B,0x8C,0x8D,0x8E,0x8F, \
-				0xA0,0xA1,0xA2,0xA3,0xA4,0xA5,0xA6,0xA7,0xA8,0xA9,0xAA,0xAB,0xAC,0xAD,0xAE,0xAF,0xB0,0xB1,0xB2,0xA3,0xB4,0xB5,0xB6,0xB7,0xB8,0xA5,0xAA,0xBB,0xBC,0xBD,0xBC,0xAF, \
-				0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF,0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF, \
-				0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF,0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xF7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xFF}
-
-#elif _CODE_PAGE == 1251 /* Cyrillic (Windows) */
-#define _DF1S	0
-#define _EXCVT {0x80,0x81,0x82,0x82,0x84,0x85,0x86,0x87,0x88,0x89,0x8A,0x8B,0x8C,0x8D,0x8E,0x8F,0x80,0x91,0x92,0x93,0x94,0x95,0x96,0x97,0x98,0x99,0x8A,0x9B,0x8C,0x8D,0x8E,0x8F, \
-				0xA0,0xA2,0xA2,0xA3,0xA4,0xA5,0xA6,0xA7,0xA8,0xA9,0xAA,0xAB,0xAC,0xAD,0xAE,0xAF,0xB0,0xB1,0xB2,0xB2,0xA5,0xB5,0xB6,0xB7,0xA8,0xB9,0xAA,0xBB,0xA3,0xBD,0xBD,0xAF, \
-				0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF,0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF, \
-				0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF,0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF}
-
-#elif _CODE_PAGE == 1252 /* Latin 1 (Windows) */
-#define _DF1S	0
-#define _EXCVT {0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,0x88,0x89,0x8A,0x8B,0x8C,0x8D,0x8E,0x8F,0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97,0x98,0x99,0xAd,0x9B,0x8C,0x9D,0xAE,0x9F, \
-				0xA0,0x21,0xA2,0xA3,0xA4,0xA5,0xA6,0xA7,0xA8,0xA9,0xAA,0xAB,0xAC,0xAD,0xAE,0xAF,0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBE,0xBF, \
-				0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF,0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF, \
-				0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF,0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xF7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0x9F}
-
-#elif _CODE_PAGE == 1253 /* Greek (Windows) */
-#define _DF1S	0
-#define _EXCVT {0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,0x88,0x89,0x8A,0x8B,0x8C,0x8D,0x8E,0x8F,0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97,0x98,0x99,0x9A,0x9B,0x9C,0x9D,0x9E,0x9F, \
-				0xA0,0xA1,0xA2,0xA3,0xA4,0xA5,0xA6,0xA7,0xA8,0xA9,0xAA,0xAB,0xAC,0xAD,0xAE,0xAF,0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBE,0xBF, \
-				0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF,0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xA2,0xB8,0xB9,0xBA, \
-				0xE0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF,0xD0,0xD1,0xF2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xFB,0xBC,0xFD,0xBF,0xFF}
-
-#elif _CODE_PAGE == 1254 /* Turkish (Windows) */
-#define _DF1S	0
-#define _EXCVT {0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,0x88,0x89,0x8A,0x8B,0x8C,0x8D,0x8E,0x8F,0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97,0x98,0x99,0x8A,0x9B,0x8C,0x9D,0x9E,0x9F, \
-				0xA0,0x21,0xA2,0xA3,0xA4,0xA5,0xA6,0xA7,0xA8,0xA9,0xAA,0xAB,0xAC,0xAD,0xAE,0xAF,0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBE,0xBF, \
-				0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF,0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF, \
-				0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF,0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xF7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0x9F}
-
-#elif _CODE_PAGE == 1255 /* Hebrew (Windows) */
-#define _DF1S	0
-#define _EXCVT {0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,0x88,0x89,0x8A,0x8B,0x8C,0x8D,0x8E,0x8F,0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97,0x98,0x99,0x9A,0x9B,0x9C,0x9D,0x9E,0x9F, \
-				0xA0,0x21,0xA2,0xA3,0xA4,0xA5,0xA6,0xA7,0xA8,0xA9,0xAA,0xAB,0xAC,0xAD,0xAE,0xAF,0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBE,0xBF, \
-				0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF,0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF, \
-				0xE0,0xE1,0xE2,0xE3,0xE4,0xE5,0xE6,0xE7,0xE8,0xE9,0xEA,0xEB,0xEC,0xED,0xEE,0xEF,0xF0,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF7,0xF8,0xF9,0xFA,0xFB,0xFC,0xFD,0xFE,0xFF}
-
-#elif _CODE_PAGE == 1256 /* Arabic (Windows) */
-#define _DF1S	0
-#define _EXCVT {0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,0x88,0x89,0x8A,0x8B,0x8C,0x8D,0x8E,0x8F,0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97,0x98,0x99,0x9A,0x9B,0x8C,0x9D,0x9E,0x9F, \
-				0xA0,0xA1,0xA2,0xA3,0xA4,0xA5,0xA6,0xA7,0xA8,0xA9,0xAA,0xAB,0xAC,0xAD,0xAE,0xAF,0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBE,0xBF, \
-				0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF,0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF, \
-				0x41,0xE1,0x41,0xE3,0xE4,0xE5,0xE6,0x43,0x45,0x45,0x45,0x45,0xEC,0xED,0x49,0x49,0xF0,0xF1,0xF2,0xF3,0x4F,0xF5,0xF6,0xF7,0xF8,0x55,0xFA,0x55,0x55,0xFD,0xFE,0xFF}
-
-#elif _CODE_PAGE == 1257 /* Baltic (Windows) */
-#define _DF1S	0
-#define _EXCVT {0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,0x88,0x89,0x8A,0x8B,0x8C,0x8D,0x8E,0x8F,0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97,0x98,0x99,0x9A,0x9B,0x9C,0x9D,0x9E,0x9F, \
-				0xA0,0xA1,0xA2,0xA3,0xA4,0xA5,0xA6,0xA7,0xA8,0xA9,0xAA,0xAB,0xAC,0xAD,0xAE,0xAF,0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xA8,0xB9,0xAA,0xBB,0xBC,0xBD,0xBE,0xAF, \
-				0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF,0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF, \
-				0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF,0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xF7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xFF}
-
-#elif _CODE_PAGE == 1258 /* Vietnam (OEM, Windows) */
-#define _DF1S	0
-#define _EXCVT {0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,0x88,0x89,0x8A,0x8B,0x8C,0x8D,0x8E,0x8F,0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97,0x98,0x99,0x9A,0x9B,0xAC,0x9D,0x9E,0x9F, \
-				0xA0,0x21,0xA2,0xA3,0xA4,0xA5,0xA6,0xA7,0xA8,0xA9,0xAA,0xAB,0xAC,0xAD,0xAE,0xAF,0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBE,0xBF, \
-				0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF,0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF, \
-				0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xEC,0xCD,0xCE,0xCF,0xD0,0xD1,0xF2,0xD3,0xD4,0xD5,0xD6,0xF7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xFE,0x9F}
-
-#elif _CODE_PAGE == 1	/* ASCII (for only non-LFN cfg) */
-#define _DF1S	0
-
-#else
-#error Unknown code page
-
-#endif
-
-
-
-/* Character code support macros */
-
-#define IsUpper(c)	(((c)>='A')&&((c)<='Z'))
-#define IsLower(c)	(((c)>='a')&&((c)<='z'))
-
-#if _DF1S		/* DBCS configuration */
-
-#ifdef _DF2S	/* Two 1st byte areas */
-#define IsDBCS1(c)	(((BYTE)(c) >= _DF1S && (BYTE)(c) <= _DF1E) || ((BYTE)(c) >= _DF2S && (BYTE)(c) <= _DF2E))
-#else			/* One 1st byte area */
-#define IsDBCS1(c)	((BYTE)(c) >= _DF1S && (BYTE)(c) <= _DF1E)
-#endif
-
-#ifdef _DS3S	/* Three 2nd byte areas */
-#define IsDBCS2(c)	(((BYTE)(c) >= _DS1S && (BYTE)(c) <= _DS1E) || ((BYTE)(c) >= _DS2S && (BYTE)(c) <= _DS2E) || ((BYTE)(c) >= _DS3S && (BYTE)(c) <= _DS3E))
-#else			/* Two 2nd byte areas */
-#define IsDBCS2(c)	(((BYTE)(c) >= _DS1S && (BYTE)(c) <= _DS1E) || ((BYTE)(c) >= _DS2S && (BYTE)(c) <= _DS2E))
-#endif
-
-#else			/* SBCS configuration */
-
-#define IsDBCS1(c)	0
-#define IsDBCS2(c)	0
 
 
-#endif /* _DF1S */
-
-
-
-/* Definitions corresponds to multi partition */
+/* Definitions of volume management */
 
 
 #if _MULTI_PARTITION		/* Multiple partition configuration */
 #if _MULTI_PARTITION		/* Multiple partition configuration */
-
-typedef struct _PARTITION {
+#define LD2PD(vol) (VolToPart[vol].pd)	/* Get physical drive# */
+#define LD2PT(vol) (VolToPart[vol].pt)	/* Get partition# */
+typedef struct {
 	BYTE pd;	/* Physical drive# */
 	BYTE pd;	/* Physical drive# */
 	BYTE pt;	/* Partition # (0-3) */
 	BYTE pt;	/* Partition # (0-3) */
 } PARTITION;
 } PARTITION;
-
-extern
-const PARTITION Drives[];			/* Logical drive# to physical location conversion table */
-#define LD2PD(drv) (Drives[drv].pd)	/* Get physical drive# */
-#define LD2PT(drv) (Drives[drv].pt)	/* Get partition# */
+extern const PARTITION VolToPart[];	/* Volume - Physical location resolution table */
 
 
 #else						/* Single partition configuration */
 #else						/* Single partition configuration */
-
-#define LD2PD(drv) (drv)	/* Physical drive# is equal to the logical drive# */
-#define LD2PT(drv) 0		/* Always mounts the 1st partition */
+#define LD2PD(vol) (vol)	/* Logical drive# is bound to the same physical drive# */
+#define LD2PT(vol) 0		/* Always mounts the 1st partition */
 
 
 #endif
 #endif
 
 
 
 
 
 
-/* Definitions corresponds to multiple sector size */
-
-#if _MAX_SS == 512		/* Single sector size */
-#define	SS(fs)	512U
-
-#elif _MAX_SS == 1024 || _MAX_SS == 2048 || _MAX_SS == 4096	/* Multiple sector size */
-#define	SS(fs)	((fs)->s_size)
-
-#else
-#error Sector size must be 512, 1024, 2048 or 4096.
+/* Type of path name strings on FatFs API */
 
 
+#if _LFN_UNICODE			/* Unicode string */
+#if !_USE_LFN
+#error _LFN_UNICODE must be 0 in non-LFN cfg.
+#endif
+#ifndef _INC_TCHAR
+typedef WCHAR TCHAR;
+#define _T(x) L ## x
+#define _TEXT(x) L ## x
 #endif
 #endif
 
 
+#else						/* ANSI/OEM string */
+#ifndef _INC_TCHAR
+typedef char TCHAR;
+#define _T(x) x
+#define _TEXT(x) x
+#endif
 
 
-
-/* Type of file name on FatFs API */
-
-#if _LFN_UNICODE && _USE_LFN
-typedef WCHAR XCHAR;	/* Unicode */
-#else
-typedef char XCHAR;		/* SBCS, DBCS */
 #endif
 #endif
 
 
 
 
 
 
-/* File system object structure */
+/* File system object structure (FATFS) */
 
 
-typedef struct _FATFS_ {
-	BYTE	fs_type;	/* FAT sub type */
-	BYTE	drive;		/* Physical drive number */
-	BYTE	csize;		/* Number of sectors per cluster */
-	BYTE	n_fats;		/* Number of FAT copies */
-	BYTE	wflag;		/* win[] dirty flag (1:must be written back) */
-	BYTE	fsi_flag;	/* fsinfo dirty flag (1:must be written back) */
-	WORD	id;			/* File system mount ID */
-	WORD	n_rootdir;	/* Number of root directory entries (0 on FAT32) */
-#if _FS_REENTRANT
-	_SYNC_t	sobj;		/* Identifier of sync object */
-#endif
+typedef struct {
+	BYTE	fs_type;		/* FAT sub-type (0:Not mounted) */
+	BYTE	drv;			/* Physical drive number */
+	BYTE	csize;			/* Sectors per cluster (1,2,4...128) */
+	BYTE	n_fats;			/* Number of FAT copies (1,2) */
+	BYTE	wflag;			/* win[] dirty flag (1:must be written back) */
+	BYTE	fsi_flag;		/* fsinfo dirty flag (1:must be written back) */
+	WORD	id;				/* File system mount ID */
+	WORD	n_rootdir;		/* Number of root directory entries (FAT12/16) */
 #if _MAX_SS != 512
 #if _MAX_SS != 512
-	WORD	s_size;		/* Sector size */
+	WORD	ssize;			/* Bytes per sector (512,1024,2048,4096) */
+#endif
+#if _FS_REENTRANT
+	_SYNC_t	sobj;			/* Identifier of sync object */
 #endif
 #endif
 #if !_FS_READONLY
 #if !_FS_READONLY
-	DWORD	last_clust;	/* Last allocated cluster */
-	DWORD	free_clust;	/* Number of free clusters */
-	DWORD	fsi_sector;	/* fsinfo sector */
+	DWORD	last_clust;		/* Last allocated cluster */
+	DWORD	free_clust;		/* Number of free clusters */
+	DWORD	fsi_sector;		/* fsinfo sector (FAT32) */
 #endif
 #endif
 #if _FS_RPATH
 #if _FS_RPATH
-	DWORD	cdir;		/* Current directory (0:root)*/
+	DWORD	cdir;			/* Current directory start cluster (0:root) */
 #endif
 #endif
-	DWORD	sects_fat;	/* Sectors per fat */
-	DWORD	max_clust;	/* Maximum cluster# + 1. Number of clusters is max_clust - 2 */
-	DWORD	fatbase;	/* FAT start sector */
-	DWORD	dirbase;	/* Root directory start sector (Cluster# on FAT32) */
-	DWORD	database;	/* Data start sector */
-	DWORD	winsect;	/* Current sector appearing in the win[] */
-	BYTE	win[_MAX_SS];/* Disk access window for Directory/FAT */
+	DWORD	n_fatent;		/* Number of FAT entries (= number of clusters + 2) */
+	DWORD	fsize;			/* Sectors per FAT */
+	DWORD	fatbase;		/* FAT start sector */
+	DWORD	dirbase;		/* Root directory start sector (FAT32:Cluster#) */
+	DWORD	database;		/* Data start sector */
+	DWORD	winsect;		/* Current sector appearing in the win[] */
+	BYTE	win[_MAX_SS];	/* Disk access window for Directory, FAT (and Data on tiny cfg) */
 } FATFS;
 } FATFS;
 
 
 
 
 
 
-/* Directory object structure */
+/* File object structure (FIL) */
 
 
-typedef struct _DIR_ {
-	FATFS*	fs;			/* Pointer to the owner file system object */
-	WORD	id;			/* Owner file system mount ID */
-	WORD	index;		/* Current read/write index number */
-	DWORD	sclust;		/* Table start cluster (0:Static table) */
-	DWORD	clust;		/* Current cluster */
-	DWORD	sect;		/* Current sector */
-	BYTE*	dir;		/* Pointer to the current SFN entry in the win[] */
-	BYTE*	fn;			/* Pointer to the SFN (in/out) {file[8],ext[3],status[1]} */
-#if _USE_LFN
-	WCHAR*	lfn;		/* Pointer to the LFN working buffer */
-	WORD	lfn_idx;	/* Last matched LFN index number (0xFFFF:No LFN) */
+typedef struct {
+	FATFS*	fs;				/* Pointer to the owner file system object */
+	WORD	id;				/* Owner file system mount ID */
+	BYTE	flag;			/* File status flags */
+	BYTE	pad1;
+	DWORD	fptr;			/* File read/write pointer (0 on file open) */
+	DWORD	fsize;			/* File size */
+	DWORD	sclust;			/* File start cluster (0 when fsize==0) */
+	DWORD	clust;			/* Current cluster */
+	DWORD	dsect;			/* Current data sector */
+#if !_FS_READONLY
+	DWORD	dir_sect;		/* Sector containing the directory entry */
+	BYTE*	dir_ptr;		/* Ponter to the directory entry in the window */
 #endif
 #endif
-} DIR;
+#if _USE_FASTSEEK
+	DWORD*	cltbl;			/* Pointer to the cluster link map table (null on file open) */
+#endif
+#if _FS_SHARE
+	UINT	lockid;			/* File lock ID (index of file semaphore table) */
+#endif
+#if !_FS_TINY
+	BYTE	buf[_MAX_SS];	/* File data read/write buffer */
+#endif
+} FIL;
 
 
 
 
 
 
-/* File object structure */
+/* Directory object structure (DIR) */
 
 
-typedef struct _FIL_ {
-	FATFS*	fs;			/* Pointer to the owner file system object */
-	WORD	id;			/* Owner file system mount ID */
-	BYTE	flag;		/* File status flags */
-	BYTE	csect;		/* Sector address in the cluster */
-	DWORD	fptr;		/* File R/W pointer */
-	DWORD	fsize;		/* File size */
-	DWORD	org_clust;	/* File start cluster */
-	DWORD	curr_clust;	/* Current cluster */
-	DWORD	dsect;		/* Current data sector */
-#if !_FS_READONLY
-	DWORD	dir_sect;	/* Sector containing the directory entry */
-	BYTE*	dir_ptr;	/* Ponter to the directory entry in the window */
-#endif
-#if !_FS_TINY
-	BYTE	buf[_MAX_SS];/* File R/W buffer */
+typedef struct {
+	FATFS*	fs;				/* Pointer to the owner file system object */
+	WORD	id;				/* Owner file system mount ID */
+	WORD	index;			/* Current read/write index number */
+	DWORD	sclust;			/* Table start cluster (0:Root dir) */
+	DWORD	clust;			/* Current cluster */
+	DWORD	sect;			/* Current sector */
+	BYTE*	dir;			/* Pointer to the current SFN entry in the win[] */
+	BYTE*	fn;				/* Pointer to the SFN (in/out) {file[8],ext[3],status[1]} */
+#if _USE_LFN
+	WCHAR*	lfn;			/* Pointer to the LFN working buffer */
+	WORD	lfn_idx;		/* Last matched LFN index number (0xFFFF:No LFN) */
 #endif
 #endif
-} FIL;
+} DIR;
 
 
 
 
 
 
-/* File status structure */
+/* File status structure (FILINFO) */
 
 
-typedef struct _FILINFO_ {
-	DWORD	fsize;		/* File size */
-	WORD	fdate;		/* Last modified date */
-	WORD	ftime;		/* Last modified time */
-	BYTE	fattrib;	/* Attribute */
-	char	fname[13];	/* Short file name (8.3 format) */
+typedef struct {
+	DWORD	fsize;			/* File size */
+	WORD	fdate;			/* Last modified date */
+	WORD	ftime;			/* Last modified time */
+	BYTE	fattrib;		/* Attribute */
+	TCHAR	fname[13];		/* Short file name (8.3 format) */
 #if _USE_LFN
 #if _USE_LFN
-	XCHAR*	lfname;		/* Pointer to the LFN buffer */
-	int 	lfsize;		/* Size of LFN buffer [chrs] */
+	TCHAR*	lfname;			/* Pointer to the LFN buffer */
+	UINT 	lfsize;			/* Size of LFN buffer in TCHAR */
 #endif
 #endif
 } FILINFO;
 } FILINFO;
 
 
@@ -393,22 +176,25 @@ typedef struct _FILINFO_ {
 /* File function return code (FRESULT) */
 /* File function return code (FRESULT) */
 
 
 typedef enum {
 typedef enum {
-	FR_OK = 0,			/* 0 */
-	FR_DISK_ERR,		/* 1 */
-	FR_INT_ERR,			/* 2 */
-	FR_NOT_READY,		/* 3 */
-	FR_NO_FILE,			/* 4 */
-	FR_NO_PATH,			/* 5 */
-	FR_INVALID_NAME,	/* 6 */
-	FR_DENIED,			/* 7 */
-	FR_EXIST,			/* 8 */
-	FR_INVALID_OBJECT,	/* 9 */
-	FR_WRITE_PROTECTED,	/* 10 */
-	FR_INVALID_DRIVE,	/* 11 */
-	FR_NOT_ENABLED,		/* 12 */
-	FR_NO_FILESYSTEM,	/* 13 */
-	FR_MKFS_ABORTED,	/* 14 */
-	FR_TIMEOUT			/* 15 */
+	FR_OK = 0,				/* (0) Succeeded */
+	FR_DISK_ERR,			/* (1) A hard error occured in the low level disk I/O layer */
+	FR_INT_ERR,				/* (2) Assertion failed */
+	FR_NOT_READY,			/* (3) The physical drive cannot work */
+	FR_NO_FILE,				/* (4) Could not find the file */
+	FR_NO_PATH,				/* (5) Could not find the path */
+	FR_INVALID_NAME,		/* (6) The path name format is invalid */
+	FR_DENIED,				/* (7) Acces denied due to prohibited access or directory full */
+	FR_EXIST,				/* (8) Acces denied due to prohibited access */
+	FR_INVALID_OBJECT,		/* (9) The file/directory object is invalid */
+	FR_WRITE_PROTECTED,		/* (10) The physical drive is write protected */
+	FR_INVALID_DRIVE,		/* (11) The logical drive number is invalid */
+	FR_NOT_ENABLED,			/* (12) The volume has no work area */
+	FR_NO_FILESYSTEM,		/* (13) There is no valid FAT volume on the physical drive */
+	FR_MKFS_ABORTED,		/* (14) The f_mkfs() aborted due to any parameter error */
+	FR_TIMEOUT,				/* (15) Could not get a grant to access the volume within defined period */
+	FR_LOCKED,				/* (16) The operation is rejected according to the file shareing policy */
+	FR_NOT_ENOUGH_CORE,		/* (17) LFN working buffer could not be allocated */
+	FR_TOO_MANY_OPEN_FILES	/* (18) Number of open files > _FS_SHARE */
 } FRESULT;
 } FRESULT;
 
 
 
 
@@ -417,66 +203,73 @@ typedef enum {
 /* FatFs module application interface                           */
 /* FatFs module application interface                           */
 
 
 FRESULT f_mount (BYTE, FATFS*);						/* Mount/Unmount a logical drive */
 FRESULT f_mount (BYTE, FATFS*);						/* Mount/Unmount a logical drive */
-FRESULT f_open (FIL*, const XCHAR*, BYTE);			/* Open or create a file */
+FRESULT f_open (FIL*, const TCHAR*, BYTE);			/* Open or create a file */
 FRESULT f_read (FIL*, void*, UINT, UINT*);			/* Read data from a file */
 FRESULT f_read (FIL*, void*, UINT, UINT*);			/* Read data from a file */
-FRESULT f_write (FIL*, const void*, UINT, UINT*);	/* Write data to a file */
 FRESULT f_lseek (FIL*, DWORD);						/* Move file pointer of a file object */
 FRESULT f_lseek (FIL*, DWORD);						/* Move file pointer of a file object */
 FRESULT f_close (FIL*);								/* Close an open file object */
 FRESULT f_close (FIL*);								/* Close an open file object */
-FRESULT f_opendir (DIR*, const XCHAR*);				/* Open an existing directory */
+FRESULT f_opendir (DIR*, const TCHAR*);				/* Open an existing directory */
 FRESULT f_readdir (DIR*, FILINFO*);					/* Read a directory item */
 FRESULT f_readdir (DIR*, FILINFO*);					/* Read a directory item */
-FRESULT f_stat (const XCHAR*, FILINFO*);			/* Get file status */
-FRESULT f_getfree (const XCHAR*, DWORD*, FATFS**);	/* Get number of free clusters on the drive */
+FRESULT f_stat (const TCHAR*, FILINFO*);			/* Get file status */
+FRESULT f_write (FIL*, const void*, UINT, UINT*);	/* Write data to a file */
+FRESULT f_getfree (const TCHAR*, DWORD*, FATFS**);	/* Get number of free clusters on the drive */
 FRESULT f_truncate (FIL*);							/* Truncate file */
 FRESULT f_truncate (FIL*);							/* Truncate file */
 FRESULT f_sync (FIL*);								/* Flush cached data of a writing file */
 FRESULT f_sync (FIL*);								/* Flush cached data of a writing file */
-FRESULT f_unlink (const XCHAR*);					/* Delete an existing file or directory */
-FRESULT	f_mkdir (const XCHAR*);						/* Create a new directory */
-FRESULT f_chmod (const XCHAR*, BYTE, BYTE);			/* Change attriburte of the file/dir */
-FRESULT f_utime (const XCHAR*, const FILINFO*);		/* Change timestamp of the file/dir */
-FRESULT f_rename (const XCHAR*, const XCHAR*);		/* Rename/Move a file or directory */
+FRESULT f_unlink (const TCHAR*);					/* Delete an existing file or directory */
+FRESULT	f_mkdir (const TCHAR*);						/* Create a new directory */
+FRESULT f_chmod (const TCHAR*, BYTE, BYTE);			/* Change attriburte of the file/dir */
+FRESULT f_utime (const TCHAR*, const FILINFO*);		/* Change timestamp of the file/dir */
+FRESULT f_rename (const TCHAR*, const TCHAR*);		/* Rename/Move a file or directory */
 FRESULT f_forward (FIL*, UINT(*)(const BYTE*,UINT), UINT, UINT*);	/* Forward data to the stream */
 FRESULT f_forward (FIL*, UINT(*)(const BYTE*,UINT), UINT, UINT*);	/* Forward data to the stream */
-FRESULT f_mkfs (BYTE, BYTE, DWORD);					/* Create a file system on the drive */
-FRESULT f_chdir (const XCHAR*);						/* Change current directory */
+FRESULT f_mkfs (BYTE, BYTE, UINT);					/* Create a file system on the drive */
 FRESULT f_chdrive (BYTE);							/* Change current drive */
 FRESULT f_chdrive (BYTE);							/* Change current drive */
+FRESULT f_chdir (const TCHAR*);						/* Change current directory */
+FRESULT f_getcwd (TCHAR*, UINT);					/* Get current directory */
+int f_putc (TCHAR, FIL*);							/* Put a character to the file */
+int f_puts (const TCHAR*, FIL*);					/* Put a string to the file */
+int f_printf (FIL*, const TCHAR*, ...);				/* Put a formatted string to the file */
+TCHAR* f_gets (TCHAR*, int, FIL*);					/* Get a string from the file */
 
 
-#if _USE_STRFUNC
-int f_putc (int, FIL*);								/* Put a character to the file */
-int f_puts (const char*, FIL*);						/* Put a string to the file */
-int f_printf (FIL*, const char*, ...);				/* Put a formatted string to the file */
-char* f_gets (char*, int, FIL*);					/* Get a string from the file */
-#define f_eof(fp) (((fp)->fptr == (fp)->fsize) ? 1 : 0)
-#define f_error(fp) (((fp)->flag & FA__ERROR) ? 1 : 0)
 #ifndef EOF
 #ifndef EOF
-#define EOF -1
-#endif
+#define EOF (-1)
 #endif
 #endif
 
 
+#define f_eof(fp) (((fp)->fptr == (fp)->fsize) ? 1 : 0)
+#define f_error(fp) (((fp)->flag & FA__ERROR) ? 1 : 0)
+#define f_tell(fp) ((fp)->fptr)
+#define f_size(fp) ((fp)->fsize)
+
+
 
 
 
 
 /*--------------------------------------------------------------*/
 /*--------------------------------------------------------------*/
-/* User defined functions                                       */
+/* Additional user defined functions                            */
 
 
-/* Real time clock */
+/* RTC function */
 #if !_FS_READONLY
 #if !_FS_READONLY
-DWORD get_fattime (void);	/* 31-25: Year(0-127 org.1980), 24-21: Month(1-12), 20-16: Day(1-31) */
-							/* 15-11: Hour(0-23), 10-5: Minute(0-59), 4-0: Second(0-29 *2) */
+DWORD get_fattime (void);
 #endif
 #endif
 
 
-/* Unicode - OEM code conversion */
-#if _USE_LFN
-WCHAR ff_convert (WCHAR, UINT);
-WCHAR ff_wtoupper (WCHAR);
+/* Unicode support functions */
+#if _USE_LFN						/* Unicode - OEM code conversion */
+WCHAR ff_convert (WCHAR, UINT);		/* OEM-Unicode bidirectional conversion */
+WCHAR ff_wtoupper (WCHAR);			/* Unicode upper-case conversion */
+#if _USE_LFN == 3					/* Memory functions */
+void* ff_memalloc (UINT);			/* Allocate memory block */
+void ff_memfree (void*);			/* Free memory block */
+#endif
 #endif
 #endif
 
 
 /* Sync functions */
 /* Sync functions */
 #if _FS_REENTRANT
 #if _FS_REENTRANT
-BOOL ff_cre_syncobj(BYTE, _SYNC_t*);
-BOOL ff_del_syncobj(_SYNC_t);
-BOOL ff_req_grant(_SYNC_t);
-void ff_rel_grant(_SYNC_t);
+int ff_cre_syncobj (BYTE, _SYNC_t*);/* Create a sync object */
+int ff_req_grant (_SYNC_t);			/* Lock sync object */
+void ff_rel_grant (_SYNC_t);		/* Unlock sync object */
+int ff_del_syncobj (_SYNC_t);		/* Delete a sync object */
 #endif
 #endif
 
 
 
 
 
 
+
 /*--------------------------------------------------------------*/
 /*--------------------------------------------------------------*/
 /* Flags and offset address                                     */
 /* Flags and offset address                                     */
 
 
@@ -485,7 +278,9 @@ void ff_rel_grant(_SYNC_t);
 
 
 #define	FA_READ				0x01
 #define	FA_READ				0x01
 #define	FA_OPEN_EXISTING	0x00
 #define	FA_OPEN_EXISTING	0x00
-#if _FS_READONLY == 0
+#define FA__ERROR			0x80
+
+#if !_FS_READONLY
 #define	FA_WRITE			0x02
 #define	FA_WRITE			0x02
 #define	FA_CREATE_NEW		0x04
 #define	FA_CREATE_NEW		0x04
 #define	FA_CREATE_ALWAYS	0x08
 #define	FA_CREATE_ALWAYS	0x08
@@ -493,7 +288,6 @@ void ff_rel_grant(_SYNC_t);
 #define FA__WRITTEN			0x20
 #define FA__WRITTEN			0x20
 #define FA__DIRTY			0x40
 #define FA__DIRTY			0x40
 #endif
 #endif
-#define FA__ERROR			0x80
 
 
 
 
 /* FAT sub type (FATFS.fs_type) */
 /* FAT sub type (FATFS.fs_type) */
@@ -515,66 +309,8 @@ void ff_rel_grant(_SYNC_t);
 #define AM_MASK	0x3F	/* Mask of defined bits */
 #define AM_MASK	0x3F	/* Mask of defined bits */
 
 
 
 
-/* FatFs refers the members in the FAT structures with byte offset instead
-/ of structure member because there are incompatibility of the packing option
-/ between various compilers. */
-
-#define BS_jmpBoot			0
-#define BS_OEMName			3
-#define BPB_BytsPerSec		11
-#define BPB_SecPerClus		13
-#define BPB_RsvdSecCnt		14
-#define BPB_NumFATs			16
-#define BPB_RootEntCnt		17
-#define BPB_TotSec16		19
-#define BPB_Media			21
-#define BPB_FATSz16			22
-#define BPB_SecPerTrk		24
-#define BPB_NumHeads		26
-#define BPB_HiddSec			28
-#define BPB_TotSec32		32
-#define BS_55AA				510
-
-#define BS_DrvNum			36
-#define BS_BootSig			38
-#define BS_VolID			39
-#define BS_VolLab			43
-#define BS_FilSysType		54
-
-#define BPB_FATSz32			36
-#define BPB_ExtFlags		40
-#define BPB_FSVer			42
-#define BPB_RootClus		44
-#define BPB_FSInfo			48
-#define BPB_BkBootSec		50
-#define BS_DrvNum32			64
-#define BS_BootSig32		66
-#define BS_VolID32			67
-#define BS_VolLab32			71
-#define BS_FilSysType32		82
-
-#define	FSI_LeadSig			0
-#define	FSI_StrucSig		484
-#define	FSI_Free_Count		488
-#define	FSI_Nxt_Free		492
-
-#define MBR_Table			446
-
-#define	DIR_Name			0
-#define	DIR_Attr			11
-#define	DIR_NTres			12
-#define	DIR_CrtTime			14
-#define	DIR_CrtDate			16
-#define	DIR_FstClusHI		20
-#define	DIR_WrtTime			22
-#define	DIR_WrtDate			24
-#define	DIR_FstClusLO		26
-#define	DIR_FileSize		28
-#define	LDIR_Ord			0
-#define	LDIR_Attr			11
-#define	LDIR_Type			12
-#define	LDIR_Chksum			13
-#define	LDIR_FstClusLO		26
+/* Fast seek function */
+#define CREATE_LINKMAP	0xFFFFFFFF
 
 
 
 
 
 
@@ -587,11 +323,14 @@ void ff_rel_grant(_SYNC_t);
 #define	ST_WORD(ptr,val)	*(WORD*)(BYTE*)(ptr)=(WORD)(val)
 #define	ST_WORD(ptr,val)	*(WORD*)(BYTE*)(ptr)=(WORD)(val)
 #define	ST_DWORD(ptr,val)	*(DWORD*)(BYTE*)(ptr)=(DWORD)(val)
 #define	ST_DWORD(ptr,val)	*(DWORD*)(BYTE*)(ptr)=(DWORD)(val)
 #else					/* Use byte-by-byte access to the FAT structure */
 #else					/* Use byte-by-byte access to the FAT structure */
-#define	LD_WORD(ptr)		(WORD)(((WORD)*(BYTE*)((ptr)+1)<<8)|(WORD)*(BYTE*)(ptr))
-#define	LD_DWORD(ptr)		(DWORD)(((DWORD)*(BYTE*)((ptr)+3)<<24)|((DWORD)*(BYTE*)((ptr)+2)<<16)|((WORD)*(BYTE*)((ptr)+1)<<8)|*(BYTE*)(ptr))
-#define	ST_WORD(ptr,val)	*(BYTE*)(ptr)=(BYTE)(val); *(BYTE*)((ptr)+1)=(BYTE)((WORD)(val)>>8)
-#define	ST_DWORD(ptr,val)	*(BYTE*)(ptr)=(BYTE)(val); *(BYTE*)((ptr)+1)=(BYTE)((WORD)(val)>>8); *(BYTE*)((ptr)+2)=(BYTE)((DWORD)(val)>>16); *(BYTE*)((ptr)+3)=(BYTE)((DWORD)(val)>>24)
+#define	LD_WORD(ptr)		(WORD)(((WORD)*((BYTE*)(ptr)+1)<<8)|(WORD)*(BYTE*)(ptr))
+#define	LD_DWORD(ptr)		(DWORD)(((DWORD)*((BYTE*)(ptr)+3)<<24)|((DWORD)*((BYTE*)(ptr)+2)<<16)|((WORD)*((BYTE*)(ptr)+1)<<8)|*(BYTE*)(ptr))
+#define	ST_WORD(ptr,val)	*(BYTE*)(ptr)=(BYTE)(val); *((BYTE*)(ptr)+1)=(BYTE)((WORD)(val)>>8)
+#define	ST_DWORD(ptr,val)	*(BYTE*)(ptr)=(BYTE)(val); *((BYTE*)(ptr)+1)=(BYTE)((WORD)(val)>>8); *((BYTE*)(ptr)+2)=(BYTE)((DWORD)(val)>>16); *((BYTE*)(ptr)+3)=(BYTE)((DWORD)(val)>>24)
 #endif
 #endif
 
 
+#ifdef __cplusplus
+}
+#endif
 
 
 #endif /* _FATFS */
 #endif /* _FATFS */

+ 71 - 44
components/dfs/filesystems/elmfat/ffconf.h

@@ -1,52 +1,57 @@
 /*---------------------------------------------------------------------------/
 /*---------------------------------------------------------------------------/
-/  FatFs - FAT file system module configuration file  R0.07e  (C)ChaN, 2009
+/  FatFs - FAT file system module configuration file  R0.08b (C)ChaN, 2011
 /----------------------------------------------------------------------------/
 /----------------------------------------------------------------------------/
 /
 /
 / CAUTION! Do not forget to make clean the project after any changes to
 / CAUTION! Do not forget to make clean the project after any changes to
 / the configuration options.
 / the configuration options.
 /
 /
 /----------------------------------------------------------------------------*/
 /----------------------------------------------------------------------------*/
-#ifndef _FFCONFIG
-#define _FFCONFIG 0x007E
+#ifndef _FFCONF
+#define _FFCONF 8237	/* Revision ID */
+
 
 
 /*---------------------------------------------------------------------------/
 /*---------------------------------------------------------------------------/
 / Function and Buffer Configurations
 / Function and Buffer Configurations
 /----------------------------------------------------------------------------*/
 /----------------------------------------------------------------------------*/
 
 
-#define	_FS_TINY	0		/* 0 or 1 */
+#define	_FS_TINY		0	/* 0:Normal or 1:Tiny */
 /* When _FS_TINY is set to 1, FatFs uses the sector buffer in the file system
 /* When _FS_TINY is set to 1, FatFs uses the sector buffer in the file system
 /  object instead of the sector buffer in the individual file object for file
 /  object instead of the sector buffer in the individual file object for file
 /  data transfer. This reduces memory consumption 512 bytes each file object. */
 /  data transfer. This reduces memory consumption 512 bytes each file object. */
 
 
 
 
-#define _FS_READONLY	0	/* 0 or 1 */
+#define _FS_READONLY	0	/* 0:Read/Write or 1:Read only */
 /* Setting _FS_READONLY to 1 defines read only configuration. This removes
 /* Setting _FS_READONLY to 1 defines read only configuration. This removes
 /  writing functions, f_write, f_sync, f_unlink, f_mkdir, f_chmod, f_rename,
 /  writing functions, f_write, f_sync, f_unlink, f_mkdir, f_chmod, f_rename,
 /  f_truncate and useless f_getfree. */
 /  f_truncate and useless f_getfree. */
 
 
 
 
-#define _FS_MINIMIZE	0	/* 0, 1, 2 or 3 */
+#define _FS_MINIMIZE	0	/* 0 to 3 */
 /* The _FS_MINIMIZE option defines minimization level to remove some functions.
 /* The _FS_MINIMIZE option defines minimization level to remove some functions.
 /
 /
 /   0: Full function.
 /   0: Full function.
 /   1: f_stat, f_getfree, f_unlink, f_mkdir, f_chmod, f_truncate and f_rename
 /   1: f_stat, f_getfree, f_unlink, f_mkdir, f_chmod, f_truncate and f_rename
 /      are removed.
 /      are removed.
-/   2: f_opendir and f_readdir are removed in addition to level 1.
-/   3: f_lseek is removed in addition to level 2. */
+/   2: f_opendir and f_readdir are removed in addition to 1.
+/   3: f_lseek is removed in addition to 2. */
 
 
 
 
-#define	_USE_STRFUNC	0	/* 0, 1 or 2 */
+#define	_USE_STRFUNC	0	/* 0:Disable or 1/2:Enable */
 /* To enable string functions, set _USE_STRFUNC to 1 or 2. */
 /* To enable string functions, set _USE_STRFUNC to 1 or 2. */
 
 
 
 
-#define	_USE_MKFS	1		/* 0 or 1 */
+#define	_USE_MKFS		1	/* 0:Disable or 1:Enable */
 /* To enable f_mkfs function, set _USE_MKFS to 1 and set _FS_READONLY to 0 */
 /* To enable f_mkfs function, set _USE_MKFS to 1 and set _FS_READONLY to 0 */
 
 
 
 
-#define	_USE_FORWARD	0	/* 0 or 1 */
+#define	_USE_FORWARD	0	/* 0:Disable or 1:Enable */
 /* To enable f_forward function, set _USE_FORWARD to 1 and set _FS_TINY to 1. */
 /* To enable f_forward function, set _USE_FORWARD to 1 and set _FS_TINY to 1. */
 
 
 
 
+#define	_USE_FASTSEEK	1	/* 0:Disable or 1:Enable */
+/* To enable fast seek feature, set _USE_FASTSEEK to 1. */
+
+
 
 
 /*---------------------------------------------------------------------------/
 /*---------------------------------------------------------------------------/
 / Locale and Namespace Configurations
 / Locale and Namespace Configurations
@@ -84,37 +89,43 @@
 /	1    - ASCII only (Valid for non LFN cfg.)
 /	1    - ASCII only (Valid for non LFN cfg.)
 */
 */
 
 
+
 #ifdef RT_DFS_ELM_USE_LFN
 #ifdef RT_DFS_ELM_USE_LFN
 #define _USE_LFN RT_DFS_ELM_USE_LFN
 #define _USE_LFN RT_DFS_ELM_USE_LFN
 #define _MAX_LFN RT_DFS_ELM_MAX_LFN
 #define _MAX_LFN RT_DFS_ELM_MAX_LFN
 #else
 #else
-#define	_USE_LFN	0		/* 0, 1 or 2 */
+#define	_USE_LFN	0		/* 0 to 3 */
 #define	_MAX_LFN	255		/* Maximum LFN length to handle (12 to 255) */
 #define	_MAX_LFN	255		/* Maximum LFN length to handle (12 to 255) */
 #endif
 #endif
-
 /* The _USE_LFN option switches the LFN support.
 /* The _USE_LFN option switches the LFN support.
 /
 /
-/   0: Disable LFN. _MAX_LFN and _LFN_UNICODE have no effect.
-/   1: Enable LFN with static working buffer on the bss. NOT REENTRANT.
+/   0: Disable LFN feature. _MAX_LFN and _LFN_UNICODE have no effect.
+/   1: Enable LFN with static working buffer on the BSS. Always NOT reentrant.
 /   2: Enable LFN with dynamic working buffer on the STACK.
 /   2: Enable LFN with dynamic working buffer on the STACK.
+/   3: Enable LFN with dynamic working buffer on the HEAP.
 /
 /
-/  The LFN working buffer occupies (_MAX_LFN + 1) * 2 bytes. When enable LFN,
-/  two Unicode handling functions ff_convert() and ff_wtoupper() must be added
-/  to the project. */
+/  The LFN working buffer occupies (_MAX_LFN + 1) * 2 bytes. To enable LFN,
+/  Unicode handling functions ff_convert() and ff_wtoupper() must be added
+/  to the project. When enable to use heap, memory control functions
+/  ff_memalloc() and ff_memfree() must be added to the project. */
+
 
 
 #ifdef RT_DFS_ELM_LFN_UNICODE
 #ifdef RT_DFS_ELM_LFN_UNICODE
-#define _LFN_UNICODE	1	/* 0 or 1 */
+#define _LFN_UNICODE	1	/* 0:ANSI/OEM or 1:Unicode */
 #else
 #else
-#define	_LFN_UNICODE	0	/* 0 or 1 */
+#define	_LFN_UNICODE	0	/* 0:ANSI/OEM or 1:Unicode */
 #endif
 #endif
 /* To switch the character code set on FatFs API to Unicode,
 /* To switch the character code set on FatFs API to Unicode,
-/  enable LFN feature and set _LFN_UNICODE to 1.
-*/
+/  enable LFN feature and set _LFN_UNICODE to 1. */
 
 
 
 
-#define _FS_RPATH	0		/* 0 or 1 */
-/* When _FS_RPATH is set to 1, relative path feature is enabled and f_chdir,
-/  f_chdrive function are available.
+#define _FS_RPATH		0	/* 0 to 2 */
+/* The _FS_RPATH option configures relative path feature.
+/
+/   0: Disable relative path feature and remove related functions.
+/   1: Enable relative path. f_chdrive() and f_chdir() are available.
+/   2: f_getcwd() is available in addition to 1.
+/
 /  Note that output of the f_readdir fnction is affected by this option. */
 /  Note that output of the f_readdir fnction is affected by this option. */
 
 
 
 
@@ -122,10 +133,11 @@
 /*---------------------------------------------------------------------------/
 /*---------------------------------------------------------------------------/
 / Physical Drive Configurations
 / Physical Drive Configurations
 /----------------------------------------------------------------------------*/
 /----------------------------------------------------------------------------*/
+
 #ifdef RT_DFS_ELM_DRIVES
 #ifdef RT_DFS_ELM_DRIVES
-#define _DRIVES RT_DFS_ELM_DRIVES
+#define _VOLUMES RT_DFS_ELM_DRIVES
 #else
 #else
-#define _DRIVES		1
+#define _VOLUMES	1
 #endif
 #endif
 /* Number of volumes (logical drives) to be used. */
 /* Number of volumes (logical drives) to be used. */
 
 
@@ -137,46 +149,56 @@
 #endif
 #endif
 /* Maximum sector size to be handled.
 /* Maximum sector size to be handled.
 /  Always set 512 for memory card and hard disk but a larger value may be
 /  Always set 512 for memory card and hard disk but a larger value may be
-/  required for floppy disk (512/1024) and optical disk (512/2048).
-/  When _MAX_SS is larger than 512, GET_SECTOR_SIZE command must be implememted
-/  to the disk_ioctl function. */
+/  required for on-board flash memory, floppy disk and optical disk.
+/  When _MAX_SS is larger than 512, it configures FatFs to variable sector size
+/  and GET_SECTOR_SIZE command must be implememted to the disk_ioctl function. */
 
 
 
 
-#define	_MULTI_PARTITION	0	/* 0 or 1 */
-/* When _MULTI_PARTITION is set to 0, each volume is bound to the same physical
-/ drive number and can mount only first primaly partition. When it is set to 1,
-/ each volume is tied to the partitions listed in Drives[]. */
+#define	_MULTI_PARTITION	0	/* 0:Single partition or 1:Multiple partition */
+/* When set to 0, each volume is bound to the same physical drive number and
+/ it can mount only first primaly partition. When it is set to 1, each volume
+/ is tied to the partitions listed in VolToPart[]. */
+
+
+#define	_USE_ERASE	0	/* 0:Disable or 1:Enable */
+/* To enable sector erase feature, set _USE_ERASE to 1. CTRL_ERASE_SECTOR command
+/  should be added to the disk_ioctl functio. */
 
 
 
 
 
 
 /*---------------------------------------------------------------------------/
 /*---------------------------------------------------------------------------/
 / System Configurations
 / System Configurations
 /----------------------------------------------------------------------------*/
 /----------------------------------------------------------------------------*/
+
 #ifdef RT_DFS_ELM_WORD_ACCESS
 #ifdef RT_DFS_ELM_WORD_ACCESS
 #define _WORD_ACCESS	1
 #define _WORD_ACCESS	1
 #else
 #else
-#define _WORD_ACCESS	0
+#define _WORD_ACCESS	0	/* 0 or 1 */
 #endif
 #endif
-
-/* The _WORD_ACCESS option defines which access method is used to the word
-/  data on the FAT volume.
+/* Set 0 first and it is always compatible with all platforms. The _WORD_ACCESS
+/  option defines which access method is used to the word data on the FAT volume.
 /
 /
-/   0: Byte-by-byte access. Always compatible with all platforms.
+/   0: Byte-by-byte access.
 /   1: Word access. Do not choose this unless following condition is met.
 /   1: Word access. Do not choose this unless following condition is met.
 /
 /
-/  When the byte order on the memory is big-endian or address miss-aligned
-/  word access results incorrect behavior, the _WORD_ACCESS must be set to 0.
+/  When the byte order on the memory is big-endian or address miss-aligned word
+/  access results incorrect behavior, the _WORD_ACCESS must be set to 0.
 /  If it is not the case, the value can also be set to 1 to improve the
 /  If it is not the case, the value can also be set to 1 to improve the
 /  performance and code size. */
 /  performance and code size. */
 
 
+
+/* A header file that defines sync object types on the O/S, such as
+/  windows.h, ucos_ii.h and semphr.h, must be included prior to ff.h. */
+
 #ifdef RT_DFS_ELM_REENTRANT
 #ifdef RT_DFS_ELM_REENTRANT
 #define _FS_REENTRANT	RT_DFS_ELM_REENTRANT			/* 0 or 1 */
 #define _FS_REENTRANT	RT_DFS_ELM_REENTRANT			/* 0 or 1 */
 #else
 #else
-#define _FS_REENTRANT	0
+#define _FS_REENTRANT	0		/* 0:Disable or 1:Enable */
 #endif
 #endif
-#define _FS_TIMEOUT		1000		/* Timeout period in unit of time ticks */
+#define _FS_TIMEOUT		1000	/* Timeout period in unit of time ticks */
 #define	_SYNC_t			rt_mutex_t	/* O/S dependent type of sync object. e.g. HANDLE, OS_EVENT*, ID and etc.. */
 #define	_SYNC_t			rt_mutex_t	/* O/S dependent type of sync object. e.g. HANDLE, OS_EVENT*, ID and etc.. */
-/* The _FS_REENTRANT option switches the reentrancy of the FatFs module.
+
+/* The _FS_REENTRANT option switches the reentrancy (thread safe) of the FatFs module.
 /
 /
 /   0: Disable reentrancy. _SYNC_t and _FS_TIMEOUT have no effect.
 /   0: Disable reentrancy. _SYNC_t and _FS_TIMEOUT have no effect.
 /   1: Enable reentrancy. Also user provided synchronization handlers,
 /   1: Enable reentrancy. Also user provided synchronization handlers,
@@ -184,4 +206,9 @@
 /      function must be added to the project. */
 /      function must be added to the project. */
 
 
 
 
+#define	_FS_SHARE	0	/* 0:Disable or >=1:Enable */
+/* To enable file shareing feature, set _FS_SHARE to 1 or greater. The value
+   defines how many files can be opened simultaneously. */
+
+
 #endif /* _FFCONFIG */
 #endif /* _FFCONFIG */

+ 6 - 6
components/dfs/filesystems/elmfat/integer.h

@@ -3,10 +3,14 @@
 /*-------------------------------------------*/
 /*-------------------------------------------*/
 
 
 #ifndef _INTEGER
 #ifndef _INTEGER
+#define _INTEGER
+
+#ifdef _WIN32	/* FatFs development platform */
 
 
-#if 0
 #include <windows.h>
 #include <windows.h>
-#else
+#include <tchar.h>
+
+#else			/* Embedded platform */
 
 
 /* These types must be 16-bit, 32-bit or larger integer */
 /* These types must be 16-bit, 32-bit or larger integer */
 typedef int				INT;
 typedef int				INT;
@@ -28,10 +32,6 @@ typedef long			LONG;
 typedef unsigned long	ULONG;
 typedef unsigned long	ULONG;
 typedef unsigned long	DWORD;
 typedef unsigned long	DWORD;
 
 
-/* Boolean type */
-typedef enum { FALSE = 0, TRUE } BOOL;
-
 #endif
 #endif
 
 
-#define _INTEGER
 #endif
 #endif

+ 4 - 4
components/dfs/filesystems/elmfat/option/cc932.c

@@ -9,7 +9,7 @@
 #define _TINY_TABLE	0
 #define _TINY_TABLE	0
 
 
 #if !_USE_LFN || _CODE_PAGE != 932
 #if !_USE_LFN || _CODE_PAGE != 932
-#error This file is not needed in current configuration.
+#error This file is not needed in current configuration. Remove from the project.
 #endif
 #endif
 
 
 
 
@@ -111,7 +111,7 @@ const WCHAR uni2sjis[] = {
 	0x3088, 0x82E6, 0x3089, 0x82E7, 0x308A, 0x82E8, 0x308B, 0x82E9,
 	0x3088, 0x82E6, 0x3089, 0x82E7, 0x308A, 0x82E8, 0x308B, 0x82E9,
 	0x308C, 0x82EA, 0x308D, 0x82EB, 0x308E, 0x82EC, 0x308F, 0x82ED,
 	0x308C, 0x82EA, 0x308D, 0x82EB, 0x308E, 0x82EC, 0x308F, 0x82ED,
 	0x3090, 0x82EE, 0x3091, 0x82EF, 0x3092, 0x82F0, 0x3093, 0x82F1,
 	0x3090, 0x82EE, 0x3091, 0x82EF, 0x3092, 0x82F0, 0x3093, 0x82F1,
-	0x3094, 0x8394, 0x309B, 0x814A, 0x309C, 0x814B, 0x309D, 0x8154,
+	0x309B, 0x814A, 0x309C, 0x814B, 0x309D, 0x8154,
 	0x309E, 0x8155, 0x30A1, 0x8340, 0x30A2, 0x8341, 0x30A3, 0x8342,
 	0x309E, 0x8155, 0x30A1, 0x8340, 0x30A2, 0x8341, 0x30A3, 0x8342,
 	0x30A4, 0x8343, 0x30A5, 0x8344, 0x30A6, 0x8345, 0x30A7, 0x8346,
 	0x30A4, 0x8343, 0x30A5, 0x8344, 0x30A6, 0x8345, 0x30A7, 0x8346,
 	0x30A8, 0x8347, 0x30A9, 0x8348, 0x30AA, 0x8349, 0x30AB, 0x834A,
 	0x30A8, 0x8347, 0x30A9, 0x8348, 0x30AA, 0x8349, 0x30AB, 0x834A,
@@ -1979,7 +1979,7 @@ const WCHAR sjis2uni[] = {
 	0x8386, 0x30E6, 0x8387, 0x30E7, 0x8388, 0x30E8, 0x8389, 0x30E9,
 	0x8386, 0x30E6, 0x8387, 0x30E7, 0x8388, 0x30E8, 0x8389, 0x30E9,
 	0x838A, 0x30EA, 0x838B, 0x30EB, 0x838C, 0x30EC, 0x838D, 0x30ED,
 	0x838A, 0x30EA, 0x838B, 0x30EB, 0x838C, 0x30EC, 0x838D, 0x30ED,
 	0x838E, 0x30EE, 0x838F, 0x30EF, 0x8390, 0x30F0, 0x8391, 0x30F1,
 	0x838E, 0x30EE, 0x838F, 0x30EF, 0x8390, 0x30F0, 0x8391, 0x30F1,
-	0x8392, 0x30F2, 0x8393, 0x30F3, 0x8394, 0x3094, 0x8394, 0x30F4,
+	0x8392, 0x30F2, 0x8393, 0x30F3, 0x8394, 0x30F4,
 	0x8395, 0x30F5, 0x8396, 0x30F6, 0x839F, 0x0391, 0x83A0, 0x0392,
 	0x8395, 0x30F5, 0x8396, 0x30F6, 0x839F, 0x0391, 0x83A0, 0x0392,
 	0x83A1, 0x0393, 0x83A2, 0x0394, 0x83A3, 0x0395, 0x83A4, 0x0396,
 	0x83A1, 0x0393, 0x83A2, 0x0394, 0x83A3, 0x0395, 0x83A4, 0x0396,
 	0x83A5, 0x0397, 0x83A6, 0x0398, 0x83A7, 0x0399, 0x83A8, 0x039A,
 	0x83A5, 0x0397, 0x83A6, 0x0398, 0x83A7, 0x0399, 0x83A8, 0x039A,
@@ -3760,9 +3760,9 @@ WCHAR ff_convert (	/* Converted code, 0 means conversion error */
 			do {
 			do {
 				c = *p;
 				c = *p;
 				p += 2;
 				p += 2;
+			} while (c && c != src);
 			p -= 3;
 			p -= 3;
 			c = *p;
 			c = *p;
-			} while (c && c != src);
 		} else {		/* Unicode to OEMCP */
 		} else {		/* Unicode to OEMCP */
 			li = 0; hi = sizeof(uni2sjis) / 4 - 1;
 			li = 0; hi = sizeof(uni2sjis) / 4 - 1;
 			for (n = 16; n; n--) {
 			for (n = 16; n; n--) {

+ 1 - 1
components/dfs/filesystems/elmfat/option/cc936.c

@@ -8,7 +8,7 @@
 
 
 
 
 #if !_USE_LFN || _CODE_PAGE != 936
 #if !_USE_LFN || _CODE_PAGE != 936
-#error This file is not needed in current configuration.
+#error This file is not needed in current configuration. Remove from the project.
 #endif
 #endif
 
 
 static
 static

+ 2 - 2
components/dfs/filesystems/elmfat/option/cc949.c

@@ -1,14 +1,14 @@
 /*------------------------------------------------------------------------*/
 /*------------------------------------------------------------------------*/
 /* Unicode - OEM code bidirectional converter  (C)ChaN, 2009              */
 /* Unicode - OEM code bidirectional converter  (C)ChaN, 2009              */
 /*                                                                        */
 /*                                                                        */
-/* CP949 (Korean)                                                         */
+/* CP949 (Korean EUC-KR)                                                  */
 /*------------------------------------------------------------------------*/
 /*------------------------------------------------------------------------*/
 
 
 #include "../ff.h"
 #include "../ff.h"
 
 
 
 
 #if !_USE_LFN || _CODE_PAGE != 949
 #if !_USE_LFN || _CODE_PAGE != 949
-#error This file is not needed in current configuration.
+#error This file is not needed in current configuration. Remove from the project.
 #endif
 #endif
 
 
 
 

+ 1 - 1
components/dfs/filesystems/elmfat/option/cc950.c

@@ -8,7 +8,7 @@
 
 
 
 
 #if !_USE_LFN || _CODE_PAGE != 950
 #if !_USE_LFN || _CODE_PAGE != 950
-#error This file is not needed in current configuration.
+#error This file is not needed in current configuration. Remove from the project.
 #endif
 #endif
 
 
 
 

+ 3 - 3
components/dfs/filesystems/elmfat/option/ccsbcs.c

@@ -329,7 +329,7 @@ const WCHAR Tbl[] = {	/*  CP1251(0x80-0xFF) to Unicode conversion table */
 	0x0410, 0x0411, 0x0412, 0x0413, 0x0414, 0x0415, 0x0416, 0x0417,
 	0x0410, 0x0411, 0x0412, 0x0413, 0x0414, 0x0415, 0x0416, 0x0417,
 	0x0418, 0x0419, 0x041A, 0x041B, 0x041C, 0x041D, 0x041E, 0x041F,
 	0x0418, 0x0419, 0x041A, 0x041B, 0x041C, 0x041D, 0x041E, 0x041F,
 	0x0420, 0x0421, 0x0422, 0x0423, 0x0424, 0x0425, 0x0426, 0x0427,
 	0x0420, 0x0421, 0x0422, 0x0423, 0x0424, 0x0425, 0x0426, 0x0427,
-	0x0428, 0x0429, 0x042A, 0x042D, 0x042C, 0x042D, 0x042E, 0x042F,
+	0x0428, 0x0429, 0x042A, 0x042B, 0x042C, 0x042D, 0x042E, 0x042F,
 	0x0430, 0x0431, 0x0432, 0x0433, 0x0434, 0x0435, 0x0436, 0x0437,
 	0x0430, 0x0431, 0x0432, 0x0433, 0x0434, 0x0435, 0x0436, 0x0437,
 	0x0438, 0x0439, 0x043A, 0x043B, 0x043C, 0x043D, 0x043E, 0x043F,
 	0x0438, 0x0439, 0x043A, 0x043B, 0x043C, 0x043D, 0x043E, 0x043F,
 	0x0440, 0x0441, 0x0442, 0x0443, 0x0444, 0x0445, 0x0446, 0x0447,
 	0x0440, 0x0441, 0x0442, 0x0443, 0x0444, 0x0445, 0x0446, 0x0447,
@@ -351,7 +351,7 @@ const WCHAR Tbl[] = {	/*  CP1252(0x80-0xFF) to Unicode conversion table */
 	0x00C0, 0x00C1, 0x00C2, 0x00C3, 0x00C4, 0x00C5, 0x00C6, 0x00C7,
 	0x00C0, 0x00C1, 0x00C2, 0x00C3, 0x00C4, 0x00C5, 0x00C6, 0x00C7,
 	0x00C8, 0x00C9, 0x00CA, 0x00CB, 0x00CC, 0x00CD, 0x00CE, 0x00CF,
 	0x00C8, 0x00C9, 0x00CA, 0x00CB, 0x00CC, 0x00CD, 0x00CE, 0x00CF,
 	0x00D0, 0x00D1, 0x00D2, 0x00D3, 0x00D4, 0x00D5, 0x00D6, 0x00D7,
 	0x00D0, 0x00D1, 0x00D2, 0x00D3, 0x00D4, 0x00D5, 0x00D6, 0x00D7,
-	0x00D8, 0x00D9, 0x00DA, 0x00BD, 0x00DC, 0x00DD, 0x00DE, 0x00DF,
+	0x00D8, 0x00D9, 0x00DA, 0x00DB, 0x00DC, 0x00DD, 0x00DE, 0x00DF,
 	0x00E0, 0x00E1, 0x00E2, 0x00E3, 0x00E4, 0x00E5, 0x00E6, 0x00E7,
 	0x00E0, 0x00E1, 0x00E2, 0x00E3, 0x00E4, 0x00E5, 0x00E6, 0x00E7,
 	0x00E8, 0x00E9, 0x00EA, 0x00EB, 0x00EC, 0x00ED, 0x00EE, 0x00EF,
 	0x00E8, 0x00E9, 0x00EA, 0x00EB, 0x00EC, 0x00ED, 0x00EE, 0x00EF,
 	0x00F0, 0x00F1, 0x00F2, 0x00F3, 0x00F4, 0x00F5, 0x00F6, 0x00F7,
 	0x00F0, 0x00F1, 0x00F2, 0x00F3, 0x00F4, 0x00F5, 0x00F6, 0x00F7,
@@ -494,7 +494,7 @@ const WCHAR Tbl[] = {	/*  CP1258(0x80-0xFF) to Unicode conversion table */
 
 
 
 
 #if !_TBLDEF || !_USE_LFN
 #if !_TBLDEF || !_USE_LFN
-#error This file is not needed in current configuration
+#error This file is not needed in current configuration. Remove from the project.
 #endif
 #endif
 
 
 
 

+ 61 - 25
components/dfs/filesystems/elmfat/option/syncobj.c → components/dfs/filesystems/elmfat/option/syscall.c

@@ -1,17 +1,17 @@
 /*------------------------------------------------------------------------*/
 /*------------------------------------------------------------------------*/
-/* Sample code of OS dependent synchronization object controls            */
-/* for FatFs R0.07d  (C)ChaN, 2009                                        */
+/* Sample code of OS dependent controls for FatFs R0.08                   */
+/* (C)ChaN, 2010                                                          */
 /*------------------------------------------------------------------------*/
 /*------------------------------------------------------------------------*/
 
 
-#include <windows.h>	// Win32
-//#include <ucos_ii.h>	// uC/OS-II
+#include <stdlib.h>		/* ANSI memory controls */
+#include <malloc.h>		/* ANSI memory controls */
 
 
 #include "../ff.h"
 #include "../ff.h"
 
 
-#if _FS_REENTRANT
 
 
+#if _FS_REENTRANT
 /*------------------------------------------------------------------------*/
 /*------------------------------------------------------------------------*/
-/* Create a Synchronization Object for a Volume
+/* Create a Synchronization Object
 /*------------------------------------------------------------------------*/
 /*------------------------------------------------------------------------*/
 /* This function is called in f_mount function to create a new
 /* This function is called in f_mount function to create a new
 /  synchronization object, such as semaphore and mutex. When a FALSE is
 /  synchronization object, such as semaphore and mutex. When a FALSE is
@@ -25,14 +25,17 @@ BOOL ff_cre_syncobj (	/* TRUE:Function succeeded, FALSE:Could not create due to
 {
 {
 	BOOL ret;
 	BOOL ret;
 
 
-	*sobj = CreateMutex(NULL, FALSE, NULL);					// Win32
-	ret = (*sobj != INVALID_HANDLE_VALUE) ? TRUE : FALSE;	//
+	*sobj = CreateMutex(NULL, FALSE, NULL);					/* Win32 */
+	ret = (*sobj != INVALID_HANDLE_VALUE) ? TRUE : FALSE;
 
 
-//	*sobj = VolumeSemId[vol];	// uITRON (give a static created sync object)
-//	ret = TRUE;					// The initial value of the semaphore must be 1.
+//	*sobj = SyncObjects[vol];	/* uITRON (give a static created sync object) */
+//	ret = TRUE;					/* The initial value of the semaphore must be 1. */
 
 
-//	*sobj = OSMutexCreate(0, &err);				// uC/OS-II
-//	ret = (err == OS_NO_ERR) ? TRUE : FALSE;	//
+//	*sobj = OSMutexCreate(0, &err);				/* uC/OS-II */
+//	ret = (err == OS_NO_ERR) ? TRUE : FALSE;
+
+//	*sobj = xSemaphoreCreateMutex();			/* FreeRTOS */
+//	ret = (*sobj != NULL) ? TRUE : FALSE;
 
 
 	return ret;
 	return ret;
 }
 }
@@ -53,12 +56,14 @@ BOOL ff_del_syncobj (	/* TRUE:Function succeeded, FALSE:Could not delete due to
 {
 {
 	BOOL ret;
 	BOOL ret;
 
 
-	ret = CloseHandle(sobj);	// Win32
+	ret = CloseHandle(sobj);	/* Win32 *
+
+//	ret = TRUE;					/* uITRON (nothing to do) *
 
 
-//	ret = TRUE;					// uITRON (nothing to do)
+//	OSMutexDel(sobj, OS_DEL_ALWAYS, &err);		/* uC/OS-II */
+//	ret = (err == OS_NO_ERR) ? TRUE : FALSE;
 
 
-//	OSMutexDel(sobj, OS_DEL_ALWAYS, &err);		// uC/OS-II
-//	ret = (err == OS_NO_ERR) ? TRUE : FALSE;	//
+//	ret = TRUE;					/* FreeRTOS (nothing to do) */
 
 
 	return ret;
 	return ret;
 }
 }
@@ -78,12 +83,14 @@ BOOL ff_req_grant (	/* TRUE:Got a grant to access the volume, FALSE:Could not ge
 {
 {
 	BOOL ret;
 	BOOL ret;
 
 
-	ret = (WaitForSingleObject(sobj, _FS_TIMEOUT) == WAIT_OBJECT_0) ? TRUE : FALSE;	// Win32
+	ret = (WaitForSingleObject(sobj, _FS_TIMEOUT) == WAIT_OBJECT_0) ? TRUE : FALSE;	/* Win32 */
 
 
-//	ret = (wai_sem(sobj) == E_OK) ? TRUE : FALSE;	// uITRON
+//	ret = (wai_sem(sobj) == E_OK) ? TRUE : FALSE;	/* uITRON */
 
 
-//	OSMutexPend(sobj, _FS_TIMEOUT, &err));				// uC/OS-II
-//	ret = (err == OS_NO_ERR) ? TRUE : FALSE;		//
+//	OSMutexPend(sobj, _FS_TIMEOUT, &err));			/* uC/OS-II */
+//	ret = (err == OS_NO_ERR) ? TRUE : FALSE;
+
+//	ret = (xSemaphoreTake(sobj, _FS_TIMEOUT) == pdTRUE) ? TRUE : FALSE;	/* FreeRTOS */
 
 
 	return ret;
 	return ret;
 }
 }
@@ -100,16 +107,45 @@ void ff_rel_grant (
 	_SYNC_t sobj	/* Sync object to be signaled */
 	_SYNC_t sobj	/* Sync object to be signaled */
 )
 )
 {
 {
-	ReleaseMutex(sobj);	// Win32
+	ReleaseMutex(sobj);		/* Win32 */
+
+//	sig_sem(sobj);			/* uITRON */
+
+//	OSMutexPost(sobj);		/* uC/OS-II */
 
 
-//	sig_sem(sobj);		// uITRON
+//	xSemaphoreGive(sobj);	/* FreeRTOS */
 
 
-//	OSMutexPost(sobj);	// uC/OS-II
 }
 }
 
 
+#endif
+
+
 
 
-#else
 
 
-#error This file is not needed in this configuration.
+#if _USE_LFN == 3	/* LFN with a working buffer on the heap */
+/*------------------------------------------------------------------------*/
+/* Allocate a memory block                                                */
+/*------------------------------------------------------------------------*/
+/* If a NULL is returned, the file function fails with FR_NOT_ENOUGH_CORE.
+*/
+
+void* ff_memalloc (	/* Returns pointer to the allocated memory block */
+	UINT size		/* Number of bytes to allocate */
+)
+{
+	return malloc(size);
+}
+
+
+/*------------------------------------------------------------------------*/
+/* Free a memory block                                                    */
+/*------------------------------------------------------------------------*/
+
+void ff_memfree(
+	void* mblock	/* Pointer to the memory block to free */
+)
+{
+	free(mblock);
+}
 
 
 #endif
 #endif

Some files were not shown because too many files changed in this diff