# DFU support configuration options

# Copyright (c) 2017 Nordic Semiconductor ASA
# SPDX-License-Identifier: Apache-2.0

#
# DFU
#

menuconfig IMG_MANAGER
	bool "DFU image manager"
	help
	  Enable support for managing DFU image.

if IMG_MANAGER

choice
	prompt "Image manager"
	default MCUBOOT_IMG_MANAGER
	help
	  Choice support for managing DFU image.
	  So far only mcuboot support is available.

config MCUBOOT_IMG_MANAGER
	bool "Image manager for mcuboot"
	select FLASH_MAP
	help
	  Enable support for managing DFU image downloaded using mcuboot.

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
	default 512
	help
	  Size (in Bytes) of buffer for image writer. Must be a multiple of
	  the access alignment required by used flash driver.

config 	IMG_ERASE_PROGRESSIVELY
	bool "Erase flash progressively when receiving new firmware"
	depends on MCUBOOT_IMG_MANAGER
	select FLASH_PAGE_LAYOUT
	help
	  If enabled, flash is erased as necessary when receiving new firmware,
	  instead of erasing the whole image slot at once. This is necessary
	  on some hardware that has long erase times, to prevent long wait
	  times at the beginning of the DFU process.

module = IMG_MANAGER
module-str = image manager
source "subsys/logging/Kconfig.template.log_config"

endif # IMG_MANAGER
