# 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 "Use the software-based BLE Link Layer"
	help
	  Use Zephyr software BLE Link Layer implementation.

endchoice

comment "BLE Controller configuration"

config BT_CTLR_HCI_VS_EXT
	bool "Zephyr HCI Vendor-Specific Extensions"
	default y
	help
	  Enable support for the Zephyr HCI Vendor-Specific Extensions in the
	  Controller.

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 0xFFFF
	range 0x0000 0xFFFF
	help
	  Set the Company Id that will be used in VERSION_IND PDU.

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.

config BT_CTLR_RX_PRIO_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

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"
	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
	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
	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 5168
	help
	  Configure the optimal delta in micro seconds between two consecutive
	  radio events below which (active clock) crystal will be retained. This
	  value is board dependent. The value 5168 is based on crude calculation
	  for nRF51 current versus startup time of high frequency crystal.

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 if SOC_NRF52840
	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.

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 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"
	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. When enabled, pins P0.16 to P0.25 are taken over exclusively
	  by the controller and cannot be used outside of it.

endif # BT_CTLR
