# Bluetooth drivers configuration options

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

comment "Bluetooth HCI Driver Options"

config BT_UART
	bool

choice BT_HCI_BUS_TYPE
	prompt "Bluetooth HCI driver"

config BT_H4
	bool "H:4 UART"
	select UART_INTERRUPT_DRIVEN
	select BT_UART
	depends on SERIAL
	help
	  Bluetooth H:4 UART driver. Requires hardware flow control
	  lines to be available.

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

config BT_RPMSG
	bool "HCI using RPMsg"
	select BT_HAS_HCI_VS
	select IPC_SERVICE
	select MBOX
	help
	  Bluetooth HCI driver for communication with another CPU
	  using RPMsg framework.

config BT_SPI
	bool "SPI HCI"
	depends on SPI
	help
	  Supports Bluetooth ICs using SPI as the communication protocol.
	  HCI packets are sent and received as single Byte transfers,
	  prepended after a known header.  Headers may vary per device, so
	  additional platform specific knowledge may need to be added as
	  devices are.

config BT_STM32_IPM
	bool "IPM HCI"
	select USE_STM32_HAL_CORTEX
	select HAS_STM32LIB
	help
	  TODO

config BT_SILABS_HCI
	bool "Silicon Labs Bluetooth interface"
	depends on SOC_SERIES_EFR32BG22 || SOC_SERIES_EFR32MG24 || SOC_SERIES_EFR32BG27
	depends on !PM || SOC_GECKO_PM_BACKEND_PMGR
	select ENTROPY_GENERATOR
	select MBEDTLS
	select MBEDTLS_PSA_CRYPTO_C
	select MBEDTLS_ENTROPY_ENABLED
	select MBEDTLS_ZEPHYR_ENTROPY
	help
	  Use Silicon Labs binary Bluetooth library to connect to the
	  controller.

config BT_USERCHAN
	bool "HCI User Channel based driver"
	depends on BOARD_NATIVE_POSIX
	help
	  This driver provides access to the local Linux host's Bluetooth
	  adapter using a User Channel HCI socket to the Linux kernel. It
	  is only intended to be used with the native POSIX build of Zephyr.
	  The Bluetooth adapter must be powered off in order for Zephyr to
	  be able to use it.

config BT_ESP32
	bool "ESP32 HCI driver"
	help
	  Espressif HCI bluetooth interface

config BT_B91
	bool "Telink B91 HCI driver"
	help
	  Telink B91 HCI bluetooth interface

config BT_PSOC6_BLESS
	bool "PSOC6 BLESS driver"
	select BT_HCI_SETUP
	help
	  PSOC6 BLESS driver with BLE Controller which operates in
	  Single CPU mode.

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

endchoice

if BT_SPI

config BT_SPI_INIT_PRIORITY
	int "BT SPI init priority"
	default 75

config BT_BLUENRG_ACI
	bool "ACI message with with BlueNRG-based devices"
	help
	  Enable support for devices compatible with the BlueNRG Bluetooth
	  Stack. Current driver supports: ST BLUENRG-MS.

config BT_SPI_BLUENRG
	bool "Compatibility with BlueNRG-based devices"
	help
	  Enable support for devices compatible with the BlueNRG Bluetooth
	  Stack. Current driver supports: ST BLUENRG-MS.

endif # BT_SPI

config BT_STM32_IPM_RX_STACK_SIZE
	int "STM32 IPM stack size for RX thread"
	depends on BT_STM32_IPM
	default 512

menuconfig BT_CYW43XXX
	bool "CYW43XXX BT connectivity"
	default y
	select BT_HCI_SETUP
	depends on GPIO
	depends on DT_HAS_INFINEON_CYW43XXX_BT_HCI_ENABLED
	depends on BT_H4
	help
	  Infineon's AIROC™ Wi-Fi & combos portfolio integrates
	  IEEE 802.11a/b/g/n/ac/ax Wi-Fi and Bluetooth® 5.2 in a single-chip
	  solution to enable small-form-factor IoT designs.
source "drivers/bluetooth/hci/Kconfig.infineon"

config BT_DRIVER_QUIRK_NO_AUTO_DLE
	bool "Host auto-initiated Data Length Update quirk"
	depends on BT_AUTO_DATA_LEN_UPDATE
	default y if BT_RPMSG || BT_ESP32
	help
	  Enable the quirk wherein BT Host stack will auto-initiate Data Length
	  Update procedure for new connections for controllers that do not
	  auto-initiate the procedure if the default data length parameters are
	  not equal to the initial parameters.

	  This has to be enabled when the BLE controller connected is Zephyr
	  open source controller.

config BT_HCI_SETUP
	bool
	help
	  Enable the HCI vendor-specific Setup function.

	  This option has to be enabled when the BT Controller requires execution
	  of the vendor-specific commands sequence to initialize the BT Controller
	  before the BT Host executes a Reset sequence.

	  The user should generally avoid changing it via menuconfig or in
	  configuration files. This option are enabled by the vendor-specific
	  HCI extension, where the Setup function is implemented.

config BT_DRV_TX_STACK_SIZE
	int
	default 256
	help
	  Stack size for the HCI driver's TX thread.

config BT_DRV_RX_STACK_SIZE
	int
	default 512 if BT_SPI
	default BT_RX_STACK_SIZE if (BT_H4 || BT_HCI_RAW_H4)
	default BT_STM32_IPM_RX_STACK_SIZE if BT_STM32_IPM
	default 256
	help
	  Stack size for the HCI driver's RX thread.

config BT_SILABS_HCI_BUFFER_MEMORY
	int "Silicon Labs Bluetooth Library memory buffer size"
	depends on BT_SILABS_HCI
	default 6144
	help
	  Select the size of allocated memory buffer for the Silicon Labs
	  Bluetooth Library.
