Skip to content
Permalink
Browse files

dfu/boot: make swap_type optional

Swap_type field implementation is the new mcuboot's trailer field.
This patch makes using of it optional which keeps possibility of being
compatible with older versions of MCUBoot.

Signed-off-by: Andrzej Puzdrowski <andrzej.puzdrowski@nordicsemi.no>
  • Loading branch information...
nvlsianpu authored and carlescufi committed Jun 13, 2019
1 parent b1e1774 commit f51e3c296040f73bca0e8fe1051d5ee63ce18e0d
Showing with 40 additions and 1 deletion.
  1. +13 −0 subsys/dfu/Kconfig
  2. +27 −1 subsys/dfu/boot/mcuboot.c
@@ -30,6 +30,19 @@ config MCUBOOT_IMG_MANAGER

endchoice

if MCUBOOT_IMG_MANAGER
config MCUBOOT_TRAILER_SWAP_TYPE
bool "use trailer's swap_type field"
default y
help
Enables usage swap type field which is required after
"Fix double swap on interrupted revert" mcuboot patch
(https://github.com/JuulLabs-OSS/mcuboot/pull/485)
Disable this option if need to be compatible with earlier version
of MCUBoot.
endif


config IMG_BLOCK_BUF_SIZE
int "Image writer buffer size"
depends on MCUBOOT_IMG_MANAGER
@@ -82,8 +82,10 @@ struct mcuboot_v1_raw_header {
#define FLASH_AREA_IMAGE_SCRATCH DT_FLASH_AREA_IMAGE_SCRATCH_ID
#endif /* CONFIG_TRUSTED_EXECUTION_NONSECURE */

#ifdef CONFIG_MCUBOOT_TRAILER_SWAP_TYPE
#define SWAP_TYPE_OFFS(bank_area) ((bank_area)->fa_size -\
BOOT_MAGIC_SZ - BOOT_MAX_ALIGN * 3)
#endif

#define COPY_DONE_OFFS(bank_area) ((bank_area)->fa_size -\
BOOT_MAGIC_SZ - BOOT_MAX_ALIGN * 2)
@@ -384,6 +386,7 @@ static int boot_magic_write(u8_t bank_id)
return rc;
}

#ifdef CONFIG_MCUBOOT_TRAILER_SWAP_TYPE
static int boot_swap_type_write(u8_t bank_id, u8_t swap_type)
{
const struct flash_area *fa;
@@ -402,6 +405,7 @@ static int boot_swap_type_write(u8_t bank_id, u8_t swap_type)

return rc;
}
#endif

static int boot_read_v1_header(u8_t area_id,
struct mcuboot_v1_raw_header *v1_raw)
@@ -508,6 +512,7 @@ static int boot_read_swap_state(const struct flash_area *fa,
state->magic = boot_magic_decode(magic);
}

#ifdef CONFIG_MCUBOOT_TRAILER_SWAP_TYPE
off = SWAP_TYPE_OFFS(fa);
rc = flash_area_read_is_empty(fa, off, &state->swap_type,
sizeof(state->swap_type));
@@ -529,6 +534,21 @@ static int boot_read_swap_state(const struct flash_area *fa,
} else {
state->copy_done = boot_flag_decode(state->copy_done);
}
#else
if (fa->fa_id != FLASH_AREA_IMAGE_SCRATCH) {
off = COPY_DONE_OFFS(fa);
rc = flash_area_read_is_empty(fa, off, &state->copy_done,
sizeof(state->copy_done));
if (rc < 0) {
return -EIO;
}
if (rc == 1) {
state->copy_done = BOOT_FLAG_UNSET;
} else {
state->copy_done = boot_flag_decode(state->copy_done);
}
}
#endif

off = IMAGE_OK_OFFS(fa);
rc = flash_area_read_is_empty(fa, off, &state->image_ok,
@@ -623,7 +643,9 @@ int mcuboot_swap_type(void)

int boot_request_upgrade(int permanent)
{
#ifdef CONFIG_MCUBOOT_TRAILER_SWAP_TYPE
u8_t swap_type;
#endif
int rc;

rc = boot_magic_write(FLASH_AREA_IMAGE_SECONDARY);
@@ -633,6 +655,8 @@ int boot_request_upgrade(int permanent)

if (permanent) {
rc = boot_image_ok_write(FLASH_AREA_IMAGE_SECONDARY);

#ifdef CONFIG_MCUBOOT_TRAILER_SWAP_TYPE
if (rc) {
goto op_end;
}
@@ -643,7 +667,9 @@ int boot_request_upgrade(int permanent)
}

rc = boot_swap_type_write(FLASH_AREA_IMAGE_SECONDARY, swap_type);

#else
}
#endif
op_end:
return rc;
}

0 comments on commit f51e3c2

Please sign in to comment.
You can’t perform that action at this time.