Unable to save image to slot 1 (External QSPI Flash) on nRF52840

Hi ,

I am trying to implemenent DFU on nRF52840. Aim is to store new image to slot on QSPI external flash but it seems like nothing is sored on slot 1 as when I upload image via DFU manager, nothing is on slot 1. Please confirm my dts, mcuboot and prj.conf files. Thanks Moh

prj.conf

# General Debugging and Logging
CONFIG_LOG=y
CONFIG_LOG_BACKEND_UART=y
CONFIG_LOG_PRINTK=y
CONFIG_CBPRINTF_FP_SUPPORT=y
CONFIG_CONSOLE=n
CONFIG_PRINTK=n
CONFIG_SHELL=y
CONFIG_SHELL_LOG_BACKEND=y
CONFIG_SHELL_CMD_BUFF_SIZE=512
CONFIG_USE_SEGGER_RTT=y
CONFIG_LOG_BACKEND_RTT=y
CONFIG_RTT_CONSOLE=n
CONFIG_UART_CONSOLE=y
CONFIG_SEGGER_RTT_BUFFER_SIZE_UP=4096
CONFIG_SEGGER_RTT_MODE_BLOCK_IF_FIFO_FULL=y
CONFIG_LOG_BLOCK_IN_THREAD=y
CONFIG_LOG_BUFFER_SIZE=4096
CONFIG_DEBUG=n
CONFIG_DEBUG_INFO=n
CONFIG_DEBUG_THREAD_INFO=n
CONFIG_BOOT_BANNER=y
CONFIG_SERIAL=y
CONFIG_NVS_LOG_LEVEL_DBG=y
CONFIG_LOG_BACKEND_UART_BUFFER_SIZE=4096
CONFIG_LOG_DEFAULT_LEVEL=3
CONFIG_LOG_MODE_IMMEDIATE=y
CONFIG_DEBUG_OPTIMIZATIONS=n

# Enable Clock Driver
# CONFIG_CLOCK_CONTROL=y
# CONFIG_CLOCK_CONTROL_NRF=y
# CONFIG_CLOCK_CONTROL_NRF_K32SRC_XTAL=y

# Peripheral and Sensor Drivers
CONFIG_I2C=y
CONFIG_SPI=y
CONFIG_SPI_NOR=y
CONFIG_NORDIC_QSPI_NOR=y
CONFIG_NORDIC_QSPI_NOR_FLASH_LAYOUT_PAGE_SIZE=4096
# CONFIG_ADC=y
CONFIG_SENSOR=y
# TMP116 is disabled (enable if in device tree)
# CONFIG_TMP116=y
CONFIG_BMI270=y
CONFIG_WDT_LOG_LEVEL_DBG=y
CONFIG_BMI270_TRIGGER_GLOBAL_THREAD=y
CONFIG_WATCHDOG=y
CONFIG_TASK_WDT=y
CONFIG_TASK_WDT_MIN_TIMEOUT=1000
CONFIG_WDT_LOG_LEVEL_ERR=y
CONFIG_WDT_DISABLE_AT_BOOT=n
CONFIG_LED=y
CONFIG_REGULATOR=y
CONFIG_MFD_NPM1300=y
CONFIG_PM_DEVICE=y
CONFIG_PM_DEVICE_RUNTIME=y
CONFIG_SYS_CLOCK_EXISTS=y
CONFIG_PM=y
CONFIG_POWEROFF=y
CONFIG_NRF_FUEL_GAUGE=y
CONFIG_TASK_WDT=y

# Enable nrfx drivers
CONFIG_NRFX_SAADC=y
CONFIG_NRFX_PPI=y
CONFIG_NRFX_DPPI=y
CONFIG_NRFX_TIMER2=y

# CONFIG_NRFX_QSPI=y
# CONFIG_NRFX_QSPI_LOG=y
# CONFIG_NORDIC_QSPI_NOR=y

# Memory Optimizations
CONFIG_MAIN_STACK_SIZE=4096
CONFIG_SYSTEM_WORKQUEUE_STACK_SIZE=4096
CONFIG_HEAP_MEM_POOL_SIZE=4096
CONFIG_ASSERT=n
CONFIG_THREAD_ANALYZER=n
CONFIG_SIZE_OPTIMIZATIONS=y
CONFIG_EVENTS=y
CONFIG_PM_SINGLE_IMAGE=y
CONFIG_RESET_ON_FATAL_ERROR=y

# Flash and Filesystem
CONFIG_FLASH=y
CONFIG_FLASH_PAGE_LAYOUT=y
CONFIG_FLASH_MAP=y
CONFIG_MPU_ALLOW_FLASH_WRITE=y
CONFIG_FLASH_JESD216_API=y
CONFIG_SPI_NOR_IDLE_IN_DPD=y
CONFIG_NVS=y
CONFIG_FILE_SYSTEM=y
CONFIG_FILE_SYSTEM_LITTLEFS=y
CONFIG_FS_LITTLEFS_CACHE_SIZE=64
CONFIG_FS_LITTLEFS_LOOKAHEAD_SIZE=16
CONFIG_FS_LITTLEFS_BLOCK_CYCLES=256
CONFIG_IMG_MANAGER=y
CONFIG_IMG_ERASE_PROGRESSIVELY=n

# Enable Bluetooth settings
CONFIG_BT_SETTINGS=y

# Enable settings subsystem
CONFIG_SETTINGS=y

# Enable Bluetooth and controller settings
CONFIG_BT=y
CONFIG_BT_CTLR_TX_PWR_PLUS_4=y
CONFIG_BT_HCI=y
CONFIG_BT_CTLR=y
CONFIG_BT_PERIPHERAL=y
CONFIG_BT_BROADCASTER=n
CONFIG_BT_SMP=y
CONFIG_BT_BONDABLE=y
CONFIG_BT_CTLR_ADV_EXT=n
CONFIG_BT_DEVICE_APPEARANCE=1345
CONFIG_BT_DEVICE_NAME_DYNAMIC=y
CONFIG_BT_GATT_CLIENT=y
CONFIG_BT_FILTER_ACCEPT_LIST=y
CONFIG_BT_SIGNING=y

# Bluetooth security and bonding settings
CONFIG_BT_KEYS_OVERWRITE_OLDEST=y
CONFIG_BT_SMP_ALLOW_UNAUTH_OVERWRITE=y
CONFIG_BT_ID_UNPAIR_MATCHING_BONDS=y
CONFIG_BT_PRIVACY=n
CONFIG_BT_TINYCRYPT_ECC=y
CONFIG_BT_CTLR_PHY_2M=y

# Bluetooth buffer and connection settings
CONFIG_BT_BUF_ACL_RX_SIZE=502
CONFIG_BT_ATT_PREPARE_COUNT=2
CONFIG_BT_BUF_ACL_TX_SIZE=251
CONFIG_BT_BUF_ACL_TX_COUNT=10
CONFIG_BT_L2CAP_TX_MTU=247
CONFIG_BT_L2CAP_TX_BUF_COUNT=10
CONFIG_BT_L2CAP_DYNAMIC_CHANNEL=y
CONFIG_BT_CTLR_DATA_LENGTH_MAX=251
CONFIG_BT_CTLR_RX_BUFFERS=2
CONFIG_BT_CONN_TX_MAX=10
CONFIG_BT_GAP_AUTO_UPDATE_CONN_PARAMS=n
CONFIG_BT_HCI_VS_EXT=n
CONFIG_BT_GATT_DM=y

# Allow only LESC pairing
# CONFIG_BT_SMP_SC_PAIR_ONLY=y

# Configure Bluetooth connection settings
CONFIG_BT_CTLR_TX_PWR_0=y
CONFIG_BT_MAX_CONN=1
CONFIG_BT_MAX_PAIRED=1

# Enable PHY updates
CONFIG_BT_USER_PHY_UPDATE=y
CONFIG_BT_USER_DATA_LEN_UPDATE=y

# Enable Bluetooth shell for debugging
CONFIG_BT_SHELL=n
CONFIG_SHELL_BACKEND_SERIAL=y

# Enable BT NUS (Nordic UART Service) shell for testing
# CONFIG_SHELL_BT_NUS=y

# Enable Battery Service (BAS) for battery level reporting
CONFIG_BT_BAS=y

# Cryptography
CONFIG_TINYCRYPT=y
CONFIG_BT_TINYCRYPT_ECC=y

# MCUboot + FOTA
CONFIG_BOOTLOADER_MCUBOOT=y
CONFIG_NCS_SAMPLE_MCUMGR_BT_OTA_DFU=y
CONFIG_NCS_SAMPLE_MCUMGR_BT_OTA_DFU_SPEEDUP=y
CONFIG_MCUMGR_MGMT_NOTIFICATION_HOOKS=y
# Disable the Flash Patch and Breakpoint unit for secure production
CONFIG_DISABLE_FLASH_PATCH=y

# Use internal RC oscillator instead of external 32.768 kHz crystal
CONFIG_CLOCK_CONTROL_NRF_K32SRC_RC=y
CONFIG_CLOCK_CONTROL_NRF_K32SRC_500PPM=y

# Reboot and Miscellaneous
CONFIG_REBOOT=y
CONFIG_BOOT_DELAY=0

mcuboot.conf

# Enable QSPI drivers for external flash
CONFIG_NORDIC_QSPI_NOR=y
CONFIG_BOOT_MAX_IMG_SECTORS=256
CONFIG_NORDIC_QSPI_NOR_FLASH_LAYOUT_PAGE_SIZE=4096

# Logging
CONFIG_LOG=y
CONFIG_LOG_DEFAULT_LEVEL=3

CONFIG_FLASH=y
# CONFIG_FLASH_SIMULATOR=y
# CONFIG_FLASH_SIMULATOR_DOUBLE_WRITES=y
CONFIG_FLASH_SIMULATOR_STATS=n

# Configure boolader to use two slots
CONFIG_SINGLE_APPLICATION_SLOT=n

# Place the secondary partition of MCUboot in the external flash instead of the internal flash
CONFIG_PM_EXTERNAL_FLASH_MCUBOOT_SECONDARY=y

# Override external driver check
CONFIG_PM_OVERRIDE_EXTERNAL_DRIVER_CHECK=y

# Enable bootloader signature verification using ECDSA P-256
CONFIG_BOOT_SIGNATURE_TYPE_ECDSA_P256=y

# CONFIG_BOOT_SIGNATURE_KEY_FILE="my-enc-ec256-priv.pem"

# Disable the Flash Patch and Breakpoint unit for secure production
CONFIG_DISABLE_FLASH_PATCH=y

CONFIG_CLOCK_CONTROL_NRF_K32SRC_RC=y
CONFIG_CLOCK_CONTROL_NRF_K32SRC_500PPM=y

dts

	chosen {
		zephyr,console = &uart0;
		zephyr,shell-uart = &uart0;
		zephyr,uart-mcumgr = &uart0;
		zephyr,bt-mon-uart = &uart0;
		zephyr,bt-c2h-uart = &uart0;
		zephyr,sram = &sram0;
		zephyr,flash = &flash0;
		zephyr,code-partition = &slot0_partition;
        zephyr,entropy = &rng;
		// zephyr,ieee802154 = &ieee802154;
	};


&qspi {
    status = "okay";
    pinctrl-0 = <&qspi_default>;
    pinctrl-1 = <&qspi_sleep>;
    pinctrl-names = "default", "sleep";

    at25xe32: at25xe321d@0 {
        reg = <0x0>;
        jedec-id = [1f 47 0c];
        sck-frequency = <16000000>;
        compatible = "nordic,qspi-nor";
        size = <33554432>;
        has-dpd;
        t-enter-dpd = <3000>;
        t-exit-dpd = <200000>;
        // Configure to actully use Quad SPI data.
        writeoc = "pp4o";
        readoc = "read4io";
        quad-enable-requirements = "S2B1v6";

        /* Storage Partitions */
        partitions {
            compatible = "fixed-partitions";
            #address-cells = <1>;
            #size-cells = <1>;

            slot1_partition: partition@0 {
                label = "image-1";
				reg = <0x00000000 0x00100000>;
            };
            store_partition: partition@100000 {
                label = "store";
                reg = <0x00100000 0x00300000>; /* 3MB */
            };
        };
    };
};

// &ieee802154 {
// 	status = "okay";
// };

&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(944)>;
		};
		// slot1_partition: partition@82000 {
		// 	label = "image-1";
		// 	reg = <0x00082000 DT_SIZE_K(472)>;
		// };

		/*
		 * The flash starting at 0x000f8000 and ending at
		 * 0x000fffff is reserved for use by the application.
		 */

		/*
		 * Storage partition will be used by FCB/LittleFS/NVS
		 * if enabled.
		 */
		storage_partition: partition@f8000 {
			label = "storage";
			reg = <0x000f8000 DT_SIZE_K(32)>;
		};
	};
};

Related