#
#   Copyright (c) 2024-2025 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 new default values of settings used when building Matter samples.
# This file only changes defaults and thus all symbols here must be promptless
# and safeguarded so that they only are applied when building Matter.

if CHIP

# See config/common/cmake/Kconfig for full definition
config CHIP_DEVICE_VENDOR_NAME
	default "NXP Semiconductors"

choice CHIP_CRYPTO
	default CHIP_CRYPTO_PLATFORM if CHIP_NXP_PLATFORM_MCXW72 || CHIP_SE05X
	default CHIP_CRYPTO_MBEDTLS if CHIP_NXP_PLATFORM_RW61X || CHIP_NXP_PLATFORM_RT1170 || CHIP_NXP_PLATFORM_RT1060
endchoice

choice CHIP_CRYPTO_SPAKE2P
     default CHIP_CRYPTO_SPAKE2P_CUSTOM if CHIP_NXP_PLATFORM_MCXW72 && CHIP_CRYPTO_PSA
endchoice

config CHIP_WIFI
	default y if CHIP_NXP_PLATFORM_RW61X || CHIP_NXP_PLATFORM_RT1170 || CHIP_NXP_PLATFORM_RT1060

config NET_L2_OPENTHREAD
	default y if CHIP_NXP_PLATFORM_MCXW72

config CHIP_OPERATIONAL_TIME_SAVE_INTERVAL
	default 1

config CHIP_DEVICE_CONFIG_ENABLE_SED
	default y if CHIP_NXP_PLATFORM_MCXW72

config CHIP_LIB_SHELL
	default y if CHIP_NXP_PLATFORM_MCXW72
	default n

config CHIP_IPV4
	default n if NET_L2_OPENTHREAD && !CHIP_WIFI
	default y

config CHIP_TASK_STACK_SIZE
	default 14500 if CHIP_SE05X  # Increase is due to the additional middle-ware APDU buffers
	default 6144 if CHIP_NXP_PLATFORM_MCXW72
	default 10240

 config CHIP_INET_ENABLE_TCP_ENDPOINT
	default n

config CHIP_TASK_PRIORITY
	default 2

config CHIP_USE_OT_ENDPOINT
	default y if !CHIP_WITH_LWIP

config CHIP_ENABLE_READ_CLIENT
	default y

config CHIP_DEVICE_HARDWARE_VERSION
	default 1

config CHIP_DEVICE_HARDWARE_VERSION_STRING
	default "1.0"

config CHIP_DEVICE_SOFTWARE_VERSION
	default 1

config CHIP_DEVICE_SOFTWARE_VERSION_STRING
	default "1.5"

config CHIP_DEVICE_MANUFACTURING_DATE
	default "2024-01-01"

config CHIP_DEVICE_SPAKE2_IT
	default 10000

config CHIP_DEVICE_SPAKE2_SALT
	default "UXKLzwHdN3DZZLBaL2iVGhQi/OoQwIwJRQV4rpEalbA="

if CHIP_FACTORY_DATA

config CHIP_PLAT_LOAD_REAL_FACTORY_DATA
	default y

config CHIP_DEVICE_DISCRIMINATOR
	default 0xA00 #2560

config CHIP_DEVICE_SPAKE2_PASSCODE
	default 14014

config CHIP_DEVICE_VENDOR_ID
	default 4151 # 0x1037

config CHIP_DEVICE_MANUFACTURING_DATE
	default "2023-01-01"

config CHIP_DEVICE_PRODUCT_ID
	default 41510 if CHIP_NXP_PLATFORM_RW61X
	default 41511 if CHIP_NXP_PLATFORM_RT1170
	default 42241 if CHIP_NXP_PLATFORM_MCXW72

config CHIP_DEVICE_ROTATING_DEVICE_UID
	default "00112233445566778899aabbccddeeff"

config CHIP_DEVICE_SERIAL_NUMBER
	default "12345678"

config CHIP_DEVICE_PRODUCT_COLOR
	default "Green"

config CHIP_DEVICE_PRODUCT_FINISH
	default "Matte"

config CHIP_DEVICE_PRODUCT_URL
	default "https://www.nxp.com/products/wireless/wi-fi-plus-bluetooth-plus-802-15-4/wireless-mcu-with-integrated-tri-radiobr1x1-wi-fi-6-plus-bluetooth-low-energy-5-3-802-15-4:RW612" if CHIP_NXP_PLATFORM_RW61X
	default "https://www.nxp.com/products/processors-and-microcontrollers/arm-microcontrollers/i-mx-rt-crossover-mcus/i-mx-rt1170-1-ghz-crossover-mcu-with-arm-cortex-cores:i.MX-RT1170" if CHIP_NXP_PLATFORM_RT1170
	default "https://www.nxp.com/products/i.MX-RT1060" if CHIP_NXP_PLATFORM_RT1060
	default "https://www.nxp.com/products/MCX-W72X" if CHIP_NXP_PLATFORM_MCXW72


config CHIP_DEVICE_PRODUCT_LABEL
	default "RW612" if CHIP_NXP_PLATFORM_RW61X
	default "RT1170" if CHIP_NXP_PLATFORM_RT1170
	default "RT1060" if CHIP_NXP_PLATFORM_RT1060
	default "MCXW72X" if CHIP_NXP_PLATFORM_MCXW72

config CHIP_DEVICE_PART_NUMBER
	default "RW612" if CHIP_NXP_PLATFORM_RW61X
	default "RT1170" if CHIP_NXP_PLATFORM_RT1170
	default "RT1060" if CHIP_NXP_PLATFORM_RT1060
	default "MCXW72X" if CHIP_NXP_PLATFORM_MCXW72

endif # CHIP_FACTORY_DATA

config CHIP_LOG_SIZE_OPTIMIZATION
	default y

# Enable extended discovery
config CHIP_EXTENDED_DISCOVERY
	default y

config CHIP_WITH_LWIP
	default n if CHIP_NXP_PLATFORM_MCXW72
	default y

config CHIP_ENABLE_PAIRING_AUTOSTART
	default n if CHIP_NXP_PLATFORM_MCXW72
	default y

config CHIP_ICD_SLOW_POLL_INTERVAL
	default 2000 if !CHIP_ICD_LIT_SUPPORT

config CHIP_ICD_FAST_POLLING_INTERVAL
	default 500

if CHIP_ENABLE_ICD_SUPPORT

config CHIP_ICD_IDLE_MODE_DURATION
	default 600

config CHIP_ICD_ACTIVE_MODE_DURATION
	default 10000

config CHIP_ICD_ACTIVE_MODE_THRESHOLD
	default 5000

endif # CHIP_ENABLE_ICD_SUPPORT

config CHIP_MRP_LOCAL_ACTIVE_RETRY_INTERVAL
	default 2000

if CHIP_OTA_REQUESTOR

config CHIP_OTA_IMAGE_BUILD
	default y if CHIP_NXP_PLATFORM_RW61X || CHIP_NXP_PLATFORM_RT1060 || CHIP_NXP_PLATFORM_RT1170

endif # CHIP_OTA_REQUESTOR

# Include defaults for SDK Kconfig
rsource "../../../third_party/nxp/nxp_matter_support/cmake/Kconfig.defconfig"

endif # CHIP
