Explorar o código

add more options to filesystem mount function invoke.

git-svn-id: https://rt-thread.googlecode.com/svn/trunk@665 bbd45198-f89e-11dd-88c7-29a3b14d5316
bernard.xiong %!s(int64=15) %!d(string=hai) anos
pai
achega
c4a21b4456

+ 6 - 2
components/SConscript

@@ -5,8 +5,12 @@ Import('rtconfig')
 # build each components
 objs = ''
 
-if 'RT_USING_MINILIBC' in dir(rtconfig) and rtconfig.RT_USING_MINILIBC:
-	objs = objs + SConscript('libc/minilibc/SConscript')
+if rtconfig.CROSS_TOOL == 'gcc':
+	if 'RT_USING_NEWLIB' in dir(rtconfig) and rtconfig.RT_USING_NEWLIB:
+		objs = objs + SConscript('libc/newlib/SConscript')
+	else:
+		rtconfig.RT_USING_MINILIBC = True
+		objs = objs + SConscript('libc/minilibc/SConscript')
 
 if 'RT_USING_FINSH' in dir(rtconfig) and rtconfig.RT_USING_FINSH:
 	objs = objs + SConscript('finsh/SConscript')

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

@@ -49,7 +49,7 @@ static int elm_result_to_dfs(FRESULT result)
 	return status;
 }
 
-int dfs_elm_mount(struct dfs_filesystem* fs)
+int dfs_elm_mount(struct dfs_filesystem* fs, unsigned long rwflag, const void* data)
 {
 	FATFS *fat;
 	FRESULT result;

+ 1 - 1
components/dfs/include/dfs_fs.h

@@ -28,7 +28,7 @@ struct dfs_filesystem_operation
 {
 	char name[DFS_FS_NAME_MAX + 1];
 
-	int (*mount)	(struct dfs_filesystem* fs);
+	int (*mount)	(struct dfs_filesystem* fs, unsigned long rwflag, const void* data);
 	int (*unmount)	(struct dfs_filesystem* fs);
 
 	int (*open)	(struct dfs_fd* fd);

+ 25 - 17
components/dfs/src/dfs_fs.c

@@ -206,13 +206,21 @@ int dfs_mount(const char* device_name, const char* path,
     int index;
 
     /* open specific device */
-    dev_id = rt_device_find(device_name);
-    if (dev_id == RT_NULL)
-    {
-        /* no this device */
-        rt_set_errno(-DFS_STATUS_ENODEV);
-        return -1;
-    }
+	if (device_name != RT_NULL)
+	{
+		dev_id = rt_device_find(device_name);
+		if (dev_id == RT_NULL)
+		{
+			/* no this device */
+			rt_set_errno(-DFS_STATUS_ENODEV);
+			return -1;
+		}
+	}
+	else
+	{
+		/* which is a non-device filesystem mount */
+		dev_id = RT_NULL;
+	}
 
     /* find out specific filesystem */
 	dfs_lock();
@@ -289,11 +297,12 @@ int dfs_mount(const char* device_name, const char* path,
     /* release filesystem_table lock */
 	dfs_unlock();
 
-    /* open device, but do not check the status of device */
-    rt_device_open(fs->dev_id, RT_DEVICE_OFLAG_RDWR);
+	/* open device, but do not check the status of device */
+	if (dev_id != RT_NULL) rt_device_open(fs->dev_id, RT_DEVICE_OFLAG_RDWR);
 
-    if ( ops->mount == RT_NULL ) /* there is no mount implementation */
+    if (ops->mount == RT_NULL) /* there is no mount implementation */
     {
+		if (dev_id != RT_NULL) rt_device_close(dev_id);
     	dfs_lock();
         /* clear filesystem table entry */
         rt_memset(fs, 0, sizeof(struct dfs_filesystem));
@@ -303,19 +312,18 @@ int dfs_mount(const char* device_name, const char* path,
         return -1;
     }
     /* call mount of this filesystem */
-    else if ( ops->mount(fs) < 0 )
+    else if (ops->mount(fs, rwflag, data) < 0)
     {
-        /* mount failed */
-		dfs_lock();
-
         /* close device */
-        rt_device_close(fs->dev_id);
+        if (dev_id != RT_NULL) rt_device_close(fs->dev_id);
 
+        /* mount failed */
+		dfs_lock();
         /* clear filesystem table entry */
         rt_memset(fs, 0, sizeof(struct dfs_filesystem));
-
 		dfs_unlock();
-        return -1;
+
+		return -1;
     }
 
     return 0;