This is an automated email from the ASF dual-hosted git repository.
xiaoxiang781216 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 c84b25b49a7 boards: fix mtd_partition() argument units in flash
partition loops
c84b25b49a7 is described below
commit c84b25b49a735066319de9ec64ab11f21290e984
Author: rongbaichuan <[email protected]>
AuthorDate: Mon Aug 31 01:09:12 2026 +0800
boards: fix mtd_partition() argument units in flash partition loops
mtd_partition(mtd, firstblock, nblocks) takes the partition offset and
size in units of the underlying device "blocks" (geo.blocksize), not
erase blocks. Several board drivers accumulated partoffset and computed
the partition size in erase-block units and passed them straight to
mtd_partition(), so on devices where blocksize != erasesize (W25/SST25:
256B vs 4KB, SAMD5E5 progmem: 512B vs 8KB) every partition came out
erasesize/blocksize (16x) too small and misaligned.
Convert partoffset and partszbytes to geo.blocksize units at the
mtd_partition() call site while keeping the erase-block accumulation.
Affected boards:
- stm32f103-minimum (W25)
- at32f437-mini (W25)
- stm32f429i-disco (SST25F064, enabled in the extflash defconfig)
- metro-m4 (SAMD5E5 progmem)
Also fix pre-existing nxstyle violations in the touched files so the
change passes checkpatch (see CONTRIBUTING.md).
Assisted-by: DeepSeek Harness:deepseek-v4-flash
Signed-off-by: rongbaichuan <[email protected]>
---
boards/arm/at32/at32f437-mini/src/at32_w25.c | 218 +++++++++++----------
boards/arm/samd5e5/metro-m4/src/sam_smartfs.c | 179 +++++++++--------
.../arm/stm32f1/stm32f103-minimum/src/stm32_w25.c | 15 +-
.../stm32f4/stm32f429i-disco/src/stm32_bringup.c | 21 +-
4 files changed, 244 insertions(+), 189 deletions(-)
diff --git a/boards/arm/at32/at32f437-mini/src/at32_w25.c
b/boards/arm/at32/at32f437-mini/src/at32_w25.c
index bd8dc736d8a..aa53967595d 100644
--- a/boards/arm/at32/at32f437-mini/src/at32_w25.c
+++ b/boards/arm/at32/at32f437-mini/src/at32_w25.c
@@ -129,6 +129,7 @@ int at32_w25initialize(int minor)
/* Register the MTD driver */
char path[32];
+
snprintf(path, sizeof(path), "/dev/mtdblock%d", minor);
ret = register_mtddriver(path, mtd, 0755, NULL);
if (ret < 0)
@@ -141,136 +142,149 @@ int at32_w25initialize(int minor)
/* Initialize to provide SMARTFS on the MTD interface */
#ifdef FLASH_PART
-{
- int partno;
- int partsize;
- int partoffset;
- int partszbytes;
- int erasesize;
- const char *partstring = FLASH_PART_LIST;
- const char *ptr;
- struct mtd_dev_s *mtd_part;
- char partref[16];
- struct mtd_geometry_s geo;
-
- /* Now create a partition on the FLASH device */
-
- partno = 0;
- ptr = partstring;
- partoffset = 0;
-
- /* Get the geometry of the FLASH device */
-
- ret = mtd->ioctl(mtd, MTDIOC_GEOMETRY, (unsigned long)((uintptr_t)&geo));
- if (ret < 0)
- {
- syslog(LOG_ERR, "ERROR: mtd->ioctl failed: %d\n", ret);
- return ret;
- }
-
- /* Get the Flash erase size */
-
- erasesize = geo.erasesize;
-
- while (*ptr != '\0')
+ do
{
- /* Get the partition size */
-
- partsize = atoi(ptr);
- partszbytes = (partsize << 10); /* partsize is defined in KB */
-
- /* Check if partition size is bigger then erase block */
-
- if (partszbytes < erasesize)
+ int partno;
+ int partsize;
+ int partoffset;
+ int partszbytes;
+ int erasesize;
+ int blkpererase;
+ const char *partstring = FLASH_PART_LIST;
+ const char *ptr;
+ struct mtd_dev_s *mtd_part;
+ char partref[16];
+ struct mtd_geometry_s geo;
+
+ /* Now create a partition on the FLASH device */
+
+ partno = 0;
+ ptr = partstring;
+ partoffset = 0;
+
+ /* Get the geometry of the FLASH device */
+
+ ret = mtd->ioctl(mtd, MTDIOC_GEOMETRY,
+ (unsigned long)((uintptr_t)&geo));
+ if (ret < 0)
{
- syslog(LOG_ERR,
- "ERROR: Partition size is lesser than erasesize!\n");
- return -1;
+ syslog(LOG_ERR, "ERROR: mtd->ioctl failed: %d\n", ret);
+ return ret;
}
- /* Check if partition size is multiple of erase block */
+ /* Get the Flash erase size */
- if ((partszbytes % erasesize) != 0)
+ erasesize = geo.erasesize;
+
+ while (*ptr != '\0')
{
- syslog(LOG_ERR,
- "ERROR: Partition size isn't multiple of erasesize!\n");
- return -1;
- }
+ /* Get the partition size */
+
+ partsize = atoi(ptr);
+ partszbytes = (partsize << 10); /* partsize is defined in KB */
+
+ /* Check if partition size is bigger then erase block */
+
+ if (partszbytes < erasesize)
+ {
+ syslog(LOG_ERR,
+ "ERROR: Partition size is lesser than erasesize!\n");
+ return -1;
+ }
+
+ /* Check if partition size is multiple of erase block */
+
+ if ((partszbytes % erasesize) != 0)
+ {
+ syslog(LOG_ERR,
+ "ERROR: Partition size isn't multiple of erasesize!\n");
+ return -1;
+ }
+
+ /* mtd_partition() expects the offset and size in units of the
+ * underlying device "blocks" (geo.blocksize, 256B for the W25),
+ * not erase blocks. partoffset is tracked in erase blocks, so
+ * convert. Without this, partitions are erasesize/blocksize
+ * (16x for the W25) too small and misaligned.
+ */
- mtd_part = mtd_partition(mtd, partoffset, partszbytes / erasesize);
- partoffset += partszbytes / erasesize;
+ blkpererase = geo.blocksize > 0 ? erasesize / geo.blocksize : 1;
+ mtd_part = mtd_partition(mtd, partoffset * blkpererase,
+ partszbytes / geo.blocksize);
+ partoffset += partszbytes / erasesize;
#ifdef FLASH_CONFIG_PART
- /* Test if this is the config partition */
+ /* Test if this is the config partition */
- if (FLASH_CONFIG_PART_NUMBER == partno)
- {
- /* Register the partition as the config device */
+ if (FLASH_CONFIG_PART_NUMBER == partno)
+ {
+ /* Register the partition as the config device */
- mtdconfig_register(mtd_part);
- }
- else
+ mtdconfig_register(mtd_part);
+ }
+ else
#endif
- {
- /* Now initialize a SMART Flash block device and bind it
- * to the MTD device.
- */
+ {
+ /* Now initialize a SMART Flash block device and bind it
+ * to the MTD device.
+ */
#if defined(CONFIG_MTD_SMART) && defined(CONFIG_FS_SMARTFS)
- snprintf(partref, sizeof(partref), "p%d", partno);
- smart_initialize(W25QXX_FLASH_MINOR,
- mtd_part, partref);
+ snprintf(partref, sizeof(partref), "p%d", partno);
+ smart_initialize(W25QXX_FLASH_MINOR,
+ mtd_part, partref);
#endif
- }
+ }
- /* Set the partition name */
+ /* Set the partition name */
#if defined(CONFIG_MTD_PARTITION_NAMES)
- if (!mtd_part)
- {
- syslog(LOG_ERR, "Error: failed to create partition %s\n",
- partname);
- return -1;
- }
-
- mtd_setpartitionname(mtd_part, partname);
-
- /* Now skip to next name. We don't need to split the string here
- * because the MTD partition logic will only display names up to
- * the comma, thus allowing us to use a single static name
- * in the code.
- */
+ if (!mtd_part)
+ {
+ syslog(LOG_ERR, "Error: failed to create partition %s\n",
+ partname);
+ return -1;
+ }
+
+ mtd_setpartitionname(mtd_part, partname);
+
+ /* Now skip to next name. We don't need to split the string here
+ * because the MTD partition logic will only display names up to
+ * the comma, thus allowing us to use a single static name
+ * in the code.
+ */
- while (*partname != ',' && *partname != '\0')
- {
- /* Skip to next ',' */
+ while (*partname != ',' && *partname != '\0')
+ {
+ /* Skip to next ',' */
- partname++;
- }
+ partname++;
+ }
- if (*partname == ',')
- {
- partname++;
- }
+ if (*partname == ',')
+ {
+ partname++;
+ }
#endif
- /* Update the pointer to point to the next size in the list */
+ /* Update the pointer to point to the next size in the list */
- while ((*ptr >= '0') && (*ptr <= '9'))
- {
- ptr++;
- }
+ while ((*ptr >= '0') && (*ptr <= '9'))
+ {
+ ptr++;
+ }
- if (*ptr == ',')
- {
- ptr++;
- }
+ if (*ptr == ',')
+ {
+ ptr++;
+ }
- /* Increment the part number */
+ /* Increment the part number */
- partno++;
+ partno++;
+ }
}
-}
+ while (0);
#else /* CONFIG_FLASH_PART */
diff --git a/boards/arm/samd5e5/metro-m4/src/sam_smartfs.c
b/boards/arm/samd5e5/metro-m4/src/sam_smartfs.c
index 1bdea7f5b2d..f66dfe062af 100644
--- a/boards/arm/samd5e5/metro-m4/src/sam_smartfs.c
+++ b/boards/arm/samd5e5/metro-m4/src/sam_smartfs.c
@@ -93,13 +93,15 @@ int sam_smartfs_initialize(void)
return ret;
}
- #ifdef CONFIG_MTD_PARTITION
+#ifdef CONFIG_MTD_PARTITION
+ do
{
int partno;
int partsize;
int partoffset;
int partszbytes;
int erasesize;
+ int blkpererase;
const char *partstring = "256";
const char *ptr;
struct mtd_dev_s *mtd_part;
@@ -111,95 +113,105 @@ int sam_smartfs_initialize(void)
ptr = partstring;
partoffset = 0;
- /* Get the Flash erase size */
+ /* Get the Flash erase size */
- erasesize = geo.erasesize;
+ erasesize = geo.erasesize;
- while (*ptr != '\0')
- {
- /* Get the partition size */
+ while (*ptr != '\0')
+ {
+ /* Get the partition size */
- partsize = atoi(ptr);
- partszbytes = (partsize << 10); /* partsize is defined in KB */
- printf("partsize %d partszbytes %d\n", partsize, partszbytes);
+ partsize = atoi(ptr);
+ partszbytes = (partsize << 10); /* partsize is defined in KB */
+ printf("partsize %d partszbytes %d\n", partsize, partszbytes);
- /* Check if partition size is bigger then erase block */
+ /* Check if partition size is bigger then erase block */
- if (partszbytes < erasesize)
- {
- syslog(LOG_ERR,
+ if (partszbytes < erasesize)
+ {
+ syslog(LOG_ERR,
"ERROR: Partition size is lesser than erasesize!\n");
- return -1;
- }
+ return -1;
+ }
- /* Check if partition size is multiple of erase block */
+ /* Check if partition size is multiple of erase block */
- if ((partszbytes % erasesize) != 0)
- {
- syslog(LOG_ERR,
+ if ((partszbytes % erasesize) != 0)
+ {
+ syslog(LOG_ERR,
"ERROR: Partition size is not multiple of erasesize!\n");
- return -1;
- }
-
- mtd_part = mtd_partition(mtd, partoffset,
- partszbytes / erasesize);
- partoffset += partszbytes / erasesize;
-
- /* Test if this is the config partition */
-
- #ifndef CONFIG_MTD_CONFIG_NONE
- if (partno == 0)
- {
- /* Register the partition as the config device */
-
- mtdconfig_register(mtd_part);
- }
- else
- #endif
- {
- /* Now initialize a SMART Flash block device
- * and bind it to the MTD device.
- */
-
- #if defined(CONFIG_MTD_SMART) && defined(CONFIG_FS_SMARTFS)
- snprintf(partref, sizeof(partref), "p%d", partno);
- smart_initialize(0, mtd_part, partref);
- #endif
- }
-
- /* Set the partition name */
-
- #ifdef CONFIG_MTD_PARTITION_NAMES
- if (!mtd_part)
- {
- syslog(LOG_ERR,
- "Error: failed to create partition %s\n",
- partname);
- return -1;
- }
-
- mtd_setpartitionname(mtd_part, partname);
-
- /* Now skip to next name.
- * We don't need to split the string here
- * because the MTD partition logic will only
- * display names up to the comma,
- * thus allowing us to use a single static name
- * in the code.
- */
-
- while (*partname != ',' && *partname != '\0')
- {
- /* Skip to next ',' */
-
- partname++;
- }
-
- if (*partname == ',')
- {
- partname++;
- }
- #endif
+ return -1;
+ }
+
+ /* mtd_partition() expects the offset and size in units of
+ * the underlying device "blocks" (geo.blocksize, 512B for
+ * the SAMD5E5 progmem), not erase blocks. partoffset is
+ * tracked in erase blocks, so convert. Without this,
+ * partitions are erasesize/blocksize (16x) too small and
+ * misaligned.
+ */
+
+ blkpererase = geo.blocksize > 0 ?
+ erasesize / geo.blocksize : 1;
+ mtd_part = mtd_partition(mtd, partoffset * blkpererase,
+ partszbytes / geo.blocksize);
+ partoffset += partszbytes / erasesize;
+
+ /* Test if this is the config partition */
+
+#ifndef CONFIG_MTD_CONFIG_NONE
+ if (partno == 0)
+ {
+ /* Register the partition as the config device */
+
+ mtdconfig_register(mtd_part);
+ }
+ else
+#endif
+ {
+ /* Now initialize a SMART Flash block device
+ * and bind it to the MTD device.
+ */
+
+#if defined(CONFIG_MTD_SMART) && defined(CONFIG_FS_SMARTFS)
+ snprintf(partref, sizeof(partref), "p%d", partno);
+ smart_initialize(0, mtd_part, partref);
+#endif
+ }
+
+ /* Set the partition name */
+
+#ifdef CONFIG_MTD_PARTITION_NAMES
+ if (!mtd_part)
+ {
+ syslog(LOG_ERR,
+ "Error: failed to create partition %s\n",
+ partname);
+ return -1;
+ }
+
+ mtd_setpartitionname(mtd_part, partname);
+
+ /* Now skip to next name.
+ * We don't need to split the string here
+ * because the MTD partition logic will only
+ * display names up to the comma,
+ * thus allowing us to use a single static name
+ * in the code.
+ */
+
+ while (*partname != ',' && *partname != '\0')
+ {
+ /* Skip to next ',' */
+
+ partname++;
+ }
+
+ if (*partname == ',')
+ {
+ partname++;
+ }
+#endif
/* Update the pointer to point to the next size in the list */
@@ -218,7 +230,8 @@ int sam_smartfs_initialize(void)
partno++;
}
}
- #else /* CONFIG_MTD_PARTITION */
+ while (0);
+#else /* CONFIG_MTD_PARTITION */
/* Configure the device with no partition support */
@@ -229,7 +242,7 @@ int sam_smartfs_initialize(void)
return ret;
}
- #endif
+#endif
return OK;
}
diff --git a/boards/arm/stm32f1/stm32f103-minimum/src/stm32_w25.c
b/boards/arm/stm32f1/stm32f103-minimum/src/stm32_w25.c
index 96b95da27ca..2a2d2c41825 100644
--- a/boards/arm/stm32f1/stm32f103-minimum/src/stm32_w25.c
+++ b/boards/arm/stm32f1/stm32f103-minimum/src/stm32_w25.c
@@ -123,6 +123,7 @@ int stm32_w25initialize(int minor)
/* Register the MTD driver */
char path[32];
+
snprintf(path, sizeof(path), "/dev/mtdblock%d", minor);
ret = register_mtddriver(path, mtd, 0755, NULL);
if (ret < 0)
@@ -145,12 +146,14 @@ int stm32_w25initialize(int minor)
}
#ifdef CONFIG_STM32F103MINIMUM_FLASH_PART
+ do
{
int partno;
int partsize;
int partoffset;
int partszbytes;
int erasesize;
+ int blkpererase;
const char *partstring = CONFIG_STM32F103MINIMUM_FLASH_PART_LIST;
const char *ptr;
struct mtd_dev_s *mtd_part;
@@ -191,7 +194,16 @@ int stm32_w25initialize(int minor)
return -1;
}
- mtd_part = mtd_partition(mtd, partoffset, partszbytes / erasesize);
+ /* mtd_partition() expects the offset and size in units of the
+ * underlying device "blocks" (geo.blocksize, 256B for the W25),
+ * not erase blocks. partoffset is tracked in erase blocks, so
+ * convert. Without this, partitions are erasesize/blocksize
+ * (16x for the W25) too small and misaligned.
+ */
+
+ blkpererase = geo.blocksize > 0 ? erasesize / geo.blocksize : 1;
+ mtd_part = mtd_partition(mtd, partoffset * blkpererase,
+ partszbytes / geo.blocksize);
partoffset += partszbytes / erasesize;
#ifdef CONFIG_STM32F103MINIMUM_FLASH_CONFIG_PART
@@ -265,6 +277,7 @@ int stm32_w25initialize(int minor)
partno++;
}
}
+ while (0);
#else /* CONFIG_STM32F103MINIMUM_FLASH_PART */
/* Configure the device with no partition support */
diff --git a/boards/arm/stm32f4/stm32f429i-disco/src/stm32_bringup.c
b/boards/arm/stm32f4/stm32f429i-disco/src/stm32_bringup.c
index 5b59f2dcf00..a61a077d447 100644
--- a/boards/arm/stm32f4/stm32f429i-disco/src/stm32_bringup.c
+++ b/boards/arm/stm32f4/stm32f429i-disco/src/stm32_bringup.c
@@ -180,12 +180,14 @@ int stm32_bringup(void)
}
#ifdef CONFIG_STM32F429I_DISCO_FLASH_PART
+ do
{
int partno;
int partsize;
int partoffset;
int partszbytes;
int erasesize;
+ int blkpererase;
const char *partstring = CONFIG_STM32F429I_DISCO_FLASH_PART_LIST;
const char *ptr;
struct mtd_dev_s *mtd_part;
@@ -225,8 +227,18 @@ int stm32_bringup(void)
return -1;
}
- mtd_part = mtd_partition(mtd, partoffset,
- partszbytes / erasesize);
+ /* mtd_partition() expects the offset and size in units of
+ * the underlying device "blocks" (geo.blocksize, 256B for
+ * the SST25), not erase blocks. partoffset is tracked in
+ * erase blocks, so convert. Without this, partitions are
+ * erasesize/blocksize (16x for the SST25) too small and
+ * misaligned.
+ */
+
+ blkpererase = geo.blocksize > 0 ?
+ erasesize / geo.blocksize : 1;
+ mtd_part = mtd_partition(mtd, partoffset * blkpererase,
+ partszbytes / geo.blocksize);
partoffset += partszbytes / erasesize;
#ifdef CONFIG_STM32F429I_DISCO_FLASH_CONFIG_PART
@@ -299,6 +311,7 @@ int stm32_bringup(void)
partno++;
}
}
+ while (0);
#else /* CONFIG_STM32F429I_DISCO_FLASH_PART */
/* Configure the device with no partition support */
@@ -324,9 +337,11 @@ int stm32_bringup(void)
#if defined(CONFIG_RAMMTD) && defined(CONFIG_STM32F429I_DISCO_RAMMTD)
/* Create a RAM MTD device if configured */
+ do
{
uint8_t *start =
kmm_malloc(CONFIG_STM32F429I_DISCO_RAMMTD_SIZE * 1024);
+
mtd = rammtd_initialize(start,
CONFIG_STM32F429I_DISCO_RAMMTD_SIZE * 1024);
mtd->ioctl(mtd, MTDIOC_BULKERASE, 0);
@@ -339,7 +354,7 @@ int stm32_bringup(void)
smart_initialize(CONFIG_STM32F429I_DISCO_RAMMTD_MINOR, mtd, NULL);
#endif
}
-
+ while (0);
#endif /* CONFIG_RAMMTD && CONFIG_STM32F429I_DISCO_RAMMTD */
#ifdef HAVE_USBHOST