# Nordic Semiconductor nRFx MCU line

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

config SOC_FAMILY_NRF
	select SOC_COMPATIBLE_NRF
	select PLATFORM_SPECIFIC_INIT
	bool

if SOC_FAMILY_NRF
config SOC_FAMILY
	string
	default "nordic_nrf"

source "soc/arm/nordic_nrf/Kconfig.peripherals"
source "soc/arm/nordic_nrf/*/Kconfig.soc"

config NRF_SOC_SECURE_SUPPORTED
	def_bool !TRUSTED_EXECUTION_NONSECURE || (BUILD_WITH_TFM && TFM_PARTITION_PLATFORM)
	help
	  Hidden function to indicate that that the soc_secure functions are
	  available.
	  The functions are always available when not in non-secure.
	  For non-secure the functions must redirect to secure services exposed
	  by the secure firmware.

config NRF_MPU_FLASH_REGION_SIZE
	hex
	default 0x1000
	depends on HAS_HW_NRF_MPU
	help
	  FLASH region size for the NRF_MPU peripheral.

config NRF_BPROT_FLASH_REGION_SIZE
	hex
	default $(dt_node_int_prop_hex,$(DT_CHOSEN_ZEPHYR_FLASH),erase-block-size)
	depends on HAS_HW_NRF_BPROT
	help
	  FLASH region size for the NRF_BPROT peripheral (nRF52).

config NRF_ACL_FLASH_REGION_SIZE
	hex
	default $(dt_node_int_prop_hex,$(DT_CHOSEN_ZEPHYR_FLASH),erase-block-size)
	depends on HAS_HW_NRF_ACL
	help
	  FLASH region size for the NRF_ACL peripheral.

config NFCT_PINS_AS_GPIOS
	bool "NFCT pins as GPIOs"
	depends on $(dt_has_compat,$(DT_COMPAT_NORDIC_NRF_NFCT))
	help
	  Two pins are usually reserved for NFC in SoCs that implement the
	  NFCT peripheral. This option switches them to normal GPIO mode.
	  HW enabling happens once in the device lifetime, during the first
	  system startup. Disabling this option will not switch back these
	  pins to NFCT mode. Doing this requires UICR erase prior to
	  flashing device using the image which has this option disabled.

	  NFC pins in nRF52 series: P0.09 and P0.10
	  NFC pins in nRF5340: P0.02 and P0.03

choice NRF_APPROTECT_HANDLING
	bool "APPROTECT handling"
	depends on SOC_SERIES_NRF52X || SOC_NRF5340_CPUNET || \
		   (SOC_NRF5340_CPUAPP && !TRUSTED_EXECUTION_NONSECURE)
	default NRF_APPROTECT_USE_UICR
	help
	  Specifies how the SystemInit() function should handle the APPROTECT
	  mechanism.

config NRF_APPROTECT_USE_UICR
	bool "Use UICR"
	help
	  When this option is selected, the SystemInit() function loads the
	  firmware branch state of the APPROTECT mechanism from UICR, so if
	  UICR->APPROTECT is disabled, CTRLAP->APPROTECT will be disabled.

config NRF_APPROTECT_LOCK
	bool "Lock"
	help
	  When this option is selected, the SystemInit() function locks
	  the firmware branch of the APPROTECT mechanism, preventing it
	  from being opened.

config NRF_APPROTECT_USER_HANDLING
	bool "Allow user handling"
	depends on !SOC_SERIES_NRF52X
	help
	  When this option is selected, the SystemInit() function does not
	  touch the APPROTECT mechanism, allowing the user code to handle it
	  at later stages, for example, to implement authenticated debug.

endchoice

choice NRF_SECURE_APPROTECT_HANDLING
	bool "Secure APPROTECT handling"
	depends on (SOC_NRF5340_CPUAPP && !TRUSTED_EXECUTION_NONSECURE)
	default NRF_SECURE_APPROTECT_USE_UICR
	help
	  Specifies how the SystemInit() function should handle the secure
	  APPROTECT mechanism.

config NRF_SECURE_APPROTECT_USE_UICR
	bool "Use UICR"
	help
	  When this option is selected, the SystemInit() function loads the
	  firmware branch state of the secure APPROTECT mechanism from UICR,
	  so if UICR->SECUREAPPROTECT is disabled, CTRLAP->SECUREAPPROTECT
	  will be disabled.

config NRF_SECURE_APPROTECT_LOCK
	bool "Lock"
	help
	  When this option is selected, the SystemInit() function locks the
	  firmware branch of the secure APPROTECT mechanism, preventing it
	  from being opened.

config NRF_SECURE_APPROTECT_USER_HANDLING
	bool "Allow user handling"
	depends on !SOC_SERIES_NRF52X
	help
	  When this option is selected, the SystemInit() function does not
	  touch the secure APPROTECT mechanism, allowing the user code to
	  handle it at later stages, for example, to implement authenticated
	  debug.

endchoice

config NRF_TRACE_PORT
	bool "nRF TPIU"
	depends on !SOC_SERIES_NRF51X
	help
	  Enable this option to initialize the TPIU (Trace Port Interface
	  Unit) for tracing using a hardware probe. If disabled, the trace
	  pins will be used as GPIO.

endif # SOC_FAMILY_NRF
