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
  • Hi Mithi,

    Currently FAT FS does not work with the Partition Manager enabled. Meanwhile, the Partition Manager is automatically involved when MCUboot, or NSIB, or any other child images are used. Reference:  How to use FATFS with partition manager?  

    Thus, what you are trying to achieve is currently not possible.

    If this is of great importance to your company and product, could you please drop a note with your local Nordic Regional Sales Manager?

    Hieu

    P.s: Please note that it is the summer holiday season here. We are thus understaffed and there would be delay in responses. Our apologies for the inconveniences.

  • By decreasing the size of external flash, I am able to run mass storage device:

            external_flash: partition@e8000 {
                label = "external flash";
                //reg = <0x0000e8000 0x000718000>;
                reg = <0x0000e8000 0x00018000>;
            };
    But I want to consume full size of  external flash memory.
  • Hi Priyanka,

    As this is merged: https://github.com/nrfconnect/sdk-nrf/pull/11802/ it will be resolved in the NCS 2.5 release. However if you want to start testing it out you can cherry-pick this patch.
    As Sigvartmh suggested me for the cherry-pick the patch, So i think he/she will reply in this ticket, if not so then i'll create new ticket for the same.

  • Hi Sigvartmh,

    I’ve installed the ncsV2.4.2 by the Toolchain manger and cherry-pick the patch in nrf directory by the following way:

            a. For https://github.com/nrfconnect/sdk-nrf/pull/11802/ :

    1. git cherry-pick ea4d4c4fafd07b20ba9c7a1a6bb284cbeeb87c63 
    2. git cherry-pick d1f11e92a9de0eb6d5d6ec40cf7715b56b79f45f 

            b. For https://github.com/sigvartmh/fw-nrfconnect-nrf-1/pull/38/ :

    1. git remote add upstream https://github.com/sigvartmh/fw-nrfconnect-nrf-1
    2. git fetch upstream
    3. git cherry-pick 42c15a1adf1f1f4a0a620721b9b08ed8f756b9e5

     

    After building and running the code(include NSIB, MCUBOOT and MSD), got the same error as before merging patch:

    Now I removed the ncsV2.4.2 and installed the latest nRF connect SDK manually by entering the flowing commands:

    1. west init -m https://github.com/nrfconnect/sdk-nrf --mr main

    2- west update

    In the latest SDK, the patch from https://github.com/nrfconnect/sdk-nrf/pull/11802/  has already been merged, So I only required to add patch from https://github.com/sigvartmh/fw-nrfconnect-nrf-1/pull/38/ .

     

    After building and running the code, the above encountered flash disk related error has gone.

    I’m now able to update the application but encountered an error of "Unable to find bootable image"  when trying to update the bootloader.

     

    When I attempted to verify this issue using the SMP server sample, encountered the same error also while trying to update the bootloader by mcumgr:

    The issue I am facing is, after writing the bootloader image, named signed_by_mcuboot_and_b0_s1_image_update.bin, and rebooting the device, device swap the image and directly jumps to S1, gives error "Unable to find bootable image" and device stop here.

     

    Ideally, it should initially jump to the application after swap, reboot the device again to load the new version of MCUBOOT and jump to application.

  • 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.

Reply Children
Related