# Kconfig - Bluetooth LE driver configuration options

#
# Copyright (c) 2015 Intel Corporation
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#

#
# Bluetooth options
#

if BLUETOOTH

menu "Bluetooth Drivers"

if BLUETOOTH_STACK_HCI

comment "Bluetooth HCI Driver Options"

config BLUETOOTH_UART
	bool
	default n

choice
	prompt "Bluetooth HCI driver"
	default BLUETOOTH_H4

config	BLUETOOTH_H4
	bool "H:4 UART"
	select SERIAL
	select UART_INTERRUPT_DRIVEN
	select BLUETOOTH_UART
	select BLUETOOTH_HOST_BUFFERS
	help
	  Bluetooth H:4 UART driver. Requires hardware flow control
	  lines to be available.

config BLUETOOTH_H5
	bool "H:5 UART [EXPERIMENTAL]"
	select SERIAL
	select UART_INTERRUPT_DRIVEN
	select BLUETOOTH_UART
	select BLUETOOTH_HOST_BUFFERS
	help
	  Bluetooth three-wire (H:5) UART driver. Implementation of HCI
	  Three-Wire UART Transport Layer.

config BLUETOOTH_NO_DRIVER
	bool "No default HCI driver"
	help
	  This is intended for unit tests where no internal driver
	  should be selected.

endchoice

config  BLUETOOTH_HOST_BUFFERS
	bool "Host managed incoming data buffers"
	default n
	help
	  Enable this to have the host stack manage incoming ACL data
	  and HCI event buffers. This makes sense for all HCI drivers
	  that talk to a controller running on a different CPU.

	  If the controller resides in the same address space it may
	  make sense to have the lower layers manage these buffers, in
	  which case this option can be left disabled.

config	BLUETOOTH_DEBUG_DRIVER
	bool "Bluetooth driver debug"
	depends on BLUETOOTH_DEBUG && BLUETOOTH_UART
	default n
	help
	  This option enables debug support for the chosen
	  Bluetooth HCI driver

config  BLUETOOTH_UART_ON_DEV_NAME
	string "Device Name of UART Device for Bluetooth"
	default "UART_0"
	depends on BLUETOOTH_UART
	help
	  This option specifies the name of UART device to be used
	  for Bluetooth.

# Headroom that the driver needs for sending and receiving buffers.
# Add a new 'default' entry for each new driver.

# Needed headroom for outgoing buffers (to controller)
config BLUETOOTH_HCI_SEND_RESERVE
	int
	# Even if no driver is selected the following default is still
	# needed e.g. for unit tests.
	default 0
	default 0 if BLUETOOTH_H4
	default 1 if BLUETOOTH_H5

# Needed headroom for incoming buffers (from controller)
config BLUETOOTH_HCI_RECV_RESERVE
	int
	# Even if no driver is selected the following default is still
	# needed e.g. for unit tests.
	default 0
	default 0 if BLUETOOTH_H4
	default 0 if BLUETOOTH_H5

endif # BLUETOOTH_STACK_HCI

source "drivers/bluetooth/nble/Kconfig"

config BLUETOOTH_NRF51_PM
	bool "nRF51 Power Management [EXPERIMENTAL]"
	depends on BLUETOOTH_H4 || NBLE
	help
	  Power Management support for Nordic BLE nRF51 chip. Allows to enable,
	  disable the chip and handle wakeups.

config BLUETOOTH_WAIT_NOP
	bool "Wait for \"NOP\" Command Complete event during init"
	help
	  Some controllers emit a Command Complete event for the NOP
	  opcode to indicate that they're ready to receive commands.
	  This option should be selected if the controller used
	  exhibits such behavior.

endmenu

endif # BLUETOOTH
