-
Notifications
You must be signed in to change notification settings - Fork 1.3k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
mgmt: mcumgr: grp: os: Add active b0 slot bootloader info query #19714
Changes from all commits
4b198dd
aca0c1c
a3094d1
16ea1c3
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,7 @@ | ||
# | ||
# Copyright (c) 2024 Nordic Semiconductor | ||
# | ||
# SPDX-License-Identifier: LicenseRef-Nordic-5-Clause | ||
# | ||
|
||
add_subdirectory(grp) |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,11 @@ | ||
# | ||
# Copyright (c) 2024 Nordic Semiconductor | ||
# | ||
# SPDX-License-Identifier: LicenseRef-Nordic-5-Clause | ||
# | ||
|
||
menu "Additional MCUmgr configuration" | ||
|
||
rsource "grp/Kconfig" | ||
|
||
endmenu |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,7 @@ | ||
# | ||
# Copyright (c) 2024 Nordic Semiconductor | ||
# | ||
# SPDX-License-Identifier: LicenseRef-Nordic-5-Clause | ||
# | ||
|
||
add_subdirectory_ifdef(CONFIG_MCUMGR_GRP_OS os_mgmt) |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,11 @@ | ||
# | ||
# Copyright (c) 2024 Nordic Semiconductor | ||
# | ||
# SPDX-License-Identifier: LicenseRef-Nordic-5-Clause | ||
# | ||
|
||
menu "Additional MCUmgr group configuration" | ||
|
||
rsource "os_mgmt/Kconfig" | ||
|
||
endmenu |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,10 @@ | ||
# | ||
# Copyright (c) 2024 Nordic Semiconductor ASA | ||
# | ||
# SPDX-License-Identifier: LicenseRef-Nordic-5-Clause | ||
# | ||
|
||
if(CONFIG_MCUMGR_GRP_OS_BOOTLOADER_INFO_B0_ACTIVE_SLOT) | ||
zephyr_library_amend() | ||
zephyr_library_sources(src/os_mgmt_b0_active_slot.c) | ||
endif() |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,22 @@ | ||
# | ||
# Copyright (c) 2024 Nordic Semiconductor ASA | ||
# | ||
# SPDX-License-Identifier: LicenseRef-Nordic-5-Clause | ||
# | ||
|
||
menu "Additional MCUmgr OS group management functionality" | ||
|
||
config MCUMGR_GRP_OS_BOOTLOADER_INFO_B0_ACTIVE_SLOT | ||
bool "Bootloader info query for active b0 slot" | ||
depends on MCUMGR_GRP_OS_BOOTLOADER_INFO | ||
depends on BOOTLOADER_MCUBOOT | ||
depends on MCUBOOT_MCUBOOT_IMAGE_NUMBER != -1 | ||
depends on FW_INFO | ||
depends on FW_INFO_API | ||
depends on MCUMGR_MGMT_NOTIFICATION_HOOKS | ||
depends on MCUMGR_GRP_OS_BOOTLOADER_INFO_HOOK | ||
help | ||
Enables a bootloader info command for `active_b0_slot` which will return the active b0 | ||
image slot number, and can be used to determine which update image should be loaded. | ||
|
||
endmenu |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,70 @@ | ||
/* | ||
* Copyright (c) 2024 Nordic Semiconductor ASA | ||
* | ||
* SPDX-License-Identifier: LicenseRef-Nordic-5-Clause | ||
*/ | ||
|
||
#include <zcbor_common.h> | ||
#include <zcbor_encode.h> | ||
#include <pm_config.h> | ||
#include <fw_info.h> | ||
#include <zephyr/mgmt/mcumgr/mgmt/callbacks.h> | ||
#include <zephyr/mgmt/mcumgr/grp/os_mgmt/os_mgmt.h> | ||
|
||
static enum mgmt_cb_return bootloader_info_hook(uint32_t event, enum mgmt_cb_return prev_status, | ||
int32_t *rc, uint16_t *group, bool *abort_more, | ||
void *data, size_t data_size) | ||
{ | ||
struct os_mgmt_bootloader_info_data *bootloader_info_data = | ||
(struct os_mgmt_bootloader_info_data *)data; | ||
|
||
if (event != MGMT_EVT_OP_OS_MGMT_BOOTLOADER_INFO || data_size != | ||
sizeof(*bootloader_info_data)) { | ||
*rc = MGMT_ERR_EUNKNOWN; | ||
return MGMT_CB_ERROR_RC; | ||
} | ||
|
||
if (*(bootloader_info_data->decoded) >= 1 && (sizeof("active_b0_slot") - 1) == | ||
bootloader_info_data->query->len && memcmp("active_b0_slot", | ||
bootloader_info_data->query->value, | ||
bootloader_info_data->query->len) == 0) { | ||
const struct fw_info *s0_info = fw_info_find(PM_S0_ADDRESS); | ||
const struct fw_info *s1_info = fw_info_find(PM_S1_ADDRESS); | ||
|
||
if (s0_info || s1_info) { | ||
uint32_t active_slot; | ||
bool ok; | ||
|
||
if (!s1_info || (s0_info && s0_info->version >= s1_info->version)) { | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. is the There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. it's possible that there is no s1 image loaded in which case s1 would be a null pointer so the check is needed. |
||
active_slot = 0; | ||
} else if (!s0_info || (s1_info && s1_info->version > s0_info->version)) { | ||
active_slot = 1; | ||
} | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Assuming that at this point we can have both There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. there must be an s0_info or s1_info for b0 to be able to boot the image so one of the conditions must run, if there is no s0_info and no s1_info and b0 has booted the image then something is very wrong There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Right, my bad. |
||
|
||
ok = zcbor_tstr_put_lit(bootloader_info_data->zse, "active") && | ||
zcbor_uint32_put(bootloader_info_data->zse, active_slot); | ||
*rc = (ok ? MGMT_ERR_EOK : MGMT_ERR_EMSGSIZE); | ||
return MGMT_CB_ERROR_RC; | ||
} | ||
|
||
/* Return response not valid error when active slot cannot be determined */ | ||
*group = MGMT_GROUP_ID_OS; | ||
*rc = OS_MGMT_ERR_QUERY_RESPONSE_VALUE_NOT_VALID; | ||
return MGMT_CB_ERROR_ERR; | ||
} | ||
|
||
return MGMT_CB_OK; | ||
} | ||
|
||
static struct mgmt_callback cmd_bootloader_info_cb = { | ||
.callback = bootloader_info_hook, | ||
.event_id = MGMT_EVT_OP_OS_MGMT_BOOTLOADER_INFO, | ||
}; | ||
|
||
static int os_mgmt_register_bootloader_info_hook_b0_active_slot(void) | ||
{ | ||
mgmt_callback_register(&cmd_bootloader_info_cb); | ||
return 0; | ||
} | ||
|
||
SYS_INIT(os_mgmt_register_bootloader_info_hook_b0_active_slot, APPLICATION, 0); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
minor nit.
Very long line before, and even much longer now 😞