examples/module: Add support for automounting removable media. This involves a wait for the block driver to become available before performing the mount.

This commit is contained in:
Gregory Nutt
2018-08-05 15:35:38 -06:00
parent b980e943c7
commit f5eeaf1fb6
3 changed files with 116 additions and 28 deletions

View File

@@ -40,9 +40,8 @@
#include <nuttx/config.h>
#include <nuttx/compiler.h>
#ifdef CONFIG_EXAMPLES_MODULE_BUILTINFS
# include <sys/mount.h>
#endif
#include <sys/mount.h>
#include <sys/stat.h>
#include <sys/boardctl.h>
#include <stdio.h>
@@ -80,7 +79,7 @@
# error "You must select CONFIG_MODULE in your configuration file"
#endif
#ifdef CONFIG_EXAMPLES_MODULE_BUILTINFS
#if defined(CONFIG_EXAMPLES_MODULE_BUILTINFS)
# if !defined(CONFIG_FS_ROMFS) || !defined(CONFIG_FS_CROMFS)
# error "You must select CONFIG_FS_ROMFS or CONFIG_FS_CROMFS in your configuration file"
# endif
@@ -91,7 +90,7 @@
/* Describe the ROMFS file system */
# if defined(CONFIG_EXAMPLES_ELF_CROMFS)
# if defined(CONFIG_EXAMPLES_MODULE_CROMFS)
# define SECTORSIZE 64
# define NSECTORS(b) (((b)+SECTORSIZE-1)/SECTORSIZE)
# define MOUNTPT "/mnt/romfs"
@@ -103,7 +102,7 @@
# ifndef CONFIG_EXAMPLES_MODULE_DEVPATH
# define CONFIG_EXAMPLES_MODULE_DEVPATH "/dev/ram0"
# endif
# elif defined(CONFIG_EXAMPLES_ELF_CROMFS)
# elif defined(CONFIG_EXAMPLES_MODULE_CROMFS)
/* Describe the CROMFS file system */
# define MOUNTPT "/mnt/cromfs"
@@ -111,8 +110,13 @@
# define BINDIR MOUNTPT
#elif defined(CONFIG_EXAMPLES_MODULE_FSMOUNT)
# define MOUNTPT "/mnt/" CONFIG_EXAMPLES_MODULE_FSTYPE
# define BINDIR MOUNTPT
#else
# define BINDIR CONFIG_EXAMPLES_MODULE_BINDIR
#endif /* CONFIG_EXAMPLES_MODULE_BUILTINFS */
/****************************************************************************
@@ -143,6 +147,9 @@ int module_main(int argc, char *argv[])
#endif
{
struct boardioc_symtab_s symdesc;
#ifdef CONFIG_EXAMPLES_MODULE_FSREMOVEABLE
struct stat buf;
#endif
FAR void *handle;
char buffer[128];
ssize_t nbytes;
@@ -161,7 +168,7 @@ int module_main(int argc, char *argv[])
}
#ifdef CONFIG_EXAMPLES_MODULE_BUILTINFS
#if defined(CONFIG_EXAMPLES_ELF_ROMFS)
#if defined(CONFIG_EXAMPLES_MODULE_ROMFS)
/* Create a ROM disk for the ROMFS filesystem */
printf("main: Registering romdisk at /dev/ram%d\n",
@@ -206,7 +213,7 @@ int module_main(int argc, char *argv[])
exit(EXIT_FAILURE);
}
#elif defined(CONFIG_EXAMPLES_ELF_CROMFS)
#elif defined(CONFIG_EXAMPLES_MODULE_CROMFS)
/* Mount the CROMFS file system */
printf("Mounting CROMFS filesystem at target=%s\n", MOUNTPT);
@@ -217,7 +224,58 @@ int module_main(int argc, char *argv[])
errmsg("ERROR: mount(%s, cromfs) failed: %d\n", MOUNTPT, errno);
}
#endif /* CONFIG_EXAMPLES_ELF_ROMFS */
#endif /* CONFIG_EXAMPLES_MODULE_ROMFS */
#elif defined(CONFIG_EXAMPLES_MODULE_EXTERN)
/* An external file system is being used */
#if defined(CONFIG_EXAMPLES_MODULE_FSMOUNT)
#if defined(CONFIG_EXAMPLES_MODULE_FSREMOVEABLE)
/* The file system is removable, wait until the block driver is available */
do
{
ret = stat(CONFIG_EXAMPLES_MODULE_DEVPATH, &buf);
if (ret < 0)
{
int errcode = errno;
if (errcode == ENOENT)
{
printf("%s does not exist. Waiting...\n",
CONFIG_EXAMPLES_MODULE_DEVPATH);
sleep(1);
}
else
{
printf("ERROR: stat(%s) failed: %d Aborting...\n",
CONFIG_EXAMPLES_MODULE_DEVPATH, errcode);
exit(EXIT_FAILURE);
}
}
else if (!S_ISBLK(buf.st_mode))
{
printf("ERROR: stat(%s) exists but is not a block driver: %04x\n",
CONFIG_EXAMPLES_MODULE_DEVPATH, buf.st_mode);
exit(EXIT_FAILURE);
}
}
while (ret < 0);
#endif /* CONFIG_EXAMPLES_MODULE_FSREMOVEABLE */
/* Mount the external file system */
message("Mounting %s filesystem at target=%s\n",
CONFIG_EXAMPLES_MODULE_FSTYPE, MOUNTPT);
ret = mount(CONFIG_EXAMPLES_MODULE_DEVPATH, MOUNTPT,
CONFIG_EXAMPLES_MODULE_FSTYPE, MS_RDONLY, NULL);
if (ret < 0)
{
errmsg("ERROR: mount(%s, %s, %s) failed: %d\n",\
CONFIG_EXAMPLES_MODULE_DEVPATH, CONFIG_EXAMPLES_MODULE_FSTYPE,
MOUNTPT, errno);
}
#endif
#endif /* CONFIG_EXAMPLES_MODULE_BUILTINFS */
/* Install the character driver */