<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="https://devzone.nordicsemi.com/cfs-file/__key/system/syndication/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>littlefs not mount to external flash winbond w25q256</title><link>https://devzone.nordicsemi.com/f/nordic-q-a/123831/littlefs-not-mount-to-external-flash-winbond-w25q256</link><description>am trying to mount little fs example with my external flash winbond w25q256 but my nrf52840 board taking internal memory and am using qspi 
 it get automount and writing in internal memory ( mx25r64 ) and this is my overlay i have tried with little fs</description><dc:language>en-US</dc:language><generator>Telligent Community 13</generator><lastBuildDate>Mon, 22 Sep 2025 13:14:59 GMT</lastBuildDate><atom:link rel="self" type="application/rss+xml" href="https://devzone.nordicsemi.com/f/nordic-q-a/123831/littlefs-not-mount-to-external-flash-winbond-w25q256" /><item><title>RE: littlefs not mount to external flash winbond w25q256</title><link>https://devzone.nordicsemi.com/thread/549449?ContentTypeID=1</link><pubDate>Mon, 22 Sep 2025 13:14:59 GMT</pubDate><guid isPermaLink="false">137ad170-7792-4731-bb38-c0d22fbe4515:84076beb-cd93-4792-8371-5f887694966a</guid><dc:creator>AHaug</dc:creator><description>&lt;p&gt;Hi,&lt;/p&gt;
&lt;p&gt;You&amp;#39;re query is incomprehensive. Please use the insert code boxes that I mentioned. I&amp;#39;ve edited your reply yet again to use those.&lt;/p&gt;
&lt;p&gt;Your device initializes, but as the error states&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&amp;quot;Erase error: address or size exceeds expected values.Addr: 0x480000 size 65536&amp;quot;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Seems to me that you are writing out of bounds.&lt;/p&gt;
&lt;p&gt;Kind regards,&lt;br /&gt;Andreas&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>RE: littlefs not mount to external flash winbond w25q256</title><link>https://devzone.nordicsemi.com/thread/548808?ContentTypeID=1</link><pubDate>Tue, 16 Sep 2025 05:14:14 GMT</pubDate><guid isPermaLink="false">137ad170-7792-4731-bb38-c0d22fbe4515:41cf8fb1-0ac0-4187-a7dc-f61eb38e305d</guid><dc:creator>pushparaj</dc:creator><description>&lt;p&gt;hi &lt;a href="https://devzone.nordicsemi.com/members/ahaug"&gt;AHaug&lt;/a&gt;&amp;nbsp;aHuag can u response for the issue&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>RE: littlefs not mount to external flash winbond w25q256</title><link>https://devzone.nordicsemi.com/thread/548295?ContentTypeID=1</link><pubDate>Wed, 10 Sep 2025 01:17:28 GMT</pubDate><guid isPermaLink="false">137ad170-7792-4731-bb38-c0d22fbe4515:d56f933f-2654-43f0-abb7-6fc5eeb13c7b</guid><dc:creator>pushparaj</dc:creator><description>&lt;p&gt;&lt;pre class="ui-code" data-mode="text"&gt;#include &amp;lt;stdio.h&amp;gt;
#include &amp;lt;zephyr/kernel.h&amp;gt;
#include &amp;lt;zephyr/device.h&amp;gt;
#include &amp;lt;zephyr/fs/fs.h&amp;gt;
#include &amp;lt;zephyr/fs/littlefs.h&amp;gt;
#include &amp;lt;zephyr/logging/log.h&amp;gt;
#include &amp;lt;zephyr/storage/flash_map.h&amp;gt;
#include &amp;lt;zephyr/drivers/flash.h&amp;gt;


LOG_MODULE_REGISTER(main);

#define MAX_PATH_LEN 255
#define DATA_BLOCK_SIZE 406
#define WRITE_INTERVAL_MS 1000  // 1 second
#define MAX_FILE_SIZE_MB 10     // Very conservative 10MB limit per file
#define MAX_TOTAL_USAGE_MB 25   // Stop writing when 25MB total is used
#define MAX_FILE_SIZE_BYTES (MAX_FILE_SIZE_MB * 1024 * 1024)
#define MAX_TOTAL_USAGE_BYTES (MAX_TOTAL_USAGE_MB * 1024 * 1024)

static uint8_t data_buffer[DATA_BLOCK_SIZE];
static uint32_t write_counter = 0;
static uint32_t total_bytes_written = 0;
static uint32_t current_file_size = 0;

static void generate_data_pattern(uint8_t *buffer, uint32_t sequence_num)
{
	// Create a header with metadata (16 bytes)
	struct data_header {
		uint32_t sequence;      // 4 bytes - sequence number
		uint64_t timestamp;     // 8 bytes - system uptime
		uint32_t checksum;      // 4 bytes - simple checksum
	} __packed;

	struct data_header *header = (struct data_header *)buffer;
	
	// Fill header
	header-&amp;gt;sequence = sequence_num;
	header-&amp;gt;timestamp = k_uptime_get();
	
	// Fill remaining 390 bytes with pattern
	uint8_t *data_section = buffer + sizeof(struct data_header);
	uint16_t remaining_bytes = DATA_BLOCK_SIZE - sizeof(struct data_header);
	
	// Create pattern: repeating sequence with variations
	for (int i = 0; i &amp;lt; remaining_bytes; i++) {
		if (i % 16 == 0) {
			// Every 16th byte: sequence-dependent value
			data_section[i] = (sequence_num + i) &amp;amp; 0xFF;
		} else if (i % 8 == 0) {
			// Every 8th byte: timestamp-dependent value
			data_section[i] = (header-&amp;gt;timestamp &amp;gt;&amp;gt; (i % 32)) &amp;amp; 0xFF;
		} else {
			// Other bytes: mixed pattern
			data_section[i] = (0x55 ^ (i &amp;amp; 0xFF) ^ (sequence_num &amp;amp; 0xFF));
		}
	}
	
	// Calculate simple checksum (sum of all data bytes)
	uint32_t checksum = 0;
	for (int i = sizeof(struct data_header); i &amp;lt; DATA_BLOCK_SIZE; i++) {
		checksum += buffer[i];
	}
	header-&amp;gt;checksum = checksum;
}
static int write_406_bytes_continuous(char *fname, struct fs_mount_t *mp)
{
    struct fs_file_t file;
    int rc, ret;
    struct fs_statvfs sbuf;
    struct fs_dirent entry;

    // Get current file size before writing
    rc = fs_stat(fname, &amp;amp;entry);
    if (rc == 0) {
        current_file_size = entry.size;  // Update with actual file size
    } else if (rc != -ENOENT) {
        LOG_ERR(&amp;quot;Failed to stat file %s: %d&amp;quot;, fname, rc);
        return rc;
    }

    // Check total usage limit FIRST
    if (total_bytes_written &amp;gt; MAX_TOTAL_USAGE_BYTES) {
        LOG_ERR(&amp;quot;Total usage limit reached (%u MB) - stopping all writes&amp;quot;, MAX_TOTAL_USAGE_MB);
        return -ENOSPC;
    }

    // Check file size limit BEFORE writing
    if (current_file_size + DATA_BLOCK_SIZE &amp;gt; MAX_FILE_SIZE_BYTES) {
        LOG_WRN(&amp;quot;File size limit reached (%u MB) - need new file&amp;quot;, MAX_FILE_SIZE_MB);
        return -EFBIG;
    }

    // Rest of function remains the same...
    fs_file_t_init(&amp;amp;file);
    
    rc = fs_open(&amp;amp;file, fname, FS_O_CREATE | FS_O_APPEND | FS_O_WRITE);
    if (rc &amp;lt; 0) {
        LOG_ERR(&amp;quot;FAIL: open %s: %d&amp;quot;, fname, rc);
        return rc;
    }

    generate_data_pattern(data_buffer, write_counter);

    rc = fs_write(&amp;amp;file, data_buffer, DATA_BLOCK_SIZE);
    if (rc &amp;lt; 0) {
        LOG_ERR(&amp;quot;FAIL: write %s: %d&amp;quot;, fname, rc);
        goto out;
    }

    if (rc != DATA_BLOCK_SIZE) {
        LOG_WRN(&amp;quot;Partial write: expected %d, wrote %d bytes&amp;quot;, DATA_BLOCK_SIZE, rc);
    }

    total_bytes_written += rc;
    current_file_size += rc;
    
    // Improved logging with better formatting
    LOG_PRINTK(&amp;quot;Write #%u: %d bytes (File: %u KB, Total: %u KB = %.2f MB)\n&amp;quot;, 
               write_counter, rc, current_file_size / 1024, 
               total_bytes_written / 1024, (float)total_bytes_written / (1024.0 * 1024.0));

out:
    ret = fs_close(&amp;amp;file);
    if (ret &amp;lt; 0) {
        LOG_ERR(&amp;quot;FAIL: close %s: %d&amp;quot;, fname, ret);
        return ret;
    }

    return (rc &amp;lt; 0 ? rc : 0);
}

// static int write_406_bytes_continuous(char *fname, struct fs_mount_t *mp)
// {
// 	struct fs_file_t file;
// 	int rc, ret;
// 	struct fs_statvfs sbuf;

// 	// Check total usage limit FIRST
// 	if (total_bytes_written &amp;gt; MAX_TOTAL_USAGE_BYTES) {
// 		LOG_ERR(&amp;quot;Total usage limit reached (%u MB) - stopping all writes&amp;quot;, MAX_TOTAL_USAGE_MB);
// 		return -ENOSPC;
// 	}

// 	// Check file size limit BEFORE writing
// 	if (current_file_size + DATA_BLOCK_SIZE &amp;gt; MAX_FILE_SIZE_BYTES) {
// 		LOG_WRN(&amp;quot;File size limit reached (%u MB) - need new file&amp;quot;, MAX_FILE_SIZE_MB);
// 		return -EFBIG;  // File too big error
// 	}

// 	// Check available space before writing
// 	rc = fs_statvfs(mp-&amp;gt;mnt_point, &amp;amp;sbuf);
// 	if (rc == 0) {
// 		uint32_t used_kb = ((sbuf.f_blocks - sbuf.f_bfree) * sbuf.f_frsize) / 1024;
// 		if (used_kb &amp;gt; (MAX_TOTAL_USAGE_MB * 1024)) {
// 			LOG_ERR(&amp;quot;Usage limit exceeded: %u KB used (max %u KB)&amp;quot;, 
// 			        used_kb, MAX_TOTAL_USAGE_MB * 1024);
// 			return -ENOSPC;
// 		}
// 	}

// 	fs_file_t_init(&amp;amp;file);
	
// 	// Open file in append mode to continuously add data
// 	rc = fs_open(&amp;amp;file, fname, FS_O_CREATE | FS_O_APPEND | FS_O_WRITE);
// 	if (rc &amp;lt; 0)
// 	{
// 		LOG_ERR(&amp;quot;FAIL: open %s: %d&amp;quot;, fname, rc);
// 		return rc;
// 	}

// 	// Generate the 406-byte data pattern
// 	generate_data_pattern(data_buffer, write_counter);

// 	// Write exactly 406 bytes
// 	rc = fs_write(&amp;amp;file, data_buffer, DATA_BLOCK_SIZE);
// 	if (rc &amp;lt; 0)
// 	{
// 		LOG_ERR(&amp;quot;FAIL: write %s: %d&amp;quot;, fname, rc);
// 		goto out;
// 	}

// 	if (rc != DATA_BLOCK_SIZE) {
// 		LOG_WRN(&amp;quot;Partial write: expected %d, wrote %d bytes&amp;quot;, DATA_BLOCK_SIZE, rc);
// 	}

// 	total_bytes_written += rc;
// 	current_file_size += rc;
	
// 	LOG_PRINTK(&amp;quot;Write #%u: %d bytes (File: %u KB, Total: %u MB)\n&amp;quot;, 
// 		   write_counter, rc, current_file_size / 1024, 
// 		   total_bytes_written / (1024 * 1024));

// out:
// 	ret = fs_close(&amp;amp;file);
// 	if (ret &amp;lt; 0)
// 	{
// 		LOG_ERR(&amp;quot;FAIL: close %s: %d&amp;quot;, fname, ret);
// 		return ret;
// 	}

// 	return (rc &amp;lt; 0 ? rc : 0);
// }

static int lsdir(const char *path)
{
	int res;
	struct fs_dir_t dirp;
	static struct fs_dirent entry;

	fs_dir_t_init(&amp;amp;dirp);

	res = fs_opendir(&amp;amp;dirp, path);
	if (res)
	{
		LOG_ERR(&amp;quot;Error opening dir %s [%d]\n&amp;quot;, path, res);
		return res;
	}

	LOG_PRINTK(&amp;quot;\nListing dir %s ...\n&amp;quot;, path);
	for (;;)
	{
		res = fs_readdir(&amp;amp;dirp, &amp;amp;entry);

		if (res || entry.name[0] == 0)
		{
			if (res &amp;lt; 0)
			{
				LOG_ERR(&amp;quot;Error reading dir [%d]\n&amp;quot;, res);
			}
			break;
		}

		if (entry.type == FS_DIR_ENTRY_DIR)
		{
			LOG_PRINTK(&amp;quot;[DIR ] %s\n&amp;quot;, entry.name);
		}
		else
		{
			LOG_PRINTK(&amp;quot;[FILE] %s (size = %zu)\n&amp;quot;,
					   entry.name, entry.size);
		}
	}

	fs_closedir(&amp;amp;dirp);
	return res;
}

#ifdef CONFIG_APP_LITTLEFS_STORAGE_FLASH
static int littlefs_flash_erase(unsigned int id)
{
    const struct flash_area *pfa;
    int rc;

    rc = flash_area_open(id, &amp;amp;pfa);
    if (rc &amp;lt; 0) {
        LOG_ERR(&amp;quot;FAIL: unable to find flash area %u: %d\n&amp;quot;, id, rc);
        return rc;
    }

    LOG_PRINTK(&amp;quot;=== FLASH AREA INFO ===\n&amp;quot;);
    LOG_PRINTK(&amp;quot;Area ID: %u\n&amp;quot;, id);
    LOG_PRINTK(&amp;quot;Offset: 0x%x\n&amp;quot;, (unsigned int)pfa-&amp;gt;fa_off);
    LOG_PRINTK(&amp;quot;Size: %u bytes (%u KB)\n&amp;quot;, 
               (unsigned int)pfa-&amp;gt;fa_size, (unsigned int)pfa-&amp;gt;fa_size / 1024);
    LOG_PRINTK(&amp;quot;Device: %s\n&amp;quot;, pfa-&amp;gt;fa_dev-&amp;gt;name);
    
    if (strstr(pfa-&amp;gt;fa_dev-&amp;gt;name, &amp;quot;w25q&amp;quot;) != NULL ||
        strstr(pfa-&amp;gt;fa_dev-&amp;gt;name, &amp;quot;qspi&amp;quot;) != NULL) {
        LOG_PRINTK(&amp;quot;✓ Using EXTERNAL QSPI flash\n&amp;quot;);
    } else {
        LOG_PRINTK(&amp;quot;⚠ Using INTERNAL flash\n&amp;quot;);
    }
    LOG_PRINTK(&amp;quot;=====================\n&amp;quot;);

    if (IS_ENABLED(CONFIG_APP_WIPE_STORAGE)) {
        rc = flash_area_flatten(pfa, 0, pfa-&amp;gt;fa_size);
        LOG_PRINTK(&amp;quot;Erasing flash area ... %d\n&amp;quot;, rc);
    }
	LOG_PRINTK(&amp;quot;flash area flatten ... \n&amp;quot;);
    flash_area_close(pfa);
    return rc;
}

#define PARTITION_NODE DT_NODELABEL(lfs1)

#if DT_NODE_EXISTS(PARTITION_NODE)
FS_FSTAB_DECLARE_ENTRY(PARTITION_NODE);	
#else
FS_LITTLEFS_DECLARE_DEFAULT_CONFIG(storage);
static struct fs_mount_t lfs_storage_mnt = {
	.type = FS_LITTLEFS,
	.fs_data = &amp;amp;storage,
	.storage_dev = (void *)PM_LITTLEFS_STORAGE_ID,
	.mnt_point = &amp;quot;/lfs&amp;quot;,
};
#endif

struct fs_mount_t *mountpoint =
#if DT_NODE_EXISTS(PARTITION_NODE)
	&amp;amp;FS_FSTAB_ENTRY(PARTITION_NODE)
#else
	&amp;amp;lfs_storage_mnt
#endif
	;

static int littlefs_mount(struct fs_mount_t *mp)
{
	int rc;

	rc = littlefs_flash_erase((uintptr_t)mp-&amp;gt;storage_dev);
	if (rc &amp;lt; 0)
	{
		return rc;
	}
    
    LOG_PRINTK(&amp;quot;storage device ID to: %u\n&amp;quot;, (unsigned int)(uintptr_t)mp-&amp;gt;storage_dev);

#if !DT_NODE_EXISTS(PARTITION_NODE) || \
	!(FSTAB_ENTRY_DT_MOUNT_FLAGS(PARTITION_NODE) &amp;amp; FS_MOUNT_FLAG_AUTOMOUNT)
	rc = fs_mount(mp);
	if (rc &amp;lt; 0)
	{
		LOG_PRINTK(&amp;quot;FAIL: mount id %&amp;quot; PRIuPTR &amp;quot; at %s: %d\n&amp;quot;,
				   (uintptr_t)mp-&amp;gt;storage_dev, mp-&amp;gt;mnt_point, rc);
		return rc;
	}
	LOG_PRINTK(&amp;quot;manual mounted\n&amp;quot; );
	LOG_PRINTK(&amp;quot;%s mount: %d\n&amp;quot;, mp-&amp;gt;mnt_point, rc);
#else
	LOG_PRINTK(&amp;quot;%s automounted\n&amp;quot;, mp-&amp;gt;mnt_point);
#endif

	return 0;
}
#endif

static void print_flash_info(void)
{
    const struct device *flash_dev;
    const struct device *qspi_dev;

    flash_dev = DEVICE_DT_GET(DT_CHOSEN(zephyr_flash_controller));
    if (device_is_ready(flash_dev)) {
        LOG_PRINTK(&amp;quot;Flash controller: %s\n&amp;quot;, flash_dev-&amp;gt;name);
        LOG_PRINTK(&amp;quot;Flash device ready: %s\n&amp;quot;, device_is_ready(flash_dev) ? &amp;quot;YES&amp;quot; : &amp;quot;NO&amp;quot;);
    }

    qspi_dev = DEVICE_DT_GET(DT_NODELABEL(w25q256));
    if (device_is_ready(qspi_dev)) {
        LOG_PRINTK(&amp;quot;QSPI device: %s\n&amp;quot;, qspi_dev-&amp;gt;name);
        LOG_PRINTK(&amp;quot;QSPI device ready: %s\n&amp;quot;, device_is_ready(qspi_dev) ? &amp;quot;YES&amp;quot; : &amp;quot;NO&amp;quot;);
    }

    if (strstr(flash_dev-&amp;gt;name, &amp;quot;w25q&amp;quot;) != NULL ||
        strstr(flash_dev-&amp;gt;name, &amp;quot;qspi&amp;quot;) != NULL) {
        LOG_PRINTK(&amp;quot;✓ Using external QSPI flash\n&amp;quot;);
    } else {
        LOG_PRINTK(&amp;quot;Using internal flash\n&amp;quot;);
    }
}

static void print_filesystem_stats(void)
{
    struct fs_statvfs sbuf;
    int rc;

    rc = fs_statvfs(mountpoint-&amp;gt;mnt_point, &amp;amp;sbuf);
    if (rc &amp;lt; 0) {
        LOG_ERR(&amp;quot;FAIL: statvfs: %d\n&amp;quot;, rc);
        return;
    }

    uint32_t total_kb = (sbuf.f_blocks * sbuf.f_frsize) / 1024;
    uint32_t free_kb = (sbuf.f_bfree * sbuf.f_frsize) / 1024;
    uint32_t used_kb = total_kb - free_kb;

    LOG_PRINTK(&amp;quot;=== FILESYSTEM STATS ===\n&amp;quot;);
    LOG_PRINTK(&amp;quot;Total: %u KB, Used: %u KB, Free: %u KB\n&amp;quot;, 
               total_kb, used_kb, free_kb);
    LOG_PRINTK(&amp;quot;Data written: %u KB (%u MB)\n&amp;quot;,
               total_bytes_written / 1024, total_bytes_written / (1024 * 1024));
    LOG_PRINTK(&amp;quot;========================\n&amp;quot;);
}



int main(void)
{
	char fname_data[MAX_PATH_LEN];
	int rc;
	uint32_t file_number = 1;

	LOG_PRINTK(&amp;quot;=== 406 Byte Continuous Write Demo ===\n&amp;quot;);
	LOG_PRINTK(&amp;quot;Writing %d bytes to external flash every %d ms\n&amp;quot;, 
	           DATA_BLOCK_SIZE, WRITE_INTERVAL_MS);
	LOG_PRINTK(&amp;quot;Max file size: %d MB, Max total usage: %d MB\n&amp;quot;, 
	           MAX_FILE_SIZE_MB, MAX_TOTAL_USAGE_MB);
	LOG_PRINTK(&amp;quot;Using mount point: %s\n&amp;quot;, mountpoint-&amp;gt;mnt_point);
	LOG_PRINTK(&amp;quot;Storage device ID: %u\n&amp;quot;, (unsigned int)(uintptr_t)mountpoint-&amp;gt;storage_dev);
	
	print_flash_info();
	
	rc = littlefs_mount(mountpoint);
	if (rc &amp;lt; 0)
	{
		LOG_ERR(&amp;quot;Failed to mount LittleFS: %d\n&amp;quot;, rc);
		return 0;
	}

	// Setup initial file name
	snprintf(fname_data, sizeof(fname_data), &amp;quot;%s/data406_%03u.bin&amp;quot;, 
	         mountpoint-&amp;gt;mnt_point, file_number);

	// Delete existing files to start fresh
	LOG_PRINTK(&amp;quot;Cleaning up old files...\n&amp;quot;);
	for (int i = 1; i &amp;lt;= 10; i++) {
		char temp_fname[MAX_PATH_LEN];
		snprintf(temp_fname, sizeof(temp_fname), &amp;quot;%s/data406_%03u.bin&amp;quot;, 
		         mountpoint-&amp;gt;mnt_point, i);
		// fs_unlink(temp_fname);  // Remove old files (ignore errors)
	}

	// Initial file system status
	print_filesystem_stats();
	lsdir(mountpoint-&amp;gt;mnt_point);

	LOG_PRINTK(&amp;quot;\n=== Starting continuous 406-byte write loop ===\n&amp;quot;);
	LOG_PRINTK(&amp;quot;Current file: %s\n&amp;quot;, fname_data);

	// Continuous write loop
	while (1) {
		write_counter++;
		
		LOG_PRINTK(&amp;quot;\n--- Write cycle #%u ---\n&amp;quot;, write_counter);

		// Write exactly 406 bytes to data file
		rc = write_406_bytes_continuous(fname_data, mountpoint);
		
		if (rc == -EFBIG) {
			// File size limit reached - create new file
			file_number++;
			snprintf(fname_data, sizeof(fname_data), &amp;quot;%s/data406_%03u.bin&amp;quot;, 
			         mountpoint-&amp;gt;mnt_point, file_number);
			current_file_size = 0;  // Reset file size counter
			LOG_PRINTK(&amp;quot;Rotating to new file: %s\n&amp;quot;, fname_data);
			
			// Try writing to new file
			rc = write_406_bytes_continuous(fname_data, mountpoint);
		}
		
		if (rc == -ENOSPC) {
			LOG_ERR(&amp;quot;Storage space exhausted - stopping writes&amp;quot;);
			break;
		}
		
		if (rc &amp;lt; 0) {
			LOG_ERR(&amp;quot;Failed to write 406 bytes: %d\n&amp;quot;, rc);
			// Continue trying instead of stopping
		}

		// Print filesystem stats every 100 writes
		if (write_counter % 100 == 0) {
			print_filesystem_stats();
			lsdir(mountpoint-&amp;gt;mnt_point);
		}

		// Calculate and show data rate every 10 writes
		if (write_counter % 10 == 0) {
			uint64_t uptime_ms = k_uptime_get();
			if (uptime_ms &amp;gt; 0) {
				uint32_t bytes_per_sec = (total_bytes_written * 1000ULL) / uptime_ms;
				LOG_PRINTK(&amp;quot;Data rate: %u bytes/sec (%u KB/sec)\n&amp;quot;, 
				           bytes_per_sec, bytes_per_sec / 1024);
			}
		}

		// Wait for next write cycle
		k_msleep(WRITE_INTERVAL_MS);
	}

	LOG_PRINTK(&amp;quot;Write loop terminated\n&amp;quot;);
	return 0;
}&lt;/pre&gt;&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;br /&gt;&lt;pre class="ui-code" data-mode="text"&gt;#
# Copyright (c) 2019 Peter Bigot Consulting, LLC
#
# SPDX-License-Identifier: Apache-2.0
#

# Optionally force the file system to be recreated
# CONFIG_APP_WIPE_STORAGE=y

# fs_dirent structures are big.
CONFIG_MAIN_STACK_SIZE=4096

# Let __ASSERT do its job
CONFIG_DEBUG=y

CONFIG_LOG=y
CONFIG_LOG_MODE_MINIMAL=y

CONFIG_FLASH=y
CONFIG_FLASH_MAP=y

CONFIG_FILE_SYSTEM=y
CONFIG_FILE_SYSTEM_LITTLEFS=y
CONFIG_NORDIC_QSPI_NOR=y

CONFIG_NORDIC_QSPI_NOR_FLASH_LAYOUT_PAGE_SIZE=65536
CONFIG_NORDIC_QSPI_NOR_STACK_WRITE_BUFFER_SIZE=16
CONFIG_APP_LITTLEFS_STORAGE_FLASH=y



CONFIG_LOG_DEFAULT_LEVEL=3
CONFIG_UART_CONSOLE=n
CONFIG_USE_SEGGER_RTT=y
CONFIG_LOG=y
CONFIG_RTT_CONSOLE=y
CONFIG_APP_WIPE_STORAGE=n

CONFIG_PARTITION_MANAGER_ENABLED=y
# CONFIG_PM_OVERRIDE_EXTERNAL_DRIVER_CHECK=y
&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;
&lt;div&gt;
&lt;div&gt;&lt;span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;pre class="ui-code" data-mode="text"&gt;/ {
aliases {
qspi-flash0 = &amp;amp;w25q256;
};

chosen {
// zephyr,flash-controller = &amp;amp;w25q256;
// zephyr,flash = &amp;amp;w25q256;
nordic,pm-ext-flash = &amp;amp;w25q256;

};

// fstab {
// compatible = &amp;quot;zephyr,fstab&amp;quot;;
// lfs1: lfs1 {
// compatible = &amp;quot;zephyr,fstab,littlefs&amp;quot;;
// mount-point = &amp;quot;/lfs&amp;quot;;
// partition = &amp;lt;&amp;amp;lfs1_part&amp;gt;;
// // automount;
// read-size = &amp;lt;16&amp;gt;;
// prog-size = &amp;lt;16&amp;gt;;
// cache-size = &amp;lt;64&amp;gt;;
// lookahead-size = &amp;lt;32&amp;gt;;
// block-cycles = &amp;lt;512&amp;gt;;
// };
// };
};


/delete-node/ &amp;amp;storage_partition;
/delete-node/ &amp;amp;mx25r64;

&amp;amp;qspi {
status = &amp;quot;okay&amp;quot;;
pinctrl-0 = &amp;lt;&amp;amp;qspi_custom&amp;gt;;
pinctrl-1 = &amp;lt;&amp;amp;qspi_sleep_custom&amp;gt;;
pinctrl-names = &amp;quot;default&amp;quot;, &amp;quot;sleep&amp;quot;;

w25q256: w25q256ve@0 {
compatible = &amp;quot;nordic,qspi-nor&amp;quot;;
reg = &amp;lt;0&amp;gt;;
size = &amp;lt;DT_SIZE_M(32)&amp;gt;;
sck-frequency = &amp;lt;32000000&amp;gt;;
writeoc = &amp;quot;pp4o&amp;quot;;
readoc = &amp;quot;read4io&amp;quot;;

jedec-id = [ ef 40 19 ];
has-dpd;
t-enter-dpd = &amp;lt;3000&amp;gt;;
t-exit-dpd = &amp;lt;30000&amp;gt;;
// address-size-32;
// partitions {
// compatible = &amp;quot;fixed-partitions&amp;quot;;
// #address-cells = &amp;lt;1&amp;gt;;
// #size-cells = &amp;lt;1&amp;gt;;

// /* LittleFS partition (0-4MB) - CHANGED: Larger partition */
// lfs1_part: partition@0 {
// label = &amp;quot;littlefs_storage&amp;quot;;
// reg = &amp;lt;0x00000000 DT_SIZE_M(4)&amp;gt;;
// };

// /* Test area (4MB-8MB) */
// test_partition: partition@400000 {
// label = &amp;quot;test_area&amp;quot;;
// reg = &amp;lt;0x00400000 DT_SIZE_M(4)&amp;gt;;
// };

// external_storage_partition: partition@800000 {
// label = &amp;quot;external_storage&amp;quot;;
// reg = &amp;lt;0x00800000 DT_SIZE_M(24)&amp;gt;;
// };
// };
};
};

&amp;amp;pinctrl {
qspi_custom: qspi_custom {
group1 {
psels = &amp;lt;NRF_PSEL(QSPI_SCK, 0, 19)&amp;gt;,
&amp;lt;NRF_PSEL(QSPI_IO0, 0, 14)&amp;gt;,
&amp;lt;NRF_PSEL(QSPI_IO1, 0, 23)&amp;gt;,
&amp;lt;NRF_PSEL(QSPI_IO2, 0, 11)&amp;gt;,
&amp;lt;NRF_PSEL(QSPI_IO3, 1, 0)&amp;gt;,
&amp;lt;NRF_PSEL(QSPI_CSN, 0, 16)&amp;gt;;
nordic,drive-mode = &amp;lt;NRF_DRIVE_H0H1&amp;gt;;
};
};

qspi_sleep_custom: qspi_sleep_custom {
group1 {
psels = &amp;lt;NRF_PSEL(QSPI_SCK, 0, 19)&amp;gt;,
&amp;lt;NRF_PSEL(QSPI_IO0, 0, 14)&amp;gt;,
&amp;lt;NRF_PSEL(QSPI_IO1, 0, 23)&amp;gt;,
&amp;lt;NRF_PSEL(QSPI_IO2, 0, 11)&amp;gt;,
&amp;lt;NRF_PSEL(QSPI_IO3, 1, 0)&amp;gt;,
&amp;lt;NRF_PSEL(QSPI_CSN, 0, 16)&amp;gt;;
low-power-enable;
};
};
};
&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;pm_static.yml&amp;nbsp;&lt;br /&gt;&lt;pre class="ui-code" data-mode="text"&gt;littlefs_storage:
address: 0x0
size: 0x00400000
device: w25q256ve@0
region: external_flash&lt;/pre&gt;
&lt;div&gt;
&lt;div&gt;&lt;span&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&amp;nbsp;if i changed 4mb size to 8mb size in pm_static.yml ,it through error, if i gave 4mbit doesnt through any error it write in flash&lt;/div&gt;
&lt;div&gt;&lt;pre class="ui-code" data-mode="text"&gt;

00&amp;gt; *** Booting nRF Connect SDK v2.9.0-7787b2649840 ***
00&amp;gt; *** Using Zephyr OS v3.7.99-1f8f3dc29142 ***
00&amp;gt; === 406 Byte Continuous Write Demo ===
00&amp;gt; Writing 406 bytes to external flash every 1000 ms
00&amp;gt; Max file size: 10 MB, Max total usage: 25 MB
00&amp;gt; Using mount point: /lfs
00&amp;gt; Storage device ID: 1
00&amp;gt; Flash controller: flash-controller@4001e000
00&amp;gt; Flash device ready: YES
00&amp;gt; QSPI device: w25q256ve@0
00&amp;gt; QSPI device ready: YES
00&amp;gt; Using internal flash
00&amp;gt; === FLASH AREA INFO ===
00&amp;gt; Area ID: 1
00&amp;gt; Offset: 0x0
00&amp;gt; Size: 8388608 bytes (8192 KB)
00&amp;gt; Device: w25q256ve@0
00&amp;gt; &amp;#226; Using EXTERNAL QSPI flash
00&amp;gt; =====================
00&amp;gt; flash area flatten ...
00&amp;gt; storage device ID to: 1
00&amp;gt; I: LittleFS version 2.9, disk version 2.1
00&amp;gt; I: FS at w25q256ve@0:0x0 is 128 0x10000-byte blocks with 512 cycle
00&amp;gt; I: sizes: rd 16 ; pr 16 ; ca 64 ; la 32
00&amp;gt; E: WEST_TOPDIR/modules/fs/littlefs/lfs.c:4531: Invalid block count (64 != 128)
00&amp;gt; W: can&amp;#39;t mount (LFS -22); formatting
00&amp;gt; I: /lfs mounted
00&amp;gt; manual mounted
00&amp;gt; /lfs mount: 0
00&amp;gt; Cleaning up old files...
00&amp;gt; === FILESYSTEM STATS ===
00&amp;gt; Total: 8192 KB, Used: 128 KB, Free: 8064 KB
00&amp;gt; Data writ
00&amp;gt; --- Write cycle #5 ---
00&amp;gt; E: erase error: address or size exceeds expected values.Addr: 0x480000 size 65536
00&amp;gt; E: file write error (-22)
00&amp;gt; E: FAIL: write /lfs/data406_001.bin: -22
00&amp;gt; E: Failed to write 406 bytes: -22
00&amp;gt;
00&amp;gt;
00&amp;gt; --- Write cycle #6 ---
00&amp;gt; E: erase error: address or size exceeds expected values.Addr: 0x490000 size 65536
00&amp;gt; E: file write error (-22)
00&amp;gt; E: FAIL: write /lfs/data406_001.bin: -22
00&amp;gt; E: Failed to write 406 bytes: -22
00&amp;gt;
00&amp;gt;
00&amp;gt; --- Write cycle #7 ---
00&amp;gt; E: erase error: address or size exceeds expected values.Addr: 0x4a0000 size 65536
00&amp;gt; E: file write error (-22)
00&amp;gt; E: FAIL: write /lfs/data406_001.bin: -22
00&amp;gt; E: Failed to write 406 bytes: -22
00&amp;gt;
00&amp;gt;
00&amp;gt; --- Write cycle #8 ---
00&amp;gt; E: erase error: address or size exceeds expected values.Addr: 0x4b0000 size 65536
00&amp;gt; E: file write error (-22)
00&amp;gt; E: FAIL: write /lfs/data406_001.bin: -22
00&amp;gt; E: Failed to write 406 bytes: -22
00&amp;gt;
(Connection lost)&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>RE: littlefs not mount to external flash winbond w25q256</title><link>https://devzone.nordicsemi.com/thread/546762?ContentTypeID=1</link><pubDate>Tue, 26 Aug 2025 12:46:32 GMT</pubDate><guid isPermaLink="false">137ad170-7792-4731-bb38-c0d22fbe4515:552c9e4f-fa68-4a7c-b688-1effff0c557b</guid><dc:creator>AHaug</dc:creator><description>&lt;p&gt;Hello,&lt;/p&gt;
&lt;p&gt;Thank you for attaching this. For future references, please use the insert -&amp;gt; code functionality to make it easier to review the contents of your reply (such as I&amp;#39;ve edited your reply to show):&lt;/p&gt;
&lt;p&gt;&lt;img style="max-height:240px;max-width:320px;" src="https://devzone.nordicsemi.com/cfs-file/__key/communityserver-discussions-components-files/4/pastedimage1756212031254v2.png" alt=" " /&gt;&lt;/p&gt;
&lt;p&gt;Is this the sample you&amp;#39;ve based your application on?&lt;/p&gt;
&lt;p&gt;There should be a &lt;a href="https://github.com/zephyrproject-rtos/zephyr/tree/main/samples/subsys/fs/fs_sample"&gt;sample &lt;/a&gt;that you can use directly for the nrf52840dk with the qspi external flash overlay set up&amp;nbsp;&lt;a href="https://github.com/zephyrproject-rtos/zephyr/blob/main/samples/subsys/fs/fs_sample/boards/nrf52840dk_nrf52840_qspi.overlay"&gt;https://github.com/zephyrproject-rtos/zephyr/blob/main/samples/subsys/fs/fs_sample/boards/nrf52840dk_nrf52840_qspi.overlay&lt;/a&gt;&amp;nbsp;which should work out of the box if you add a pm_static.yml as well as modify the overlay to use your winbound external flash instead of the mx25&lt;/p&gt;
&lt;p&gt;Kind regards,&lt;br /&gt;Andreas&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>RE: littlefs not mount to external flash winbond w25q256</title><link>https://devzone.nordicsemi.com/thread/546329?ContentTypeID=1</link><pubDate>Thu, 21 Aug 2025 11:22:10 GMT</pubDate><guid isPermaLink="false">137ad170-7792-4731-bb38-c0d22fbe4515:8d34f691-ae65-4f72-bcce-8d0dea9d8a67</guid><dc:creator>pushparaj</dc:creator><description>&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&lt;span&gt;&lt;/span&gt;
&lt;div&gt;&lt;span&gt;&lt;span&gt;i have created pm_static.yml file in that i have configure external memory&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;pre class="ui-code" data-mode="text"&gt;external_flash:
address: 0x0
size: 0x2000000 # 32MB
device: w25q256ve@0
region: external_flash

littlefs_storage:
address: 0x0
size: 0x2000000 # 32MB for LittleFS
device: w25q256ve@0
region: external_flash
&lt;/pre&gt;&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span&gt;I have changed my overlay file like removing partition and fstab .&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span&gt;&lt;pre class="ui-code" data-mode="text"&gt;/ {
aliases&amp;#160;
qspi-flash0 = &amp;amp;w25q256;
};

chosen {
zephyr,flash-controller = &amp;amp;w25q256;
// zephyr,flash = &amp;amp;w25q256;
nordic,pm-ext-flash = &amp;amp;w25q256;

};

// fstab {
// compatible = &amp;quot;zephyr,fstab&amp;quot;;
// lfs1: lfs1 {
// compatible = &amp;quot;zephyr,fstab,littlefs&amp;quot;;
// mount-point = &amp;quot;/lfs&amp;quot;;
// partition = &amp;lt;&amp;amp;lfs1_part&amp;gt;;
// // automount;
// read-size = &amp;lt;16&amp;gt;;
// prog-size = &amp;lt;16&amp;gt;;
// cache-size = &amp;lt;64&amp;gt;;
// lookahead-size = &amp;lt;32&amp;gt;;
// block-cycles = &amp;lt;512&amp;gt;;
// };
// };
};


/delete-node/ &amp;amp;storage_partition;
/delete-node/ &amp;amp;mx25r64;

&amp;amp;qspi {
status = &amp;quot;okay&amp;quot;;
pinctrl-0 = &amp;lt;&amp;amp;qspi_custom&amp;gt;;
pinctrl-1 = &amp;lt;&amp;amp;qspi_sleep_custom&amp;gt;;
pinctrl-names = &amp;quot;default&amp;quot;, &amp;quot;sleep&amp;quot;;

w25q256: w25q256ve@0 {
compatible = &amp;quot;nordic,qspi-nor&amp;quot;;
reg = &amp;lt;0&amp;gt;;
size = &amp;lt;DT_SIZE_M(32)&amp;gt;;
sck-frequency = &amp;lt;8000000&amp;gt;;
writeoc = &amp;quot;pp4o&amp;quot;;
readoc = &amp;quot;read4io&amp;quot;;

jedec-id = [ ef 40 19 ];
has-dpd;
t-enter-dpd = &amp;lt;3000&amp;gt;;
t-exit-dpd = &amp;lt;30000&amp;gt;;

// partitions {
// compatible = &amp;quot;fixed-partitions&amp;quot;;
// #address-cells = &amp;lt;1&amp;gt;;
// #size-cells = &amp;lt;1&amp;gt;;

// /* LittleFS partition (0-4MB) - CHANGED: Larger partition */
// lfs1_part: partition@0 {
// label = &amp;quot;littlefs_storage&amp;quot;;
// reg = &amp;lt;0x00000000 DT_SIZE_M(4)&amp;gt;;
// };

// /* Test area (4MB-8MB) */
// test_partition: partition@400000 {
// label = &amp;quot;test_area&amp;quot;;
// reg = &amp;lt;0x00400000 DT_SIZE_M(4)&amp;gt;;
// };

// external_storage_partition: partition@800000 {
// label = &amp;quot;external_storage&amp;quot;;
// reg = &amp;lt;0x00800000 DT_SIZE_M(24)&amp;gt;;
// };
// };
};
};

&amp;amp;pinctrl {
qspi_custom: qspi_custom {
group1 {
psels = &amp;lt;NRF_PSEL(QSPI_SCK, 0, 19)&amp;gt;,
&amp;lt;NRF_PSEL(QSPI_IO0, 0, 14)&amp;gt;,
&amp;lt;NRF_PSEL(QSPI_IO1, 0, 23)&amp;gt;,
&amp;lt;NRF_PSEL(QSPI_IO2, 0, 11)&amp;gt;,
&amp;lt;NRF_PSEL(QSPI_IO3, 1, 0)&amp;gt;,
&amp;lt;NRF_PSEL(QSPI_CSN, 0, 16)&amp;gt;;
nordic,drive-mode = &amp;lt;NRF_DRIVE_H0H1&amp;gt;;
};
};

qspi_sleep_custom: qspi_sleep_custom {
group1 {
psels = &amp;lt;NRF_PSEL(QSPI_SCK, 0, 19)&amp;gt;,
&amp;lt;NRF_PSEL(QSPI_IO0, 0, 14)&amp;gt;,
&amp;lt;NRF_PSEL(QSPI_IO1, 0, 23)&amp;gt;,
&amp;lt;NRF_PSEL(QSPI_IO2, 0, 11)&amp;gt;,
&amp;lt;NRF_PSEL(QSPI_IO3, 1, 0)&amp;gt;,
&amp;lt;NRF_PSEL(QSPI_CSN, 0, 16)&amp;gt;;
low-power-enable;
};
};
};&lt;/pre&gt;&lt;/span&gt;&lt;/div&gt;
&lt;br /&gt;changed this line&amp;nbsp;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;storage_dev&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&amp;nbsp;(&lt;/span&gt;&lt;span&gt;void&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;*&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;PM_LITTLEFS_STORAGE_ID&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;pre class="ui-code" data-mode="text"&gt;#define PARTITION_NODE DT_NODELABEL(lfs1)

#if DT_NODE_EXISTS(PARTITION_NODE)
FS_FSTAB_DECLARE_ENTRY(PARTITION_NODE);
#else
FS_LITTLEFS_DECLARE_DEFAULT_CONFIG(storage);
static struct fs_mount_t lfs_storage_mnt = {
.type = FS_LITTLEFS,
.fs_data = &amp;amp;storage,
.storage_dev = (void *)PM_LITTLEFS_STORAGE_ID,
.mnt_point = &amp;quot;/lfs&amp;quot;,
};
#endif
&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;i can see that external flash is visible in flash area.&lt;br /&gt;and&amp;nbsp;this is the output in this write operation get failed&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&lt;pre class="ui-code" data-mode="text"&gt;
*** Booting nRF Connect SDK v2.9.0-7787b2649840 ***
*** Using Zephyr OS v3.7.99-1f8f3dc29142 ***
=== 406 Byte Continuous Write Demo ===
Writing 406 bytes to external flash every 1000 ms
Using mount point: /lfs
Storage device ID: 2
Flash controller: w25q256ve@0
Flash device ready: YES
QSPI device: w25q256ve@0
QSPI device ready: YES
&amp;#226; Using external QSPI flash
=== FLASH AREA INFO ===
Area ID: 2
Offset: 0x0
Size: 33554432 bytes (32768 KB)
Device: w25q256ve@0
&amp;#226; Using EXTERNAL QSPI flash
=====================
storage device ID to: 2
I: LittleFS version 2.9, disk version 2.1
I: FS at w25q256ve@0:0x0 is 512 0x10000-byte blocks with 512 cycle
I: sizes: rd 16 ; pr 16 ; ca 64 ; la 32
manual mounted
/lfs mount: 0
Deleting existing data file to start fresh...
=== FILESYSTEM STATS ===
Total: 32768 KB, Used: 128 KB, Free: 32640 KB
Data written: 0 bytes (0 KB)
========================

Listing dir /lfs ...
[FILE] data406_001.bin (size = 0)

=== Starting continuous 406-byte write loop ===

--- Write cycle #1 ---
E: eras
--- Write cycle #4 ---
E: erase error: address or size exceeds expected values.Addr: 0x1000000 size 65536
E: file write error (-22)
E: FAIL: write /lfs/data406.bin: -22
E: Failed to write 406 bytes: -22


--- Write cycle #5 ---
E: erase error: address or size exceeds expected values.Addr: 0x1010000 size 65536
E: file write error (-22)
E: FAIL: write /lfs/data406.bin: -22
E: Failed to write 406 bytes: -22
&lt;/pre&gt;&lt;/div&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>RE: littlefs not mount to external flash winbond w25q256</title><link>https://devzone.nordicsemi.com/thread/546118?ContentTypeID=1</link><pubDate>Wed, 20 Aug 2025 05:20:46 GMT</pubDate><guid isPermaLink="false">137ad170-7792-4731-bb38-c0d22fbe4515:32adc00f-12d6-4e41-bfac-c1ec859430a8</guid><dc:creator>pushparaj</dc:creator><description>&lt;p&gt;&lt;img style="max-height:240px;max-width:320px;" src="https://devzone.nordicsemi.com/resized-image/__size/640x480/__key/communityserver-discussions-components-files/4/pastedimage1755667205722v1.png" alt=" " /&gt;this is the output&lt;/p&gt;
&lt;p&gt;&amp;nbsp;Area 1 at 0xfa000 on flash-controller@4001e000 for 24576 bytes showing only internal 24 bytes&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item></channel></rss>