mirror of
https://github.com/apache/nuttx-apps.git
synced 2025-10-19 02:17:37 +08:00
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:
@@ -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 */
|
||||
|
Reference in New Issue
Block a user