#
#   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_WIFI
	bool "Enable nrfconnect Wi-Fi support"
	default y if SHIELD_NRF7002_EK || BOARD_NRF7002DK_NRF5340_CPUAPP
	select WIFI_NRF700X
	select WIFI
	select WPA_SUPP
	imply NORDIC_SECURITY_BACKEND
	imply MBEDTLS_ENTROPY_C
	imply MBEDTLS_PSA_CRYPTO_C
	imply NET_STATISTICS
	imply NET_L2_ETHERNET
	imply NET_PKT_TXTIME
	imply NET_PKT_TIMESTAMP
	imply MBEDTLS_PROMPTLESS
	imply BUILD_OUTPUT_META
	imply USE_DT_CODE_PARTITION # might be removed when the OTA is enabled
	imply NET_IPV6_ND # enable Neighbor Discovery to handle Router Advertisements
	imply NET_IPV6_NBR_CACHE
	imply NET_STATISTICS_IPV6
	imply NET_STATISTICS_USER_API

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
	default y

config NORDIC_QSPI_NOR_STACK_WRITE_BUFFER_SIZE
	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
	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
	select MCUMGR
	select MCUMGR_SMP_BT
	select MCUMGR_CMD_IMG_MGMT
	select MCUMGR_CMD_OS_MGMT
	# Enable custom SMP request to erase settings partition.
	select MCUMGR_GRP_ZEPHYR_BASIC if SOC_SERIES_NRF53X
	select MCUMGR_GRP_BASIC_CMD_STORAGE_ERASE if SOC_SERIES_NRF53X
	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_SMP_BT_AUTHEN
	default n

config MCUMGR_BUF_COUNT
	default 6

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

config BT_BUF_ACL_RX_SIZE
	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
	default 1024

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

if SOC_SERIES_NRF53X

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

config MCUMGR_GRP_BASIC_CMD_STORAGE_ERASE
	default y

endif # SOC_SERIES_NRF53X

endif # CHIP_DFU_OVER_BT_SMP

endif # CHIP
