This is an automated email from the ASF dual-hosted git repository.

xiaoxiang pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/nuttx-apps.git


The following commit(s) were added to refs/heads/master by this push:
     new b08c29617 system/usbmsc: Add support for setting paths that bind to 
LUN at runtime
b08c29617 is described below

commit b08c29617bbf1f2c6227f74e23ffdd7706997e0c
Author: wangjianyu3 <[email protected]>
AuthorDate: Mon Dec 2 17:02:43 2024 +0800

    system/usbmsc: Add support for setting paths that bind to LUN at runtime
    
    Help
    
      nsh> msconn -h
      Usage: msconn [-o OPTION]... [-l LUNs]...
      Configures the USB mass storage device and exports the LUN(s).
    
      Supported arguments
        -o
            nc: No const LUN
            ro: Readonly
            rw: Read/Write(default)
        -l
            Device path to export
    
      Examples
        1. Export const LUN(s) only
            msconn
        2. Export /dev/ramx and const LUN(s)
            msconn -l /dev/ramx
    
    Signed-off-by: wangjianyu3 <[email protected]>
---
 system/usbmsc/Kconfig       |  30 +++++---
 system/usbmsc/usbmsc.h      |  42 -----------
 system/usbmsc/usbmsc_main.c | 174 ++++++++++++++++++++++++++++----------------
 3 files changed, 131 insertions(+), 115 deletions(-)

diff --git a/system/usbmsc/Kconfig b/system/usbmsc/Kconfig
index 5844cba1b..d57d8fe3a 100644
--- a/system/usbmsc/Kconfig
+++ b/system/usbmsc/Kconfig
@@ -18,19 +18,21 @@ if SYSTEM_USBMSC
 
 config SYSTEM_USBMSC_NLUNS
        int "Number of LUNs"
-       default 1
+       default 8
        ---help---
-               Defines the number of logical units (LUNs) exported by the USB
+               Defines the max number of logical units (LUNs) exported by the 
USB
                storage driver.  Each LUN corresponds to one exported block 
driver
-               (or partition of a block driver).  May be 1, 2, or 3.  Default 
is 1.
+               (or partition of a block driver).  May be 1, 2, or 3.
 
 config SYSTEM_USBMSC_DEVMINOR1
        int "LUN1 Minor Device Number"
-       default 0
+       default -1
        ---help---
                The minor device number of the block driver for the first LUN. 
For
                example, N in /dev/mmcsdN.  Used for registering the block 
driver.
-               Default is zero.
+               Default -1 means the LUN is disabled.
+
+if SYSTEM_USBMSC_DEVMINOR1 > -1
 
 config SYSTEM_USBMSC_DEVPATH1
        string "LUN1 Device Path"
@@ -46,13 +48,17 @@ config SYSTEM_USBMSC_WRITEPROTECT1
                Enable this if you want to write-protect the first LUN. Default 
is
                off.
 
+endif
+
 config SYSTEM_USBMSC_DEVMINOR2
        int "LUN2 Minor Device Number"
-       default 1
+       default -1
        ---help---
                The minor device number of the block driver for the second LUN. 
For
                example, N in /dev/mmcsdN.  Used for registering the block 
driver.
-               Ignored if SYSTEM_USBMSC_NLUNS < 2. Default is one.
+               Default -1 means the LUN is disabled.
+
+if SYSTEM_USBMSC_DEVMINOR2 > -1
 
 config SYSTEM_USBMSC_DEVPATH2
        string "LUN2 Device Path"
@@ -68,13 +74,17 @@ config SYSTEM_USBMSC_WRITEPROTECT2
                Enable this if you want to write-protect the second LUN. 
Ignored if
                SYSTEM_USBMSC_NLUNS < 2. Default is off.
 
+endif
+
 config SYSTEM_USBMSC_DEVMINOR3
        int "LUN3 Minor Device Number"
-       default 2
+       default -1
        ---help---
                The minor device number of the block driver for the third LUN. 
For
                example, N in /dev/mmcsdN.  Used for registering the block 
driver.
-               Ignored if SYSTEM_USBMSC_NLUNS < 3. Default is two.
+               Default -1 means the LUN is disabled.
+
+if SYSTEM_USBMSC_DEVMINOR3 > -1
 
 config SYSTEM_USBMSC_DEVPATH3
        string "LUN3 Device Path"
@@ -90,6 +100,8 @@ config SYSTEM_USBMSC_WRITEPROTECT3
                Enable this if you want to write-protect the third LUN. Ignored 
if
                SYSTEM_USBMSC_NLUNS < 3. Default is off.
 
+endif
+
 config SYSTEM_USBMSC_DEBUGMM
        bool "USB MSC MM Debug"
        default n
diff --git a/system/usbmsc/usbmsc.h b/system/usbmsc/usbmsc.h
index 6ed81b434..70a479704 100644
--- a/system/usbmsc/usbmsc.h
+++ b/system/usbmsc/usbmsc.h
@@ -32,48 +32,6 @@
  * Pre-Processor Definitions
  ****************************************************************************/
 
-/* Configuration ************************************************************/
-
-#ifndef CONFIG_SYSTEM_USBMSC_NLUNS
-#  define CONFIG_SYSTEM_USBMSC_NLUNS 1
-#endif
-
-#ifndef CONFIG_SYSTEM_USBMSC_DEVMINOR1
-#  define CONFIG_SYSTEM_USBMSC_DEVMINOR1 0
-#endif
-
-#ifndef CONFIG_SYSTEM_USBMSC_DEVPATH1
-#  define CONFIG_SYSTEM_USBMSC_DEVPATH1 "/dev/mmcsd0"
-#endif
-
-#if CONFIG_SYSTEM_USBMSC_NLUNS > 1
-#  ifndef CONFIG_SYSTEM_USBMSC_DEVMINOR2
-#    error "CONFIG_SYSTEM_USBMSC_DEVMINOR2 for LUN=2"
-#  endif
-#  ifndef CONFIG_SYSTEM_USBMSC_DEVPATH2
-#    error "CONFIG_SYSTEM_USBMSC_DEVPATH2 for LUN=2"
-#  endif
-#  if CONFIG_SYSTEM_USBMSC_NLUNS > 2
-#    ifndef CONFIG_SYSTEM_USBMSC_DEVMINOR3
-#      error "CONFIG_SYSTEM_USBMSC_DEVMINOR2 for LUN=3"
-#    endif
-#    ifndef CONFIG_SYSTEM_USBMSC_DEVPATH3
-#      error "CONFIG_SYSTEM_USBMSC_DEVPATH3 for LUN=3"
-#    endif
-#    if CONFIG_SYSTEM_USBMSC_NLUNS > 3
-#      error "CONFIG_SYSTEM_USBMSC_NLUNS must be {1,2,3}"
-#    endif
-#  else
-#    undef CONFIG_SYSTEM_USBMSC_DEVMINOR3
-#    undef CONFIG_SYSTEM_USBMSC_DEVPATH3
-#  endif
-#else
-#  undef CONFIG_SYSTEM_USBMSC_DEVMINOR2
-#  undef CONFIG_SYSTEM_USBMSC_DEVPATH2
-#  undef CONFIG_SYSTEM_USBMSC_DEVMINOR3
-#  undef CONFIG_SYSTEM_USBMSC_DEVPATH3
-#endif
-
 /****************************************************************************
  * Public Types
  ****************************************************************************/
diff --git a/system/usbmsc/usbmsc_main.c b/system/usbmsc/usbmsc_main.c
index d4d1162c5..0da82e6ce 100644
--- a/system/usbmsc/usbmsc_main.c
+++ b/system/usbmsc/usbmsc_main.c
@@ -27,6 +27,7 @@
 #include <sys/types.h>
 #include <sys/boardctl.h>
 
+#include <fcntl.h>
 #include <stdio.h>
 #include <stdbool.h>
 #include <stdlib.h>
@@ -80,6 +81,26 @@
 #define TRACE_BITSET            
(TRACE_INIT_BITS|TRACE_ERROR_BITS|TRACE_CLASS_BITS|\
                                  
TRACE_TRANSFER_BITS|TRACE_CONTROLLER_BITS|TRACE_INTERRUPT_BITS)
 
+/* Save device path that will bind to a USB storage LUN later */
+
+#define LUN_ADD_BIND(l, i, p, f) \
+  do                             \
+    {                            \
+      l[i].path  = p;            \
+      l[i].flags = f;            \
+      i++;                       \
+    } while (0)
+
+/****************************************************************************
+ * Private Types
+ ****************************************************************************/
+
+struct usbmsc_lun_t
+{
+  FAR const char *path; /* The full path to the block driver */
+  int flags;            /* Access modes */
+};
+
 /****************************************************************************
  * Private Data
  ****************************************************************************/
@@ -392,6 +413,23 @@ static void usbmsc_disconnect(FAR void *handle)
   boardctl(BOARDIOC_USBDEV_CONTROL, (uintptr_t)&ctrl);
 }
 
+static void help_conn(void)
+{
+  printf("Usage: msconn [-o OPTION]... [-l LUNs]...\n");
+  printf("Configures the USB mass storage device and exports the LUN(s).\n");
+  printf("\nSupported arguments\n");
+  printf("  -o\n");
+  printf("      ro: Readonly\n");
+  printf("      rw: Read/Write(default)\n");
+  printf("  -l\n");
+  printf("      Device path to export\n");
+  printf("\nExamples\n");
+  printf("  1. Export const LUN(s) only\n");
+  printf("      msconn\n");
+  printf("  2. Export /dev/ramx and const LUN(s)\n");
+  printf("      msconn -l /dev/ramx\n");
+}
+
 /****************************************************************************
  * Public Functions
  ****************************************************************************/
@@ -410,9 +448,34 @@ static void usbmsc_disconnect(FAR void *handle)
 int main(int argc, FAR char *argv[])
 {
   struct boardioc_usbdev_ctrl_s ctrl;
+  struct usbmsc_lun_t luns[CONFIG_SYSTEM_USBMSC_NLUNS];
+  int num_luns = 0;
+  int flags = O_RDWR;
   FAR void *handle = NULL;
   int ret;
 
+  memset(luns, 0, sizeof(luns));
+
+  while ((ret = getopt(argc, argv, "l:o:")) != -1)
+    {
+      switch (ret)
+        {
+          case 'o':
+            if (!strcmp("ro", optarg))
+              {
+                flags = O_RDONLY;
+              }
+            else if (!strcmp("rw", optarg))
+              {
+                flags = O_RDWR;
+              }
+            break;
+          case 'l':
+            LUN_ADD_BIND(luns, num_luns, optarg, flags);
+            break;
+        }
+    }
+
   /* If this program is implemented as the NSH 'msconn' command, then we
    * need to do a little error checking to assure that we are not being
    * called re-entrantly.
@@ -428,6 +491,38 @@ int main(int argc, FAR char *argv[])
       return EXIT_FAILURE;
     }
 
+  /* Add const LUNs */
+
+#if CONFIG_SYSTEM_USBMSC_DEVMINOR1 > -1
+#  ifdef CONFIG_SYSTEM_USBMSC_WRITEPROTECT1
+    LUN_ADD_BIND(luns, num_luns, CONFIG_SYSTEM_USBMSC_DEVPATH1, O_RDONLY);
+#  else
+    LUN_ADD_BIND(luns, num_luns, CONFIG_SYSTEM_USBMSC_DEVPATH1, O_RDWR);
+#  endif
+#endif
+
+#if CONFIG_SYSTEM_USBMSC_DEVMINOR2 > -1
+#  ifdef CONFIG_SYSTEM_USBMSC_WRITEPROTECT2
+    LUN_ADD_BIND(luns, num_luns, CONFIG_SYSTEM_USBMSC_DEVPATH2, O_RDONLY);
+#  else
+    LUN_ADD_BIND(luns, num_luns, CONFIG_SYSTEM_USBMSC_DEVPATH2, O_RDWR);
+#  endif
+#endif
+
+#if CONFIG_SYSTEM_USBMSC_DEVMINOR3 > -1
+#  ifdef CONFIG_SYSTEM_USBMSC_WRITEPROTECT3
+    LUN_ADD_BIND(luns, num_luns, CONFIG_SYSTEM_USBMSC_DEVPATH3, O_RDONLY);
+#  else
+    LUN_ADD_BIND(luns, num_luns, CONFIG_SYSTEM_USBMSC_DEVPATH3, O_RDWR);
+#  endif
+#endif
+
+  if (num_luns <= 0)
+    {
+      help_conn();
+      return EINVAL;
+    }
+
 #ifdef CONFIG_SYSTEM_USBMSC_DEBUGMM
   g_usbmsc.mmstart    = mallinfo();
   g_usbmsc.mmprevious = g_usbmsc.mmstart;
@@ -462,8 +557,8 @@ int main(int argc, FAR char *argv[])
   /* Then exports the LUN(s) */
 
   printf("mcsonn_main: Configuring with NLUNS=%d\n",
-         CONFIG_SYSTEM_USBMSC_NLUNS);
-  ret = usbmsc_configure(CONFIG_SYSTEM_USBMSC_NLUNS, &handle);
+         num_luns);
+  ret = usbmsc_configure(num_luns, &handle);
   if (ret < 0)
     {
       printf("mcsonn_main: usbmsc_configure failed: %d\n", -ret);
@@ -478,73 +573,24 @@ int main(int argc, FAR char *argv[])
   printf("mcsonn_main: handle=%p\n", handle);
   check_test_memory_usage("After usbmsc_configure()");
 
-  printf("mcsonn_main: Bind LUN=0 to %s\n",
-         CONFIG_SYSTEM_USBMSC_DEVPATH1);
-
-#ifdef CONFIG_SYSTEM_USBMSC_WRITEPROTECT1
-  ret = usbmsc_bindlun(handle, CONFIG_SYSTEM_USBMSC_DEVPATH1, 0, 0, 0,
-                       true);
-#else
-  ret = usbmsc_bindlun(handle, CONFIG_SYSTEM_USBMSC_DEVPATH1, 0, 0, 0,
-                       false);
-#endif
-  if (ret < 0)
+  while (--num_luns >= 0 && luns[num_luns].path != NULL)
     {
-      printf("mcsonn_main: usbmsc_bindlun failed for LUN 1 using %s: %d\n",
-               CONFIG_SYSTEM_USBMSC_DEVPATH1, -ret);
-      usbmsc_disconnect(handle);
-      return EXIT_FAILURE;
-    }
-
-  check_test_memory_usage("After usbmsc_bindlun()");
-
-#if CONFIG_SYSTEM_USBMSC_NLUNS > 1
-
-  printf("mcsonn_main: Bind LUN=1 to %s\n",
-         CONFIG_SYSTEM_USBMSC_DEVPATH2);
-
-#ifdef CONFIG_SYSTEM_USBMSC_WRITEPROTECT2
-  ret = usbmsc_bindlun(handle, CONFIG_SYSTEM_USBMSC_DEVPATH2, 1, 0, 0,
-                       true);
-#else
-  ret = usbmsc_bindlun(handle, CONFIG_SYSTEM_USBMSC_DEVPATH2, 1, 0, 0,
-                       false);
-#endif
-  if (ret < 0)
-    {
-      printf("mcsonn_main: usbmsc_bindlun failed for LUN 2 using %s: %d\n",
-               CONFIG_SYSTEM_USBMSC_DEVPATH2, -ret);
-      usbmsc_disconnect(handle);
-      return EXIT_FAILURE;
-    }
-
-  check_test_memory_usage("After usbmsc_bindlun() #2");
-
-#if CONFIG_SYSTEM_USBMSC_NLUNS > 2
+      printf("mcsonn_main: Bind LUN=%d to %s\n",
+             num_luns, luns[num_luns].path);
 
-  printf("mcsonn_main: Bind LUN=2 to %s\n",
-         CONFIG_SYSTEM_USBMSC_DEVPATH3);
+      ret = usbmsc_bindlun(handle, luns[num_luns].path, 0, 0, 0,
+                           luns[num_luns].flags & O_WROK ? false : true);
+      if (ret < 0)
+        {
+          printf("mcsonn_main: usbmsc_bindlun failed for LUN %d using %s: "
+                 "%d\n", num_luns, luns[num_luns].path, -ret);
+          usbmsc_disconnect(handle);
+          return EXIT_FAILURE;
+        }
 
-#ifdef CONFIG_SYSTEM_USBMSC_WRITEPROTECT3
-  ret = usbmsc_bindlun(handle, CONFIG_SYSTEM_USBMSC_DEVPATH3, 2, 0, 0,
-                       true);
-#else
-  ret = usbmsc_bindlun(handle, CONFIG_SYSTEM_USBMSC_DEVPATH3, 2, 0, 0,
-                       false);
-#endif
-  if (ret < 0)
-    {
-      printf("mcsonn_main: usbmsc_bindlun failed for LUN 3 using %s: %d\n",
-               CONFIG_SYSTEM_USBMSC_DEVPATH3, -ret);
-      usbmsc_disconnect(handle);
-      return EXIT_FAILURE;
+      check_test_memory_usage("After usbmsc_bindlun()");
     }
 
-  check_test_memory_usage("After usbmsc_bindlun() #3");
-
-#endif
-#endif
-
   ret = usbmsc_exportluns(handle);
   if (ret < 0)
     {

Reply via email to