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

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

commit 525a27b8592646f67c5a45fc530c533702e9b173
Author: zhaoxingyu1 <[email protected]>
AuthorDate: Fri Sep 6 20:14:13 2024 +0800

    mtd/nvs: compatible with bread/bwrite
    
    add MTD_BREAD/MTD_BWRITE in nvs when
    CONFIG_MTD_BYTE_WRITE is n
    
    Signed-off-by: zhaoxingyu1 <[email protected]>
---
 drivers/mtd/Kconfig         |   1 -
 drivers/mtd/mtd_config_fs.c | 107 +++++++++++++++++++++++++++++++++++++-------
 2 files changed, 91 insertions(+), 17 deletions(-)

diff --git a/drivers/mtd/Kconfig b/drivers/mtd/Kconfig
index 12d61d98a2a..bd120b5d333 100644
--- a/drivers/mtd/Kconfig
+++ b/drivers/mtd/Kconfig
@@ -189,7 +189,6 @@ config MTD_CONFIG_NAME_LEN
 config MTD_CONFIG_FAIL_SAFE
        bool "Enable Fail Safe MTD Config"
        default n
-       depends on MTD_BYTE_WRITE
        ---help---
                Enable the new storage layout to support the resilient to power 
loss.
                This replaces the drivers/mtd/mtd_config, which
diff --git a/drivers/mtd/mtd_config_fs.c b/drivers/mtd/mtd_config_fs.c
index 7dae8198f37..a60fdf785d8 100644
--- a/drivers/mtd/mtd_config_fs.c
+++ b/drivers/mtd/mtd_config_fs.c
@@ -227,40 +227,41 @@ static int nvs_flash_wrt(FAR struct nvs_fs *fs, uint32_t 
addr,
   offset = fs->blocksize * (addr >> ADDR_BLOCK_SHIFT);
   offset += addr & ADDR_OFFS_MASK;
 
+#ifdef CONFIG_MTD_BYTE_WRITE
   ret = MTD_WRITE(fs->mtd, offset, len, data);
-  if (ret < 0)
-    {
-      return ret;
-    }
+#else
+  ret = MTD_BWRITE(fs->mtd, offset / fs->progsize, len / fs->progsize, data);
+#endif
 
-  return OK;
+  return ret < 0 ? ret : 0;
 }
 
 /****************************************************************************
- * Name: nvs_flash_rd
- *
- * Description:
- *   Basic flash read from nvs address.
- *
+ * Name: nvs_flash_brd
  ****************************************************************************/
 
-static int nvs_flash_rd(FAR struct nvs_fs *fs, uint32_t addr,
-                        FAR void *data, size_t len)
+static int nvs_flash_brd(FAR struct nvs_fs *fs, off_t offset,
+                         FAR void *data, size_t len)
 {
-  off_t offset;
   int ret;
 
-  offset = fs->blocksize * (addr >> ADDR_BLOCK_SHIFT);
-  offset += addr & ADDR_OFFS_MASK;
-
+#ifdef CONFIG_MTD_BYTE_WRITE
   ret = MTD_READ(fs->mtd, offset, len, data);
+#else
+  ret = MTD_BREAD(fs->mtd, offset / fs->progsize, len / fs->progsize, data);
+#endif
   if (ret == -EBADMSG)
     {
       /* ECC fail first time
        * try again to avoid transient electronic interference
        */
 
+#ifdef CONFIG_MTD_BYTE_WRITE
       ret = MTD_READ(fs->mtd, offset, len, data);
+#else
+      ret = MTD_BREAD(fs->mtd, offset / fs->progsize, len / fs->progsize,
+                      data);
+#endif
       if (ret == -EBADMSG)
         {
           /* ECC fail second time
@@ -275,6 +276,80 @@ static int nvs_flash_rd(FAR struct nvs_fs *fs, uint32_t 
addr,
   return ret < 0 ? ret : 0;
 }
 
+/****************************************************************************
+ * Name: nvs_flash_rd
+ *
+ * Description:
+ *   Basic flash read from nvs address.
+ *
+ ****************************************************************************/
+
+static int nvs_flash_rd(FAR struct nvs_fs *fs, uint32_t addr,
+                        FAR void *data, size_t len)
+{
+#ifdef CONFIG_MTD_BYTE_WRITE
+  off_t offset;
+
+  offset = fs->blocksize * (addr >> ADDR_BLOCK_SHIFT);
+  offset += addr & ADDR_OFFS_MASK;
+
+  return nvs_flash_brd(fs, offset, data, len);
+#else
+  uint8_t buf[fs->progsize];
+  size_t bytes_to_rd;
+  off_t begin_padding;
+  off_t offset;
+  int ret;
+
+  offset = fs->blocksize * (addr >> ADDR_BLOCK_SHIFT) +
+           (addr & ADDR_OFFS_MASK);
+  begin_padding = offset % fs->progsize;
+
+  if (begin_padding > 0)
+    {
+      offset -= begin_padding;
+      bytes_to_rd = MIN(fs->progsize - begin_padding, len);
+      ret = nvs_flash_brd(fs, offset, buf, fs->progsize);
+      if (ret < 0)
+        {
+          return ret;
+        }
+
+      memcpy(data, buf + begin_padding, bytes_to_rd);
+      offset += fs->progsize;
+      data += bytes_to_rd;
+      len -= bytes_to_rd;
+    }
+
+  if (len >= fs->progsize)
+    {
+      bytes_to_rd = len / fs->progsize * fs->progsize;
+      ret = nvs_flash_brd(fs, offset, data, bytes_to_rd);
+      if (ret < 0)
+        {
+          return ret;
+        }
+
+      offset += bytes_to_rd;
+      data += bytes_to_rd;
+      len -= bytes_to_rd;
+    }
+
+  if (len > 0)
+    {
+      ret = nvs_flash_brd(fs, offset, buf, fs->progsize);
+      if (ret < 0)
+        {
+          return ret;
+        }
+
+      memcpy(data, buf, len);
+    }
+
+  return 0;
+#endif
+}
+
 /****************************************************************************
  * Name: nvs_flash_ate_wrt
  *

Reply via email to