Hello
I’m aware that this topic has been discussed in several posts from a couple of years ago, but I haven’t found a concrete solution yet.
I'm currently using an external flash to store large files, but I would also like to use the internal flash for smaller ones. Here's what I’ve tried so far:
prj.conf :
CONFIG_NCS_SAMPLES_DEFAULTS=y CONFIG_DK_LIBRARY=y CONFIG_SYSTEM_WORKQUEUE_STACK_SIZE=2048 CONFIG_USE_SEGGER_RTT=y CONFIG_RTT_CONSOLE=y CONFIG_UART_CONSOLE=n CONFIG_NEWLIB_LIBC=y CONFIG_NEWLIB_LIBC_FLOAT_PRINTF=y CONFIG_BT=y CONFIG_BT_PERIPHERAL=y CONFIG_BT_DEVICE_NAME="FREEDOM" CONFIG_BT_MAX_CONN=2 CONFIG_BT_SMP=y CONFIG_BT_MAX_PAIRED=8 CONFIG_BT_GATT_AUTO_SEC_REQ=y CONFIG_BT_FIXED_PASSKEY=y CONFIG_BT_CTLR_TX_PWR_DYNAMIC_CONTROL=y # Enable bonding CONFIG_BT_SETTINGS=y CONFIG_FLASH=y CONFIG_FLASH_PAGE_LAYOUT=y CONFIG_FLASH_MAP=y CONFIG_NVS=y CONFIG_SETTINGS=y CONFIG_SETTINGS_RUNTIME=y CONFIG_SETTINGS_NVS=y CONFIG_BT_DIS=y CONFIG_BT_DIS_SETTINGS=y CONFIG_BT_DIS_STR_MAX=32 CONFIG_BT_DIS_PNP=n CONFIG_BT_DIS_MODEL="FREEDOM" CONFIG_BT_DIS_MANUF="TELEDYNE" CONFIG_BT_DIS_SERIAL_NUMBER=y CONFIG_BT_DIS_FW_REV=y CONFIG_BT_DIS_HW_REV=y CONFIG_BT_DIS_SW_REV=y CONFIG_BT_DIS_SERIAL_NUMBER_STR="123456789abcdef" CONFIG_BT_DIS_FW_REV_STR="0.0.0" CONFIG_BT_DIS_HW_REV_STR="0.0.0" CONFIG_BT_DIS_SW_REV_STR="0.0.0" #Enable MCUBOOT bootloader build in the application CONFIG_BOOTLOADER_MCUBOOT=y CONFIG_MCUBOOT_SIGNATURE_KEY_FILE="priv.pem" #Include MCUMGR and the dependencies in the build CONFIG_NCS_SAMPLE_MCUMGR_BT_OTA_DFU=y #CONFIG_MCUMGR_TRANSPORT_BT_AUTHEN=y CONFIG_BT_EXT_ADV=y CONFIG_BT_EXT_ADV_MAX_ADV_SET=2 CONFIG_BT_DEVICE_NAME_DYNAMIC=n CONFIG_BT_CTLR_ADV_DATA_LEN_MAX=100 CONFIG_MODBUS=y CONFIG_MODBUS_RAW_ADU=y CONFIG_MODBUS_ROLE_CLIENT=y CONFIG_PARTITION_MANAGER_ENABLED=y CONFIG_FILE_SYSTEM=y CONFIG_FILE_SYSTEM_LITTLEFS=y CONFIG_CLOCK_CONTROL_NRF_K32SRC_RC=y CONFIG_CLOCK_CONTROL_NRF_K32SRC_XTAL=n CONFIG_MULTITHREADING=y CONFIG_HEAP_MEM_POOL_SIZE=60000 # Enable binary descriptors #CONFIG_BINDESC=y # Enable definition of binary descriptors #CONFIG_BINDESC_DEFINE=y # Enable default build time binary descriptors #CONFIG_BINDESC_DEFINE_BUILD_TIME=y #CONFIG_BINDESC_BUILD_DATE_TIME_STRING=y ################################################## ################ CONF TO CHECK ################### ################ TO BE REMOVED ################### ################################################## # Enable file system commands CONFIG_MCUMGR_GRP_FS=y CONFIG_MCUMGR_GRP_FS_DL_CHUNK_SIZE=200 # Enable the storage erase command. CONFIG_MCUMGR_GRP_ZBASIC=y CONFIG_MCUMGR_GRP_ZBASIC_STORAGE_ERASE=y # Optionally force the file system to be recreated #CONFIG_APP_WIPE_STORAGE=y # fs_dirent structures are big. CONFIG_MAIN_STACK_SIZE=4096 CONFIG_BT_RX_STACK_SIZE=4096 CONFIG_BT_HCI_TX_STACK_SIZE=4096 CONFIG_MCUMGR_TRANSPORT_WORKQUEUE_STACK_SIZE=6000 # Let __ASSERT do its job CONFIG_DEBUG=y CONFIG_INIT_STACKS=y CONFIG_THREAD_STACK_INFO=y CONFIG_STACK_SENTINEL=y CONFIG_THREAD_MONITOR=y CONFIG_THREAD_NAME=y CONFIG_PM_SINGLE_IMAGE=y # ou CONFIG_PM_MULTI_IMAGE si tu utilises MCUboot CONFIG_PM_OVERRIDE_EXTERNAL_DRIVER_CHECK=y CONFIG_PM_PARTITION_REGION_LITTLEFS_EXTERNAL=y #CONFIG_PM_PARTITION_REGION_SETTINGS_STORAGE_EXTERNAL=y #CONFIG_PM_PARTITION_REGION_NVS_STORAGE_EXTERNAL=y CONFIG_SPI=y CONFIG_SPI_NOR=y CONFIG_SPI_NOR_FLASH_LAYOUT_PAGE_SIZE=4096 #CONFIG_NORDIC_QSPI_NOR=y #CONFIG_NORDIC_QSPI_NOR_FLASH_LAYOUT_PAGE_SIZE=4096 CONFIG_NFCT_PINS_AS_GPIOS=y #CONFIG_LOG_DEFAULT_LEVEL=4 #CONFIG_WATCHDOG=n CONFIG_SERIAL=y CONFIG_UART_ASYNC_API=y CONFIG_UART_INTERRUPT_DRIVEN=n
app.overlay
/ {
chosen {
nordic,pm-ext-flash = &mx25r16;
};
fstab {
compatible = "zephyr,fstab";
lfs1: lfs1 {
compatible = "zephyr,fstab,littlefs";
mount-point = "/lfs1";
partition = <&lfs1_partition>;
/*automount;*/
read-size = <16>;
prog-size = <16>;
cache-size = <64>;
lookahead-size = <32>;
block-cycles = <512>;
};
lfs2: lfs2 {
compatible = "zephyr,fstab,littlefs";
mount-point = "/lfs2";
partition = <&lfs2_partition>;
/*automount;*/
read-size = <16>;
prog-size = <16>;
cache-size = <64>;
lookahead-size = <32>;
block-cycles = <512>;
};
};
};
&flash0 {
partitions {
compatible = "fixed-partitions";
#address-cells = <1>;
#size-cells = <1>;
boot_partition: partition@0 {
label = "mcuboot";
reg = <0x00000000 DT_SIZE_K(48)>;
};
slot0_partition: partition@c000 {
label = "image-0";
reg = <0x0000c000 DT_SIZE_K(472)>;
};
slot1_partition: partition@82000 {
label = "image-1";
reg = <0x00082000 DT_SIZE_K(464)>;
};
lfs2_partition: partition@f6000 {
label = "lfs2";
reg = <0x000f6000 DT_SIZE_K(8)>;
};
storage_partition: partition@f8000 {
label = "storage";
reg = <0x000f8000 DT_SIZE_K(32)>;
};
};
};
&spi2 {
compatible = "nordic,nrf-spi";
status = "okay";
cs-gpios = <&gpio0 5 GPIO_ACTIVE_LOW>;
pinctrl-0 = <&spi2_default>;
pinctrl-1 = <&spi2_sleep>;
pinctrl-names = "default", "sleep";
mx25r16: mx25r1635f@0 {
compatible = "jedec,spi-nor";
reg = <0>;
spi-max-frequency = <8000000>;
jedec-id = [c2 28 15];
/*
sfdp-bfp = [
e5 20 f1 ff ff ff ff 03 44 eb 08 6b 08 3b 04 bb
ee ff ff ff ff ff 00 ff ff ff 00 ff 0c 20 0f 52
10 d8 00 ff 23 72 f5 00 82 ed 04 cc 44 83 68 44
30 b0 30 b0 f7 c4 d5 5c 00 be 29 ff f0 d0 ff ff
];*/
size = <DT_SIZE_M(16)>;
has-dpd;
t-enter-dpd = <10000>;
t-exit-dpd = <35000>;
};
};
&mx25r16 {
status = "okay";
partitions {
compatible = "fixed-partitions";
#address-cells = <1>;
#size-cells = <1>;
lfs1_partition: partition@0 {
label = "lfs1";
reg = <0x00000000 0x200000>;
};
};
};
pm_static.yml
app:
address: 0xc200
end_address: 0x85000
region: flash_primary
size: 0x78e00
mcuboot:
address: 0x0
end_address: 0xc000
placement:
align:
end: 0x1000
before:
- mcuboot_primary
region: flash_primary
size: 0xc000
mcuboot_pad:
address: 0xc000
end_address: 0xc200
placement:
align:
start: 0x1000
before:
- mcuboot_primary_app
region: flash_primary
size: 0x200
mcuboot_primary:
address: 0xc000
end_address: 0x85000
orig_span: &id001
- mcuboot_pad
- app
region: flash_primary
sharers: 0x1
size: 0x79000
span: *id001
mcuboot_primary_app:
address: 0xc200
end_address: 0x85000
orig_span: &id002
- app
region: flash_primary
size: 0x78e00
span: *id002
mcuboot_secondary:
address: 0x85000
end_address: 0xfe000
placement:
after:
- mcuboot_primary
align:
start: 0x1000
region: flash_primary
share_size:
- mcuboot_primary
size: 0x79000
settings_storage:
address: 0xfe000
end_address: 0x100000
placement:
align:
start: 0x1000
before:
- end
region: flash_primary
size: 0x2000
sram_primary:
address: 0x20000000
end_address: 0x20040000
region: sram_primary
size: 0x40000
littlefs_storage:
address: 0xF6000
end_address: 0xF8000
region: flash_primary
size: 0x2000
littlefs_storage:
address: 0x0
device: mx25r16
end_address: 0x200000
region: external_flash
size: 0x200000
external_flash:
address: 0x0
size: 0x200000
device: mx25r16f
region: external_flash
The problem is: even though I’m trying to mount an internal flash partition as lfs2, it still seems to point to the external flash, just like lfs1.
Any ideas on how to properly configure LittleFS to use both internal and external flash independently?
Thank you in advance
Best regards,
Aurélien