snapshot: Update mcumgr to commit edb485cf from the upstream

The commit applies changes that have appeared between the last snapshot
update from the upstream:
  apache/mynewt-mcumgr 75d6f6ea7b05895e654513fecd598a7229df427b
and the current top of the upstream:
  apache/mynewt-mcumgr edb485cf471be3bc998b5c48866399a8a336ace5

Signed-off-by: Dominik Ermel <dominik.ermel@nordicsemi.no>
This commit is contained in:
Dominik Ermel 2021-09-21 11:59:15 +00:00 committed by Carles Cufí
parent 657deb658e
commit df9be73761
5 changed files with 82 additions and 53 deletions

View File

@ -30,7 +30,7 @@ not require MCUboot.
The `mcumgr` command line tool is available at:
https://github.com/apache/mynewt-mcumgr-cli. The command line tool requires [Go
1.7 or later](https://golang.org/dl/). Once Go is installed and set up on your
1.12 or later](https://golang.org/dl/). Once Go is installed and set up on your
system, you can install the mcumgr CLI tool by issuing the following `go get`
command:

View File

@ -40,8 +40,12 @@
#define IMG_MGMT_LAZY_ERASE CONFIG_IMG_ERASE_PROGRESSIVELY
#define IMG_MGMT_DUMMY_HDR CONFIG_IMG_MGMT_DUMMY_HDR
#define IMG_MGMT_BOOT_CURR_SLOT 0
#ifdef CONFIG_IMG_MGMT_UPDATABLE_IMAGE_NUMBER
/* Up to two images are supported */
BUILD_ASSERT(CONFIG_IMG_MGMT_UPDATABLE_IMAGE_NUMBER > 2, "Unsupported number of images");
#undef IMG_MGMT_UPDATABLE_IMAGE_NUMBER
#define IMG_MGMT_UPDATABLE_IMAGE_NUMBER CONFIG_IMG_MGMT_UPDATABLE_IMAGE_NUMBER
#endif
/* No direct support for this OS. The application needs to define the above
* settings itself.

View File

@ -36,8 +36,8 @@ LOG_MODULE_REGISTER(LOG_MODULE_NAME);
#include <img_mgmt/image.h>
#include "../../../src/img_mgmt_priv.h"
BUILD_ASSERT(CONFIG_IMG_MGMT_UPDATABLE_IMAGE_NUMBER == 1 ||
(CONFIG_IMG_MGMT_UPDATABLE_IMAGE_NUMBER == 2 &&
BUILD_ASSERT(IMG_MGMT_UPDATABLE_IMAGE_NUMBER == 1 ||
(IMG_MGMT_UPDATABLE_IMAGE_NUMBER == 2 &&
FLASH_AREA_LABEL_EXISTS(image_2) &&
FLASH_AREA_LABEL_EXISTS(image_3)),
"Missing partitions?");
@ -153,7 +153,7 @@ zephyr_img_mgmt_flash_area_id(int slot)
return fa_id;
}
#if CONFIG_IMG_MGMT_UPDATABLE_IMAGE_NUMBER == 1
#if IMG_MGMT_UPDATABLE_IMAGE_NUMBER == 1
/**
* In normal operation this function will select between first two slot
* (in reality it just checks whether second slot can be used), ignoring the
@ -199,20 +199,18 @@ img_mgmt_get_unused_slot_area_id(int slot)
return slot != -1 ? zephyr_img_mgmt_flash_area_id(slot) : -1;
#endif
}
#elif CONFIG_IMG_MGMT_UPDATABLE_IMAGE_NUMBER == 2
#elif IMG_MGMT_UPDATABLE_IMAGE_NUMBER == 2
static int
img_mgmt_get_unused_slot_area_id(int image)
{
int area_id = -1;
if (image == 0) {
if (image == 0 || image == -1) {
if (img_mgmt_slot_in_use(1) == 0) {
area_id = zephyr_img_mgmt_flash_area_id(1);
}
} else if (image == 1) {
area_id = zephyr_img_mgmt_flash_area_id(3);
} else {
assert(0);
}
return area_id;
@ -266,7 +264,7 @@ img_mgmt_impl_erase_slot(void)
/* Select any non-active, unused slot */
best_id = img_mgmt_get_unused_slot_area_id(-1);
if (best_id < 0) {
return MGMT_ERR_EUNKNOWN;
return MGMT_ERR_ENOENT;
}
rc = zephyr_img_mgmt_flash_check_empty(best_id, &empty);
if (rc != 0) {
@ -289,7 +287,7 @@ img_mgmt_impl_write_pending(int slot, bool permanent)
int rc;
if (slot != 1 &&
!(CONFIG_IMG_MGMT_UPDATABLE_IMAGE_NUMBER == 2 && slot == 3)) {
!(IMG_MGMT_UPDATABLE_IMAGE_NUMBER == 2 && slot == 3)) {
return MGMT_ERR_EINVAL;
}
@ -337,59 +335,83 @@ img_mgmt_impl_read(int slot, unsigned int offset, void *dst,
return 0;
}
/*
* The alloc_ctx and free_ctx are specifically provided for
* the img_mgmt_impl_write_image_data to allocate/free single flash_img_context
* type buffer.
* When heap is enabled these functions will operate on heap; when heap is not
* allocated the alloc_ctx just returns pointer to static, global life-time
* variable, and free_ctx does nothing.
* CONFIG_HEAP_MEM_POOL_SIZE is C preprocessor literal.
*/
static inline struct flash_img_context *alloc_ctx(void)
{
struct flash_img_context *ctx = NULL;
if (CONFIG_HEAP_MEM_POOL_SIZE > 0) {
ctx = k_malloc(sizeof(*ctx));
} else {
static struct flash_img_context stcx;
ctx = &stcx;
}
return ctx;
}
static inline void free_ctx(struct flash_img_context *ctx)
{
if (CONFIG_HEAP_MEM_POOL_SIZE > 0) {
k_free(ctx);
}
}
int
img_mgmt_impl_write_image_data(unsigned int offset, const void *data,
unsigned int num_bytes, bool last)
{
int rc;
#if (CONFIG_HEAP_MEM_POOL_SIZE > 0)
static struct flash_img_context *ctx = NULL;
#else
static struct flash_img_context ctx_data;
#define ctx (&ctx_data)
#endif
int rc = 0;
static struct flash_img_context *ctx = NULL;
#if (CONFIG_HEAP_MEM_POOL_SIZE > 0)
if (offset != 0 && ctx == NULL) {
return MGMT_ERR_EUNKNOWN;
}
#endif
if (CONFIG_HEAP_MEM_POOL_SIZE > 0 && offset != 0 && ctx == NULL) {
return MGMT_ERR_EUNKNOWN;
}
if (offset == 0) {
#if (CONFIG_HEAP_MEM_POOL_SIZE > 0)
if (ctx == NULL) {
ctx = k_malloc(sizeof(*ctx));
if (offset == 0) {
if (ctx == NULL) {
ctx = alloc_ctx();
if (ctx == NULL) {
return MGMT_ERR_ENOMEM;
}
}
#endif
rc = flash_img_init_id(ctx, g_img_mgmt_state.area_id);
if (ctx == NULL) {
rc = MGMT_ERR_ENOMEM;
goto out;
}
}
if (rc != 0) {
return MGMT_ERR_EUNKNOWN;
}
}
rc = flash_img_init_id(ctx, g_img_mgmt_state.area_id);
if (offset != ctx->stream.bytes_written + ctx->stream.buf_bytes) {
return MGMT_ERR_EUNKNOWN;
}
if (rc != 0) {
rc = MGMT_ERR_EUNKNOWN;
goto out;
}
}
/* Cast away const. */
rc = flash_img_buffered_write(ctx, (void *)data, num_bytes, last);
if (rc != 0) {
return MGMT_ERR_EUNKNOWN;
}
if (offset != ctx->stream.bytes_written + ctx->stream.buf_bytes) {
rc = MGMT_ERR_EUNKNOWN;
goto out;
}
#if (CONFIG_HEAP_MEM_POOL_SIZE > 0)
if (last) {
k_free(ctx);
ctx = NULL;
}
#endif
/* Cast away const. */
rc = flash_img_buffered_write(ctx, (void *)data, num_bytes, last);
if (rc != 0) {
rc = MGMT_ERR_EUNKNOWN;
goto out;
}
return 0;
out:
if (CONFIG_HEAP_MEM_POOL_SIZE > 0 && (last || rc != 0)) {
k_free(ctx);
ctx = NULL;
}
return rc;
}
int
@ -569,7 +591,7 @@ img_mgmt_impl_upload_inspect(const struct img_mgmt_upload_req *req,
if (action->area_id < 0) {
/* No slot where to upload! */
*errstr = img_mgmt_err_str_no_slot;
return MGMT_ERR_ENOMEM;
return MGMT_ERR_ENOENT;
}

View File

@ -515,6 +515,8 @@ img_mgmt_upload(struct mgmt_ctxt *ctxt)
}
}
#endif
} else {
cmd_status_arg.status = IMG_MGMT_ID_UPLOAD_STATUS_ONGOING;
}
/* Write the image data to flash. */
@ -542,7 +544,7 @@ img_mgmt_upload(struct mgmt_ctxt *ctxt)
if (g_img_mgmt_state.off == g_img_mgmt_state.size) {
/* Done */
img_mgmt_dfu_pending();
cmd_status_arg.status = IMG_MGMT_ID_UPLOAD_STATUS_ONGOING;
cmd_status_arg.status = IMG_MGMT_ID_UPLOAD_STATUS_COMPLETE;
g_img_mgmt_state.area_id = -1;
}
}

View File

@ -3,6 +3,7 @@ CONFIG_MCUMGR=y
# Some command handlers require a large stack.
CONFIG_SYSTEM_WORKQUEUE_STACK_SIZE=2304
CONFIG_MAIN_STACK_SIZE=2048
# Ensure an MCUboot-compatible binary is generated.
CONFIG_BOOTLOADER_MCUBOOT=y