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

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

Children
No Data
Related