Hi support team,
I'm currently developing a project for a custom board with a nRF9160 chip and with nRF Connect SDK 2.9.0 and Zephyr 3.7.99 using VS code with nRF connect extension as IDE.
My board collects samples from a sensor and then uploads it to the cloud. However, since I cannot lose any data I need to save it somewhere while there's no connection to the cloud, so I've added an external flash (MX25R6435F). To test the connection to my flash I used the jesd216 sample, building it to my custom board. I also included it in my device tree like this:
&spi3 { compatible = "nordic,nrf-spim"; status = "okay"; cs-gpios = <&gpio0 18 GPIO_ACTIVE_LOW>; pinctrl-0 = <&spi3_default>; pinctrl-1 = <&spi3_sleep>; pinctrl-names = "default", "sleep"; mx25r64: mx25r6435f@0 { compatible = "jedec,spi-nor"; reg = <0>; spi-max-frequency = <8000000>; jedec-id = [c2 28 17]; size = <67108864>; wp-gpios = <&gpio0 16 GPIO_ACTIVE_LOW>; hold-gpios = <&gpio0 13 GPIO_ACTIVE_LOW>; }; };
This seems to work fine, the sample output:
*** Booting nRF Connect SDK v2.9.0-7787b2649840 *** *** Using Zephyr OS v3.7.99-1f8f3dc29142 *** mx25r6435f@0: SFDP v 1.6 AP ff with 3 PH PH0: ff00 rev 1.6: 16 DW @ 30 Summary of BFP content: DTR Clocking not supported Addressing: 3-Byte only 4-KiBy erase: uniform Support QSPI XIP Support 1-1-1 Support 1-1-2: instr 3Bh, 0 mode clocks, 8 waits Support 1-1-4: instr 6Bh, 0 mode clocks, 8 waits Support 1-2-2: instr BBh, 0 mode clocks, 4 waits Support 1-4-4: instr EBh, 2 mode clocks, 4 waits Flash density: 8388608 bytes ET1: instr 20h for 4096 By; typ 48 ms, max 384 ms ET2: instr 52h for 32768 By; typ 240 ms, max 1920 ms ET3: instr D8h for 65536 By; typ 480 ms, max 3840 ms Chip erase: typ 52000 ms, max 312000 ms Byte program: type 32 + 1 * B us, max 192 + 6 * B us Page program: typ 896 us, max 5376 us Page program size: 256 By Suspend: B0h ; Resume: 30h DPD: Enter B9h, exit ABh ; delay 40000 ns ; poll 0x3d HOLD or RESET Disable: unsupported QER: 2 0-4-4 Mode methods: entry 0x9 ; exit 0x2f 4-4-4 Mode sequences: en
Now I want to include LittleFS to the project so I have a file system where I can store the sensor data.
I updated my prj.conf to include the following:
# Enable SPI NOR flash support CONFIG_SPI=y CONFIG_SPI_NOR=y CONFIG_SPI_NOR_FLASH_LAYOUT_PAGE_SIZE=4096 # Enable flash operations CONFIG_FLASH=y CONFIG_FLASH_MAP=y CONFIG_FLASH_PAGE_LAYOUT=y # Enable file system CONFIG_FILE_SYSTEM=y CONFIG_FILE_SYSTEM_LITTLEFS=y # Cpp CONFIG_CPP=y CONFIG_STD_CPP20=y CONFIG_MINIMAL_LIBCPP=y CONFIG_GLIBCXX_LIBCPP=y CONFIG_SETTINGS=y CONFIG_SETTINGS_FILE=y CONFIG_SETTINGS_FILE_PATH="/lfs/settings"
I also added this to the device tree, to tell the partition manager to include my external flash.
chosen { nordic,pm-ext-flash = &mx25r64; };
Finally, I added a pm_static.yml file to define my external flash partitions:
littlefs_storage: address: 0x00000000 # Start of the combined storage area in external flash region: external_flash size: 0x00800000 # Total size covering all three partitions placement: before: end sensordata_partition: address: 0x00000000 region: external_flash size: 0x00400000 placement: within: littlefs_storage # Explicitly part of littlefs_storage log_partition: address: 0x00400000 region: external_flash size: 0x00400000 placement: after: sensordata_partition within: littlefs_storage
When building the project I can see that my external flash partition is indeed being included, but addresses seems wrong?
app: address: 0x8000 end_address: 0x0 region: flash_primary size: -0x8000 external_flash: address: 0x1000000 end_address: 0x800000 region: external_flash size: -0x800000 littlefs_storage: address: 0x0 end_address: 0x800000 placement: before: end region: external_flash size: 0x800000 log_partition: address: 0x400000 end_address: 0x800000 placement: after: sensordata_partition within: littlefs_storage region: external_flash size: 0x400000 nrf_modem_lib_ctrl: address: 0x20008000 end_address: 0x200084e8 inside: - sram_nonsecure placement: after: - tfm_sram - start region: sram_primary size: 0x4e8 nrf_modem_lib_rx: address: 0x2000a568 end_address: 0x2000c568 inside: - sram_nonsecure placement: after: - nrf_modem_lib_tx region: sram_primary size: 0x2000 nrf_modem_lib_sram: address: 0x20008000 end_address: 0x2000c568 orig_span: &id001 - nrf_modem_lib_ctrl - nrf_modem_lib_tx - nrf_modem_lib_rx region: sram_primary size: 0x4568 span: *id001 nrf_modem_lib_tx: address: 0x200084e8 end_address: 0x2000a568 inside: - sram_nonsecure placement: after: - nrf_modem_lib_ctrl region: sram_primary size: 0x2080 otp: address: 0xff8108 end_address: 0xff83fc region: otp size: 0x2f4 sensordata_partition: address: 0x0 end_address: 0x400000 placement: within: littlefs_storage region: external_flash size: 0x400000 sram_nonsecure: address: 0x20008000 end_address: 0x20040000 orig_span: &id002 - sram_primary - nrf_modem_lib_ctrl - nrf_modem_lib_tx - nrf_modem_lib_rx region: sram_primary size: 0x38000 span: *id002 sram_primary: address: 0x2000c568 end_address: 0x20040000 region: sram_primary size: 0x33a98 sram_secure: address: 0x20000000 end_address: 0x20008000 orig_span: &id003 - tfm_sram region: sram_primary size: 0x8000 span: *id003 tfm: address: 0x0 end_address: 0x8000 placement: before: - app region: flash_primary size: 0x8000 tfm_nonsecure: address: 0x8000 end_address: 0x0 orig_span: &id004 - app region: flash_primary size: -0x8000 span: *id004 tfm_secure: address: 0x0 end_address: 0x8000 orig_span: &id005 - tfm region: flash_primary size: 0x8000 span: *id005 tfm_sram: address: 0x20000000 end_address: 0x20008000 inside: - sram_secure placement: after: - start region: sram_primary size: 0x8000
Also when running the code I instantly get a hardfault.
I just upgraded my SDK from version 2.4.0 to 2.9.0 and I can see that something called sysbuild have been introduced, maybe I'm missing a link there?
Also when this is working, I would like to configure the external flash to also have a partition for the FOTA image to free up some space on the internal flash, is this possible?