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)>;
		};
	};
};

Parents
  • Hello,

    You can add/edit the configuration of mcuboot file in the following way:

    CONFIG_BOOT_MAX_IMG_SECTORS=512
    CONFIG_MULTITHREADING=y
    CONFIG_MAIN_STACK_SIZE=10240
    CONFIG_LOG_MODE_MINIMAL=y
    

    You need  add this to your DTS file to properly identify the external flash for the partition manager

    chosen {
    nordic,pm-ext-flash = &at25xe32;
    }

    If you're using a different flash chip (AT25XE321D) than the default one (MX25R6435F) that comes with the nRF52840 development kit, you should delete the default flash node in your devicetree overlay.

    &qspi {
        /delete-node/ &mx25r64;
        status = "okay";
        pinctrl-0 = <&qspi_default>;
        pinctrl-1 = <&qspi_sleep>;
        pinctrl-names = "default", "sleep";
        
        at25xe32: at25xe321d@0 {
            /* Your existing configuration */
        };
    };

    After adding the above-mentioned configuration and changed in the DTS file, you can try to run the sample again and let us know.

    Thanks.

    BR

    Kazi

  • Hi Kazi,

    I have made above suggestions. When I upload the image via Device Manager or nrf Connect app, I got the error Hash not Found (8). I am using the custom board based on nRF52840. See the updated files changes below. 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
    CONFIG_MCUBOOT_UTIL_LOG_LEVEL_WRN=y
    
    # 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=n
    CONFIG_PM_DEVICE_RUNTIME=n
    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_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_TRANSPORT_BT_AUTHEN=n
    
    # CONFIG_MCUMGR_MGMT_NOTIFICATION_HOOKS=y
    CONFIG_MCUMGR=y
    CONFIG_IMG_MANAGER=y
    CONFIG_MCUMGR_GRP_IMG=y
    CONFIG_MCUMGR_GRP_OS=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
    CONFIG_BOOT_MAX_IMG_SECTORS=512
    CONFIG_MULTITHREADING=y
    CONFIG_MAIN_STACK_SIZE=10240
    CONFIG_LOG_MODE_MINIMAL=y
    
    # 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
    
    CONFIG_FLASH_MAP=y
    CONFIG_IMG_MANAGER=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
    
    CONFIG_PM_DEVICE=n
    CONFIG_PM_DEVICE_RUNTIME=n

    mcuboot.overlay

    /delete-node/ &i2c0;
     / {
    	chosen {
    		nordic,pm-ext-flash = &at25xe32;
    	};
    };
    

    dts

    / {
    	model = "custom, custom nRF52840";
    	compatible = "custom,custom-nrf52840";
    
    	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;
    	};
    
    	zephyr,user { /* User-configurable settings */
    		io-channels = <&adc 0>; /* Assign ADC channel 0 */
    	};
    };
    
    &adc {
    	#address-cells = <1>;
    	#size-cells = <0>;
    	status = "okay"; /* Enable ADC */
    
    	channel@0 {
    		reg = <0>; /* ADC channel 0 */
    		zephyr,gain = "ADC_GAIN_1_4"; /* ADC gain setting */
    		zephyr,reference = "ADC_REF_VDD_1_4"; /* Reference voltage (VDD/4) */
    		zephyr,acquisition-time = <ADC_ACQ_TIME_DEFAULT>; /* Acquisition time */
    		zephyr,input-positive = <NRF_SAADC_AIN6>; /* Positive input pin (P0.30) */
    		zephyr,resolution = <12>; /* ADC resolution: 12 bits */
    	};
    };
    
    &clock {
        lfclk {
            clock-source = "XTAL";
        };
    };
    
    &radio {
        status = "okay";
    };
    
    &uicr {
    	nfct-pins-as-gpios;
    };
    
    &gpiote {
    	status = "okay";
    };
    
    &gpio0 {
    	status = "okay";
    	sense-edge-mask = < 0x100000 >;  // gpio0 20
    };
    
    &gpio1 {
    	status = "okay";
    };
    
    &uart0 {
    	compatible = "nordic,nrf-uart";
    	status = "okay";
    	current-speed = <115200>;
    	pinctrl-0 = <&uart0_default>;
    	pinctrl-1 = <&uart0_sleep>;
    	pinctrl-names = "default", "sleep";
    };
    
    &qspi {
        status = "okay";
        pinctrl-0 = <&qspi_default>;
        pinctrl-1 = <&qspi_sleep>;
        pinctrl-names = "default", "sleep";
    
        at25xe32: at25xe321d@0 {
    		compatible = "nordic,qspi-nor";
            reg = <0x0>;
            jedec-id = [1f 47 0c];
            sck-frequency = <16000000>;
            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>; /* 1MB */
                };
                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(904)>;
    		};
    		// slot1_partition: partition@82000 {
    		// 	label = "image-1";
    		// 	reg = <0x00082000 DT_SIZE_K(472)>;
    		// };
    
    		scratch_partition: partition@ee000 {
    			label = "image-scratch";
    			reg = <0x000ee000 DT_SIZE_K(40)>;
    		};
    		/*
    		 * 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)>;
    		};
    	};
    };

  • Hi, Any update regarding my ticket? Thanks

  • Hello,

    The "Hash not Found (8)" error during DFU with MCUboot and a custom nRF52840 board usually shows an issue like how the image management and partitioning are set up, especially when using external flash for the secondary slot.

    The one of the reasons of this error is nonidentical partition size of internal and external flash. From your DTS, I can see that the primary slot (image-0) and secondary slot (image-1) are not in same size.  From your DTS

    &flash0 {
        ...
        slot0_partition: partition@c000 {
            label = "image-0";
            reg = <0x0000C000 DT_SIZE_K(904)>;
        };
        ...
    };
    
    &qspi {
        ...
        at25xe32: at25xe321d@0 {
            ...
            partitions {
                ...
                slot1_partition: partition@0 {
                    label = "image-1";
                    reg = <0x00000000 0x00100000>; /* 1MB */
                };
                ...
            };
        };
    };

    • image-0 size: DT_SIZE_K(904) = 904 kB
    • image-1 size: 0x00100000 = 1024 kB (1 MB)

     If they differ, validation will fail, and you may see errors like the one you describe. This is a common issue as seen in other cases where DFU fails due to mismatched slot sizes or insufficient space in the secondary slot [MCUmgr error not_supported during DFU by BLE with MCUboot.

Reply
  • Hello,

    The "Hash not Found (8)" error during DFU with MCUboot and a custom nRF52840 board usually shows an issue like how the image management and partitioning are set up, especially when using external flash for the secondary slot.

    The one of the reasons of this error is nonidentical partition size of internal and external flash. From your DTS, I can see that the primary slot (image-0) and secondary slot (image-1) are not in same size.  From your DTS

    &flash0 {
        ...
        slot0_partition: partition@c000 {
            label = "image-0";
            reg = <0x0000C000 DT_SIZE_K(904)>;
        };
        ...
    };
    
    &qspi {
        ...
        at25xe32: at25xe321d@0 {
            ...
            partitions {
                ...
                slot1_partition: partition@0 {
                    label = "image-1";
                    reg = <0x00000000 0x00100000>; /* 1MB */
                };
                ...
            };
        };
    };

    • image-0 size: DT_SIZE_K(904) = 904 kB
    • image-1 size: 0x00100000 = 1024 kB (1 MB)

     If they differ, validation will fail, and you may see errors like the one you describe. This is a common issue as seen in other cases where DFU fails due to mismatched slot sizes or insufficient space in the secondary slot [MCUmgr error not_supported during DFU by BLE with MCUboot.

Children
No Data
Related