浏览代码

fix f_mount when mount more fats

Urey 8 年之前
父节点
当前提交
0e82a5b821
共有 1 个文件被更改,包括 7 次插入4 次删除
  1. 7 4
      components/dfs/filesystems/elmfat/dfs_elm.c

+ 7 - 4
components/dfs/filesystems/elmfat/dfs_elm.c

@@ -28,6 +28,7 @@
  * 2014-01-26     Bernard      Check the sector size before mount.
  * 2017-02-13     Hichard      Update Fatfs version to 0.12b, support exFAT.
  * 2017-04-11     Bernard      fix the st_blksize issue.
+ * 2017-05-26     Urey         fix f_mount error when mount more fats
  */
 
 #include <rtthread.h>
@@ -42,7 +43,7 @@
 #include <dfs_fs.h>
 #include <dfs_def.h>
 
-static rt_device_t disk[_VOLUMES] = {0};
+volatile static rt_device_t disk[_VOLUMES] = {0};
 
 static int elm_result_to_dfs(FRESULT result)
 {
@@ -114,11 +115,13 @@ int dfs_elm_mount(struct dfs_filesystem *fs, unsigned long rwflag, const void *d
     FRESULT result;
     int index;
     struct rt_device_blk_geometry geometry;
+    char logic_nbr[2] = {'0',':'};
 
     /* get an empty position */
     index = get_disk(RT_NULL);
     if (index == -1)
         return -DFS_STATUS_ENOENT;
+    logic_nbr[0] = '0' + index;
 
     /* save device */
     disk[index] = fs->dev_id;
@@ -140,7 +143,7 @@ int dfs_elm_mount(struct dfs_filesystem *fs, unsigned long rwflag, const void *d
     }
 
     /* mount fatfs, always 0 logic driver */
-    result = f_mount(fat,"", (BYTE)index);
+    result = f_mount(fat,(const TCHAR*)logic_nbr, 1);
     if (result == FR_OK)
     {
         char drive[8];
@@ -150,7 +153,7 @@ int dfs_elm_mount(struct dfs_filesystem *fs, unsigned long rwflag, const void *d
         dir = (DIR *)rt_malloc(sizeof(DIR));
         if (dir == RT_NULL)
         {
-            f_mount(RT_NULL,"",(BYTE)index);
+            f_mount(RT_NULL,(const TCHAR*)logic_nbr,1);
             disk[index] = RT_NULL;
             rt_free(fat);
             return -DFS_STATUS_ENOMEM;
@@ -168,7 +171,7 @@ int dfs_elm_mount(struct dfs_filesystem *fs, unsigned long rwflag, const void *d
     }
 
 __err:
-    f_mount(RT_NULL, "", (BYTE)index);
+    f_mount(RT_NULL, (const TCHAR*)logic_nbr, 1);
     disk[index] = RT_NULL;
     rt_free(fat);
     return elm_result_to_dfs(result);