Mass storage initialization error with nsib and mcuboot

Board: nRF52840Dk

ncs: v2.3.0.

Hi, I am working on a project in which i need to update bootloader itself and application from the external flash. I also need to make partition where i can store my files using FatFs file system.

My project configuration and overlay setting are below:

CONFIG_STDOUT_CONSOLE=y

#USB related configs
CONFIG_USB_DEVICE_STACK=y
CONFIG_USB_DEVICE_PRODUCT="Zephyr MSC sample"
CONFIG_LOG=y
CONFIG_USB_DRIVER_LOG_LEVEL_ERR=y
CONFIG_USB_MASS_STORAGE=y
CONFIG_USB_DEVICE_LOG_LEVEL_ERR=y
CONFIG_USB_MASS_STORAGE_LOG_LEVEL_ERR=y

CONFIG_MAIN_STACK_SIZE=4096


#CONFIG_APP_MSC_STORAGE_FLASH_LITTLEFS=y
CONFIG_USB_DEVICE_INITIALIZE_AT_BOOT=n
CONFIG_APP_MSC_STORAGE_FLASH_FATFS=y
CONFIG_FS_FATFS_LFN=y

# External partitions
#CONFIG_PM_PARTITION_REGION_LITTLEFS_EXTERNAL=y
#CONFIG_PM_PARTITION_REGION_SETTINGS_STORAGE_EXTERNAL=y
#CONFIG_PM_PARTITION_REGION_NVS_STORAGE_EXTERNAL=y

CONFIG_BOOTLOADER_MCUBOOT=y
CONFIG_PM_EXTERNAL_FLASH_MCUBOOT_SECONDARY=y

#memory related configs
CONFIG_NVS=y
CONFIG_FLASH=y
CONFIG_FLASH_MAP=y
CONFIG_STREAM_FLASH=y
CONFIG_REBOOT=y
CONFIG_HWINFO=y
CONFIG_IMG_MANAGER=y
CONFIG_IMG_ERASE_PROGRESSIVELY=y

#immutable boot
CONFIG_SECURE_BOOT=y
CONFIG_SB_SIGNING_KEY_FILE="nsib_priv.pem"
CONFIG_BUILD_S1_VARIANT=y
# Need to lower the number of counter slots to be able to update several times. Do not know the best number yet.
CONFIG_SB_NUM_VER_COUNTER_SLOTS=120

CONFIG_FW_INFO_FIRMWARE_VERSION=1
CONFIG_MCUBOOT_IMAGE_VERSION="1.1.1"

/delete-node/ &boot_partition;
/delete-node/ &slot0_partition;
/delete-node/ &slot1_partition;

&flash0 {
	partitions {
		boot_partition: partition@0 {
			label = "mcuboot";
			reg = <0x000000000 0x00010000>;
		};
		slot0_partition: partition@10000 {
			label = "image-0";
			reg = <0x000010000 0x0000e8000>;
		};
	};
};

&mx25r64 {
	partitions {
		compatible = "fixed-partitions";
		#address-cells = <1>;
		#size-cells = <1>;

		slot1_partition: partition@0 {
			label = "image-1";
			reg = <0x000000000 0x0000e8000>;
		};
		external_flash: partition@e8000 {
			label = "external flash";
			reg = <0x0000e8000 0x000718000>;
		};
	};
};

/ {
	chosen {
		nordic,pm-ext-flash = &mx25r64;
	};
	msc_disk0 {
		compatible = "zephyr,flash-disk";
		partition = <&external_flash>;
		disk-name = "NAND";
		cache-size = <4096>;
	};
};

When i am running the code then getting error of msc init:

Attempting to boot slot 0.
Attempting to boot from address 0x9200.
Verifying signature against key 0.
Hash: 0x8f...3b
Firmware signature verified.
Firmware version 5
Setting monotonic counter (version: 5, slot: 0)
*** Booting Zephyr OS build v3.2.99-ncs2-3159-g1e1697d881a9 ***
[00:00:00.376,220] <inf> mcuboot: Starting bootloader
[00:00:00.376,983] <inf> mcuboot: Primary image: magic=unset, swap_type=0x1, copy_done=0x3, image_ok=0x3
[00:00:00.377,349] <inf> mcuboot: Secondary image: magic=unset, swap_type=0x1, copy_done=0x3, image_ok=0x3
[00:00:00.377,349] <inf> mcuboot: Boot source: none
[00:00:00.377,838] <inf> mcuboot: Swap type: none
[00:00:00.378,295] <inf> mcuboot: Primary image: magic=bad, swap_type=0x1, copy_done=0x2, image_ok=0x2
[00:00:00.378,662] <inf> mcuboot: Secondary image: magic=unset, swap_type=0x1, copy_done=0x3, image_ok=0x3
[00:00:00.378,692] <inf> mcuboot: Boot source: none
[00:00:00.379,150] <inf> mcuboot: Swap type: none
*** Booting Zephyr OS build v3.2.99-ncs2-3159-g1e1697d881a9 ***
[00:00:00.000,396] <inf> flashdisk: Initialize device NAND
[00:00:00.000,427] <inf> flashdisk: offset e8000, sector size 512, page size 4096, volume size 7438336
[00:00:00.000,488] <err> flashdisk: Error -22 getting page info at offset 100000
[00:00:00.000,488] <err> usb_msc: Storage init ERROR !!!! - Aborting USB init
[00:00:00.000,518] <wrn> main: Image build time: Jul 10 2023 09:44:53
[00:00:00.000,579] <inf> main: Image is confirmed OK

Please help me, what I am doing wrong.

Thanks.

Parents Reply Children
  • Hi Sigvartmh,

    I've uploaded the sample code, please look into this, if i am doing any wrong configuration: 

    nsib_mcuboot_mass_1.zip

  • *** Booting nRF Connect SDK v2.4.99-dev2-68-g386b811dfb17 ***
    Attempting to boot slot 0.
    Attempting to boot from address 0x9200.
    Verifying signature against key 0.
    Hash: 0x8f...3b
    Firmware signature verified.
    Firmware version 11
    Booting (0x9200).
    *** Booting nRF Connect SDK v2.4.99-dev2-68-g386b811dfb17 ***
    [00:00:00.250,854] <inf> mcuboot: Starting bootloader
    [00:00:00.252,868] <inf> mcuboot: Primary image: magic=unset, swap_type=0x1, copy_done=0x3, image_ok=0x3
    [00:00:00.253,326] <inf> mcuboot: Secondary image: magic=good, swap_type=0x1, copy_done=0x3, image_ok=0x3
    [00:00:00.253,356] <inf> mcuboot: Boot source: none
    [00:00:00.255,340] <inf> mcuboot: Primary image: magic=unset, swap_type=0x1, copy_done=0x3, image_ok=0x3
    [00:00:00.255,798] <inf> mcuboot: Secondary image: magic=good, swap_type=0x1, copy_done=0x3, image_ok=0x3
    [00:00:00.255,828] <inf> mcuboot: Boot source: none
    [00:00:00.256,561] <inf> mcuboot: Image index: 1, Swap type: test
    [00:00:00.409,942] <inf> mcuboot: Starting swap using move algorithm.
    [00:00:00.409,973] <wrn> mcuboot: Not enough free space to run swap upgrade
    [00:00:00.409,973] <wrn> mcuboot: required 69632 bytes but only 65536 are available
    *** Booting nRF Connect SDK v2.4.99-dev2-68-g386b811dfb17 ***
    [00:00:00.000,518] <inf> flashdisk: Initialize device NAND
    [00:00:00.000,518] <inf> flashdisk: offset 0, sector size 512, page size 4096, volume size 7516160
    [00:00:00.004,608] <wrn> main: Image build time: Oct  4 2023 13:39:34
    [00:00:00.004,669] <inf> main: Set up button at gpio@50000000 pin 11

    So I tired to run your setup on a newer version of MCUBoot which gives this error message which probably means that the swap before happened with a too small space meaning it copies some wrong data into the flash resulting in an invalid image.

    see:

    [00:00:00.409,973] <wrn> mcuboot: Not enough free space to run swap upgrade
    [00:00:00.409,973] <wrn> mcuboot: required 69632 bytes but only 65536 are available


    So using MCUBoot with Swap using Move requires empty 1 free flash page(4k) at the end of the image for swapping. So what needs to be fixed is your pm_static.yml file. Details on the algorithm here: https://www.youtube.com/watch?v=YgILPGzCdxc

    more info with regards to the flash block here: Partition Manager not using flash efficientlyy

  • Could you please fix this issue in pm_static.yml file for both application and bootloader upgrade, and please share the updated file.

  • nsib_mcuboot_mass_1_modified.zip

    Here is a modified version of your project that can do MCUBoot and Application updates. It features a much smaller MCUBoot without logging.

    The problem is that I don't know what you intended with your setup, so I kept it as close to what you initially setup as possible, but I had to modify MCUBoot to fit the alignment requirements. This is not necessarily needed, as you could have also made it bigger, but it depends on your project and what you intend to do.

  • My objective is to update mcuboot and application by binary file stored in external flash. I want to use external flash in two partition 1- for file system and 2- for mcuboot secondary partition.

    I tried your modified project code but not able to update bootloader but able to update application.

    To debug the failure on updating MCUBOOT, I enabled the log of mcuboot, but encountered a flash overflow error.

    Are you able to update MCUBOOT?, if so please let me know which SDK you are using(ncs installed by toolchain manger or installed the main sdk by west) and which cherry-pick you have selected?

Related