This post is older than 2 years and might not be relevant anymore
More Info: Consider searching for newer posts

External SPI Flash to use with LittleFS on nRF9160 w/ MCUboot

Hey all,

I've been bringing up the nRF9160 Feather and noticed some curious issues with adding an external partition when MCUboot is enabled.

I first tested the external chip without MCUboot using the example provided at this path: ncs/zephyr/samples/subsys/fs/littlefs

The tests passed with an .overlay file like so:

Fullscreen
1
2
3
4
5
6
7
8
9
10
11
12
13
14
/delete-node/ &storage_partition;
&w25q16jv {
partitions {
compatible = "fixed-partitions";
#address-cells = <1>;
#size-cells = <1>;
storage_partition: partition@0 {
label = "storage";
reg = <0x00000000 0x00010000>;
};
};
};
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

Now I'm trying to merge together the MCUboot + External LittleFS into one app.

My prj.conf looks like so:

Fullscreen
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# Note: fs_dirent structures are big.
CONFIG_MAIN_STACK_SIZE=2048
# Print a banner on the UART on startup.
CONFIG_BOOT_BANNER=y
# Enable console and printk()
CONFIG_PRINTK=y
CONFIG_STDOUT_CONSOLE=y
# Let __ASSERT do its job
CONFIG_DEBUG=y
CONFIG_LOG=y
# Enable Zephyr application to be booted by MCUboot
CONFIG_BOOTLOADER_MCUBOOT=y
# Adding Peripherals
CONFIG_GPIO=y
# CONFIG_I2C=y
# CONFIG_I2C_2=y
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

After some serious searching, I found there was some documentation related to external flash plus Nordic's partition manager. I was able to get the external flash to show up in the devicetree_legacy_unfixed.h

It's not quite clear to me where the devicetree ends and the partition manager begins. Here's some output from my app versus the example code:

Fullscreen
1
2
3
4
5
6
7
8
9
10
11
*** Booting Zephyr OS build v2.1.99-ncs1-2955-ge34f48a24ac4 ***
Hello World from Zephyr on circuitdojo_feather_nrf9160!
Area 6 at 0x10200 on NRF_FLASH_DRV_NAME for 478720 bytes
FAIL: mount id 6 at /lfs: -22
[00:00:00.017,028] .[0m<inf> littlefs: LittleFS version 2.2, disk version 2.0.[0m
[00:00:00.017,150] .[0m<inf> littlefs: FS at NRF_FLASH_DRV_NAME:0x10200 is 116 0x1000-byte blocks with 512 cycle.[0m
[00:00:00.017,150] .[0m<inf> littlefs: sizes: rd 16 ; pr 16 ; ca 64 ; la 32.[0m
[00:00:00.017,242] .[1;31m<err> littlefs: WEST_TOPDIR/modules/fs/littlefs/lfs.c:998: Corrupted dir pair at {0x0, 0x1}.[0m
[00:00:00.017,242] .[1;33m<wrn> littlefs: can't mount (LFS -84); formatting.[0m
[00:00:00.017,303] .[1;31m<err> littlefs: format failed (LFS -22).[0m
[00:00:00.017,303] .[1;31m<err> fs: fs mount error (-22).[0m
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

My code (which is some of the early bits of the LittleFS example)

Fullscreen
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
*** Booting Zephyr OS build v2.1.99-ncs1-2955-ge34f48a24ac4 ***
Area 6 at 0x0 on W25Q16JV for 65536 bytes
/lfs mount: 0
/lfs: bsize = 16 ; frsize = 4096 ; blocks = 16 ; bfree = 14
/lfs/boot_count stat: 0
.fn 'boot_count' siz 4
/lfs/boot_count read count 10: 4
/lfs/boot_count seek start: 0
/lfs/boot_count write new boot count 11: 4
/lfs/boot_count close: 0
/lfs opendir: 0
F 4 boot_count
End of files
/lfs unmount: 0
[00:00:00.011,108] .[0m<inf> littlefs: LittleFS version 2.2, disk version 2.0.[0m
[00:00:00.011,138] .[0m<inf> littlefs: FS at W25Q16JV:0x0 is 16 0x1000-byte blocks with 512 cycle.[0m
[00:00:00.011,169] .[0m<inf> littlefs: sizes: rd 16 ; pr 16 ; ca 64 ; la 32.[0m
[00:00:00.016,601] .[0m<inf> littlefs: /lfs mounted.[0m
[00:00:00.057,830] .[0m<inf> littlefs: /lfs unmounted.[0m
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

You can see it's referencing the correct ID but not the rest of the correct info. (Like the mount point, name, size, etc)

Any help is appreciated!