My project is using NCS 2.6.0, builds the _ns variant with TF-M and mcuboot, and targets nRF5340 with an 8MB QSPI flash (it's a custom board, but mirrors the 5340DK in this regard).
For some time now I've operated with a certain partition layout. In this arrangement the SPI flash contains 0xf0000 for app core OTA, 0x40000 for net core OTA, 0x4000 for settings NVS, and 0xa000 for lfs. The remaining 0x6c2000 of the flash is allocated to the external_flash partition. This is the pm_static.yml I'm starting from:
mcuboot_secondary:
address: 0x0
device: DT_CHOSEN(nordic_pm_ext_flash)
end_address: 0xf0000
placement:
align:
start: 0x4
region: external_flash
share_size:
- mcuboot_primary
size: 0xf0000
mcuboot_secondary_1:
address: 0xf0000
device: DT_CHOSEN(nordic_pm_ext_flash)
end_address: 0x130000
region: external_flash
size: 0x40000
external_flash:
address: 0x13e000
end_address: 0x800000
region: external_flash
size: 0x6c2000
nonsecure_storage:
address: 0x130000
end_address: 0x13e000
orig_span: &id008
- settings_storage
- littlefs_storage
region: external_flash
size: 0xe000
span: *id008
settings_storage:
address: 0x130000
device: DT_CHOSEN(nordic_pm_ext_flash)
end_address: 0x134000
inside:
- nonsecure_storage
placement:
align:
start: 0x4000
before:
- littlefs_storage
region: external_flash
size: 0x4000
littlefs_storage:
address: 0x134000
device: DT_CHOSEN(nordic_pm_ext_flash)
end_address: 0x13e000
placement:
before:
- end
region: external_flash
size: 0xa000
mcuboot:
address: 0x0
end_address: 0x10000
placement:
before:
- mcuboot_primary
region: flash_primary
size: 0x10000
mcuboot_pad:
address: 0x10000
end_address: 0x10200
placement:
align:
start: 0x4000
before:
- mcuboot_primary_app
region: flash_primary
size: 0x200
mcuboot_primary:
address: 0x10000
end_address: 0x100000
orig_span: &id001
- app
- tfm
- mcuboot_pad
region: flash_primary
size: 0xf0000
span: *id001
mcuboot_primary_1:
address: 0x0
device: nordic_ram_flash_controller
end_address: 0x40000
region: ram_flash
size: 0x40000
mcuboot_primary_app:
address: 0x10200
end_address: 0x100000
orig_span: &id002
- app
- tfm
region: flash_primary
size: 0xefe00
span: *id002
app:
address: 0x20000
end_address: 0x100000
region: flash_primary
size: 0xf0000
mcuboot_sram:
address: 0x20000000
end_address: 0x20080000
orig_span: &id003
- sram_primary
- rpmsg_nrf53_sram
- tfm_sram
- pcd_sram
region: sram_primary
size: 0x80000
span: *id003
otp:
address: 0xff8100
end_address: 0xff83fc
region: otp
size: 0x2fc
pcd_sram:
address: 0x20000000
end_address: 0x20002000
placement:
before:
- tfm_sram
region: sram_primary
size: 0x2000
ram_flash:
address: 0x40000
end_address: 0x40000
region: ram_flash
size: 0x0
rpmsg_nrf53_sram:
address: 0x20070000
end_address: 0x20080000
placement:
before:
- end
region: sram_primary
size: 0x10000
sram_nonsecure:
address: 0x2000a000
end_address: 0x20080000
orig_span: &id004
- sram_primary
- rpmsg_nrf53_sram
region: sram_primary
size: 0x76000
span: *id004
sram_primary:
address: 0x2000a000
end_address: 0x20070000
region: sram_primary
size: 0x66000
sram_secure:
address: 0x20000000
end_address: 0x2000a000
orig_span: &id005
- pcd_sram
- tfm_sram
region: sram_primary
size: 0xa000
span: *id005
tfm:
address: 0x10200
end_address: 0x20000
inside:
- mcuboot_primary_app
placement:
before:
- app
region: flash_primary
size: 0xfe00
tfm_nonsecure:
address: 0x20000
end_address: 0x100000
orig_span: &id006
- app
region: flash_primary
size: 0xe0000
span: *id006
tfm_secure:
address: 0x10000
end_address: 0x20000
orig_span: &id007
- mcuboot_pad
- tfm
region: flash_primary
size: 0x10000
span: *id007
tfm_sram:
address: 0x20002000
end_address: 0x2000a000
inside:
- sram_secure
placement:
after:
- start
region: sram_primary
size: 0x8000
It's confusing that there is a region called external_flash and also a partition called external_flash. I don't recall how this came to be -- most likely is that it was generated this way in build/partitions.yml which I copied when originally creating pm_static.yml. I note that the file v2.6.0/nrf/samples/nrf5340/extxip_smp_svr/pm_static.yml also contains a partition external_flash, but in this sample, their external_flash partition overlaps their mcuboot_primary_2 and mcuboot_secondary_2 partitions. So here's one problem: my understanding of the purpose of the external_flash partition is flawed; I had though it should be covering all of, and exclusively, the unused portion of flash. I deleted this partition in my changes below, but I question whether I should be keeping it and what addresses it should be assigned.
I'd like to add 0x10000 pad between mcuboot_secondary and mcuboot_secondary_1, grow the nonsecure_storage to 0x20000, and allocate the remaining 0x6a0000 of the flash to lfs. I modified the pm_static.yml accordingly: insert secondary_pad, slide mcuboot_secondary_1, adjust the boundaries on nonsecure_storage, slide and adjust settings_storage and littlefs_storage.
mcuboot_secondary:
address: 0x0
device: DT_CHOSEN(nordic_pm_ext_flash)
end_address: 0xf0000
placement:
align:
start: 0x4
region: external_flash
share_size:
- mcuboot_primary
size: 0xf0000
secondary_pad: # Pad out the app image space to a full 1 MB
address: 0xf0000
end_address: 0x100000
region: external_flash
size: 0x10000
mcuboot_secondary_1:
address: 0x100000
device: DT_CHOSEN(nordic_pm_ext_flash)
end_address: 0x140000
region: external_flash
size: 0x40000
nonsecure_storage:
address: 0x140000
end_address: 0x800000
orig_span: &id008
- settings_storage
- littlefs_storage
region: external_flash
size: 0x6c0000
span: *id008
settings_storage:
address: 0x140000
device: DT_CHOSEN(nordic_pm_ext_flash)
end_address: 0x160000
inside:
- nonsecure_storage
placement:
align:
start: 0x10000
before:
- littlefs_storage
region: external_flash
size: 0x20000
littlefs_storage:
address: 0x160000
device: DT_CHOSEN(nordic_pm_ext_flash)
end_address: 0x800000
placement:
before:
- end
region: external_flash
size: 0x6a0000
app:
address: 0x20000
end_address: 0x100000
region: flash_primary
size: 0xf0000
mcuboot:
address: 0x0
end_address: 0x10000
placement:
before:
- mcuboot_primary
region: flash_primary
size: 0x10000
mcuboot_pad:
address: 0x10000
end_address: 0x10200
placement:
align:
start: 0x4000
before:
- mcuboot_primary_app
region: flash_primary
size: 0x200
mcuboot_primary:
address: 0x10000
end_address: 0x100000
orig_span: &id001
- app
- tfm
- mcuboot_pad
region: flash_primary
size: 0xf0000
span: *id001
mcuboot_primary_1:
address: 0x0
device: nordic_ram_flash_controller
end_address: 0x40000
region: ram_flash
size: 0x40000
mcuboot_primary_app:
address: 0x10200
end_address: 0x100000
orig_span: &id002
- app
- tfm
region: flash_primary
size: 0xefe00
span: *id002
mcuboot_sram:
address: 0x20000000
end_address: 0x20080000
orig_span: &id003
- sram_primary
- rpmsg_nrf53_sram
- tfm_sram
- pcd_sram
region: sram_primary
size: 0x80000
span: *id003
otp:
address: 0xff8100
end_address: 0xff83fc
region: otp
size: 0x2fc
pcd_sram:
address: 0x20000000
end_address: 0x20002000
placement:
before:
- tfm_sram
region: sram_primary
size: 0x2000
ram_flash:
address: 0x40000
end_address: 0x40000
region: ram_flash
size: 0x0
rpmsg_nrf53_sram:
address: 0x20070000
end_address: 0x20080000
placement:
before:
- end
region: sram_primary
size: 0x10000
sram_nonsecure:
address: 0x2000a000
end_address: 0x20080000
orig_span: &id004
- sram_primary
- rpmsg_nrf53_sram
region: sram_primary
size: 0x76000
span: *id004
sram_primary:
address: 0x2000a000
end_address: 0x20070000
region: sram_primary
size: 0x66000
sram_secure:
address: 0x20000000
end_address: 0x2000a000
orig_span: &id005
- pcd_sram
- tfm_sram
region: sram_primary
size: 0xa000
span: *id005
tfm:
address: 0x10200
end_address: 0x20000
inside:
- mcuboot_primary_app
placement:
before:
- app
region: flash_primary
size: 0xfe00
tfm_nonsecure:
address: 0x20000
end_address: 0x100000
orig_span: &id006
- app
region: flash_primary
size: 0xe0000
span: *id006
tfm_secure:
address: 0x10000
end_address: 0x20000
orig_span: &id007
- mcuboot_pad
- tfm
region: flash_primary
size: 0x10000
span: *id007
tfm_sram:
address: 0x20002000
end_address: 0x2000a000
inside:
- sram_secure
placement:
after:
- start
region: sram_primary
size: 0x8000
Unfortunately this results in an image that doesn't boot. With some mcuboot serial/uart enabled in the serial console I see mcuboot starting repeatedly. Probably my app firmware is starting and something is having a panic during its initialization and causing a reboot but I haven't pursued that.
�I: Starting bootloader image slot I: Image index: 0, Swap type: none I: Image index: 1, Swap type: none I: Bootloader chainload address offset: 0x10000 �I: Starting bootloader image slot I: Image index: 0, Swap type: none I: Image index: 1, Swap type: none I: Bootloader chainload address offset: 0x10000 �I: Starting bootloader image slot I: Image index: 0, Swap type: none I: Image index: 1, Swap type: none I: Bootloader chainload address offset: 0x10000
After quite a bit of iteration I discovered that if I manipulate the nonsecure_storage boundaries to be more similar to those I had originally, then the image boots and appears to run fine. Additionally I've tried erasing the QSPI flash with nrfjprog.exe --qspieraseall just in case there could be data from the prior partitioning that upset some module in my firmware - that didn't help.
mcuboot_secondary:
address: 0x0
device: DT_CHOSEN(nordic_pm_ext_flash)
end_address: 0xf0000
placement:
align:
start: 0x4
region: external_flash
share_size:
- mcuboot_primary
size: 0xf0000
secondary_pad: # Pad out the app image space to a full 1 MB
address: 0xf0000
end_address: 0x100000
region: external_flash
size: 0x10000
mcuboot_secondary_1:
address: 0x100000
device: DT_CHOSEN(nordic_pm_ext_flash)
end_address: 0x140000
region: external_flash
size: 0x40000
nonsecure_storage:
address: 0x140000
end_address: 0x14e000
orig_span: &id008
- settings_storage
- littlefs_storage
region: external_flash
size: 0xe000
span: *id008
settings_storage:
address: 0x140000
device: DT_CHOSEN(nordic_pm_ext_flash)
end_address: 0x160000
inside:
- nonsecure_storage
placement:
align:
start: 0x10000
before:
- littlefs_storage
region: external_flash
size: 0x20000
littlefs_storage:
address: 0x160000
device: DT_CHOSEN(nordic_pm_ext_flash)
end_address: 0x800000
placement:
before:
- end
region: external_flash
size: 0x6a0000
app:
address: 0x20000
end_address: 0x100000
region: flash_primary
size: 0xf0000
mcuboot:
address: 0x0
end_address: 0x10000
placement:
before:
- mcuboot_primary
region: flash_primary
size: 0x10000
mcuboot_pad:
address: 0x10000
end_address: 0x10200
placement:
align:
start: 0x4000
before:
- mcuboot_primary_app
region: flash_primary
size: 0x200
mcuboot_primary:
address: 0x10000
end_address: 0x100000
orig_span: &id001
- app
- tfm
- mcuboot_pad
region: flash_primary
size: 0xf0000
span: *id001
mcuboot_primary_1:
address: 0x0
device: nordic_ram_flash_controller
end_address: 0x40000
region: ram_flash
size: 0x40000
mcuboot_primary_app:
address: 0x10200
end_address: 0x100000
orig_span: &id002
- app
- tfm
region: flash_primary
size: 0xefe00
span: *id002
mcuboot_sram:
address: 0x20000000
end_address: 0x20080000
orig_span: &id003
- sram_primary
- rpmsg_nrf53_sram
- tfm_sram
- pcd_sram
region: sram_primary
size: 0x80000
span: *id003
otp:
address: 0xff8100
end_address: 0xff83fc
region: otp
size: 0x2fc
pcd_sram:
address: 0x20000000
end_address: 0x20002000
placement:
before:
- tfm_sram
region: sram_primary
size: 0x2000
ram_flash:
address: 0x40000
end_address: 0x40000
region: ram_flash
size: 0x0
rpmsg_nrf53_sram:
address: 0x20070000
end_address: 0x20080000
placement:
before:
- end
region: sram_primary
size: 0x10000
sram_nonsecure:
address: 0x2000a000
end_address: 0x20080000
orig_span: &id004
- sram_primary
- rpmsg_nrf53_sram
region: sram_primary
size: 0x76000
span: *id004
sram_primary:
address: 0x2000a000
end_address: 0x20070000
region: sram_primary
size: 0x66000
sram_secure:
address: 0x20000000
end_address: 0x2000a000
orig_span: &id005
- pcd_sram
- tfm_sram
region: sram_primary
size: 0xa000
span: *id005
tfm:
address: 0x10200
end_address: 0x20000
inside:
- mcuboot_primary_app
placement:
before:
- app
region: flash_primary
size: 0xfe00
tfm_nonsecure:
address: 0x20000
end_address: 0x100000
orig_span: &id006
- app
region: flash_primary
size: 0xe0000
span: *id006
tfm_secure:
address: 0x10000
end_address: 0x20000
orig_span: &id007
- mcuboot_pad
- tfm
region: flash_primary
size: 0x10000
span: *id007
tfm_sram:
address: 0x20002000
end_address: 0x2000a000
inside:
- sram_secure
placement:
after:
- start
region: sram_primary
size: 0x8000
Could you help me figure out why adjusting the nonsecure_storage addresses so that they do not properly span settings_storage and littlefs_storage actually results in an image that boots? Also, if you have any insight about whether the partition external_flash should stay or go, that would be appreciated too.


