# Zephyr Bluetooth Controller configuration options

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

config BT_CTLR_DF_SUPPORT
	bool
	depends on !BT_CTLR_TIFS_HW
	select BT_CTLR_DF_CTE_TX_SUPPORT
	select BT_CTLR_DF_ANT_SWITCH_2US_SUPPORT
	select BT_CTLR_DF_ANT_SWITCH_1US_SUPPORT
	select BT_CTLR_DF_CTE_RX_SUPPORT
	select BT_CTLR_DF_CTE_RX_SAMPLE_1US_SUPPORT

config BT_CTLR_DF_CTE_TX_SUPPORT
	bool

config BT_CTLR_DF_CTE_RX_SUPPORT
	bool

config BT_CTLR_DF_CTE_RX_SAMPLE_1US_SUPPORT
	bool

config BT_CTLR_DF_ANT_SWITCH_2US_SUPPORT
	bool

config BT_CTLR_DF_ANT_SWITCH_1US_SUPPORT
	bool

config BT_CTLR_CTEINLINE_SUPPORT
	bool

menuconfig BT_CTLR_DF
	bool "LE Direction Finding [EXPERIMENTAL]"
	depends on BT_CTLR_DF_SUPPORT
	select EXPERIMENTAL
	help
	  Enable support for Bluetooth 5.1 Direction Finding

if BT_CTLR_DF

# Basic controller functionalities required for implementation of
# Bluetooth v5.1 Direction Finding

config BT_CTLR_DF_CTE_TX
	bool "Enable transmission of Constant Tone Extension"
	depends on BT_CTLR_DF_CTE_TX_SUPPORT
	default y
	help
	  Enable support for transmission of Constant Tone Extension in
	  controller.

config BT_CTLR_DF_CTE_RX_SAMPLE_1US
	bool "Enable reception of CTE with 1us sampling slots"
	depends on BT_CTLR_DF_CTE_RX_SAMPLE_1US_SUPPORT
	default y
	help
	  Enable reception of Constant Tone Extension. Process IQ sampling
	  during CTE reception with 1us sampling slots.
	  This sampling mode is optional for Direction Finding according to
	  Bluetooth v5.1.

config BT_CTLR_DF_ANT_SWITCH_1US
	bool "Enable support for 1us antenna switch slots"
	depends on BT_CTLR_DF_ANT_SWITCH_1US_SUPPORT
	default y
	help
	  Enable support for 1us antenna switching slots. This antenna switching
	  mode is optional for Direction Finding according to Bluetooth v5.1.

# Features related with Direction Finding
# BT Core spec 5.1, Vol 6, Part B, sec. 4.6 Feature Support

config BT_CTLR_DF_ANT_SWITCH_TX
	bool "Enable antenna switching during CTE transmission (AoD) feature"
	depends on BT_CTLR_DF_CTE_TX && BT_CTLR_DF_ANT_SWITCH_2US_SUPPORT
	default y
	help
	  Enable support for antenna switching during CTE transmission.
	  Also known as Angle of Departure mode.

config BT_CTLR_DF_ANT_SWITCH_RX
	bool "Enable antenna switching during CTE reception (AoA) feature"
	depends on BT_CTLR_DF_CTE_RX && BT_CTLR_DF_ANT_SWITCH_2US_SUPPORT
	default y
	help
	  Enable support for antenna switching during CTE reception.
	  Also known as Angle of Arrival mode.

config BT_CTLR_DF_CTE_RX
	bool "Enable reception of Constant Tone Extension feature"
	depends on BT_CTLR_DF_CTE_RX_SUPPORT
	select BT_CTLR_CONN_RSSI if BT_CONN
	default y
	help
	  Enable support for reception of Constant Tone Extension in controller.

config BT_CTLR_DF_CONN_CTE_REQ
	bool "Enable Connection CTE Request feature"
	depends on BT_CTLR_DF_CONN_CTE_RX
	help
	  Enable support for Bluetooth v5.1 Connection CTE Request feature
	  in controller.

config BT_CTLR_DF_CONN_CTE_RSP
	bool "Enable Connection CTE Response feature"
	depends on BT_CTLR_DF_CONN_CTE_TX
	help
	  Enable support for Bluetooth v5.1 Connection CTE Response feature
	  in controller.

config BT_CTLR_DF_ADV_CTE_TX
	bool "Enable Connectionless CTE Transmitter feature"
	depends on BT_CTLR_DF_CTE_TX && BT_CTLR_ADV_PERIODIC
	select BT_CTLR_ADV_EXT_PDU_EXTRA_DATA_MEMORY
	default y
	help
	  Enable support for Bluetooth v5.1 Connectionless CTE Transmitter
	  feature in controller.

config BT_CTLR_DF_SCAN_CTE_RX
	bool "Enable Connectionless CTE Receiver"
	depends on BT_CTLR_DF_CTE_RX && BT_CTLR_SYNC_PERIODIC
	default y
	help
	  Enable support for Bluetooth v5.1 connectionless CTE reception
	  in controller.

config BT_CTLR_DF_CONN_CTE_TX
	bool "Enable Connection based CTE Transmitter"
	depends on BT_CTLR_DF_CTE_TX && BT_CONN
	default y
	help
	  Enable transmission of Constant Tone Extension in
	  direction finding connected mode.

config BT_CTLR_DF_CONN_CTE_RX
	bool "Enable Connection based CTE Receiver"
	depends on BT_CTLR_DF_CTE_RX && BT_CONN
	default y
	help
	  Enable reception and sampling of Constant Tone Extension in direction
	  finding connected mode.

config BT_CTLR_DF_SAMPLE_CTE_FOR_PDU_WITH_BAD_CRC
	bool "Enable sampling of CTE for PDUs with bad CRC"
	depends on BT_CTLR_DF_SCAN_CTE_RX
	default y
	help
	  Enable support for sampling of CTE for PDUs that have bad CRC.

# Customization setting to manage memory usage footprint

config BT_CTLR_DF_MAX_ANT_SW_PATTERN_LEN
	int "Maximum length of antenna switch pattern"
	range 3 39 if SOC_COMPATIBLE_NRF
	range 2 75 if !SOC_COMPATIBLE_NRF
	default 12
	help
	  Defines maximum length of antenna switch pattern that controller
	  is able to store. For nRF5x-based controllers, the hardware imposes
	  the value is within range 3 to 40, where last value is maximum.
	  For general use cases Bluetooth Core 5.1 spec. required the value
	  to be within range 2 up to 75.

config BT_CTLR_DF_INIT_ANT_SEL_GPIOS
	bool "Enable initialization of GPIOs responsible for antenna switching"
	depends on BT_CTLR_DF_ANT_SWITCH_TX || BT_CTLR_DF_ANT_SWITCH_RX
	default y
	help
	  Enable implicit initialization of GPIOs responsible for antenna
	  switching during Radio initialization.
	  If this feature is not enabled, the Radio initialization procedure will
	  not initialize GPIOs pins selected to drive antenna switching.
	  In such case application is responsible for appropriate GPIOs
	  initialization.

config BT_CTLR_DF_PER_ADV_CTE_NUM_MAX
	int "Maximum number of transmitted PDUs with Constant Tone Extension in connectionless mode"
	depends on BT_CTLR_DF_ADV_CTE_TX && BT_CTLR_ADV_PDU_LINK
	range 1 16
	default 1
	help
	  Maximum supported number of PDUs, that have Constant Tone Extension, transmitted in single
	  periodic advertising chain. The range is taken from BT Core spec 5.1, Vol 4 Part E
	  section 7.8.82 HCI_LE_Set_Connectionless_IQ_Sampling_Enable Max_Sampled_CTEs parameter.

config BT_CTLR_DF_PER_SCAN_CTE_NUM_MAX
	int "Maximum number of received PDUs with Constant Tone Extension in connectionless mode"
	depends on BT_CTLR_DF_SCAN_CTE_RX
	range 1 16
	default 16
	help
	  Maximum supported number of PDUs, that have Constant Tone Extension, received in single
	  periodic advertising chain. The range is taken from BT Core spec 5.1, Vol 4 Part E
	  section 7.8.82 HCI_LE_Set_Connectionless_IQ_Sampling_Enable Max_Sampled_CTEs parameter.

config BT_CTLR_DF_DEBUG_ENABLE
	bool "Bluetooth Direction Finding debug support enable"
	help
	  This option enables debug support for the Direction Finding
	  implementation in controller.

config BT_CTLR_DF_PHYEND_OFFSET_COMPENSATION_ENABLE
	bool
	depends on BT_CTLR_DF_CTE_RX && BT_CONN && (SOC_NRF52811 || SOC_NRF52820 || SOC_NRF52833 || SOC_NRF5340_CPUNET)
	default y
	help
	  SOCs nRF52811, nRF52820, nRF52833, nRF5340 generate PHYEND event delayed when
	  CTEINLINECTRLEN is enabled and received PDU does not have CTEInfo field. The option
	  enables workaround for the delay to maintain inter frame spacing (IFS) for connection
	  events.

endif # BT_CTLR_DF
