From f5eeaf1fb6c1ba30c04d21706bea20698c1f24e8 Mon Sep 17 00:00:00 2001 From: Gregory Nutt Date: Sun, 5 Aug 2018 15:35:38 -0600 Subject: [PATCH] examples/module: Add support for automounting removable media. This involves a wait for the block driver to become available before performing the mount. --- examples/elf/Kconfig | 8 ++-- examples/module/Kconfig | 60 ++++++++++++++++++++------- examples/module/module_main.c | 76 ++++++++++++++++++++++++++++++----- 3 files changed, 116 insertions(+), 28 deletions(-) diff --git a/examples/elf/Kconfig b/examples/elf/Kconfig index 3fc30389b..4aaad727a 100644 --- a/examples/elf/Kconfig +++ b/examples/elf/Kconfig @@ -51,8 +51,8 @@ config EXAMPLES_ELF_FSMOUNT default y depends on EXAMPLES_ELF_EXTERN ---help--- - Autmatically mount the external file system using the block - device provided by CONFIG_EXAMPLES_DEVPATH and the file + Automatically mount the external file system using the block + device provided by CONFIG_EXAMPLES_ELF_DEVPATH and the file system type specified by CONFIG_EXAMPLES_ELF_FSTYPE. config EXAMPLES_ELF_FSREMOVEABLE @@ -62,8 +62,8 @@ config EXAMPLES_ELF_FSREMOVEABLE ---help--- If the external file system is on removable media such as an SD card or a USB FLASH driver, then this option may be selected - to build in logic to way for the media to be installed and - initialized before trying to open it. + to build in logic to wait for the media to be installed and + initialized before trying to mount it. config EXAMPLES_ELF_DEVMINOR int "ROMFS Minor Device Number" diff --git a/examples/module/Kconfig b/examples/module/Kconfig index 1a27058f1..99a3e7019 100644 --- a/examples/module/Kconfig +++ b/examples/module/Kconfig @@ -31,7 +31,8 @@ config EXAMPLES_MODULE_BUILTINFS the fsroot/ directory. You can then copy them to, say an SD card, for testing on the target. That file system will need to be mounted such that CONFIG_EXAMPLES_MODULE_BINDIR refers to the directory - containing the module binaries. + containing the module binaries (unless the file system is auto- + automounted) NOTE: This option can only be used in the FLAT build mode because it makes an illegal OS call to ramdisk_register(). @@ -67,22 +68,51 @@ config EXAMPLES_MODULE_DEVMINOR Used for registering the RAM block driver that will hold the ROMFS file system containing the MODULE executables to be tested. Default: 0 -config EXAMPLES_MODULE_DEVPATH - string "ROMFS Device Path" - default "/dev/ram0" - depends on EXAMPLES_MODULE_ROMFS - ---help--- - The path to the ROMFS block driver device. This must match EXAMPLES_MODULE_DEVMINOR. - Used for registering the RAM block driver that will hold the ROMFS file system - containing the MODULE executables to be tested. Default: "/dev/ram0" - -config EXAMPLES_MODULE_BINDIR - string "Path to Test Modules" - default "/mnt/sdcard" +config EXAMPLES_MODULE_FSMOUNT + bool "Mount external file system" + default y depends on !EXAMPLES_MODULE_BUILTINFS ---help--- - The path to the directory on the mounted volume where the test - modules can found at runtime. + Automatically mount the external file system using the block + device provided by CONFIG_EXAMPLES_MODULE_DEVPATH and the file + system type specified by CONFIG_EXAMPLES_MODULE_FSTYPE. + +config EXAMPLES_MODULE_FSREMOVEABLE + bool "Removable file system" + default n + depends on EXAMPLES_MODULE_FSMOUNT + ---help--- + If the external file system is on removable media such as an + SD card or a USB FLASH driver, then this option may be selected + to build in logic to wait for the media to be installed and + initialized before trying to mount it. + +config EXAMPLES_MODULE_FSTYPE + string "External file system type" + default "vfat" + depends on EXAMPLES_MODULE_FSMOUNT + ---help--- + The type of the external file system as will be used in the mount() + command. Default: "vfat" + +config EXAMPLES_MODULE_DEVPATH + string "Block driver device path" + default "/dev/ram0" if EXAMPLES_MODULE_ROMFS + default "/dev/mmcsd0" if EXAMPLES_MODULE_FSMOUNT + depends on EXAMPLES_MODULE_ROMFS || EXAMPLES_MODULE_FSMOUNT + ---help--- + The path to the ROMFS/External block driver device. This must match + EXAMPLES_MODULE_DEVMINOR for the case of ROMFS. Used for mounting the + file system containing the ELF executables to be tested. Default: + "/dev/ram0" for ROMFS, "/dev/mmcsd0" for the external file system. + +config EXAMPLES_MODULE_BINDIR + string "Path to binaries" + default "/mnt/moddata" + depends on !EXAMPLES_MODULE_BUILTINFS && !EXAMPLES_MODULE_FSMOUNT + ---help--- + The full, absolte path to the location for the binaries can be + located in a pre-mounted external file system. config EXAMPLES_MODULE_NOSTRIP bool "Do not strip debug symbols" diff --git a/examples/module/module_main.c b/examples/module/module_main.c index 25f47866c..be75a0903 100644 --- a/examples/module/module_main.c +++ b/examples/module/module_main.c @@ -40,9 +40,8 @@ #include #include -#ifdef CONFIG_EXAMPLES_MODULE_BUILTINFS -# include -#endif +#include +#include #include #include @@ -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 */