Skip to content

Commit 8931e85

Browse files
kapi-nonordicjm
authored andcommitted
applications: nrf_desktop: adapt dfu_mcumgr to the nRF54H20 DFU solution
Adapted the DFU MCUmgr module in the nRF Desktop application so that it can work with the new DFU solution for the nRF54H20 SoC. Removed all module mentions of the old DFU solution for the nRF54H20 SoC called SUIT. Ref: NCSDK-34151 Signed-off-by: Kamil Piszczek <[email protected]>
1 parent 6df6566 commit 8931e85

File tree

6 files changed

+76
-136
lines changed

6 files changed

+76
-136
lines changed

applications/nrf_desktop/configuration/nrf54h20dk_nrf54h20_cpuapp/prj.conf

Lines changed: 24 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,9 +57,11 @@ CONFIG_DESKTOP_BLE_LOW_LATENCY_LOCK=y
5757
CONFIG_DESKTOP_CONFIG_CHANNEL_ENABLE=y
5858
CONFIG_DESKTOP_CONFIG_CHANNEL_OUT_REPORT=y
5959

60+
CONFIG_DESKTOP_DFU_MCUMGR_ENABLE=y
61+
CONFIG_CAF_INIT_LOG_BLE_SMP_TRANSFER_EVENTS=n
62+
6063
# Temporarily disable unsupported features.
6164
CONFIG_DESKTOP_CONFIG_CHANNEL_DFU_ENABLE=n
62-
CONFIG_DESKTOP_DFU_MCUMGR_ENABLE=n
6365

6466
################################################################################
6567
# Zephyr Configuration
@@ -101,6 +103,27 @@ CONFIG_UDC_DWC2_DMA=n
101103
CONFIG_BT_MAX_PAIRED=2
102104
CONFIG_BT_ID_MAX=3
103105

106+
# Enable MCUmgr Bluetooth transport
107+
CONFIG_MCUMGR_TRANSPORT_BT=y
108+
CONFIG_MCUMGR_TRANSPORT_BT_PERM_RW_ENCRYPT=y
109+
110+
# Allow for large Bluetooth data packets.
111+
CONFIG_BT_L2CAP_TX_MTU=498
112+
CONFIG_BT_BUF_ACL_RX_SIZE=502
113+
CONFIG_BT_BUF_ACL_TX_SIZE=251
114+
115+
# Enable the MCUmgr Packet Reassembly feature over Bluetooth and its configuration dependencies.
116+
# MCUmgr buffer size is optimized to fit one SMP packet divided into five Bluetooth Write Commands,
117+
# transmitted with the maximum possible MTU value: 498 bytes.
118+
CONFIG_MCUMGR_TRANSPORT_BT_REASSEMBLY=y
119+
CONFIG_MCUMGR_TRANSPORT_NETBUF_SIZE=2475
120+
CONFIG_MCUMGR_TRANSPORT_WORKQUEUE_STACK_SIZE=4096
121+
122+
# Allow a DFU host to retrieve information about the number and size of MCUmgr buffers.
123+
# The nRF Connect Device Manager uses this information to speed up the DFU.
124+
CONFIG_MCUMGR_GRP_OS=y
125+
CONFIG_MCUMGR_GRP_OS_MCUMGR_PARAMS=y
126+
104127
# Configure Zephyr system power management
105128
CONFIG_PM=y
106129
CONFIG_PM_S2RAM=y

applications/nrf_desktop/configuration/nrf54h20dk_nrf54h20_cpuapp/prj_release.conf

Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,9 +53,10 @@ CONFIG_DESKTOP_FAILSAFE_ENABLE=y
5353
CONFIG_DESKTOP_CONFIG_CHANNEL_ENABLE=y
5454
CONFIG_DESKTOP_CONFIG_CHANNEL_OUT_REPORT=y
5555

56+
CONFIG_DESKTOP_DFU_MCUMGR_ENABLE=y
57+
5658
# Temporarily disable unsupported features.
5759
CONFIG_DESKTOP_CONFIG_CHANNEL_DFU_ENABLE=n
58-
CONFIG_DESKTOP_DFU_MCUMGR_ENABLE=n
5960

6061
################################################################################
6162
# Zephyr Configuration
@@ -96,6 +97,27 @@ CONFIG_UDC_DWC2_DMA=n
9697
CONFIG_BT_MAX_PAIRED=2
9798
CONFIG_BT_ID_MAX=3
9899

100+
# Enable MCUmgr Bluetooth transport
101+
CONFIG_MCUMGR_TRANSPORT_BT=y
102+
CONFIG_MCUMGR_TRANSPORT_BT_PERM_RW_ENCRYPT=y
103+
104+
# Allow for large Bluetooth data packets.
105+
CONFIG_BT_L2CAP_TX_MTU=498
106+
CONFIG_BT_BUF_ACL_RX_SIZE=502
107+
CONFIG_BT_BUF_ACL_TX_SIZE=251
108+
109+
# Enable the MCUmgr Packet Reassembly feature over Bluetooth and its configuration dependencies.
110+
# MCUmgr buffer size is optimized to fit one SMP packet divided into five Bluetooth Write Commands,
111+
# transmitted with the maximum possible MTU value: 498 bytes.
112+
CONFIG_MCUMGR_TRANSPORT_BT_REASSEMBLY=y
113+
CONFIG_MCUMGR_TRANSPORT_NETBUF_SIZE=2475
114+
CONFIG_MCUMGR_TRANSPORT_WORKQUEUE_STACK_SIZE=4096
115+
116+
# Allow a DFU host to retrieve information about the number and size of MCUmgr buffers.
117+
# The nRF Connect Device Manager uses this information to speed up the DFU.
118+
CONFIG_MCUMGR_GRP_OS=y
119+
CONFIG_MCUMGR_GRP_OS_MCUMGR_PARAMS=y
120+
99121
# Configure Zephyr system power management
100122
CONFIG_PM=y
101123
CONFIG_PM_S2RAM=y

applications/nrf_desktop/configuration/nrf54h20dk_nrf54h20_cpurad/images/ipc_radio/prj.conf

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,11 @@ CONFIG_BT_CTLR_TX_PWR_DYNAMIC_CONTROL=y
3434
CONFIG_BT_CTLR_FILTER_ACCEPT_LIST=y
3535
CONFIG_BT_CTLR_PRIVACY=y
3636

37+
# Allow for large Bluetooth data packets.
38+
CONFIG_BT_BUF_ACL_RX_SIZE=502
39+
CONFIG_BT_BUF_ACL_TX_SIZE=251
40+
CONFIG_BT_CTLR_DATA_LENGTH_MAX=251
41+
3742
# Disable reset on fatal error for better debugging experience.
3843
CONFIG_RESET_ON_FATAL_ERROR=n
3944

applications/nrf_desktop/configuration/nrf54h20dk_nrf54h20_cpurad/images/ipc_radio/prj_release.conf

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,11 @@ CONFIG_BT_CTLR_TX_PWR_DYNAMIC_CONTROL=y
3434
CONFIG_BT_CTLR_FILTER_ACCEPT_LIST=y
3535
CONFIG_BT_CTLR_PRIVACY=y
3636

37+
# Allow for large Bluetooth data packets.
38+
CONFIG_BT_BUF_ACL_RX_SIZE=502
39+
CONFIG_BT_BUF_ACL_TX_SIZE=251
40+
CONFIG_BT_CTLR_DATA_LENGTH_MAX=251
41+
3742
# Improve firmware reliability.
3843
CONFIG_RESET_ON_FATAL_ERROR=y
3944

applications/nrf_desktop/src/modules/Kconfig.dfu_mcumgr

Lines changed: 14 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
#
2-
# Copyright (c) 2023 Nordic Semiconductor ASA
2+
# Copyright (c) 2023-2025 Nordic Semiconductor ASA
33
#
44
# SPDX-License-Identifier: LicenseRef-Nordic-5-Clause
55
#
@@ -8,6 +8,7 @@ menuconfig DESKTOP_DFU_MCUMGR_ENABLE
88
bool "Enable DFU using MCUmgr [EXPERIMENTAL]"
99
select EXPERIMENTAL
1010
select CAF_BLE_SMP_TRANSFER_EVENTS if MCUMGR_TRANSPORT_BT
11+
select DESKTOP_DFU_MCUMGR_MCUBOOT_DEPS
1112
select MCUMGR
1213
select MCUMGR_GRP_OS
1314
select MCUMGR_GRP_OS_BOOTLOADER_INFO
@@ -18,12 +19,24 @@ menuconfig DESKTOP_DFU_MCUMGR_ENABLE
1819
select FLASH
1920
select FLASH_MAP
2021
select ZCBOR
22+
depends on BOOTLOADER_MCUBOOT
2123
help
2224
This option enables an alternative method of performing DFU using the
2325
MCUmgr module.
2426

2527
if DESKTOP_DFU_MCUMGR_ENABLE
2628

29+
config DESKTOP_DFU_MCUMGR_MCUBOOT_DEPS
30+
bool
31+
select MCUBOOT_BOOTUTIL_LIB
32+
select IMG_MANAGER
33+
select MCUMGR_GRP_IMG
34+
select MCUMGR_GRP_IMG_MUTEX if DESKTOP_DFU_LOCK
35+
select STREAM_FLASH
36+
help
37+
This option is used to logically group the MCUboot bootloader dependencies in the MCUmgr DFU
38+
module. The MCUboot bootloader is the only supported bootloader for this module.
39+
2740
config DESKTOP_DFU_MCUMGR_MCUBOOT_DIRECT_XIP
2841
bool "Device uses MCUboot bootloader in direct-xip mode"
2942
default y if MCUBOOT_BOOTLOADER_MODE_DIRECT_XIP
@@ -38,35 +51,6 @@ config DESKTOP_DFU_MCUMGR_MCUBOOT_DIRECT_XIP
3851
boots the image with a higher version. The module does not confirm the
3952
newly updated image after a successful boot.
4053

41-
choice DESKTOP_DFU_MCUMGR_BACKEND
42-
prompt "Choose DFU backend"
43-
default DESKTOP_DFU_BACKEND_MCUBOOT if BOOTLOADER_MCUBOOT
44-
default DESKTOP_DFU_BACKEND_SUIT if SUIT
45-
46-
config DESKTOP_DFU_BACKEND_MCUBOOT
47-
bool "Use MCUboot as DFU backend"
48-
select MCUBOOT_BOOTUTIL_LIB
49-
select IMG_MANAGER
50-
select MCUMGR_GRP_IMG
51-
select MCUMGR_GRP_IMG_MUTEX if DESKTOP_DFU_LOCK
52-
select STREAM_FLASH
53-
depends on BOOTLOADER_MCUBOOT
54-
help
55-
This option enables the MCUboot bootloader as the backend for the MCUmgr DFU module.
56-
57-
config DESKTOP_DFU_BACKEND_SUIT
58-
bool "Use SUIT as DFU backend"
59-
select MCUMGR_SMP_LEGACY_RC_BEHAVIOUR
60-
select MGMT_SUITFU
61-
select MGMT_SUITFU_GRP_SUIT
62-
select SSF_SUIT_SERVICE_ENABLED
63-
select ZCBOR_CANONICAL
64-
depends on SUIT
65-
help
66-
This option enables the SUIT as the backend for the MCUmgr DFU module.
67-
68-
endchoice
69-
7054
module = DESKTOP_DFU_MCUMGR
7155
module-str = DFU MCUmgr
7256
source "subsys/logging/Kconfig.template.log_config"

applications/nrf_desktop/src/modules/dfu_mcumgr.c

Lines changed: 5 additions & 104 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,13 @@
11
/*
2-
* Copyright (c) 2023 Nordic Semiconductor ASA
2+
* Copyright (c) 2023-2025 Nordic Semiconductor ASA
33
*
44
* SPDX-License-Identifier: LicenseRef-Nordic-5-Clause
55
*/
66

77
#include <zephyr/kernel.h>
88

9-
#if defined CONFIG_DESKTOP_DFU_BACKEND_MCUBOOT
109
#include <zephyr/dfu/mcuboot.h>
1110
#include <zephyr/mgmt/mcumgr/grp/img_mgmt/img_mgmt.h>
12-
#elif defined CONFIG_DESKTOP_DFU_BACKEND_SUIT
13-
#include <sdfw/sdfw_services/suit_service.h>
14-
#include <dfu/suit_dfu.h>
15-
#endif
1611

1712
#include <zephyr/mgmt/mcumgr/grp/os_mgmt/os_mgmt.h>
1813
#include <zephyr/mgmt/mcumgr/mgmt/callbacks.h>
@@ -45,16 +40,7 @@ static void dfu_lock_owner_changed(const struct dfu_lock_owner *new_owner)
4540
/* The function declaration is not included in MCUmgr's header file if the mutex locking
4641
* of the image management state object is disabled.
4742
*/
48-
#if defined CONFIG_DESKTOP_DFU_BACKEND_MCUBOOT
4943
img_mgmt_reset_upload();
50-
#elif defined CONFIG_DESKTOP_DFU_BACKEND_SUIT
51-
int err = suit_dfu_cleanup();
52-
53-
if (err) {
54-
module_set_state(MODULE_STATE_ERROR);
55-
LOG_ERR("Failed to cleanup SUIT DFU: %d", err);
56-
}
57-
#endif
5844
#endif /* CONFIG_DESKTOP_DFU_LOCK */
5945
}
6046

@@ -75,19 +61,6 @@ static void dfu_timeout_handler(struct k_work *work)
7561
}
7662
}
7763

78-
static bool smp_cmd_is_suit_dfu_cmd(const struct mgmt_evt_op_cmd_arg *cmd,
79-
const char **smp_cmd_name)
80-
{
81-
#if CONFIG_MGMT_SUITFU_GRP_SUIT
82-
if (cmd->group == CONFIG_MGMT_GROUP_ID_SUIT) {
83-
*smp_cmd_name = "SUIT Management";
84-
return true;
85-
}
86-
#endif /* CONFIG_MGMT_SUITFU_GRP_SUIT */
87-
88-
return false;
89-
}
90-
9164
static bool smp_cmd_is_dfu_cmd(const struct mgmt_evt_op_cmd_arg *cmd)
9265
{
9366
const char *smp_cmd_name = "Unknown";
@@ -101,10 +74,6 @@ static bool smp_cmd_is_dfu_cmd(const struct mgmt_evt_op_cmd_arg *cmd)
10174
dfu_transfer_cmd = false;
10275
}
10376

104-
if (IS_ENABLED(CONFIG_DESKTOP_DFU_BACKEND_SUIT) && !dfu_transfer_cmd) {
105-
dfu_transfer_cmd = smp_cmd_is_suit_dfu_cmd(cmd, &smp_cmd_name);
106-
}
107-
10877
if (dfu_transfer_cmd && smp_cmd_name) {
10978
LOG_DBG("MCUmgr %s event", smp_cmd_name);
11079
}
@@ -161,7 +130,6 @@ static struct mgmt_callback cmd_recv_cb = {
161130
.event_id = MGMT_EVT_OP_CMD_RECV,
162131
};
163132

164-
#if CONFIG_DESKTOP_DFU_BACKEND_MCUBOOT
165133
static void dfu_backend_init(void)
166134
{
167135
if (!IS_ENABLED(CONFIG_DESKTOP_DFU_MCUMGR_MCUBOOT_DIRECT_XIP)) {
@@ -172,76 +140,12 @@ static void dfu_backend_init(void)
172140
}
173141
}
174142

175-
LOG_INF("MCUboot image version: %s", CONFIG_MCUBOOT_IMGTOOL_SIGN_VERSION);
176-
}
177-
#elif CONFIG_DESKTOP_DFU_BACKEND_SUIT
178-
static const char *suit_release_type_str_get(suit_version_release_type_t type)
179-
{
180-
switch (type) {
181-
case SUIT_VERSION_RELEASE_NORMAL:
182-
return NULL;
183-
case SUIT_VERSION_RELEASE_RC:
184-
return "rc";
185-
case SUIT_VERSION_RELEASE_BETA:
186-
return "beta";
187-
case SUIT_VERSION_RELEASE_ALPHA:
188-
return "alpha";
189-
default:
190-
__ASSERT(0, "Unknown release type");
191-
return NULL;
192-
}
193-
};
194-
195-
static void dfu_backend_init(void)
196-
{
197-
int err;
198-
bool is_semver_supported;
199-
unsigned int seq_num = 0;
200-
suit_ssf_manifest_class_info_t class_info;
201-
suit_semver_raw_t version_raw;
202-
suit_version_t version;
203-
204-
err = suit_get_supported_manifest_info(SUIT_MANIFEST_APP_ROOT, &class_info);
205-
if (!err) {
206-
err = suit_get_installed_manifest_info(&(class_info.class_id),
207-
&seq_num, &version_raw, NULL, NULL, NULL);
208-
}
209-
if (!err) {
210-
/* Semantic versioning support has been added to the SDFW in the v0.6.2
211-
* public release. Older SDFW versions return empty array in the version
212-
* variable.
213-
*/
214-
is_semver_supported = (version_raw.len != 0);
215-
if (is_semver_supported) {
216-
err = suit_metadata_version_from_array(&version,
217-
version_raw.raw,
218-
version_raw.len);
219-
}
220-
}
143+
k_work_init_delayable(&dfu_timeout, dfu_timeout_handler);
221144

222-
if (!err) {
223-
if (is_semver_supported) {
224-
const char *release_type;
225-
226-
release_type = suit_release_type_str_get(version.type);
227-
if (release_type) {
228-
LOG_INF("SUIT manifest version: %d.%d.%d-%s%d",
229-
version.major, version.minor, version.patch,
230-
release_type, version.pre_release_number);
231-
} else {
232-
LOG_INF("SUIT manifest version: %d.%d.%d",
233-
version.major, version.minor, version.patch);
234-
}
235-
}
145+
mgmt_callback_register(&cmd_recv_cb);
236146

237-
LOG_INF("SUIT manifest sequence number: %d", seq_num);
238-
} else {
239-
LOG_ERR("SUIT manifest info retrieval failed (err: %d)", err);
240-
}
147+
LOG_INF("MCUboot image version: %s", CONFIG_MCUBOOT_IMGTOOL_SIGN_VERSION);
241148
}
242-
#else
243-
#error "The DFU backend choice is not supported"
244-
#endif /* CONFIG_DESKTOP_DFU_BACKEND_MCUBOOT */
245149

246150
static bool app_event_handler(const struct app_event_header *aeh)
247151
{
@@ -261,11 +165,8 @@ static bool app_event_handler(const struct app_event_header *aeh)
261165

262166
if (check_state(event, MODULE_ID(main), MODULE_STATE_READY)) {
263167
dfu_backend_init();
264-
265-
k_work_init_delayable(&dfu_timeout, dfu_timeout_handler);
266-
267-
mgmt_callback_register(&cmd_recv_cb);
268168
}
169+
269170
return false;
270171
}
271172

0 commit comments

Comments
 (0)