Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions arch/arm/src/rp2040/rp2040_flash_mtd.c
Original file line number Diff line number Diff line change
Expand Up @@ -185,8 +185,10 @@ static struct rp2040_flash_dev_s my_dev =
NULL,
#endif
rp2040_flash_ioctl,
#ifdef CONFIG_FTL_BBM
NULL,
NULL,
#endif
"rp_flash"
},
.lock = NXMUTEX_INITIALIZER,
Expand Down
6 changes: 4 additions & 2 deletions drivers/mtd/Kconfig
Original file line number Diff line number Diff line change
Expand Up @@ -51,8 +51,8 @@ config FTL_READAHEAD
depends on DRVR_READAHEAD

config FTL_BBM
bool "Enable bad block management in the FTL layer"
default y if MTD_NAND
bool
default n
---help---
Enable logical to physical erase-block mapping in the FTL layer for
MTD devices that expose bad blocks via the MTD isbad/markbad methods.
Expand Down Expand Up @@ -240,6 +240,7 @@ menuconfig MTD_NAND
bool "MTD NAND support"
depends on ALLOW_BSD_COMPONENTS
default n
select FTL_BBM
---help---
Enable support for NAND FLASH devices.

Expand Down Expand Up @@ -419,6 +420,7 @@ endif # RAMMTD
config FILEMTD
bool "File-based MTD driver"
default n
select FTL_BBM
---help---
Build support for a File-based MTD driver.

Expand Down
9 changes: 0 additions & 9 deletions drivers/mtd/ftl.c
Original file line number Diff line number Diff line change
Expand Up @@ -951,15 +951,6 @@ int ftl_initialize_by_path(FAR const char *path, FAR struct mtd_dev_s *mtd,

finfo("path=\"%s\"\n", path);

#ifndef CONFIG_FTL_BBM
/* It is likely a configuration error if the mtd driver implements
* the bad block management, but it is still disabled by the
* configuration.
*/

DEBUGASSERT(mtd->isbad == NULL && mtd->markbad == NULL);
#endif

/* Allocate a FTL device structure */

dev = kmm_zalloc(sizeof(struct ftl_struct_s));
Expand Down
6 changes: 6 additions & 0 deletions drivers/mtd/mtd_partition.c
Original file line number Diff line number Diff line change
Expand Up @@ -116,8 +116,10 @@ static ssize_t part_write(FAR struct mtd_dev_s *dev, off_t offset,
#endif
static int part_ioctl(FAR struct mtd_dev_s *dev, int cmd,
unsigned long arg);
#ifdef CONFIG_FTL_BBM
static int part_isbad(FAR struct mtd_dev_s *dev, off_t block);
static int part_markbad(FAR struct mtd_dev_s *dev, off_t block);
#endif

/* File system methods */

Expand Down Expand Up @@ -495,6 +497,7 @@ static int part_ioctl(FAR struct mtd_dev_s *dev, int cmd, unsigned long arg)
*
****************************************************************************/

#ifdef CONFIG_FTL_BBM
static int part_isbad(FAR struct mtd_dev_s *dev, off_t block)
{
FAR struct mtd_partition_s *priv = (FAR struct mtd_partition_s *)dev;
Expand Down Expand Up @@ -540,6 +543,7 @@ static int part_markbad(FAR struct mtd_dev_s *dev, off_t block)

return -ENOSYS;
}
#endif

#if defined(CONFIG_FS_PROCFS) && !defined(CONFIG_PROCFS_EXCLUDE_PARTITIONS)

Expand Down Expand Up @@ -906,8 +910,10 @@ FAR struct mtd_dev_s *mtd_partition(FAR struct mtd_dev_s *mtd,
part->child.bwrite = part_bwrite;
part->child.read = mtd->read ? part_read : NULL;
part->child.ioctl = part_ioctl;
#ifdef CONFIG_FTL_BBM
part->child.isbad = part_isbad;
part->child.markbad = part_markbad;
#endif
#ifdef CONFIG_MTD_BYTE_WRITE
part->child.write = mtd->write ? part_write : NULL;
#endif
Expand Down
2 changes: 2 additions & 0 deletions drivers/mtd/mtd_progmem.c
Original file line number Diff line number Diff line change
Expand Up @@ -103,8 +103,10 @@ static struct progmem_dev_s g_progmem =
progmem_write,
#endif
progmem_ioctl,
#ifdef CONFIG_FTL_BBM
NULL,
NULL,
#endif
"progmem",
}
};
Expand Down
12 changes: 10 additions & 2 deletions include/nuttx/mtd/mtd.h
Original file line number Diff line number Diff line change
Expand Up @@ -97,8 +97,14 @@
#define MTD_READ(d,s,n,b) ((d)->read ? (d)->read(d,s,n,b) : (-ENOSYS))
#define MTD_WRITE(d,s,n,b) ((d)->write ? (d)->write(d,s,n,b) : (-ENOSYS))
#define MTD_IOCTL(d,c,a) ((d)->ioctl ? (d)->ioctl(d,c,a) : (-ENOSYS))
#define MTD_ISBAD(d,b) ((d)->isbad ? (d)->isbad(d,b) : (-ENOSYS))
#define MTD_MARKBAD(d,b) ((d)->markbad ? (d)->markbad(d,b) : (-ENOSYS))

#ifdef CONFIG_FTL_BBM
# define MTD_ISBAD(d,b) ((d)->isbad ? (d)->isbad(d,b) : (-ENOSYS))
# define MTD_MARKBAD(d,b) ((d)->markbad ? (d)->markbad(d,b) : (-ENOSYS))
#else
# define MTD_ISBAD(d,b) (-ENOSYS)
# define MTD_MARKBAD(d,b) (-ENOSYS)
#endif

/* If any of the low-level device drivers declare they want sub-sector erase
* support, then define MTD_SUBSECTOR_ERASE.
Expand Down Expand Up @@ -220,8 +226,10 @@ struct mtd_dev_s

/* Check/Mark bad block for the specified block number */

#ifdef CONFIG_FTL_BBM
CODE int (*isbad)(FAR struct mtd_dev_s *dev, off_t block);
CODE int (*markbad)(FAR struct mtd_dev_s *dev, off_t block);
#endif

/* Name of this MTD device */

Expand Down
Loading