# DFU support configuration options

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

#
# DFU
#

menuconfig IMG_MANAGER
	bool "DFU image manager"
	select STREAM_FLASH
	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
	select MCUBOOT_BOOTUTIL_LIB
	help
	  Enable support for managing DFU image downloaded using mcuboot.

endchoice

config MCUBOOT_SHELL
	bool "MCUboot shell"
	default y
	depends on MCUBOOT_IMG_MANAGER
	depends on SHELL
	help
	  Enable shell module, which provides information about image slots and
	  allows to perform such operations as: confirm, erase and request
	  upgrade.

config MCUBOOT_TRAILER_SWAP_TYPE
	bool "use trailer's swap_type field"
	default y
	depends on MCUBOOT_IMG_MANAGER
	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.

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 STREAM_FLASH_ERASE
	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.

config IMG_ENABLE_IMAGE_CHECK
	bool "Enable image check functions"
	depends on MCUBOOT_IMG_MANAGER
	select FLASH_AREA_CHECK_INTEGRITY
	help
	  If enabled, there will be available the function to check flash
	  integrity.  It can be used to verify flash integrity after received
	  a new firmware.  This is useful to avoid firmware reboot and test.
	  Another use is to ensure that firmware upgrade routines from internet
	  server to flash slot are performing properly.

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

if !MCUBOOT
config UPDATEABLE_IMAGE_NUMBER
	int "Number of updateable images"
	default 1
	range 1 2
	help
	  If value is set to 2 or greater then, this enables support needed when
	  application is combined with MCUboot multi-image boot.
endif

endif # IMG_MANAGER
