-
Notifications
You must be signed in to change notification settings - Fork 7.4k
API for request MCUboot mode by the application #44512
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
Changes from all commits
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,35 @@ | ||
/* | ||
* Copyright (c) 2022 Nordic Semiconductor ASA | ||
* | ||
* SPDX-License-Identifier: Apache-2.0 | ||
*/ | ||
|
||
#ifndef ZEPHYR_INCLUDE_MCUBOOT_BOOT_MODE_H_ | ||
|
||
#define BOOT_MODE_REQ_NORMAL 0x00 | ||
#define BOOT_MODE_REQ_RECOVERY_DFU 0x01 | ||
|
||
/** | ||
* Set bootloader mode | ||
* | ||
* Using this the application can request specific bootloader mode. | ||
* MCUboot might enter this mode once system reboot. | ||
* | ||
* @param mode requested mode | ||
* | ||
* @retval 0 on success, negative errno code on fail. | ||
*/ | ||
int boot_mode_set(uint8_t mode); | ||
|
||
/** | ||
* Get bootloader mode | ||
* | ||
* Using this the bootloader might obtain the mode requested by the application. | ||
* Only first call returns valid value as the implementation should cleanup | ||
* hardware resource used for transferring the mode from the application. | ||
* | ||
* @retval bootloader mode | ||
*/ | ||
uint8_t boot_mode_get(void); | ||
|
||
#endif /* ZEPHYR_INCLUDE_MCUBOOT_BOOT_MODE_H_ */ |
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -47,6 +47,22 @@ extern void z_arm_nmi_init(void); | |
#define LOG_LEVEL CONFIG_SOC_LOG_LEVEL | ||
LOG_MODULE_REGISTER(soc); | ||
|
||
int soc_mcuboot_mode_set(uint8_t mode) | ||
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. Nothing wrong with this line of code, but the Signed-off-by: line in the commit message has the wrong format. |
||
{ | ||
nrf_power_gpregret2_set(NRF_POWER, mode); | ||
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. From spot-checking a product specification, the GPREGRET and GPREGRET2 registers seem to be available for application developer use too. Is there any risk in using them for this purpose? 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. GPREGRET is used by NCS internally for instance, it is also place where nRF SoC stores reboot-type in zephyr. 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. I can use GPREGRET for transfer both the reboot-type and the recovery-dfu request. This implies that I need to introduce an API for retrieve reboot-type as well. 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. Sorry, I don't understand your last comment 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. If you see usage of GPREGRET2 as the waste of resources I can make a better solution: The idea would be to start using GPREGRET for request of recovery-dfu as well (along with reboot-type to keep of which it is used currently). @mbolivar-nordic What is your opinion on that ^^ idea? 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. Ah, OK, I think I understand now. No, if we're already using GPREGRET, from my side I see no harm in using GPREGRET2 as well. You're saying you're not aware of any customers already using this that will be negatively impacted, right? 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. alternative: #46084 |
||
|
||
return 0; | ||
} | ||
|
||
uint8_t soc_mcuboot_mode_get(void) | ||
{ | ||
uint8_t mode = nrf_power_gpregret2_get(NRF_POWER); | ||
|
||
nrf_power_gpregret2_set(NRF_POWER, 0); | ||
|
||
return mode; | ||
} | ||
|
||
/* Overrides the weak ARM implementation: | ||
Set general purpose retention register and reboot */ | ||
void sys_arch_reboot(int type) | ||
|
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,4 +1,5 @@ | ||
# SPDX-License-Identifier: Apache-2.0 | ||
|
||
add_subdirectory(boot) | ||
add_subdirectory(img_util) | ||
add_subdirectory_ifdef(CONFIG_MCUBOOT_IMG_MANAGER boot) | ||
add_subdirectory_ifdef(CONFIG_MCUBOOT_IMG_MANAGER img_util) | ||
add_subdirectory(boot_mode) |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,3 @@ | ||
# SPDX-License-Identifier: Apache-2.0 | ||
|
||
zephyr_sources_ifdef(CONFIG_MCUBOOT_BOOT_MODE_API mcuboot_boot_mode.c) |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,19 @@ | ||
/* | ||
* Copyright (c) 2022 Nordic Semiconductor ASA | ||
* | ||
* SPDX-License-Identifier: Apache-2.0 | ||
*/ | ||
#include <zephyr.h> | ||
|
||
extern int soc_mcuboot_mode_set(uint8_t mode); | ||
extern uint8_t soc_mcuboot_mode_get(void); | ||
|
||
int boot_mode_set(uint8_t mode) | ||
{ | ||
return soc_mcuboot_mode_set(mode); | ||
} | ||
|
||
uint8_t boot_mode_get(void) | ||
{ | ||
return soc_mcuboot_mode_get(); | ||
} |
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.
It's been a while since I've looked at zephyr's MCUboot related APIs, but I'm confused about this mix of "MCUBOOT" and "BOOT" in the namespace. Is this meant to be MCUboot-specific, or generic across all bootloaders?
If it is meant to be mcuboot-specific, is there any harm in using MCUBOOT consistently? (I think this is the real question I am trying to ask.)
If it is meant to be generic, why is MCUBOOT appearing sometimes here?