# Kconfig - NBLE configuration options

#
# Copyright (c) 2016 Intel Corporation
#
# SPDX-License-Identifier: Apache-2.0
#

config NBLE
	bool "Support for custom non-HCI nRF51 firmware [DEPRECATED]"
	select UART_INTERRUPT_DRIVEN
	select NANO_TIMEOUTS
	select NET_BUF
	depends on SERIAL
	help
	  Note: This feature is deprecated and will be removed in a
	  future Zephyr version.

	  Enables support for using Nordic Semiconductor nRF51 Bluetooth
	  LE chips with a custom firmware. The API for this is a subset of
	  the normal Bluetooth API (include/bluetooth/). This driver can
	  only be enabled if CONFIG_BLUETOOTH has not been enabled.

	  A fundamental assumption that the driver makes is that it is
	  run on an architecture with the same ABI (e.g. struct packing
	  & endianess) as the nRF51 chip. The driver cannot be used on
	  any architecture that doesn't fulfill this requirement.

if NBLE
config BLUETOOTH_PERIPHERAL
	bool
	default y

config BLUETOOTH_CENTRAL
	bool
	default y

config BLUETOOTH_ATT_PREPARE_COUNT
	int "Number of ATT prepare write buffers"
	default 2
	range 0 64
	help
	  Number of buffers available for ATT prepare write, setting
	  this to 0 disables GATT long/reliable writes.

config BLUETOOTH_GATT_CLIENT
	bool
	default y

config BLUETOOTH_SMP
	bool
	default y

config	BLUETOOTH_MAX_CONN
	int
	default 6

config	BLUETOOTH_MAX_PAIRED
	int
	default 7

config BLUETOOTH_RX_STACK_SIZE
	int "Size of the receiving thread stack"
	default 1024
	range 1024 65536
	help
	  Size of the receiving thread stack. This is the context from
	  which all event callbacks to the application occur. The
	  default value is sufficient for basic operation, but if the
	  application needs to do advanced things in its callbacks that
	  require extra stack space, this value can be increased to
	  accomodate for that.

config BLUETOOTH_DEVICE_NAME
	string "Bluetooth device name"
	default "Zephyr"
	help
	  Bluetooth device name. Name can be up to 248 bytes long (excluding
	  NULL termination). Can be empty string.

if BLUETOOTH_DEBUG

config	BLUETOOTH_DEBUG_HCI_DRIVER
	bool "Bluetooth driver debug"
	help
	  This option enables debug support for the chosen
	  Bluetooth UART driver to Nordic chip.

config BLUETOOTH_DEBUG_GATT
	bool "Bluetooth Generic Attribute Profile (GATT) debug"
	help
	  This option enables debug support for the Bluetooth
	  Generic Attribute Profile (GATT).

config NBLE_DEBUG_GAP
	bool "NBLE Generic Access Profile (GAP) debug"
	help
	  This option enables debug support for the Bluetooth
	  Generic Access Profile (GAP) in the interfaces to the
	  Nordic chip.

config NBLE_DEBUG_CONN
	bool "NBLE connection debug"
	help
	  This option enables debug support for Bluetooth
	  connections in the nble driver.

config NBLE_DEBUG_RPC
	bool "NBLE RPC debug"
	help
	  This option enables debug for RPC interface to the Nordic
	  Bluetooth LE chip.

endif # BLUETOOTH_DEBUG

config NBLE_UART_ON_DEV_NAME
	string "Device Name of UART Device for Nordic BLE"
	default "UART_0"
	depends on NBLE
	help
	  This option specifies the name of UART device to be used
	  for Nordic BLE.

endif
