Flash area error when attempting DFU via nRF Connect App

Hello,

I'm getting the following error  when attempting to perform a DFU. I'm using the Android nRF Connect app.

00> I: Image index: 0, Swap type: test
00> I: Image index: 1, Swap type: none
00> E: Failed to open flash area ID 1: -2

Flash Area ID of 1 indicates it's external flash. Error -2 is ENOENT. So it's saying that no such flash area exists? I suspect something is not configured correctly.

Here is my external flash devicetree snippet:

&spi4 {
	compatible = "nordic,nrf-spim";
	status = "okay";
	pinctrl-0 = <&spi4_default>;
	pinctrl-1 = <&spi4_sleep>;
	pinctrl-names = "default", "sleep";
	cs-gpios = <&gpio1 12 GPIO_ACTIVE_LOW>;

	sst26vf: sst26vf064b@0 {
		compatible = "jedec,spi-nor";
				reg = <0>;
		spi-max-frequency = <24000000>;
		jedec-id = [bf 26 43]; /* see datasheet table 5-4, p.25 */

		/* see datasheet pp. 72-79 for basic flash parameters table below */
		sfdp-bfp = [
			fd 20 f1 ff  ff ff ff 03  44 eb 08 6b  08 3b 80 bb
			fe ff ff ff  ff ff 00 ff  ff ff 44 0b  0c 20 0d d8
			0f d8 10 d8  20 91 48 24  80 6f 1d 81  ed 0f 77 38
			30 b0 30 b0  f7 ff ff ff  29 c2 5f ff  f0 30 c0 80
		];
		size = <67108864>;

	 	requires-ulbpr; /* sst26vf has block write protections enabled by default */
	};
};

The project is based on the smart lock sample code. I had to increase the size of the bootloader region to get it to fit. Here is the pm_static_dfu.yml file:

mcuboot:
  address: 0x0
  size: 0xc000
  region: flash_primary
mcuboot_pad:
  address: 0xc000
  size: 0x200
app:
  address: 0xc200
  size: 0xeae00
mcuboot_primary:
  orig_span: &id001
  - mcuboot_pad
  - app
  span: *id001
  address: 0xc000
  size: 0xeb000
  region: flash_primary
mcuboot_primary_app:
  orig_span: &id002
  - app
  span: *id002
  address: 0xc200
  size: 0xeae00
factory_data:
  address: 0xf7000
  size: 0x1000
  region: flash_primary
settings_storage:
  address: 0xf8000
  size: 0x8000
  region: flash_primary
mcuboot_primary_1:
  address: 0x0
  size: 0x40000
  device: flash_ctrl
  region: ram_flash
mcuboot_secondary:
  address: 0x0
  size: 0xef000
  device: SST26VF
  region: external_flash
mcuboot_secondary_1:
  address: 0xef000
  size: 0x40000
  device: SST26VF
  region: external_flash
external_flash:
  address: 0x12f000
  size: 0x6D1000
  device: SST26VF
  region: external_flash
pcd_sram:
  address: 0x20000000
  size: 0x2000
  region: sram_primary

I'm don't know how or if this yaml file relates to the partitions defined in the devicetree, but here are the devicetree partitions:

&flash0 {

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

		boot_partition: partition@0 {
			label = "mcuboot";
			reg = <0x00000000 0x00010000>;
		};
		slot0_partition: partition@10000 {
			label = "image-0";
		};
		slot0_ns_partition: partition@50000 {
			label = "image-0-nonsecure";
		};
		slot1_partition: partition@80000 {
			label = "image-1";
		};
		slot1_ns_partition: partition@c0000 {
			label = "image-1-nonsecure";
		};
		/* 0xf0000 to 0xf7fff reserved for TF-M partitions */
		storage_partition: partition@f8000 {
			label = "storage";
			reg = <0x000f8000 0x00008000>;
		};
	};
}

Thanks.

Parents
  • Update 2:

    I found this guide: https://devzone.nordicsemi.com/guides/nrf-connect-sdk-guides/b/software/posts/ncs-dfu#mcetoc_1h90k6ei40 which will supposedly add DFU over bluetooth easily.

    Still working from the sample matter lock application, I added to following to prj.conf since I'm working with sdk 2.5.99:

    CONFIG_BOOTLOADER_MCUBOOT=y
    CONFIG_NCS_SAMPLE_MCUMGR_BT_OTA_DFU=y

    This gets me a compile error due to a build-time assertion:

    In file included from C:/ncs/v2.5.99-dev1/zephyr/include/zephyr/toolchain.h:50,
                     from C:/ncs/v2.5.99-dev1/zephyr/include/zephyr/kernel_includes.h:19,
                     from C:/ncs/v2.5.99-dev1/zephyr/include/zephyr/kernel.h:17,
                     from C:/ncs/v2.5.99-dev1/zephyr/subsys/mgmt/mcumgr/grp/img_mgmt/src/zephyr_img_mgmt.c:7:
    C:/ncs/v2.5.99-dev1/zephyr/include/zephyr/toolchain/gcc.h:81:36: error: static assertion failed: "Missing partitions?"
       81 | #define BUILD_ASSERT(EXPR, MSG...) _Static_assert(EXPR, "" MSG)
          |                                    ^~~~~~~~~~~~~~
    C:/ncs/v2.5.99-dev1/zephyr/subsys/mgmt/mcumgr/grp/img_mgmt/src/zephyr_img_mgmt.c:38:1: note: in expansion of macro 'BUILD_ASSERT'
       38 | BUILD_ASSERT(FIXED_PARTITION_EXISTS(SLOT2_PARTITION) &&
          | ^~~~~~~~~~~~

    So it looks like the partition mcuboot_primary_1 is missing. The sample app uses a static partition file (pm_static_dfu.yml):

    mcuboot:
      address: 0x0
      size: 0x8000
      region: flash_primary
    mcuboot_pad:
      address: 0x8000
      size: 0x200
    app:
      address: 0x8200
      size: 0xeee00
    mcuboot_primary:
      orig_span: &id002
      - mcuboot_pad
      - app
      span: *id001
      address: 0x8000
      size: 0xef000
      region: flash_primary
    mcuboot_primary_app:
      orig_span: &id002
      - app
      span: *id002
      address: 0x8200
      size: 0xeee00
    factory_data:
      address: 0xf7000
      size: 0x1000
      region: flash_primary
    settings_storage:
      address: 0xf8000
      size: 0x8000
      region: flash_primary
    mcuboot_primary_1:
      address: 0x0
      size: 0x40000
      device: flash_ctrl
      region: ram_flash
    mcuboot_secondary:
      address: 0x0
      size: 0xef000
      device: MX25R64
      region: external_flash
    mcuboot_secondary_1:
      address: 0xef000
      size: 0x40000
      device: MX25R64
      region: external_flash
    external_flash:
      address: 0x12f000
      size: 0x6D1000
      device: MX25R64
      region: external_flash
    pcd_sram:
      address: 0x20000000
      size: 0x2000
      region: sram_primary
    

    mcuboot_primary_1 is clearly defined, but it's placed in the ram_flash region. Huh? I don't know what that means, but the resulting file at build/zephyr/include/generated/pm_config.h has no mention of mcuboot_primary_1 at all. Should this partition be placed in external flash?

Reply
  • Update 2:

    I found this guide: https://devzone.nordicsemi.com/guides/nrf-connect-sdk-guides/b/software/posts/ncs-dfu#mcetoc_1h90k6ei40 which will supposedly add DFU over bluetooth easily.

    Still working from the sample matter lock application, I added to following to prj.conf since I'm working with sdk 2.5.99:

    CONFIG_BOOTLOADER_MCUBOOT=y
    CONFIG_NCS_SAMPLE_MCUMGR_BT_OTA_DFU=y

    This gets me a compile error due to a build-time assertion:

    In file included from C:/ncs/v2.5.99-dev1/zephyr/include/zephyr/toolchain.h:50,
                     from C:/ncs/v2.5.99-dev1/zephyr/include/zephyr/kernel_includes.h:19,
                     from C:/ncs/v2.5.99-dev1/zephyr/include/zephyr/kernel.h:17,
                     from C:/ncs/v2.5.99-dev1/zephyr/subsys/mgmt/mcumgr/grp/img_mgmt/src/zephyr_img_mgmt.c:7:
    C:/ncs/v2.5.99-dev1/zephyr/include/zephyr/toolchain/gcc.h:81:36: error: static assertion failed: "Missing partitions?"
       81 | #define BUILD_ASSERT(EXPR, MSG...) _Static_assert(EXPR, "" MSG)
          |                                    ^~~~~~~~~~~~~~
    C:/ncs/v2.5.99-dev1/zephyr/subsys/mgmt/mcumgr/grp/img_mgmt/src/zephyr_img_mgmt.c:38:1: note: in expansion of macro 'BUILD_ASSERT'
       38 | BUILD_ASSERT(FIXED_PARTITION_EXISTS(SLOT2_PARTITION) &&
          | ^~~~~~~~~~~~

    So it looks like the partition mcuboot_primary_1 is missing. The sample app uses a static partition file (pm_static_dfu.yml):

    mcuboot:
      address: 0x0
      size: 0x8000
      region: flash_primary
    mcuboot_pad:
      address: 0x8000
      size: 0x200
    app:
      address: 0x8200
      size: 0xeee00
    mcuboot_primary:
      orig_span: &id002
      - mcuboot_pad
      - app
      span: *id001
      address: 0x8000
      size: 0xef000
      region: flash_primary
    mcuboot_primary_app:
      orig_span: &id002
      - app
      span: *id002
      address: 0x8200
      size: 0xeee00
    factory_data:
      address: 0xf7000
      size: 0x1000
      region: flash_primary
    settings_storage:
      address: 0xf8000
      size: 0x8000
      region: flash_primary
    mcuboot_primary_1:
      address: 0x0
      size: 0x40000
      device: flash_ctrl
      region: ram_flash
    mcuboot_secondary:
      address: 0x0
      size: 0xef000
      device: MX25R64
      region: external_flash
    mcuboot_secondary_1:
      address: 0xef000
      size: 0x40000
      device: MX25R64
      region: external_flash
    external_flash:
      address: 0x12f000
      size: 0x6D1000
      device: MX25R64
      region: external_flash
    pcd_sram:
      address: 0x20000000
      size: 0x2000
      region: sram_primary
    

    mcuboot_primary_1 is clearly defined, but it's placed in the ram_flash region. Huh? I don't know what that means, but the resulting file at build/zephyr/include/generated/pm_config.h has no mention of mcuboot_primary_1 at all. Should this partition be placed in external flash?

Children
No Data
Related