Support msc mode automatic switching
Signed-off-by: Cliff Chen <cliff.chen@rock-chips.com>
This commit is contained in:
parent
a7bcf90d78
commit
1c68bd9d3c
|
@ -91,6 +91,7 @@ int dfs_unmount(const char *specialfile);
|
|||
int dfs_mkfs(const char *fs_name, const char *device_name);
|
||||
int dfs_statfs(const char *path, struct statfs *buffer);
|
||||
int dfs_mount_device(rt_device_t dev);
|
||||
int dfs_unmount_device(rt_device_t dev);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
|
|
|
@ -555,6 +555,54 @@ int dfs_mount_device(rt_device_t dev)
|
|||
rt_kprintf("can't find device:%s to be mounted.\n", dev->parent.name);
|
||||
return -RT_ERROR;
|
||||
}
|
||||
|
||||
int dfs_unmount_device(rt_device_t dev)
|
||||
{
|
||||
struct dfs_filesystem *iter;
|
||||
struct dfs_filesystem *fs = NULL;
|
||||
|
||||
/* lock filesystem */
|
||||
dfs_lock();
|
||||
|
||||
for (iter = &filesystem_table[0];
|
||||
iter < &filesystem_table[DFS_FILESYSTEMS_MAX]; iter++)
|
||||
{
|
||||
/* check if the PATH is mounted */
|
||||
if ((iter->dev_id->parent.name != NULL)
|
||||
&& (strcmp(iter->dev_id->parent.name, dev->parent.name) == 0))
|
||||
{
|
||||
fs = iter;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (fs == NULL ||
|
||||
fs->ops->unmount == NULL ||
|
||||
fs->ops->unmount(fs) < 0)
|
||||
{
|
||||
goto err1;
|
||||
}
|
||||
|
||||
/* close device, but do not check the status of device */
|
||||
if (fs->dev_id != NULL)
|
||||
rt_device_close(fs->dev_id);
|
||||
|
||||
if (fs->path != NULL)
|
||||
rt_free(fs->path);
|
||||
|
||||
/* clear this filesystem table entry */
|
||||
memset(fs, 0, sizeof(struct dfs_filesystem));
|
||||
|
||||
dfs_unlock();
|
||||
|
||||
return 0;
|
||||
|
||||
err1:
|
||||
dfs_unlock();
|
||||
|
||||
return -1;
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
#ifdef RT_USING_FINSH
|
||||
|
|
|
@ -16,6 +16,10 @@
|
|||
#include "drivers/usb_device.h"
|
||||
#include "mstorage.h"
|
||||
|
||||
#ifdef RT_USING_DFS_MNTTABLE
|
||||
#include "dfs_fs.h"
|
||||
#endif
|
||||
|
||||
#ifdef RT_USB_DEVICE_MSTORAGE
|
||||
|
||||
enum STAT
|
||||
|
@ -964,6 +968,10 @@ static rt_err_t _function_enable(ufunction_t func)
|
|||
return -RT_ERROR;
|
||||
}
|
||||
|
||||
#ifdef RT_USING_DFS_MNTTABLE
|
||||
dfs_unmount_device(data->disk);
|
||||
#endif
|
||||
|
||||
if(rt_device_open(data->disk, RT_DEVICE_OFLAG_RDWR) != RT_EOK)
|
||||
{
|
||||
rt_kprintf("disk open error\n");
|
||||
|
@ -1029,6 +1037,9 @@ static rt_err_t _function_disable(ufunction_t func)
|
|||
if(data->disk != RT_NULL)
|
||||
{
|
||||
rt_device_close(data->disk);
|
||||
#ifdef RT_USING_DFS_MNTTABLE
|
||||
dfs_mount_device(data->disk);
|
||||
#endif
|
||||
data->disk = RT_NULL;
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue