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