#
#   Copyright (c) 2022 Project CHIP Authors
#
#   Licensed under the Apache License, Version 2.0 (the "License");
#   you may not use this file except in compliance with the License.
#   You may obtain a copy of the License at
#
#       http://www.apache.org/licenses/LICENSE-2.0
#
#   Unless required by applicable law or agreed to in writing, software
#   distributed under the License is distributed on an "AS IS" BASIS,
#   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
#   See the License for the specific language governing permissions and
#   limitations under the License.
#

# The purpose of this file is to define Kconfig options enabling specific features.
# Feature options will define defaults for settings that are related to the specific feature.

if CHIP

config CHIP_QSPI_NOR
	bool "Enable QSPI NOR feature set"
	help
		Enables QSPI NOR with the set of options
		configuring pages and buffer sizes.

if CHIP_QSPI_NOR

config NORDIC_QSPI_NOR
	bool
	default y

config NORDIC_QSPI_NOR_STACK_WRITE_BUFFER_SIZE
	int
	default 16

endif # CHIP_QSPI_NOR

config CHIP_SPI_NOR
	bool "Enable SPI NOR feature set"
	imply SPI
	imply SPI_NOR
	imply MULTITHREADING
	imply PM_OVERRIDE_EXTERNAL_DRIVER_CHECK
	help
		Enables SPI NOR with the set of options
		configuring pages and buffer sizes.

if CHIP_SPI_NOR

config SPI_NOR_FLASH_LAYOUT_PAGE_SIZE
	int
	default 4096

endif # CHIP_SPI_NOR

config CHIP_DFU_OVER_BT_SMP
	bool "Enable DFU over Bluetooth LE SMP feature set"
	imply CHIP_QSPI_NOR if BOARD_NRF5340DK_NRF5340_CPUAPP || BOARD_NRF52840DK_NRF52840
	imply CHIP_SPI_NOR if BOARD_NRF7002DK_NRF5340_CPUAPP
	imply BOOTLOADER_MCUBOOT
	help
		Enables Device Firmware Upgrade over Bluetoot LE with SMP
		and configures set of options related to that feature.

if CHIP_DFU_OVER_BT_SMP

# MCU Manager and SMP configuration
config MCUMGR
	bool
	default y

config MCUMGR_CMD_IMG_MGMT
	bool
	default y

config MCUMGR_CMD_OS_MGMT
	bool
	default y

config MCUMGR_SMP_BT
	bool
	default y

config MCUMGR_SMP_BT_AUTHEN
	bool
	default n

config MCUMGR_BUF_COUNT
	int
	default 6

# Increase BT MTU and RX buffer for big size DFU messages
config BT_L2CAP_TX_MTU
	int
	default 498

config BT_BUF_ACL_RX_SIZE
	int
	default 502

# Increase MCUMGR_BUF_SIZE, as it must be big enough to fit MAX MTU + overhead and for single-image DFU default is 384 B
config MCUMGR_BUF_SIZE
	int
	default 1024

# Increase system workqueue size, as SMP is processed within it
config SYSTEM_WORKQUEUE_STACK_SIZE
	int
	default 2800

if SOC_SERIES_NRF53X

# FLASH nop device is enabled to prevent bus faults when mcumgr tries to access
# simulated partition with network core image data.
config FLASH_NOP_DEVICE
	bool
	default y

# Enable custom SMP request to erase settings partition.
config MCUMGR_GRP_ZEPHYR_BASIC
	bool
	default y

config MCUMGR_GRP_BASIC_CMD_STORAGE_ERASE
	bool
	default y

endif # SOC_SERIES_NRF53X

endif # CHIP_DFU_OVER_BT_SMP

endif # CHIP
