# Bluetooth drivers configuration options

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

comment "Bluetooth HCI Driver Options"

config BT_UART
	bool
	select SERIAL
	select UART_INTERRUPT_DRIVEN


choice BT_HCI_BUS_TYPE
	prompt "Bluetooth HCI driver"

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

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

# Removed: Here only to give the user a warning about its removal
# Remove after 3.7.0 is released
config BT_RPMSG
	bool "[REMOVED] HCI using RPMsg"
	help
	  Use BT_HCI_IPC instead

config BT_HCI_IPC
	bool "HCI using the IPC subsystem"
	select BT_HAS_HCI_VS
	select IPC_SERVICE
	select MBOX
	help
	  Bluetooth HCI driver for communication with another CPU
	  using the IPC subsystem.

config BT_SPI
	bool "SPI HCI"
	select 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_STM32WBA
	bool "STM32WBA HCI driver"
	select HAS_STM32LIB
	help
	  ST STM32WBA HCI Bluetooth interface

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 SOC_GECKO_USE_RAIL
	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"
	select BT_HAS_HCI_VS
	help
	  This is intended for unit tests where no internal driver
	  should be selected.

config BT_AMBIQ_HCI
	bool "AMBIQ BT HCI driver"
	select SPI
	select GPIO
	select CLOCK_CONTROL
	select BT_HCI_SETUP
	help
	  Supports Ambiq Bluetooth SoC using SPI as the communication protocol.
	  HCI packets are sent and received as single Byte transfers.

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"
	select BT_HCI_SET_PUBLIC_ADDR
	help
	  Enable support for devices compatible with the BlueNRG Bluetooth
	  Stack. Current driver supports: ST BLUENRG-MS.

endif # BT_SPI

if BT_AMBIQ_HCI

config BT_HCI_INIT_PRIORITY
	int "BT HCI init priority"
	default 75
	help
	  The priority of BT HCI driver initialization needs to be lower than
	  the SPI, GPIO, clock controller drivers initialization priorities.

endif # BT_AMBIQ_HCI

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

menuconfig BT_AIROC
	bool "AIROC BT connectivity"
	default y
	select BT_HCI_SETUP
	select UART_USE_RUNTIME_CONFIGURE
	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_HCI_IPC || 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_SET_PUBLIC_ADDR
	bool
	select BT_HCI_SETUP
	help
	  Pass the controller's public address to the HCI driver in setup()

	  This option should be enabled by drivers for controllers that support setting the
	  public identity through vendor-specific commands. They can then implement the
	  setup() HCI driver API function and get the address to set from the public_addr field.

	  From the application side, the public address is set using the first call to
	  bt_id_create(), before calling bt_enable().

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 640 if (BT_SPI || BT_AMBIQ_HCI)
	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.
