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

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


The following commit(s) were added to refs/heads/master by this push:
     new 5e117fda60c mtdconfig: support ram_mtdconfig device && lomtdconfig 
device
5e117fda60c is described below

commit 5e117fda60c0975ce61c98408ffb575eb176ac8b
Author: guohao15 <[email protected]>
AuthorDate: Mon Dec 16 17:05:58 2024 +0800

    mtdconfig: support ram_mtdconfig device && lomtdconfig device
    
    For nvs test in qemu
    
    Signed-off-by: guohao15 <[email protected]>
---
 drivers/mtd/filemtd.c      | 51 ++++++++++++++++++++++++++++++++++++++++++++--
 include/nuttx/fs/loopmtd.h |  3 +++
 2 files changed, 52 insertions(+), 2 deletions(-)

diff --git a/drivers/mtd/filemtd.c b/drivers/mtd/filemtd.c
index f9694f1b5c9..149062c9efd 100644
--- a/drivers/mtd/filemtd.c
+++ b/drivers/mtd/filemtd.c
@@ -42,6 +42,9 @@
 #include <nuttx/fs/ioctl.h>
 #include <nuttx/fs/loopmtd.h>
 #include <nuttx/mtd/mtd.h>
+#ifdef CONFIG_MTD_CONFIG
+#  include <nuttx/mtd/configdata.h>
+#endif
 
 /****************************************************************************
  * Pre-processor Definitions
@@ -551,8 +554,14 @@ static int filemtd_ioctl(FAR struct mtd_dev_s *dev, int 
cmd,
  ****************************************************************************/
 
 #ifdef CONFIG_MTD_LOOP
+#  ifdef CONFIG_MTD_CONFIG
+static int mtd_loop_setup(FAR const char *devname, FAR const char *filename,
+                          int sectsize, int erasesize, off_t offset,
+                          int configdata)
+#  else
 static int mtd_loop_setup(FAR const char *devname, FAR const char *filename,
                           int sectsize, int erasesize, off_t offset)
+#  endif
 {
   FAR struct mtd_dev_s *mtd;
   int ret;
@@ -563,7 +572,29 @@ static int mtd_loop_setup(FAR const char *devname, FAR 
const char *filename,
       return -ENOENT;
     }
 
-  ret = register_mtddriver(devname, mtd, 0755, NULL);
+#  ifdef CONFIG_MTD_CONFIG
+  if (configdata)
+    {
+      if (configdata == 2)
+        {
+          /* Try to erase the entire device, before register */
+
+          FAR struct file_dev_s *fdev = (FAR struct file_dev_s *)mtd;
+          mtd->erase(mtd, offset / erasesize, fdev->nblocks);
+        }
+
+      ret = mtdconfig_register_by_path(mtd, devname);
+      if (ret == -EDEADLK)
+        {
+          ferr("ERROR: mtdconfig_register_by_path failed: %d\n", ret);
+        }
+    }
+  else
+#  endif
+    {
+      ret = register_mtddriver(devname, mtd, 0755, NULL);
+    }
+
   if (ret != OK)
     {
       filemtd_teardown(mtd);
@@ -615,7 +646,17 @@ static int mtd_loop_teardown(FAR const char *devname)
   /* Now teardown the filemtd */
 
   filemtd_teardown(&dev->mtd);
-  unregister_mtddriver(devname);
+
+#  ifdef CONFIG_MTD_CONFIG
+  if (inode->i_private)
+    {
+      mtdconfig_unregister_by_path(devname);
+    }
+  else
+#  endif
+    {
+      unregister_mtddriver(devname);
+    }
 
   return OK;
 }
@@ -674,9 +715,15 @@ static int mtd_loop_ioctl(FAR struct file *filep, int cmd,
           }
         else
           {
+#  ifdef CONFIG_MTD_CONFIG
+            ret = mtd_loop_setup(setup->devname, setup->filename,
+                                 setup->sectsize, setup->erasesize,
+                                 setup->offset, setup->configdata);
+#  else
             ret = mtd_loop_setup(setup->devname, setup->filename,
                                  setup->sectsize, setup->erasesize,
                                  setup->offset);
+#  endif
           }
       }
       break;
diff --git a/include/nuttx/fs/loopmtd.h b/include/nuttx/fs/loopmtd.h
index 23b11ded7ab..b3c5e05dd9e 100644
--- a/include/nuttx/fs/loopmtd.h
+++ b/include/nuttx/fs/loopmtd.h
@@ -75,6 +75,9 @@ struct mtd_losetup_s
   size_t          erasesize;    /* The erase size to use on the file */
   size_t          sectsize;     /* The sector / page size of the file */
   off_t           offset;       /* An offset that may be applied to the device 
*/
+#  ifdef CONFIG_MTD_CONFIG
+  int             configdata;   /* 1: register mtdconfig device, 2: erase 
before register */
+#  endif
 };
 #endif
 

Reply via email to