Problem with first connection to external storage using littlefs and nRF Connect SDK 2.6.0

Let me point out that when compiling on nRF Connect SDK 2.5.0, everything works perfectly.

This always happens when the external memory is not initialized yet. I have several of my own prototype boards and the same thing happens on the new nrf52840dk board.

I configure littlefs like this:

in proj.conf:

CONFIG_FILE_SYSTEM=y
CONFIG_FILE_SYSTEM_LITTLEFS=y

In pm_static.yml

external_flash:
  address: 0x0
  end_address: 0x800000
  region: external_flash
  size: 0x800000
littlefs_storage:
  address: 0x0
  end_address: 0x800000
  region: external_flash
  size: 0x800000

I use mcuboot so in child_image/mcuboot.conf

CONFIG_PM_EXTERNAL_FLASH_MCUBOOT_SECONDARY=n

In code:

FS_LITTLEFS_DECLARE_DEFAULT_CONFIG (storage_data);

static const struct device *storage_dev = NULL;

static struct fs_mount_t mnt_storage =
{
	.type = FS_LITTLEFS,
	.fs_data = &storage_data,
	.storage_dev = (void *)FLASH_AREA_ID(LITTLEFS_STORAGE),
	.mnt_point = "/lfs",
};

void storage_init ()
{
    storage_dev = DEVICE_DT_GET (DT_NODELABEL (mx25r64));
    if (storage_dev != NULL)
    {
        printk ("[Storage] Device is found\n");

    	int res = fs_mount (&mnt_storage);
        if (res == 0)
        {
            printf("[Storage] Mounted\n");
            
            res = fs_unmount (&mnt_storage);
            if (res == 0)
            {
                printf("[Storage] Unmounted\n");
            }
            else
            {
                printf("[Storage] Error unmounting: %d\n", res);
            }
        }
        else
        {
            printf("[Storage] Error mounting: %d\n", res);
        }
    }
    else
    {
        printk ("[Storage] Device not found\n");
    }
}

When I compile on SDK 2.5.0, everything is always OK.
When I compile on SDK 2.6.0, I always get error -19 with the fs_mount function, i.e.: ENODEV 19 /* No such device */ (but only if the memory has never been initialized)

Interestingly, when I compile on SDK 2.5.0 and start the memory, it initializes itself correctly, then when I compile on SDK 2.6.0, everything will work correctly, because the memory has already been initialized on 2.5.0. So the problem is only with the first initialization when using the fs_mount function on SDK 2.6.0.

Has something changed in SDK 2.6.0 that requires adding some configuration to be able to initialize external storage from littlefs?

Or do I need to add some flag to the fs_mount_t.flags structure?

Parents
  • Hi Tomasz

    Thank you for being so thorough, I have now created an internal ticket for the developers to dive into the issue. I'll let you know when I hear something.

    One thing I noticed is that with the newest Zephyr version used in NCS v2.6.0, there was an update to the LittleFS module to v2.8.1, which removed the deprecated Flash Map API macros, just in case you use either of those on your end: "Following Flash Map API macros, marked in 3.2 as deprecated, have been removed: FLASH_AREA_ID, FLASH_AREA_OFFSET, FLASH_AREA_SIZE, FLASH_AREA_LABEL_EXISTS and FLASH_AREA_DEVICE."

    Best regards,

    Simon

Reply
  • Hi Tomasz

    Thank you for being so thorough, I have now created an internal ticket for the developers to dive into the issue. I'll let you know when I hear something.

    One thing I noticed is that with the newest Zephyr version used in NCS v2.6.0, there was an update to the LittleFS module to v2.8.1, which removed the deprecated Flash Map API macros, just in case you use either of those on your end: "Following Flash Map API macros, marked in 3.2 as deprecated, have been removed: FLASH_AREA_ID, FLASH_AREA_OFFSET, FLASH_AREA_SIZE, FLASH_AREA_LABEL_EXISTS and FLASH_AREA_DEVICE."

    Best regards,

    Simon

Children
Related