Does not have enough internal flash memory on nrf5340DK + nrf7002EK to have an application that has an immutable bootloader, mcuboot as platform bootloader and a wifi example code. How to resolve this issue.

Hi,

I am using an nrf5340DK + nrf7002EK. i am able to run an example helloworld application with an immutable bootloader and mcuboot as platform bootloader. When i try to add the wifi code, im getting an error stating that the internal flash doesnt have enough memory to run the application, which is understandable. So i tried to have XIP enabled. What i see here from the memory report is that ncs folder is consuming a lot of space. Is there a way where i can relocate the entire application code and ncs code to the external flash and run the application?

This is my prj.conf. I have disabled the wifi related code for now. its just the XIP and Bootloader code that is enabled

###################################### BOOTLOADERS ######################################
# Print a banner on the UART on startup.
CONFIG_BOOT_BANNER=y

# Enable console and printk()
CONFIG_PRINTK=y
CONFIG_STDOUT_CONSOLE=y

# Enable Zephyr application to be booted by MCUboot
CONFIG_BOOTLOADER_MCUBOOT=y
CONFIG_SECURE_BOOT=y
# CONFIG_FLASH_LOAD_OFFSET=0x00000000
# CONFIG_FLASH_LOAD_SIZE=0x800000  # Full external flash size

# Use the default MCUBoot PEM key file (BOOT_SIGNATURE_KEY_FILE)
CONFIG_MCUBOOT_SIGNATURE_KEY_FILE="bootloader/mcuboot/root-rsa-2048.pem"

# Enable SPI NOR driver
# CONFIG_SPI=y
# CONFIG_FLASH=y
# CONFIG_SPI_NOR=y

# Use external flash for application slots
# CONFIG_PM_EXTERNAL_FLASH=y
###################################### XIP ######################################

CONFIG_CODE_DATA_RELOCATION=y
CONFIG_HAVE_CUSTOM_LINKER_SCRIPT=y
CONFIG_CUSTOM_LINKER_SCRIPT="xip_ext_flash.ld"
CONFIG_BUILD_NO_GAP_FILL=y
CONFIG_XIP=y
CONFIG_NORDIC_QSPI_NOR_XIP=y
CONFIG_FLASH_INIT_PRIORITY=40
CONFIG_NRF_WIFI_PATCHES_EXT_FLASH_XIP=n # This DISABLES XIP after its done loading the nRF7002 (BAD, need to fix!!!)
# Enable caching for improved performance
# CONFIG_NORDIC_QSPI_NOR_FLASH_CACHE=y
# # Enable relocation of driver code to external flash
# CONFIG_CODE_PARTITION=y
# CONFIG_PM_EXTERNAL_FLASH=y
# # Reduce internal flash usage
# CONFIG_DRIVERS_FLASH_EXTENDED=y
# CONFIG_WIFI_NRF700X_BUS_LOG_LEVEL_OFF=y # Makes the NRF700X driver able to be relocated to XIP? (still seems to have runtime issues)


# ###################################### WIFI ######################################
# CONFIG_WIFI=y
# CONFIG_WIFI_NRF70=y

# # WPA supplicant
# CONFIG_WIFI_NM_WPA_SUPPLICANT=y
# CONFIG_WIFI_READY_LIB=y
# CONFIG_NRF_WIFI_RPU_RECOVERY=y

# CONFIG_WIFI_MGMT_EXT=y
# CONFIG_WIFI_CREDENTIALS=y
# CONFIG_WIFI_CREDENTIALS_STATIC=y
# CONFIG_WIFI_CREDENTIALS_STATIC_SSID="ArjunKariat"
# CONFIG_WIFI_CREDENTIALS_STATIC_PASSWORD="kariat2018"

# # Networking
# CONFIG_NETWORKING=y
# CONFIG_NET_SOCKETS=y
# CONFIG_NET_LOG=y
# CONFIG_NET_IPV4=y
# CONFIG_NET_UDP=y
# CONFIG_NET_TCP=y
# CONFIG_NET_DHCPV4=y

# CONFIG_NET_PKT_RX_COUNT=8
# CONFIG_NET_PKT_TX_COUNT=8

# # Below section is the primary contributor to SRAM and is currently
# # tuned for performance, but this will be revisited in the future.
# CONFIG_NET_BUF_RX_COUNT=8
# CONFIG_NET_BUF_TX_COUNT=16
# CONFIG_NRF70_RX_NUM_BUFS=16
# CONFIG_HEAP_MEM_POOL_SIZE=120000
# CONFIG_HEAP_MEM_POOL_IGNORE_MIN=y
# CONFIG_NET_TC_TX_COUNT=1

# CONFIG_NET_IF_UNICAST_IPV4_ADDR_COUNT=1
# CONFIG_NET_MAX_CONTEXTS=5
# CONFIG_NET_CONTEXT_SYNC_RECV=y

# CONFIG_INIT_STACKS=y

# CONFIG_NET_L2_ETHERNET=y

# CONFIG_NET_CONFIG_SETTINGS=y
# CONFIG_NET_CONFIG_INIT_TIMEOUT=0

# CONFIG_NET_SOCKETS_POLL_MAX=10

# # Memories
# CONFIG_MAIN_STACK_SIZE=5200
# CONFIG_NET_TX_STACK_SIZE=4096
# CONFIG_NET_RX_STACK_SIZE=4096
# CONFIG_STA_SAMPLE_START_WIFI_THREAD_STACK_SIZE=5200

# # Debugging
# CONFIG_STACK_SENTINEL=y
# CONFIG_DEBUG_COREDUMP=y
# CONFIG_DEBUG_COREDUMP_BACKEND_LOGGING=y
# CONFIG_DEBUG_COREDUMP_MEMORY_DUMP_MIN=y
# CONFIG_SHELL_CMDS_RESIZE=n


# # Kernel options
# CONFIG_ENTROPY_GENERATOR=y

# # Logging
# CONFIG_LOG=y
# CONFIG_LOG_BUFFER_SIZE=2048
# CONFIG_POSIX_CLOCK=y

# CONFIG_NET_CONFIG_MY_IPV4_ADDR="192.168.1.99"
# CONFIG_NET_CONFIG_MY_IPV4_NETMASK="255.255.255.0"
# CONFIG_NET_CONFIG_MY_IPV4_GW="192.168.1.1"

# # printing of scan results puts pressure on queues in new locking
# # design in net_mgmt. So, use a higher timeout for a crowded
# # environment.
# CONFIG_NET_MGMT_EVENT_QUEUE_TIMEOUT=5000

This is my CMakeFile

# Top-level CMakeLists.txt for the skeleton application.
#
# Copyright (c) 2017 Open Source Foundries Limited
# Copyright (c) 2018 Foundries.io Ltd
#
# SPDX-License-Identifier: Apache-2.0
#
# This provides a basic application structure suitable for loading by
# mcuboot, which is easy to customize on a per-board basis. It can be
# used as a starting point for new applications.

cmake_minimum_required(VERSION 3.8)

# find_package(Zephyr) in order to load application boilerplate:
# https://docs.zephyrproject.org/latest/develop/application/index.html
find_package(Zephyr REQUIRED HINTS $ENV{ZEPHYR_BASE})
project(Test)

# This string ends up getting printed in the device console
if (NOT DEFINED FROM_WHO)
  set(FROM_WHO Zephyr)
endif()

target_compile_definitions(app PRIVATE "-DMCUBOOT_HELLO_WORLD_FROM=\"${FROM_WHO}\"")

target_sources(app PRIVATE src/main.c)
# target_sources(app PRIVATE src/wifi_manager.c)

# Modules moved to XIP area in external flash
zephyr_code_relocate(FILES src/main.c LOCATION EXTFLASH)
# zephyr_code_relocate(FILES src/wifi_manager.c LOCATION EXTFLASH)
# zephyr_code_relocate(LIBRARY drivers__wifi LOCATION EXTFLASH)

Screenshot of the memory report

This is the code.

/cfs-file/__key/communityserver-discussions-components-files/4/1586.Test.zip

Parents
  • Hello,

    Apologies for the delayed response. I was a bit swamped after returning from vacation.

    Is there a way where i can relocate the entire application code and ncs code to the external flash and run the application?

    There are examples and configurations available for relocating specific parts of the code to external flash. However, support for relocating the entire application and NCS code is quite limited. For instance, this old DevZone ticket discusses a very similar issue. Additionally, take a look at this ticket, which suggests some methods for reducing memory usage.

    I understand that this is not an ideal solution, as it will only provide partial relief. However, it can help optimize the build application to some extent.

    Kind Regards,

    Abhijith

  • Hi Abhijith,

    Just to bring some clarity.

    1. Is it possible to move both the mcuboot primary and secondary to the external flash? i have seen examples where the mcuboot stays in the internal and only the secondary lies in the external flash

    2. Were you able to get the code i have attached to work? Because, i tried few things as per the links you shared and i was not able to get it build

    3. Is it possible to get this done without the pm_static file? and use only the devicetree instead?

    This is something i have tried now. i abandoned the idea of using the immutable bootloader. i took a MCUboot helloworld example code and build it for the nrf7002EK board. The example code is working fine. Now i added the changes as per this link: https://docs.nordicsemi.com/bundle/ncs-latest/page/nrf/app_dev/device_guides/nrf53/qspi_xip_guide_nrf5340.html#setting_up_code_relocation

    i have done the following as per the link

    1. setup the QSPI flash

    2. added the pm_static.yml file

    3. Added the linker script and updated the CMakeFile

    On building the code, im getting some issues. im not able to insert that here, so i ll just attach the zip file of the code

    ./cfs-file/__key/communityserver-discussions-components-files/4/mcuboot.zip

  • Hello Arun,

    Arjun Kariat said:
    Is it possible to move both the mcuboot primary and secondary to the external flash? i have seen examples where the mcuboot stays in the internal and only the secondary lies in the external flash

    I think the primary slot should be placed in the internal flash for MCUboot to work properly. MCUboot needs to be able to run directly from the primary image after a reset. The secondary slot can be placed in external flash without any issues. This setup helps you save internal flash space while still enabling DFU. You can refer to this sample to see how to do that.

    Arjun Kariat said:
    Were you able to get the code i have attached to work? Because, i tried few things as per the links you shared and i was not able to get it build

    Could you share the SDK version you're using to build this code? I’ll try the same here. Also, please share the build logs showing the issue, and I’ll take a closer look at it.

    Arjun Kariat said:
    Is it possible to get this done without the pm_static file? and use only the devicetree instead?

    If you're using NCS version >2.7.0, then using Partition Manager is necessary. Building with MCUboot using sysbuild without PM is not supported. Try disabling the Partition Manager in the config, and you’ll likely see some warnings about this.

    Kind Regards,

    Abhijith

  • hi, i was not able to insert code here feature. thats the reason for not being able to share the build logs.

    also the SDK im using is 2.9.0

Reply Children
No Data
Related