# Kconfig - Bluetooth configuration options
#
# Copyright (c) 2016 Intel Corporation
#
# SPDX-License-Identifier: Apache-2.0
#

menu "Bluetooth"

config BT
	bool "Bluetooth support"
	select NET_BUF
	help
	  This option enables Bluetooth support.

if BT

module = BT
module-str = bt
source "subsys/logging/Kconfig.template.log_config"

choice
	prompt "Bluetooth Stack Selection"
	default BT_HCI
	help
	  Select the Bluetooth stack to compile.

config BT_HCI
	bool "HCI-based"
	help
	  HCI-based stack with optional host & controller parts and an
	  HCI driver in between.

config BT_CUSTOM
	bool "Custom"
	help
	  Select a custom, non-HCI based stack. If you're not sure what
	  this is, you probably want the HCI-based stack instead.

endchoice

# The Bluetooth subsystem requires the system workqueue to execute at
# a cooperative priority.
config SYSTEM_WORKQUEUE_PRIORITY
	range -256 -1

if BT_HCI

config BT_HCI_RAW
	bool "RAW HCI access"
	help
	  This option allows to access Bluetooth controller
	  from the application with the RAW HCI protocol.

config BT_PERIPHERAL
	bool "Peripheral Role support"
	select BT_BROADCASTER
	select BT_CONN
	default y if BT_HCI_RAW
	help
	  Select this for LE Peripheral role support.

config BT_CENTRAL
	bool "Central Role support"
	select BT_OBSERVER
	select BT_CONN
	default y if BT_HCI_RAW
	help
	  Select this for LE Central role support.

menu "Broadcaster"
	visible if !BT_PERIPHERAL

config BT_BROADCASTER
	bool "Broadcaster Role support"
	default y if !BT_OBSERVER
	help
	  Select this for LE Broadcaster role support.

endmenu

menu "Observer"
	visible if !BT_CENTRAL

config BT_OBSERVER
	bool "Observer Role support"
	help
	  Select this for LE Observer role support.

endmenu

config BT_PHY_UPDATE
	bool "PHY Update"
	default y
	help
	  Enable support for Bluetooth 5.0 PHY Update Procedure.

config BT_DATA_LEN_UPDATE
	bool "Data Length Update"
	default y
	help
	  Enable support for Bluetooth v4.2 LE Data Length Update procedure.

source "subsys/bluetooth/services/Kconfig"

config BT_CONN
	# Virtual/hidden option
	bool

config BT_MAX_CONN
	int "Maximum number of simultaneous connections"
	depends on BT_CONN
	range 1 64
	default 1
	help
	  Maximum number of simultaneous Bluetooth connections
	  supported.

if BT_CONN
config BT_HCI_ACL_FLOW_CONTROL
	bool "Controller to Host ACL flow control support"
	# Enable if building a Host-only build
	default y if !BT_CTLR
	# Enable if building a Controller-only build
	default y if BT_HCI_RAW
	select POLL
	help
	  Enable support for throttling ACL buffers from the controller
	  to the host. This is particularly useful when the host and
	  controller are on separate cores since it ensures that we do
	  not run out of incoming ACL buffers.
endif # BT_CONN

config BT_CTLR_TO_HOST_UART_DEV_NAME
	string "Device Name of UART Device to an external Bluetooth Host"
	default "UART_0"
	depends on BT_HCI_RAW
	help
	  This option specifies the name of UART device to be used
	  to connect to an external Bluetooth Host when Zephyr is
	  acting as a Bluetooth Controller.

source "subsys/bluetooth/common/Kconfig"
source "subsys/bluetooth/host/Kconfig"
source "subsys/bluetooth/controller/Kconfig"
source "subsys/bluetooth/shell/Kconfig"

endif # BT_HCI

endif # BT

endmenu
