diff --git a/applications/nrf_desktop/configuration/nrf54h20dk_nrf54h20_cpuapp/prj.conf b/applications/nrf_desktop/configuration/nrf54h20dk_nrf54h20_cpuapp/prj.conf index 39aad2f85d81..91778514e85a 100644 --- a/applications/nrf_desktop/configuration/nrf54h20dk_nrf54h20_cpuapp/prj.conf +++ b/applications/nrf_desktop/configuration/nrf54h20dk_nrf54h20_cpuapp/prj.conf @@ -56,13 +56,11 @@ CONFIG_DESKTOP_BLE_LOW_LATENCY_LOCK=y CONFIG_DESKTOP_CONFIG_CHANNEL_ENABLE=y CONFIG_DESKTOP_CONFIG_CHANNEL_OUT_REPORT=y +CONFIG_DESKTOP_CONFIG_CHANNEL_DFU_ENABLE=y CONFIG_DESKTOP_DFU_MCUMGR_ENABLE=y CONFIG_CAF_INIT_LOG_BLE_SMP_TRANSFER_EVENTS=n -# Temporarily disable unsupported features. -CONFIG_DESKTOP_CONFIG_CHANNEL_DFU_ENABLE=n - ################################################################################ # Zephyr Configuration @@ -124,6 +122,10 @@ CONFIG_MCUMGR_TRANSPORT_WORKQUEUE_STACK_SIZE=4096 CONFIG_MCUMGR_GRP_OS=y CONFIG_MCUMGR_GRP_OS_MCUMGR_PARAMS=y +CONFIG_STREAM_FLASH=y +CONFIG_IMG_MANAGER=y +CONFIG_MCUBOOT_IMG_MANAGER=y + # Configure Zephyr system power management CONFIG_PM=y CONFIG_PM_S2RAM=y diff --git a/applications/nrf_desktop/configuration/nrf54h20dk_nrf54h20_cpuapp/prj_dongle.conf b/applications/nrf_desktop/configuration/nrf54h20dk_nrf54h20_cpuapp/prj_dongle.conf index 36df5ccfe684..e529c617d6aa 100644 --- a/applications/nrf_desktop/configuration/nrf54h20dk_nrf54h20_cpuapp/prj_dongle.conf +++ b/applications/nrf_desktop/configuration/nrf54h20dk_nrf54h20_cpuapp/prj_dongle.conf @@ -41,9 +41,7 @@ CONFIG_DESKTOP_BLE_NEW_PEER_SCAN_ON_BOOT=y CONFIG_DESKTOP_BLE_PEER_ERASE=y CONFIG_DESKTOP_CONFIG_CHANNEL_ENABLE=y - -# Temporarily disable unsupported features. -CONFIG_DESKTOP_CONFIG_CHANNEL_DFU_ENABLE=n +CONFIG_DESKTOP_CONFIG_CHANNEL_DFU_ENABLE=y ################################################################################ # Zephyr Configuration @@ -85,6 +83,10 @@ CONFIG_BT_PRIVACY=y CONFIG_BT_BUF_ACL_TX_SIZE=35 +CONFIG_STREAM_FLASH=y +CONFIG_IMG_MANAGER=y +CONFIG_MCUBOOT_IMG_MANAGER=y + # Configure Zephyr system power management CONFIG_PM=y CONFIG_PM_S2RAM=y diff --git a/applications/nrf_desktop/configuration/nrf54h20dk_nrf54h20_cpuapp/prj_release.conf b/applications/nrf_desktop/configuration/nrf54h20dk_nrf54h20_cpuapp/prj_release.conf index 6dc576165f6a..2ddd71129fb4 100644 --- a/applications/nrf_desktop/configuration/nrf54h20dk_nrf54h20_cpuapp/prj_release.conf +++ b/applications/nrf_desktop/configuration/nrf54h20dk_nrf54h20_cpuapp/prj_release.conf @@ -52,12 +52,10 @@ CONFIG_DESKTOP_FAILSAFE_ENABLE=y CONFIG_DESKTOP_CONFIG_CHANNEL_ENABLE=y CONFIG_DESKTOP_CONFIG_CHANNEL_OUT_REPORT=y +CONFIG_DESKTOP_CONFIG_CHANNEL_DFU_ENABLE=y CONFIG_DESKTOP_DFU_MCUMGR_ENABLE=y -# Temporarily disable unsupported features. -CONFIG_DESKTOP_CONFIG_CHANNEL_DFU_ENABLE=n - ################################################################################ # Zephyr Configuration @@ -118,6 +116,10 @@ CONFIG_MCUMGR_TRANSPORT_WORKQUEUE_STACK_SIZE=4096 CONFIG_MCUMGR_GRP_OS=y CONFIG_MCUMGR_GRP_OS_MCUMGR_PARAMS=y +CONFIG_STREAM_FLASH=y +CONFIG_IMG_MANAGER=y +CONFIG_MCUBOOT_IMG_MANAGER=y + # Configure Zephyr system power management CONFIG_PM=y CONFIG_PM_S2RAM=y diff --git a/applications/nrf_desktop/configuration/nrf54h20dk_nrf54h20_cpuapp/prj_release_dongle.conf b/applications/nrf_desktop/configuration/nrf54h20dk_nrf54h20_cpuapp/prj_release_dongle.conf index df998b0a9962..fb6e61e56bdf 100644 --- a/applications/nrf_desktop/configuration/nrf54h20dk_nrf54h20_cpuapp/prj_release_dongle.conf +++ b/applications/nrf_desktop/configuration/nrf54h20dk_nrf54h20_cpuapp/prj_release_dongle.conf @@ -40,9 +40,7 @@ CONFIG_DESKTOP_WATCHDOG_ENABLE=y CONFIG_DESKTOP_FAILSAFE_ENABLE=y CONFIG_DESKTOP_CONFIG_CHANNEL_ENABLE=y - -# Temporarily disable unsupported features. -CONFIG_DESKTOP_CONFIG_CHANNEL_DFU_ENABLE=n +CONFIG_DESKTOP_CONFIG_CHANNEL_DFU_ENABLE=y ################################################################################ # Zephyr Configuration @@ -84,6 +82,10 @@ CONFIG_BT_PRIVACY=y CONFIG_BT_BUF_ACL_TX_SIZE=35 +CONFIG_STREAM_FLASH=y +CONFIG_IMG_MANAGER=y +CONFIG_MCUBOOT_IMG_MANAGER=y + # Configure Zephyr system power management CONFIG_PM=y CONFIG_PM_S2RAM=y diff --git a/applications/nrf_desktop/src/modules/Kconfig.config_channel b/applications/nrf_desktop/src/modules/Kconfig.config_channel index d01de82965d4..6090448a7c0b 100644 --- a/applications/nrf_desktop/src/modules/Kconfig.config_channel +++ b/applications/nrf_desktop/src/modules/Kconfig.config_channel @@ -57,7 +57,6 @@ comment "DFU" config DESKTOP_CONFIG_CHANNEL_DFU_ENABLE bool "DFU over the config channel" depends on DESKTOP_CONFIG_CHANNEL_ENABLE - depends on (SSF_SUIT_SERVICE_ENABLED || !SUIT) help This option enables DFU over the config channel. diff --git a/applications/nrf_desktop/src/modules/dfu.c b/applications/nrf_desktop/src/modules/dfu.c index 0c60468b991d..0b0bff358897 100644 --- a/applications/nrf_desktop/src/modules/dfu.c +++ b/applications/nrf_desktop/src/modules/dfu.c @@ -56,41 +56,77 @@ LOG_MODULE_REGISTER(MODULE, CONFIG_DESKTOP_CONFIG_CHANNEL_DFU_LOG_LEVEL); "B0 bootloader supported only with Partition Manager"); #include #include - #define BOOTLOADER_NAME "B0" + #define BOOTLOADER_NAME "B0" #if PM_ADDRESS == PM_S0_IMAGE_ADDRESS - #define DFU_SLOT_ID PM_S1_IMAGE_ID + #define DFU_SLOT_ID PM_S1_IMAGE_ID #elif PM_ADDRESS == PM_S1_IMAGE_ADDRESS - #define DFU_SLOT_ID PM_S0_IMAGE_ID + #define DFU_SLOT_ID PM_S0_IMAGE_ID #else #error Missing partition definitions. #endif #elif CONFIG_BOOTLOADER_MCUBOOT - BUILD_ASSERT(IS_ENABLED(CONFIG_PARTITION_MANAGER_ENABLED), - "MCUBoot bootloader supported only with Partition Manager"); - #include #include #if CONFIG_DESKTOP_CONFIG_CHANNEL_DFU_MCUBOOT_DIRECT_XIP - #define BOOTLOADER_NAME "MCUBOOT+XIP" - #else - #define BOOTLOADER_NAME "MCUBOOT" - #endif - - #ifdef PM_MCUBOOT_SECONDARY_PAD_SIZE - BUILD_ASSERT(PM_MCUBOOT_PAD_SIZE == PM_MCUBOOT_SECONDARY_PAD_SIZE); - #endif - - #if CONFIG_BUILD_WITH_TFM - #define PM_ADDRESS_OFFSET (PM_MCUBOOT_PAD_SIZE + PM_TFM_SIZE) + #define BOOTLOADER_NAME "MCUBOOT+XIP" #else - #define PM_ADDRESS_OFFSET (PM_MCUBOOT_PAD_SIZE) + #define BOOTLOADER_NAME "MCUBOOT" #endif - #if (PM_ADDRESS - PM_ADDRESS_OFFSET) == PM_MCUBOOT_PRIMARY_ADDRESS - #define DFU_SLOT_ID PM_MCUBOOT_SECONDARY_ID - #elif (PM_ADDRESS - PM_ADDRESS_OFFSET) == PM_MCUBOOT_SECONDARY_ADDRESS - #define DFU_SLOT_ID PM_MCUBOOT_PRIMARY_ID + #if CONFIG_PARTITION_MANAGER_ENABLED + #include + + #ifdef PM_MCUBOOT_SECONDARY_PAD_SIZE + BUILD_ASSERT(PM_MCUBOOT_PAD_SIZE == PM_MCUBOOT_SECONDARY_PAD_SIZE); + #endif + + #if CONFIG_BUILD_WITH_TFM + #define PM_ADDRESS_OFFSET (PM_MCUBOOT_PAD_SIZE + PM_TFM_SIZE) + #else + #define PM_ADDRESS_OFFSET (PM_MCUBOOT_PAD_SIZE) + #endif + + #define MCUBOOT_PRIMARY_SLOT_ID PM_MCUBOOT_PRIMARY_ID + #define MCUBOOT_SECONDARY_SLOT_ID PM_MCUBOOT_SECONDARY_ID + + #if (PM_ADDRESS - PM_ADDRESS_OFFSET) == PM_MCUBOOT_PRIMARY_ADDRESS + #define DFU_SLOT_ID MCUBOOT_SECONDARY_SLOT_ID + #elif (PM_ADDRESS - PM_ADDRESS_OFFSET) == PM_MCUBOOT_SECONDARY_ADDRESS + #define DFU_SLOT_ID MCUBOOT_PRIMARY_SLOT_ID + #else + #error Missing partition definitions. + #endif + #elif CONFIG_USE_DT_CODE_PARTITION + #include + + #define CODE_PARTITION_NODE DT_CHOSEN(zephyr_code_partition) + #define MCUBOOT_PRIMARY_NODE DT_NODELABEL(slot0_partition) + #define MCUBOOT_SECONDARY_NODE DT_NODELABEL(slot1_partition) + + BUILD_ASSERT(DT_FIXED_PARTITION_EXISTS(MCUBOOT_PRIMARY_NODE), + "Missing primary partition definition in DTS."); + BUILD_ASSERT(DT_FIXED_PARTITION_EXISTS(MCUBOOT_SECONDARY_NODE), + "Missing secondary partition definition in DTS."); + + #define CODE_PARTITION_START_ADDR DT_FIXED_PARTITION_ADDR(CODE_PARTITION_NODE) + #define MCUBOOT_PRIMARY_START_ADDR DT_FIXED_PARTITION_ADDR(MCUBOOT_PRIMARY_NODE) + #define MCUBOOT_SECONDARY_START_ADDR DT_FIXED_PARTITION_ADDR(MCUBOOT_SECONDARY_NODE) + + #if MCUBOOT_PRIMARY_START_ADDR == MCUBOOT_SECONDARY_START_ADDR + #error Primary and secondary partitions cannot have the same address. + #endif + + #define MCUBOOT_PRIMARY_SLOT_ID DT_FIXED_PARTITION_ID(MCUBOOT_PRIMARY_NODE) + #define MCUBOOT_SECONDARY_SLOT_ID DT_FIXED_PARTITION_ID(MCUBOOT_SECONDARY_NODE) + + #if CODE_PARTITION_START_ADDR == MCUBOOT_PRIMARY_START_ADDR + #define DFU_SLOT_ID MCUBOOT_SECONDARY_SLOT_ID + #elif CODE_PARTITION_START_ADDR == MCUBOOT_SECONDARY_START_ADDR + #define DFU_SLOT_ID MCUBOOT_PRIMARY_SLOT_ID + #else + #error Missing partition definitions in DTS. + #endif #else - #error Missing partition definitions. + #error Unsupported partitioning scheme. #endif #else #error Bootloader not supported. @@ -732,12 +768,12 @@ static void handle_image_info_request(uint8_t *data, size_t *size) uint8_t flash_area_id; uint8_t bank_header_area_id; - if (DFU_SLOT_ID == PM_MCUBOOT_SECONDARY_ID) { + if (DFU_SLOT_ID == MCUBOOT_SECONDARY_SLOT_ID) { flash_area_id = 0; - bank_header_area_id = PM_MCUBOOT_PRIMARY_ID; + bank_header_area_id = MCUBOOT_PRIMARY_SLOT_ID; } else { flash_area_id = 1; - bank_header_area_id = PM_MCUBOOT_SECONDARY_ID; + bank_header_area_id = MCUBOOT_SECONDARY_SLOT_ID; } int err = boot_read_bank_header(bank_header_area_id, &header,