# Kconfig - Bluetooth Controller configuration options
#
# Copyright (c) 2016-2017 Nordic Semiconductor ASA
#
# SPDX-License-Identifier: Apache-2.0
#

comment "BLE Controller support"

config BT_CTLR
	bool "Bluetooth Controller"
	select BT_RECV_IS_RX_THREAD
	help
	  Enables support for SoC native controller implementations.

if BT_CTLR

choice
	prompt "Bluetooth Link Layer Selection"
	default BT_LL_SW
	help
	  Select the Bluetooth Link Layer to compile.

config BT_LL_SW
	bool "Software-based BLE Link Layer"
	help
	  Use Zephyr software BLE Link Layer implementation.

endchoice

comment "BLE Controller configuration"

config BT_CTLR_RX_PRIO_STACK_SIZE
	# Hidden option for Controller's Co-Operative high priority Rx thread
	# stack size.
	int
	default 448

config BT_CTLR_RX_PRIO
	# Hidden option for Controller's Co-Operative high priority Rx thread
	# priority.
	int
	default 6

config BT_CTLR_FILTER
	# Hidden option to enable controller whitelist feature
	depends on BT_LL_SW
	bool
	default y

config BT_CTLR_HCI_VS_BUILD_INFO
	string "Zephyr HCI VS Build Info string"
	default ""
	depends on BT_HCI_VS_EXT
	help
	  User-defined string that will be returned by the Zephyr VS Read Build
	  Information command after the Zephyr version and build time. When
	  setting this to a value different from an empty string, a space
	  character is required at the beginning to separate it from the
	  already included information.

if BT_LL_SW
config BT_CTLR_DUP_FILTER_LEN
	prompt "Number of addresses in the scan duplicate filter"
	int
	depends on BT_OBSERVER
	default 16
	help
	  Set the number of unique BLE addresses that can be filtered as
	  duplicates while scanning.

config BT_CTLR_RX_BUFFERS
	prompt "Number of Rx buffers"
	int
	default 1
	default 6 if BT_HCI_RAW
	range 1 18
	help
	  Set the number of Rx PDUs to be buffered in the controller. In a 7.5ms
	  connection interval and 2M PHY, maximum 18 packets with L2CAP payload
	  size of 1 byte can be received.

config BT_CTLR_TX_BUFFERS
	prompt "Number of Tx buffers"
	int
	default 2
	default 7 if BT_HCI_RAW
	range 1 19
	help
	  Set the number of Tx PDUs to be queued for transmission in the
	  controller. In a 7.5ms connection interval and 2M PHY, maximum 19
	  packets can be enqueued, with 18 packets with L2CAP payload size of 1
	  byte can be acknowledged.

config BT_CTLR_TX_BUFFER_SIZE
	prompt "Tx buffer size"
	int
	range 27 16384
	default 27
	help
	  Size of the Tx buffers and the value returned in HCI LE Read Buffer
	  Size command response. If this size if greater than effective PDU size
	  then controller will perform fragmentation before transmitting on the
	  the packet on air.
	  Maximum is set to 16384 due to implementation limitations (use of
	  u16_t for size/length variables).

config BT_CTLR_COMPANY_ID
	prompt "Company Id"
	hex
	default 0x05F1
	range 0x0000 0xFFFF
	help
	  Set the Bluetooth Company Identifier that will be used in
	  the VERSION_IND PDU. The Linux Foundation's Company Identifier
	  (0x05F1) is the default value for this option although silicon vendors
	  and hardware manufacturers can set their own. The full list of
	  Bluetooth Company Identifiers can be found here:
	  https://www.bluetooth.com/specifications/assigned-numbers/company-identifiers

config BT_CTLR_SUBVERSION_NUMBER
	prompt "Subversion Number"
	hex
	default 0xFFFF
	range 0x0000 0xFFFF
	help
	  Set the Subversion Number that will be used in VERSION_IND PDU.

comment "BLE Controller features"

if BT_CONN

config BT_CTLR_LE_ENC
	bool
	depends on !BT_CTLR_DATA_LENGTH_CLEAR && !BT_CTLR_PHY_2M_NRF
	default y
	# Enable support for Bluetooth v4.0 LE Encryption feature in the
	# Controller.

config BT_CTLR_CONN_PARAM_REQ
	bool "Connection Parameter Request"
	default y
	help
	  Enable support for Bluetooth v4.1 Connection Parameter Request feature
	  in the Controller.

config BT_CTLR_LE_PING
	bool "LE Ping"
	default y
	help
	  Enable support for Bluetooth v4.1 LE Ping feature in the Controller.

config BT_CTLR_PRIVACY
	bool "LE Controller-based Privacy"
	depends on !SOC_SERIES_NRF51X
	default y
	select BT_RPA
	help
	  Enable support for Bluetooth v4.2 LE Controller-based Privacy feature
	  in the Controller.

config BT_CTLR_RL_SIZE
	prompt "LE Controller-based Privacy Resolving List size"
	depends on BT_CTLR_PRIVACY
	int
	default 8
	range 1 8 if SOC_FAMILY_NRF5
	help
	  Set the size of the Resolving List for LE Controller-based Privacy.
	  On nRF5x-based controllers, the hardware imposes a limit of 8 devices.

config BT_CTLR_EXT_SCAN_FP
	bool "LE Extended Scanner Filter Policies"
	default y
	help
	  Enable support for Bluetooth v4.2 LE Extended Scanner Filter Policies
	  in the Controller.

config BT_CTLR_DATA_LENGTH
	bool "Data Length Update"
	default y if SOC_SERIES_NRF52X
	help
	  Enable support for Bluetooth v4.2 LE Data Length Update procedure in
	  the Controller.

config BT_CTLR_DATA_LENGTH_MAX
	prompt "Maximum data length supported"
	depends on BT_CTLR_DATA_LENGTH
	int
	default 27
	range 27 251 if SOC_SERIES_NRF52X || BT_CTLR_DATA_LENGTH_CLEAR
	range 27 27
	help
	  Set the maximum data length of PDU supported in the Controller.

config BT_CTLR_PHY
	bool "PHY Update"
	default y if SOC_SERIES_NRF52X
	help
	  Enable support for Bluetooth 5.0 PHY Update Procedure in the
	  Controller.

endif # BT_CONN

config BT_CTLR_CHAN_SEL_2
	bool "Channel Selection Algorithm #2"
	default y
	help
	  Enable support for Bluetooth 5.0 LE Channel Selection Algorithm #2 in
	  the Controller.

config BT_CTLR_MIN_USED_CHAN
	bool "Minimum Number of Used Channels"
	default y
	help
	  Enable support for Bluetooth 5.0 Minimum Number of Used Channels
	  Procedure in the Controller.

config BT_CTLR_ADV_EXT
	bool "LE Advertising Extensions"
	select BT_CTLR_SCAN_REQ_NOTIFY
	select BT_CTLR_CHAN_SEL_2
	default y
	help
	  Enable support for Bluetooth 5.0 LE Advertising Extensions in the
	  Controller.

config BT_CTLR_DTM
	bool
	help
	  Enable support for Direct Test Mode in the Controller.

config BT_CTLR_DTM_HCI
	bool "Direct Test Mode over HCI"
	select BT_CTLR_DTM
	help
	  Enable support for Direct Test Mode over the HCI transport.

config BT_CTLR_ADVANCED_FEATURES
	bool "Show advanced features"
	help
	  Makes advanced features visible to controller developers.

menu "Advanced features"
	visible if BT_CTLR_ADVANCED_FEATURES

config BT_CTLR_DATA_LENGTH_CLEAR
	bool "Data Length Support (Cleartext only)"
	depends on BT_CTLR_DATA_LENGTH && SOC_SERIES_NRF51X
	help
	  Enable support for Bluetooth v4.2 LE Data Length Update procedure, up to
	  251 byte cleartext payloads in the Controller. Encrypted connections
	  are not supported.

if BT_CTLR_PHY

config BT_CTLR_PHY_2M
	bool "2Mbps PHY Support"
	depends on !SOC_SERIES_NRF51X || BT_CTLR_PHY_2M_NRF
	default y
	help
	  Enable support for Bluetooth 5.0 2Mbps PHY in the Controller.

config BT_CTLR_PHY_2M_NRF
	bool "2Mbps Nordic Semiconductor PHY Support (Cleartext only)"
	depends on SOC_SERIES_NRF51X
	select BT_CTLR_PHY_2M
	help
	  Enable support for Nordic Semiconductor proprietary 2Mbps PHY in the
	  Controller. Encrypted connections are not supported.

config BT_CTLR_PHY_CODED
	bool "Coded PHY Support"
	depends on SOC_NRF52840
	default y
	help
	  Enable support for Bluetooth 5.0 Coded PHY in the Controller.

endif # BT_CTLR_PHY

config BT_CTLR_WORKER_PRIO
	prompt "Radio and Ticker's Worker IRQ priority"
	int
	range 0 3 if SOC_SERIES_NRF51X
	range 0 6 if SOC_SERIES_NRF52X
	default 0
	help
	  The interrupt priority for event preparation and radio IRQ. This value
	  shall be less than or equal to the Ticker's Job priority value.

config BT_CTLR_JOB_PRIO
	prompt "Ticker's JOB IRQ priority"
	int
	range BT_CTLR_WORKER_PRIO 3 if SOC_SERIES_NRF51X
	range BT_CTLR_WORKER_PRIO 6 if SOC_SERIES_NRF52X
	default 0
	help
	  The interrupt priority for Ticker's Job (SWI4) IRQ. This value shall
	  be greater than or equal to the Ticker's Worker IRQ priority value.

config BT_CTLR_XTAL_ADVANCED
	bool "Advanced event preparation"
	default y
	help
	  Enables advanced event preparation offset ahead of radio tx/rx, taking
	  into account predictive processing time requirements in preparation to
	  the event, like control procedure handling and CPU execution speeds.
	  Crystal oscillator is retained between closely spaced consecutive
	  radio events to reduce the overall number of crystal settling current
	  consumptions.

	  This feature maximizes radio utilization in an average role event
	  timeslice when they are closely spaced by using a reduced offset
	  between preparation and radio event.

	  By disabling this feature, the controller will use a constant offset
	  between the preparation and radio event. The controller will toggle
	  crystal oscillator between two closely spaced radio events leading to
	  higher average current due to increased number of crystal settling
	  current consumptions.

config BT_CTLR_XTAL_THRESHOLD
	prompt "Crystal shutdown threshold in uS"
	depends on BT_CTLR_XTAL_ADVANCED
	int
	default 1500
	help
	  Configure the optimal delta in micro seconds between two consecutive
	  radio events, event done to next preparation, below which (active
	  clock) crystal will be retained. This value is board dependent.

config BT_CTLR_SCHED_ADVANCED
	bool "Advanced scheduling"
	depends on (BT_MAX_CONN != 0)
	default y
	default n if BT_PERIPHERAL && !BT_CENTRAL
	help
	  Enable non-overlapping placement of observer, initiator and master
	  roles in timespace. Uses window offset in connection updates and uses
	  connection parameter request in slave role to negotiate
	  non-overlapping placement with active master roles to avoid slave
	  roles drifting into active master roles in the local controller.

	  This feature maximizes the average data transmission amongst active
	  concurrent master and slave connections while other observer,
	  initiator, master or slave roles are active in the local controller.

	  Disabling this feature will lead to overlapping role in timespace
	  leading to skipped events amongst active roles.

config BT_CTLR_RADIO_ENABLE_FAST
	bool "Use tTXEN/RXEN,FAST ramp-up"
	depends on SOC_SERIES_NRF52X
	default y
	help
	  Enable use of fast radio ramp-up mode.

config BT_CTLR_TIFS_HW
	bool "H/w Accelerated tIFS Trx switching"
	depends on !BT_CTLR_RADIO_ENABLE_FAST
	default y
	help
	  Enable use of hardware accelerated tIFS Trx switching.

config BT_CTLR_SW_SWITCH_SINGLE_TIMER
	bool "Single TIMER tIFS Trx SW switching"
	depends on (!BT_CTLR_TIFS_HW) && SOC_SERIES_NRF52X
	help
	  Implement the tIFS Trx SW switch with the same TIMER
	  instance, as the one used for BLE event timing. Requires
	  SW switching be enabled. Using a single TIMER:
	  (+) frees up one TIMER instance
	  (+) removes jitter for HCTO implementation
	  (-) introduces drifting to the absolute time inside BLE
	  events, that increases linearly with the number of
	  packets exchanged in the event.

if BT_CONN

config BT_CTLR_FAST_ENC
	bool "Fast Encryption Setup"
	depends on BT_CTLR_LE_ENC
	help
	  Enable connection encryption setup in 3 connection intervals.
	  Peripheral will respond to Encryption Request with Encryption Response
	  in the same connection interval, and also, will respond with Start
	  Encryption Response PDU in the 3rd connection interval, hence
	  completing encryption setup in 3 connection intervals. Encrypted data
	  would be transmitted as fast as in 3rd connection interval from the
	  connection establishment.
	  Maximum CPU time in Radio ISR will increase if this feature is
	  selected.

config BT_CTLR_CONN_RSSI
	bool "Connection RSSI"
	help
	  Enable connection RSSI measurement.

endif # BT_CONN

config BT_CTLR_ADV_INDICATION
	bool "Advertisement indications"
	help
	  Generate events indicating on air advertisement events.

config BT_CTLR_SCAN_REQ_NOTIFY
	bool "Scan Request Notifications"
	help
	  Generate events notifying the on air scan requests received.

config BT_CTLR_SCAN_REQ_RSSI
	bool "Measure Scan Request RSSI"
	depends on BT_CTLR_SCAN_REQ_NOTIFY
	help
	  Measure RSSI of the on air scan requests received.

endmenu

comment "BLE Controller hardware configuration"

menuconfig BT_CTLR_GPIO_PA
	bool "Power Amplifier GPIO interface"
	depends on !SOC_SERIES_NRF51X
	help
	  Enable GPIO interface to a Power Amplifier. This allows hardware
	  designs using PA to let the Controller toggle their state based on
	  radio activity.

if BT_CTLR_GPIO_PA

config BT_CTLR_GPIO_PA_PIN
	prompt "Power Amplifier GPIO pin number"
	int
	help
	  GPIO Pin number connected to a Power Amplifier.

config BT_CTLR_GPIO_PA_POL_INV
	bool "Inverted polarity for the PA pin"
	help
	  Enable inverted polarity (active low) for the PA pin.

config BT_CTLR_GPIO_PA_OFFSET
	prompt "Time from PA ON to Tx ready"
	int
	default 5
	range 0 10
	help
	  Time before Tx ready to turn on PA.

endif # BT_CTLR_GPIO_PA

menuconfig BT_CTLR_GPIO_LNA
	bool "Low Noise Amplifier GPIO interface"
	depends on !SOC_SERIES_NRF51X
	help
	  Enable GPIO interface to a Low Noise Amplifier. This allows hardware
	  designs using LNAs to let the Controller toggle their state based on
	  radio activity.

if BT_CTLR_GPIO_LNA

config BT_CTLR_GPIO_LNA_PIN
	prompt "Low Noise Amplifier GPIO pin number"
	int
	help
	  GPIO Pin number connected to a Low Noise Amplifier.

config BT_CTLR_GPIO_LNA_POL_INV
	bool "Inverted polarity for the LNA pin"
	help
	  Enable inverted polarity (active low) for the LNA pin.

config BT_CTLR_GPIO_LNA_OFFSET
	prompt "Time from LNA ON to Rx ready"
	int
	default 5
	range 0 10
	help
	  Time before Rx ready to turn on LNA.

endif # BT_CTLR_GPIO_LNA

config BT_CTLR_PA_LNA_GPIOTE_CHAN
	# Hidden "nRF5 GPIO PA/LNA GPIOTE Channel"
	depends on SOC_FAMILY_NRF5 && (BT_CTLR_GPIO_PA || BT_CTLR_GPIO_LNA)
	int
	default 3
	help
	  Select the nRF5 GPIOTE channel to use for PA/LNA GPIO feature.

endif # BT_LL_SW

comment "BLE Controller debug configuration"

config BT_CTLR_ASSERT_HANDLER
	bool "Bluetooth Controller Assertion Handler"
	depends on BT_HCI_RAW
	help
	  This option enables an application-defined sink for the
	  controller assertion mechanism. This must be defined in
	  application code as void \"bt_controller_assert_handle(char \*, int)\"
	  and will be invoked whenever the controller code encounters
	  an unrecoverable error.

config BT_CTLR_PROFILE_ISR
	bool "Profile radio ISR"
	help
	  Turn on measurement of radio ISR latency, CPU usage and generation of
	  controller event with these profiling data. The controller event
	  contains current, minimum and maximum ISR entry latencies; and
	  current, minimum and maximum ISR CPU use in micro-seconds.

config BT_CTLR_DEBUG_PINS
	bool "Bluetooth Controller Debug Pins"
	depends on BOARD_NRF51_PCA10028 || BOARD_NRF52_PCA10040 || BOARD_NRF52840_PCA10056
	help
	  Turn on debug GPIO toggling for the BLE Controller. This is useful
	  when debugging with a logic analyzer or profiling certain sections of
	  the code.

endif # BT_CTLR
