# 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) || \
		   SOC_SERIES_NRF91X
	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.

config NRF_STORE_REBOOT_TYPE_GPREGRET
	bool "Set GPREGRET to reboot type (DEPRECATED)"
	depends on SOC_SERIES_NRF51X || SOC_SERIES_NRF52X
	depends on REBOOT
	depends on !RETENTION_BOOT_MODE
	select DEPRECATED
	help
	  If this option is enabled, then the parameter supplied to the
	  sys_reboot() function will be set in the GPREGRET register.

	  This has been replaced with the bootmode part of the retention
	  subsystem, which should be used instead.

endif # SOC_FAMILY_NRF
