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

comment "BLE Controller support"

config BLUETOOTH_CONTROLLER
	bool "Bluetooth Controller"
	select BLUETOOTH_RECV_IS_RX_THREAD
	help
	  Enables support for SoC native controller implementations.

if BLUETOOTH_CONTROLLER

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

config BLUETOOTH_LL_SW
	bool "Use the software-based BLE Link Layer"
	help
	  Use Zephyr software BLE Link Layer implementation.

endchoice

comment "BLE Controller configuration"

menu "Advertiser"
	visible if !BLUETOOTH_PERIPHERAL

config BLUETOOTH_CONTROLLER_STATE_ADV
	bool "Enable Advertiser"
	default y if BLUETOOTH_PERIPHERAL
	default y if !BLUETOOTH_CONTROLLER_STATE_SCAN
	help
	  Enable support for advertising state in the Controller.

endmenu

menu "Scanner"
	visible if !BLUETOOTH_CENTRAL

config BLUETOOTH_CONTROLLER_STATE_SCAN
	bool "Enable Scanner"
	default y if BLUETOOTH_CENTRAL
	help
	  Enable support for scanning state in the Controller.

endmenu

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

config BLUETOOTH_CONTROLLER_RX_BUFFERS
	prompt "Number of Rx buffers"
	int
	default 1
	default 6 if BLUETOOTH_HCI_RAW
	range 1 10
	help
	  Set the number of Rx PDUs to be buffered in the controller.

config BLUETOOTH_CONTROLLER_TX_BUFFERS
	prompt "Number of Tx buffers"
	int
	default 2
	default 7 if BLUETOOTH_HCI_RAW
	range 1 10
	help
	  Set the number of Tx PDUs to be queued for transmission
	  in the controller.

config BLUETOOTH_CONTROLLER_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 BLUETOOTH_CONTROLLER_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 BLUETOOTH_CONTROLLER_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 BLUETOOTH_CONTROLLER_RX_PRIO_STACK_SIZE
	int
	default 320

comment "BLE Controller features"

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

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

config BLUETOOTH_CONTROLLER_DATA_LENGTH_MAX
	prompt "Maximum data length supported"
	depends on BLUETOOTH_CONTROLLER_DATA_LENGTH
	int
	default 27
	range 27 251
	help
	  Set the maximum data length of PDU supported in the Controller.

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

config BLUETOOTH_CONTROLLER_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 BLUETOOTH_CONTROLLER_ADVANCED_FEATURES
	bool "Show advanced features"
	help
	  Makes advanced features visible to controller developers.

menu "Advanced features"
	visible if BLUETOOTH_CONTROLLER_ADVANCED_FEATURES

if BLUETOOTH_CONTROLLER_PHY

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

config BLUETOOTH_CONTROLLER_PHY_2M_NRF
	bool "2Mbps Nordic Semiconductor PHY Support (Open Text)"
	depends on SOC_SERIES_NRF51X
	select BLUETOOTH_CONTROLLER_PHY_2M
	help
	  Enable support for Nordic Semiconductor proprietary 2Mbps PHY in the
	  Controller. Encrypted connections are not supported.

config BLUETOOTH_CONTROLLER_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 # BLUETOOTH_CONTROLLER_PHY

config BLUETOOTH_CONTROLLER_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 BLUETOOTH_CONTROLLER_JOB_PRIO
	prompt "Ticker's JOB IRQ priority"
	int
	range BLUETOOTH_CONTROLLER_WORKER_PRIO 3 if SOC_SERIES_NRF51X
	range BLUETOOTH_CONTROLLER_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 BLUETOOTH_CONTROLLER_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 BLUETOOTH_CONTROLLER_XTAL_THRESHOLD
	prompt "Crystal shutdown threshold in uS"
	depends on BLUETOOTH_CONTROLLER_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 BLUETOOTH_CONTROLLER_SCHED_ADVANCED
	bool "Advanced scheduling"
	depends on (BLUETOOTH_MAX_CONN != 0)
	default y
	default n if BLUETOOTH_PERIPHERAL && !BLUETOOTH_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 BLUETOOTH_CONTROLLER_TIFS_HW
	bool "H/w Accelerated tIFS Trx switching"
	default y
	help
	  Enable use of hardware accelerated tIFS Trx switching.

config BLUETOOTH_CONTROLLER_FAST_ENC
	bool "Fast Encryption Setup"
	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 BLUETOOTH_CONTROLLER_CONN_RSSI
	bool "Connection RSSI"
	help
	  Enable connection RSSI measurement.

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

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

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

endmenu

comment "BLE Controller debug configuration"

config BLUETOOTH_CONTROLLER_ASSERT_HANDLER
	bool "Bluetooth Controller Assertion Handler"
	depends on BLUETOOTH_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 BLUETOOTH_CONTROLLER_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 BLUETOOTH_CONTROLLER_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 # BLUETOOTH_CONTROLLER
