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 *
