NCS 2.0 custom child image + mcuboot build

Hi,

In NCS 2.0, the ability to add a custom child image was added. This works fine but as soon as you include the mcuboot child image, the order of the child image builds changes.

For example,

If I build an application including mcuboot and the hci_rpmsg sample app, the child build order looks like this:

=== child image hci_rpmsg - CPUNET begin ===
=== child image b0n - CPUNET (inherited) begin ===
=== child image b0n - CPUNET (inherited) end ===
=== child image hci_rpmsg - CPUNET end ===
=== child image mcuboot - begin ===
=== child image mcuboot - end ===

If I build an application including mcuboot plus a custom child image, the child build order looks like this:

=== child image mcuboot - begin ===
=== child image mcuboot - end ===
=== child image hci_rpmsg - CPUNET begin ===
=== child image b0n - CPUNET (inherited) begin ===
=== child image b0n - CPUNET (inherited) end ===
=== child image hci_rpmsg - CPUNET end ===

The output of the mcuboot with the hci_rpmsg sample in the build/zephyr directory includes the following files:

app_to_sign.bin

app_update.bin

isrList.bin

net_core_app_to_sign.bin

net_core_app_update.bin  zephyr.bin

zephyr.bin

The output of the mcuboot with the custom child image in the build/zephyr directory include the following files:

app_to_sign.bin

app_update.bin

isrList.bin

zephyr.bin

The build with the custom child image is missing the net_core_app_to_sign.bin and net_core_app_update.bin files.

I did some investigation and it looks like the two missing files are generated in the following C:\ncs\v2.0.0\nrf\modules\mcuboot\CMakeLists.txt file.

    get_shared(cpunet_signed_app_hex IMAGE CPUNET PROPERTY PM_SIGNED_APP_HEX)

    if (CONFIG_NRF53_UPGRADE_NETWORK_CORE
        AND DEFINED cpunet_signed_app_hex)
      # Network core application updates are enabled.
      # We know this since MCUBoot is enabled on the application core, and
      # a network core child image is included in the build.
      # These updates are verified by the application core MCUBoot.
      # Create a signed variant of the network core application.

      get_shared(cpunet_images IMAGE CPUNET PROPERTY PM_DOMAIN_IMAGES)
      foreach(image ${cpunet_images})
        if(${image} MATCHES "CPUNET:(.*)")
          set(image_name ${CMAKE_MATCH_1})
          if(TARGET ${image_name}_subimage)
            get_shared(${image_name}_byproducts IMAGE ${image_name} PROPERTY BUILD_BYPRODUCTS)
            list(APPEND sign_depends ${image_name}_subimage ${${image_name}_byproducts})
          endif()
        endif()
      endforeach()

      set(net_core_binary_name net_core_app_update.bin)

      if (CONFIG_NRF53_ENFORCE_IMAGE_VERSION_EQUALITY)
        # Add dependency inside network core image to require the latest application core image.
        set(sign_dependencies IMAGE_DEPENDENCIES "(${APPLICATION_IMAGE_PAIR_IDX},${CONFIG_MCUBOOT_IMAGE_VERSION})")
      endif()

      sign(
        SIGNED_BIN_FILE_IN ${cpunet_signed_app_hex}
        SIGNED_HEX_FILE_NAME_PREFIX ${PROJECT_BINARY_DIR}/net_core_app
        SLOT_SIZE $<TARGET_PROPERTY:partition_manager,net_app_slot_size>
        START_ADDRESS_OFFSET $<TARGET_PROPERTY:partition_manager,net_app_TO_SECONDARY>
        SIGNED_HEX_FILE_OUT net_core_app_signed_hex
        SIGNED_BIN_FILE_OUT net_core_app_signed_bin
        SIGNED_HEX_TEST_FILE_OUT net_core_app_signed_test_hex
        ${sign_dependencies}
        DEPENDS ${sign_depends}
        )

      add_custom_target(
        net_core_app_sign_target
        DEPENDS ${net_core_app_signed_hex}
          ${net_core_app_signed_bin}
          ${net_core_app_signed_test_hex}
        )

      add_dependencies(
        mcuboot_sign_target
        net_core_app_sign_target
        )

      get_shared(net_core_soc IMAGE net_core PROPERTY SOC)
      get_shared(net_core_version IMAGE net_core PROPERTY VERSION)

      set(generate_bin_files
        ${PROJECT_BINARY_DIR}/${app_core_binary_name}
        ${PROJECT_BINARY_DIR}/${net_core_binary_name}
        )
      set(generate_script_params
        "${app_core_binary_name}load_address=$<TARGET_PROPERTY:partition_manager,PM_APP_ADDRESS>"
        "${app_core_binary_name}image_index=0"
        "${app_core_binary_name}slot_index_primary=1"
        "${app_core_binary_name}slot_index_secondary=2"
        "${app_core_binary_name}version_MCUBOOT=${CONFIG_MCUBOOT_IMAGE_VERSION}"
        "${net_core_binary_name}image_index=1"
        "${net_core_binary_name}slot_index_primary=3"
        "${net_core_binary_name}slot_index_secondary=4"
        "${net_core_binary_name}load_address=$<TARGET_PROPERTY:partition_manager,CPUNET_PM_APP_ADDRESS>"
        "${net_core_binary_name}board=${CONFIG_DOMAIN_CPUNET_BOARD}"
        "${net_core_binary_name}version=${net_core_version}"
        "${net_core_binary_name}soc=${net_core_soc}"
        )
    else()
      # No network core update
      set(generate_bin_files
        ${PROJECT_BINARY_DIR}/${app_core_binary_name}
        )
      set(generate_script_params
        "load_address=$<TARGET_PROPERTY:partition_manager,PM_APP_ADDRESS>"
        "version_MCUBOOT=${CONFIG_MCUBOOT_IMAGE_VERSION}"
        )
    endif()

Since mcuboot is built first, the PM_SIGNED_APP_HEX variable (in line #1 above) is not defined. The PM_SIGNED_APP_HEX variable is set when the custom child image is built.

Let me know if there's a fix that I can apply to the CMake files to fix the build order.  I haven't figured out a way to fix it yet.

Thanks

Related