#
#   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 flash with a set of options for 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 flash with a set of options for 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
	select MCUMGR_GRP_BASIC_CMD_STORAGE_ERASE
	help
	  Enables Device Firmware Upgrade over Bluetooth LE with SMP and configures
	  the 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
