# Kconfig - Bluetooth LE driver configuration options

#
# Copyright (c) 2015-2016 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
	select NANO_WORKQUEUE
	select SYSTEM_WORKQUEUE
	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
