fix(bt): fixed some h4 issues reported by ci pipeline

This commit is contained in:
ShenWeilong
2026-03-31 12:14:10 +08:00
parent 157fd120c5
commit 271ff9605a
48 changed files with 527 additions and 660 deletions
+1 -191
View File
@@ -1,191 +1 @@
choice
prompt "Bluetooth controller mode (BR/EDR/BLE/DUALMODE)"
help
Specify the bluetooth controller mode (BR/EDR, BLE or dual mode).
config BTDM_CTRL_MODE_BLE_ONLY
bool "BLE Only"
depends on SOC_BLE_SUPPORTED
config BTDM_CTRL_MODE_BR_EDR_ONLY
bool "BR/EDR Only"
depends on SOC_BT_CLASSIC_SUPPORTED
config BTDM_CTRL_MODE_BTDM
bool "Bluetooth Dual Mode"
depends on SOC_BLE_SUPPORTED && SOC_BT_CLASSIC_SUPPORTED
endchoice
choice BT_CTRL_PINNED_TO_CORE_CHOICE
prompt "The cpu core which bluetooth controller run"
depends on !FREERTOS_UNICORE
help
Specify the cpu core to run bluetooth controller.
Can not specify no-affinity.
config BT_CTRL_PINNED_TO_CORE_CHOICE_0
bool "Core 0 (PRO CPU)"
config BT_CTRL_PINNED_TO_CORE_CHOICE_1
bool "Core 1 (APP CPU)"
depends on !FREERTOS_UNICORE
endchoice
config BT_CTRL_PINNED_TO_CORE
int
default 0 if BT_CTRL_PINNED_TO_CORE_CHOICE_0
default 1 if BT_CTRL_PINNED_TO_CORE_CHOICE_1
default 0
config BT_CTRL_TASK_STACK_SIZE
int "Controller task stack size"
default 5120 if BLE_MESH
default 4096
help
This configures stack size of NimBLE controller task
config BT_CTRL_SLEEP_ENABLE
bool "Enable Bluetooth Controller sleep"
default n
help
Enable Bluetooth Controller sleep
menu "Bluetooth controller HCI"
config BT_CTRL_HCI_CMD_NUM
int "HCI CMD buffer number"
range 1 255
default 5
choice BT_CTRL_HCI_INTERFACE
prompt "HCI mode"
default BT_CTRL_HCI_INTERFACE_USE_RAM
config BT_CTRL_HCI_INTERFACE_USE_RAM
bool "VHCI"
help
Use RAM as HCI interface
config BT_CTRL_HCI_INTERFACE_USE_UART
bool "UART(H4)"
help
Use UART as HCI interface
endchoice
choice BT_CTRL_UART_HCI_MODE_CHOICE
prompt "UART HCI mode"
depends on BT_CTRL_HCI_INTERFACE_USE_UART
default BT_CTRL_UART_HCI_NO_DMA_MODE
help
Specify UART HCI mode: DMA or No DMA
config BT_CTRL_UART_HCI_DMA_MODE
bool "UHCI(UART with DMA)(EXPERIMENTAL)"
help
UART HCI Mode with DMA functionality.
config BT_CTRL_UART_HCI_NO_DMA_MODE
bool "UART(NO DMA)"
help
UART HCI Mode without DMA functionality.
endchoice
config BT_CTRL_HCI_UART_PORT
int "HCI UART port"
depends on BT_CTRL_HCI_INTERFACE_USE_UART
default 1
help
Set the port number of HCI UART
config BT_CTRL_HCI_UART_FLOWCTRL
bool "HCI uart Hardware Flow ctrl"
depends on BT_CTRL_HCI_INTERFACE_USE_UART
default n
config BT_CTRL_HCI_UART_TX_PIN
int "HCI uart Tx gpio"
depends on BT_CTRL_HCI_INTERFACE_USE_UART
default 19
config BT_CTRL_HCI_UART_RX_PIN
int "HCI uart Rx gpio"
depends on BT_CTRL_HCI_INTERFACE_USE_UART
default 10
config BT_CTRL_HCI_UART_RTS_PIN
int "HCI uart RTS gpio"
depends on BT_CTRL_HCI_UART_FLOWCTRL
default 4
config BT_CTRL_HCI_UART_CTS_PIN
int "HCI uart CTS gpio"
depends on BT_CTRL_HCI_UART_FLOWCTRL
default 5
config BT_CTRL_HCI_UART_BAUD
int "HCI uart baudrate"
depends on BT_CTRL_HCI_INTERFACE_USE_UART
default 921600
help
HCI uart baud rate 115200 ~ 1000000
choice BT_CTRL_HCI_UART_PARITY
prompt "select uart parity"
depends on BT_CTRL_HCI_INTERFACE_USE_UART
default BT_CTRL_HCI_UART_UART_PARITY_DISABLE
config BT_CTRL_HCI_UART_UART_PARITY_DISABLE
bool "PARITY_DISABLE"
help
UART_PARITY_DISABLE
config BT_CTRL_HCI_UART_UART_PARITY_EVEN
bool "PARITY_EVEN"
help
UART_PARITY_EVEN
config BT_CTRL_HCI_UART_UART_PARITY_ODD
bool "PARITY_ODD"
help
UART_PARITY_ODD
endchoice
config BT_CTRL_HCI_UART_RX_BUFFER_SIZE
int "The size of rx ring buffer memory"
depends on BT_CTRL_UART_HCI_NO_DMA_MODE
default 512
help
The size of rx ring buffer memory
config BT_CTRL_HCI_UART_TX_BUFFER_SIZE
int "The size of tx ring buffer memory"
depends on BT_CTRL_UART_HCI_NO_DMA_MODE
default 256
help
The size of tx ring buffer memory
config BT_CTRL_HCI_TRANS_TASK_STACK_SIZE
int "HCI transport task stack size"
depends on !BT_CTRL_HCI_INTERFACE_USE_RAM
default 1024
help
This configures stack size of hci transport task
config BT_CTRL_HCI_TRANS_RX_MEM_NUM
int "The amount of rx memory received at the same time"
depends on BT_CTRL_UART_HCI_DMA_MODE
default 3
help
The amount of rx memory received at the same time
config BT_CTRL_HCI_LLDESCS_POOL_NUM
int "The amount of lldecs memory for driver dma mode"
depends on BT_CTRL_UART_HCI_DMA_MODE
default 20
help
The amount of lldecs memory for driver dma mode
endmenu
menu "BLE Controller Settings"
depends on BTDM_CTRL_MODE_BLE_ONLY || BTDM_CTRL_MODE_BTDM
source "$IDF_PATH/components/bt/controller/$IDF_TARGET/Kconfig.ble.in"
endmenu
config BT_DUAL_MODE_ARCH
bool
default y
source "$IDF_PATH/components/bt/porting_btdm/Kconfig.in"
+7 -62
View File
@@ -500,14 +500,10 @@ static void IRAM_ATTR osi_assert_wrapper(const uint32_t ln, const char *fn,
static uint32_t IRAM_ATTR osi_random_wrapper(void)
{
static bool first = true;
//TODO: use esp_ramdom
// return esp_ramdom();
if (first) {
first = false;
srand(esp_random());
}
return rand();
return btdm_osal_rand();
}
static int esp_ecc_gen_key_pair(uint8_t *pub, uint8_t *priv)
@@ -534,12 +530,6 @@ static int esp_ecc_aes_cmac(const uint8_t *key, const uint8_t *in, size_t len, u
return ble_sm_ecc_aes_cmac(key, in, len, out);
}
static int ble_hci_unregistered_hook(void*, void*)
{
ESP_LOGD(NIMBLE_PORT_LOG_TAG,"%s ble hci rx_evt is not registered.",__func__);
return 0;
}
#if CONFIG_FREERTOS_USE_TICKLESS_IDLE
esp_err_t sleep_modem_ble_mac_modem_state_init(void)
{
@@ -766,6 +756,9 @@ esp_err_t esp_ble_controller_deinit(void)
r_ble_controller_deinit();
extern int esp_ble_unregister_bb_funcs(void);
esp_ble_unregister_bb_funcs();
#if CONFIG_BT_LE_CONTROLLER_LOG_ENABLED
esp_bt_controller_log_deinit();
#endif // CONFIG_BT_LE_CONTROLLER_LOG_ENABLED
@@ -782,52 +775,6 @@ esp_err_t esp_ble_controller_deinit(void)
return ESP_OK;
}
static
esp_err_t esp_ble_controller_enable(esp_bt_mode_t mode)
{
esp_err_t ret = ESP_OK;
// if (mode != ESP_BT_MODE_BLE) {
// ESP_LOGW(NIMBLE_PORT_LOG_TAG, "invalid controller mode");
// return ESP_FAIL;
// }
if (ble_controller_status != ESP_BT_CONTROLLER_STATUS_INITED) {
ESP_LOGW(NIMBLE_PORT_LOG_TAG, "invalid controller state");
return ESP_FAIL;
}
// esp_btbb_enable();
// #if CONFIG_SW_COEXIST_ENABLE
// coex_enable();
// #endif // CONFIG_SW_COEXIST_ENABLE
// ******************************* BTDM TODO *****************************************************
ret = ble_stack_enable();
printf("ble_stack_enable:%d\n", ret);
if (ret) {
goto error;
}
int btdm_task_enable(void);
ret = btdm_task_enable();
printf("btdm_task_enable:%d\n", ret);
if (ret) {
goto error;
}
// *************************************************************************************************
// if (ble_controller_enable(mode) != 0) {
// ret = ESP_FAIL;
// goto error;
// }
ble_controller_status = ESP_BT_CONTROLLER_STATUS_ENABLED;
return ESP_OK;
error:
return ret;
}
esp_err_t esp_ble_controller_disable(void)
{
if (ble_controller_status < ESP_BT_CONTROLLER_STATUS_ENABLED) {
@@ -1181,8 +1128,6 @@ exit:
return 0;
#endif // CONFIG_BT_NIMBLE_CRYPTO_STACK_MBEDTLS
// Calculation successful, return 0
return 0;
}
#endif // CONFIG_BT_NIMBLE_ENABLED
@@ -1611,7 +1556,7 @@ int ble_stack_enable(void)
#if CONFIG_BT_LE_ERROR_SIM_ENABLED
rc = conn_errorSim_enable();
if (rc) {
ESP_LOGW(conn_errorSim_enable, "conn_errorSim_enable failed %d", rc);
ESP_LOGW(NIMBLE_PORT_LOG_TAG, "conn_errorSim_enable failed %d", rc);
return rc;
}
#endif // CONFIG_BT_LE_ERROR_SIM_ENABLED
@@ -1,5 +1,5 @@
/*
* SPDX-FileCopyrightText: 2015-2025 Espressif Systems (Shanghai) CO LTD
* SPDX-FileCopyrightText: 2015-2026 Espressif Systems (Shanghai) CO LTD
*
* SPDX-License-Identifier: Apache-2.0
*/
@@ -13,14 +13,14 @@
extern "C" {
#endif
void *bt_osi_mem_malloc(size_t size);
void *nimble_mem_malloc(size_t size);
void *bt_osi_mem_calloc(size_t n, size_t size);
void *nimble_mem_calloc(size_t n, size_t size);
void bt_osi_mem_free(void *ptr);
void nimble_mem_free(void *ptr);
#if CONFIG_BT_LE_USED_MEM_STATISTICS_ENABLED
size_t bt_osi_mem_used_size_get(void);
size_t nimble_mem_used_size_get(void);
#endif // CONFIG_BT_LE_USED_MEM_STATISTICS_ENABLED
#if CONFIG_BT_NIMBLE_MEM_DEBUG
@@ -109,7 +109,7 @@ void *nimble_mem_dbg_realloc(void *ptr, size_t new_size, const char *func, int l
({ \
void *p; \
do { \
p = bt_osi_mem_malloc(size); \
p = nimble_mem_malloc(size); \
nimble_mem_dbg_record(p, size, __func__, __LINE__); \
} while (0); \
p; \
@@ -119,7 +119,7 @@ void *nimble_mem_dbg_realloc(void *ptr, size_t new_size, const char *func, int l
({ \
void *p; \
do { \
p = bt_osi_mem_calloc(count, size); \
p = nimble_mem_calloc(count, size); \
nimble_mem_dbg_record(p, (count) * (size), __func__, __LINE__); \
} while (0); \
p; \
@@ -135,18 +135,18 @@ void *nimble_mem_dbg_realloc(void *ptr, size_t new_size, const char *func, int l
})
#define nimble_platform_mem_free(ptr) \
do { \
void *tmp_ptr = (void *)(ptr); \
do { \
void *tmp_ptr = (void *)(ptr); \
nimble_mem_dbg_clean(tmp_ptr, __func__, __LINE__); \
bt_osi_mem_free(tmp_ptr); \
nimble_mem_free(tmp_ptr); \
} while (0)
#else
#define nimble_platform_mem_malloc bt_osi_mem_malloc
#define nimble_platform_mem_calloc bt_osi_mem_calloc
#define nimble_platform_mem_malloc nimble_mem_malloc
#define nimble_platform_mem_calloc nimble_mem_calloc
#define nimble_platform_mem_realloc realloc
#define nimble_platform_mem_free bt_osi_mem_free
#define nimble_platform_mem_free nimble_mem_free
#endif // CONFIG_BT_NIMBLE_MEM_DEBUG
@@ -1,5 +1,5 @@
/*
* SPDX-FileCopyrightText: 2015-2025 Espressif Systems (Shanghai) CO LTD
* SPDX-FileCopyrightText: 2015-2026 Espressif Systems (Shanghai) CO LTD
*
* SPDX-License-Identifier: Apache-2.0
*/
@@ -255,7 +255,7 @@ void *nimble_mem_dbg_realloc(void *ptr, size_t new_size, const char *func, int l
#if !CONFIG_BT_NIMBLE_LOW_SPEED_MODE
IRAM_ATTR
#endif
void *bt_osi_mem_malloc(size_t size)
void *nimble_mem_malloc(size_t size)
{
void *mem = NULL;
#ifdef CONFIG_BT_NIMBLE_MEM_ALLOC_MODE_INTERNAL
@@ -286,7 +286,7 @@ void *bt_osi_mem_malloc(size_t size)
#if !CONFIG_BT_NIMBLE_LOW_SPEED_MODE
IRAM_ATTR
#endif
void *bt_osi_mem_calloc(size_t n, size_t size)
void *nimble_mem_calloc(size_t n, size_t size)
{
void *mem = NULL;
#ifdef CONFIG_BT_NIMBLE_MEM_ALLOC_MODE_INTERNAL
@@ -309,7 +309,7 @@ void *bt_osi_mem_calloc(size_t n, size_t size)
#if !CONFIG_BT_NIMBLE_LOW_SPEED_MODE
IRAM_ATTR
#endif
void bt_osi_mem_free(void *ptr)
void nimble_mem_free(void *ptr)
{
#if CONFIG_BT_LE_USED_MEM_STATISTICS_ENABLED
if (ptr) {
@@ -325,7 +325,7 @@ void bt_osi_mem_free(void *ptr)
#if CONFIG_BT_LE_USED_MEM_STATISTICS_ENABLED
size_t
bt_osi_mem_used_size_get(void)
nimble_mem_used_size_get(void)
{
return host_mem_used_size;
}
@@ -333,7 +333,7 @@ bt_osi_mem_used_size_get(void)
#if CONFIG_BT_NIMBLE_ENABLED
uint32_t esp_host_used_heap_size_get(void)
{
return bt_osi_mem_used_size_get();
return nimble_mem_used_size_get();
}
#endif // CONFIG_BT_NIMBLE_ENABLED
#endif // CONFIG_BT_LE_USED_MEM_STATISTICS_ENABLED
+66 -150
View File
@@ -17,7 +17,6 @@
#include "btdm_user_cfg.h"
#if CONFIG_BTDM_CTRL_MODE_BLE_ONLY || CONFIG_BTDM_CTRL_MODE_BTDM
// #include "nimble/nimble_npl.h"
#include "ble_user_cfg.h"
#endif /* CONFIG_BTDM_CTRL_MODE_BLE_ONLY || CONFIG_BTDM_CTRL_MODE_BTDM */
@@ -29,57 +28,8 @@
extern "C" {
#endif
#define ESP_BT_HCI_TL_MAGIC_VALUE 0xfadebead
#define ESP_BT_HCI_TL_VERSION 0x00010000
/**
* @brief Bluetooth audio data transport path
*/
typedef enum {
ESP_SCO_DATA_PATH_HCI = 0, /*!< data over HCI transport */
ESP_SCO_DATA_PATH_PCM = 1, /*!< data over PCM interface */
} esp_sco_data_path_t;
/**
* @brief Type of controller HCI transport layer
*/
typedef enum {
ESP_BT_CTRL_HCI_TL_UART = 0, /*!< HCI UART h4 transport layer */
ESP_BT_CTRL_HCI_TL_VHCI = 1, /*!< VHCI interface */
} esp_bt_ctrl_hci_tl_t;
#define ESP_BT_HCI_TL_STATUS_OK (0) /*!< HCI_TL Tx/Rx operation status OK */
/**
* @brief callback function for HCI Transport Layer send/receive operations
*/
typedef void (* esp_bt_hci_tl_callback_t) (void *arg, uint8_t status);
#if CONFIG_BT_CTRL_HCI_MODE_CHOICE_VHCI
#define CFG_HCI_TL_TYPE 1
#else
#define CFG_HCI_TL_TYPE 0
#endif
/**
* @brief Controller HCI transport layer function structure
* This structure shall be registered when HCI transport layer is UART
*/
typedef struct {
uint32_t _magic; /* Magic number */
uint32_t _version; /* version number of the defined structure */
uint32_t _reserved; /* reserved for future use */
int (* _open)(void); /* hci tl open */
void (* _close)(void); /* hci tl close */
void (* _finish_transfers)(void); /* hci tl finish transfers */
void (* _recv)(uint8_t *buf, uint32_t len, esp_bt_hci_tl_callback_t callback, void* arg); /* hci tl recv */
void (* _send)(uint8_t *buf, uint32_t len, esp_bt_hci_tl_callback_t callback, void* arg); /* hci tl send */
bool (* _flow_off)(void); /* hci tl flow off */
void (* _flow_on)(void); /* hci tl flow on */
} esp_bt_hci_tl_t;
/**
* @brief Bluetooth mode for controller enable/disable
* @brief Bluetooth mode for controller enable/disable.
*/
typedef enum {
ESP_BT_MODE_IDLE = 0x00, /*!< Bluetooth is not running */
@@ -162,14 +112,6 @@ typedef enum {
ESP_BLE_ENHANCED_PWR_TYPE_MAX,
} esp_ble_enhanced_power_type_t;
/**
* @brief Address type and address value.
*/
typedef struct {
uint8_t type; /*!< Type of the Bluetooth address (public, random, etc.) */
uint8_t val[6]; /*!< Array containing the 6-byte Bluetooth address value */
} esp_ble_addr_t;
/**
* @brief Select buffers
*/
@@ -179,40 +121,13 @@ typedef enum {
} esp_ble_log_buf_t;
/**
* @brief Set BLE TX power
* Connection Tx power should only be set after connection created.
* @param power_type : The type of which tx power, could set Advertising/Connection/Default and etc
* @param power_level: Power level(index) corresponding to absolute value(dbm)
* @return ESP_OK - success, other - failed
* @brief Address type and address value.
*/
esp_err_t esp_ble_tx_power_set(esp_ble_power_type_t power_type, esp_power_level_t power_level);
typedef struct {
uint8_t type; /*!< Type of the Bluetooth address (public, random, etc.) */
uint8_t val[6]; /*!< Array containing the 6-byte Bluetooth address value */
} esp_ble_addr_t;
/**
* @brief Get BLE TX power
* Connection Tx power should only be get after connection created.
* @param power_type : The type of which tx power, could set Advertising/Connection/Default and etc
* @return >= 0 - Power level, < 0 - Invalid
*/
esp_power_level_t esp_ble_tx_power_get(esp_ble_power_type_t power_type);
/**
* @brief ENHANCED API for Setting BLE TX power
* Connection Tx power should only be set after connection created.
* @param power_type : The enhanced type of which tx power, could set Advertising/Connection/Default and etc
* @param handle : The handle of Advertising or Connection and the value 0 for other enhanced power types.
* @param power_level: Power level(index) corresponding to absolute value(dbm)
* @return ESP_OK - success, other - failed
*/
esp_err_t esp_ble_tx_power_set_enhanced(esp_ble_enhanced_power_type_t power_type, uint16_t handle, esp_power_level_t power_level);
/**
* @brief ENHANCED API of Getting BLE TX power
* Connection Tx power should only be get after connection created.
* @param power_type : The enhanced type of which tx power, could set Advertising/Connection/Default and etc
* @param handle : The handle of Advertising or Connection and the value 0 for other enhanced power types.
* @return >= 0 - Power level, < 0 - Invalid
*/
esp_power_level_t esp_ble_tx_power_get_enhanced(esp_ble_enhanced_power_type_t power_type, uint16_t handle);
#define BLE_CONFIG_VERSION 0x20241029
#define BLE_CONFIG_MAGIC 0x5A5AA5A5
@@ -223,17 +138,20 @@ esp_power_level_t esp_ble_tx_power_get_enhanced(esp_ble_enhanced_power_type_t po
/* Types definition
************************************************************************
*/
/**
* @brief BTDM controller common configuration options
*/
typedef struct {
uint32_t version;
uint32_t version; /*!< Version number of the defined structure */
uint16_t task_stack_size; /*!< Size of Bluetooth controller task stack */
uint8_t task_prio; /*!< Priority of the Bluetooth controller task */
uint8_t task_run_cpu; /*!< CPU number on which the Bluetooth controller task runs */
uint8_t hci_cmd_num; /*!< HCI command buffer number */
uint8_t hci_conn_num; /*!< HCI level connection number */
uint8_t sleep_en;
uint8_t version_num;
uint8_t sleep_en; /*!< Enable sleep functionality */
uint8_t version_num; /*!< Hardware version number of this chip */
uint8_t bluetooth_mode; /*!< Controller mode: BR/EDR, BLE or Dual Mode */
uint32_t magic;
uint32_t magic; /*!< Magic number for configuration validation */
}esp_btdm_controller_config_t;
/**
@@ -286,26 +204,26 @@ typedef struct {
uint8_t main_xtal_freq; /*!< Main crystal frequency */
uint8_t ignore_wl_for_direct_adv; /*!< Ignore the white list for directed advertising */
uint8_t enable_pcl; /*!< Enable power control */
uint8_t csa2_select;
uint8_t enable_csr;
int8_t backoff_rssi;
bool iso_enabled;
bool iso_bqb_test;
bool iso_fra_unseg;
bool iso_nsfc_en;
uint8_t iso_nsfc_num;
uint8_t iso_buf_count;
uint16_t iso_buf_size;
uint8_t iso_big_count;
uint16_t iso_bis_count;
uint8_t iso_bis_per_big;
uint8_t iso_cig_count;
uint16_t iso_cis_count;
uint8_t iso_cis_per_cig;
uint8_t csa2_select; /*!< Select CSA2 */
uint8_t enable_csr; /*!< Enable connection subrate */
int8_t backoff_rssi; /*!< Set the lowest rssi threshold for backoff */
bool iso_enabled; /*!< Enable ISO */
bool iso_bqb_test; /*!< Enable ISO BQB test */
bool iso_fra_unseg; /*!< Enable ISO FRA unsegmented */
bool iso_nsfc_en; /*!< Enable ISO NSCF */
uint8_t iso_nsfc_num; /*!< Number of ISO NSCF */
uint8_t iso_buf_count; /*!< Number of ISO buffer */
uint16_t iso_buf_size; /*!< Size of ISO buffer */
uint8_t iso_big_count; /*!< Number of ISO big */
uint16_t iso_bis_count; /*!< Number of ISO bis */
uint8_t iso_bis_per_big; /*!< Number of ISO bis per big */
uint8_t iso_cig_count; /*!< Number of ISO cig */
uint16_t iso_cis_count; /*!< Number of ISO cis */
uint8_t iso_cis_per_cig; /*!< Number of ISO cis per cig */
uint32_t config_magic; /*!< Configuration magic value */
} ble; /* Bluetooth LE controller configuration options */
} ble; /*!< Bluetooth LE controller configuration options */
esp_btdm_controller_config_t btdm; /*!< BTDM controller common configuration options */ /*!< BTDM controller common configuration options */
esp_btdm_controller_config_t btdm; /*!< BTDM controller common configuration options */
} esp_bt_controller_config_t;
#if defined(CONFIG_BTDM_CTRL_MODE_BLE_ONLY)
@@ -316,28 +234,6 @@ typedef struct {
#define BTDM_CONTROLLER_MODE_EFF ESP_BT_MODE_BTDM
#endif
#if defined(CONFIG_BT_CTRL_BR_EDR_TEST_MODE_EN)
#define BT_CTRL_BR_EDR_TEST_MODE_EN 1
#else
#define BT_CTRL_BR_EDR_TEST_MODE_EN 0
#endif
#ifndef CONFIG_BT_CTRL_BR_EDR_DTM_EN_EFF
#define CONFIG_BT_CTRL_BR_EDR_DTM_EN_EFF false
#endif
#if defined(CONFIG_BT_CTRL_BR_EDR_TX_CCA_ENABLED)
#define BT_CTRL_BR_EDR_TX_CCA_ENABLED (CONFIG_BT_CTRL_BR_EDR_TX_CCA_ENABLED)
#else
#define BT_CTRL_BR_EDR_TX_CCA_ENABLED (0)
#endif
#if defined(CONFIG_BT_CTRL_BR_EDR_CCA_RSSI_THRESH)
#define BT_CTRL_BR_EDR_CCA_RSSI_THRESH (CONFIG_BT_CTRL_BR_EDR_CCA_RSSI_THRESH)
#else
#define BT_CTRL_BR_EDR_CCA_RSSI_THRESH (50)
#endif
#if defined(CONFIG_BT_LE_ISO_SUPPORT)
#define DEFAULT_BT_LE_ISO_ENABLED 1
#if defined(CONFIG_BT_LE_ISO_FRA_UNSEG)
@@ -450,6 +346,41 @@ typedef struct {
}, \
}
/**
* @brief Set BLE TX power
* Connection Tx power should only be set after connection created.
* @param power_type : The type of which tx power, could set Advertising/Connection/Default and etc
* @param power_level: Power level(index) corresponding to absolute value(dbm)
* @return ESP_OK - success, other - failed
*/
esp_err_t esp_ble_tx_power_set(esp_ble_power_type_t power_type, esp_power_level_t power_level);
/**
* @brief Get BLE TX power
* Connection Tx power should only be get after connection created.
* @param power_type : The type of which tx power, could set Advertising/Connection/Default and etc
* @return >= 0 - Power level, < 0 - Invalid
*/
esp_power_level_t esp_ble_tx_power_get(esp_ble_power_type_t power_type);
/**
* @brief ENHANCED API for Setting BLE TX power
* Connection Tx power should only be set after connection created.
* @param power_type : The enhanced type of which tx power, could set Advertising/Connection/Default and etc
* @param handle : The handle of Advertising or Connection and the value 0 for other enhanced power types.
* @param power_level: Power level(index) corresponding to absolute value(dbm)
* @return ESP_OK - success, other - failed
*/
esp_err_t esp_ble_tx_power_set_enhanced(esp_ble_enhanced_power_type_t power_type, uint16_t handle, esp_power_level_t power_level);
/**
* @brief ENHANCED API of Getting BLE TX power
* Connection Tx power should only be get after connection created.
* @param power_type : The enhanced type of which tx power, could set Advertising/Connection/Default and etc
* @param handle : The handle of Advertising or Connection and the value 0 for other enhanced power types.
* @return >= 0 - Power level, < 0 - Invalid
*/
esp_power_level_t esp_ble_tx_power_get_enhanced(esp_ble_enhanced_power_type_t power_type, uint16_t handle);
/**
* @brief Initialize BT controller to allocate task and other resource.
@@ -466,14 +397,6 @@ esp_err_t esp_bt_controller_init(esp_bt_controller_config_t *cfg);
*/
esp_bt_controller_status_t esp_bt_controller_get_status(void);
/**
* @brief Get BLE TX power
* Connection Tx power should only be get after connection created.
* @param power_type : The type of which tx power, could set Advertising/Connection/Default and etc
* @return >= 0 - Power level, < 0 - Invalid
*/
esp_power_level_t esp_ble_tx_power_get(esp_ble_power_type_t power_type);
/**
* @brief De-initialize BT controller to free resource and delete task.
* You should stop advertising and scanning, as well as
@@ -502,13 +425,6 @@ esp_err_t esp_bt_controller_enable(esp_bt_mode_t mode);
*/
esp_err_t esp_bt_controller_disable(void);
/**
* @brief Get BT controller is initialised/de-initialised/enabled/disabled
* @return status value
*/
esp_bt_controller_status_t esp_bt_controller_get_status(void);
/** @brief esp_vhci_host_callback
* used for vhci call host function to notify what host need to do
*/
@@ -1,5 +1,5 @@
/*
* SPDX-FileCopyrightText: 2025 Espressif Systems (Shanghai) CO LTD
* SPDX-FileCopyrightText: 2026 Espressif Systems (Shanghai) CO LTD
*
* SPDX-License-Identifier: Apache-2.0
*/
@@ -11,6 +11,10 @@
#include "esp_heap_caps.h"
void *bt_osi_mem_malloc(size_t size);
void bt_osi_mem_free(void *ptr);
void *bt_osi_mem_malloc_internal(size_t size);
void *bt_osi_mem_calloc_internal(size_t n, size_t size);
+32 -1
View File
@@ -1,5 +1,5 @@
/*
* SPDX-FileCopyrightText: 2015-2025 Espressif Systems (Shanghai) CO LTD
* SPDX-FileCopyrightText: 2015-2026 Espressif Systems (Shanghai) CO LTD
*
* SPDX-License-Identifier: Apache-2.0
*/
@@ -77,6 +77,37 @@ bt_osi_mem_free_internal(void *ptr)
}
}
void *
bt_osi_mem_malloc(size_t size)
{
void *mem_ptr;
#if CONFIG_BT_LE_MEM_CHECK_ENABLED
if (mem_count_limit) {
if (curr_mem_count > mem_count_limit) {
return NULL;
}
curr_mem_count ++;
}
#endif // CONFIG_BT_LE_MEM_CHECK_ENABLED
mem_ptr = heap_caps_malloc(size, MALLOC_CAP_INTERNAL|MALLOC_CAP_8BIT);
#if CONFIG_BT_LE_USED_MEM_STATISTICS_ENABLED
if (mem_ptr) {
controller_mem_used_size += heap_caps_get_allocated_size(mem_ptr);
}
#endif // CONFIG_BT_LE_USED_MEM_STATISTICS_ENABLED
return mem_ptr;
}
void
bt_osi_mem_free(void *ptr)
{
bt_osi_mem_free_internal(ptr);
}
#if CONFIG_BT_LE_MEM_CHECK_ENABLED
void bt_osi_mem_count_limit_set(uint16_t count_limit)
{
+2
View File
@@ -513,9 +513,11 @@ os_memblock_get(struct os_mempool *mp)
// Should not happen
OS_ENTER_CRITICAL(sr);
mp->mp_num_free++;
#if MYNEWT_VAL(MP_BLOCK_REUSED)
if (mp->mp_flags & OS_MEMPOOL_F_REUSED) {
mp->mp_alloc_blocks--;
}
#endif
OS_EXIT_CRITICAL(sr);
}
} else if (block) {
+16 -15
View File
@@ -12,7 +12,6 @@
#include "mem_api.h"
#include "bt_osi_mem.h"
#include "esp_err.h"
#include "esp_nimble_mem.h"
#if CONFIG_BT_NIMBLE_ENABLED
#include "syscfg/syscfg.h"
@@ -122,11 +121,13 @@ ble_os_msys_ensure_ctx(void)
return 0;
}
os_msys_ctx = nimble_platform_mem_calloc(1, sizeof(*os_msys_ctx));
os_msys_ctx = bt_osi_mem_malloc(sizeof(*os_msys_ctx));
if(!os_msys_ctx) {
return -1;
}
memset(os_msys_ctx, 0, sizeof(*os_msys_ctx));
return 0;
}
#endif // !CONFIG_BT_LE_MSYS_INIT_IN_CONTROLLER && CONFIG_BT_NIMBLE_STATIC_TO_DYNAMIC
@@ -230,9 +231,9 @@ os_msys_buf_alloc(void)
#if CONFIG_BT_NIMBLE_STATIC_TO_DYNAMIC
#if OS_MSYS_1_BLOCK_COUNT > 0
if (!os_msys_ctx->init_1_data) {
os_msys_ctx->init_1_data = nimble_platform_mem_calloc(1, (sizeof(os_membuf_t) * SYSINIT_MSYS_1_MEMPOOL_SIZE));
os_msys_ctx->init_1_data = bt_osi_mem_malloc((sizeof(os_membuf_t) * SYSINIT_MSYS_1_MEMPOOL_SIZE));
if(!os_msys_ctx->init_1_data){
nimble_platform_mem_free(os_msys_ctx);
bt_osi_mem_free(os_msys_ctx);
os_msys_ctx = NULL;
return ESP_FAIL;
}
@@ -241,13 +242,13 @@ os_msys_buf_alloc(void)
#if OS_MSYS_2_BLOCK_COUNT > 0
if (!os_msys_ctx->init_2_data) {
os_msys_ctx->init_2_data = nimble_platform_mem_calloc(1, (sizeof(os_membuf_t) * SYSINIT_MSYS_2_MEMPOOL_SIZE));
os_msys_ctx->init_2_data = bt_osi_mem_malloc((sizeof(os_membuf_t) * SYSINIT_MSYS_2_MEMPOOL_SIZE));
if(!os_msys_ctx->init_2_data) {
#if OS_MSYS_1_BLOCK_COUNT > 0
nimble_platform_mem_free(os_msys_ctx->init_1_data);
bt_osi_mem_free(os_msys_ctx->init_1_data);
os_msys_ctx->init_1_data = NULL;
#endif
nimble_platform_mem_free(os_msys_ctx);
bt_osi_mem_free(os_msys_ctx);
os_msys_ctx = NULL;
return ESP_FAIL;
}
@@ -256,17 +257,17 @@ os_msys_buf_alloc(void)
#endif
#else
#if OS_MSYS_1_BLOCK_COUNT > 0
os_msys_init_1_data = (os_membuf_t *)nimble_platform_mem_calloc(1, (sizeof(os_membuf_t) * SYSINIT_MSYS_1_MEMPOOL_SIZE));
os_msys_init_1_data = (os_membuf_t *)bt_osi_mem_malloc((sizeof(os_membuf_t) * SYSINIT_MSYS_1_MEMPOOL_SIZE));
if (!os_msys_init_1_data) {
return ESP_ERR_NO_MEM;
}
#endif
#if OS_MSYS_2_BLOCK_COUNT > 0
os_msys_init_2_data = (os_membuf_t *)nimble_platform_mem_calloc(1, (sizeof(os_membuf_t) * SYSINIT_MSYS_2_MEMPOOL_SIZE));
os_msys_init_2_data = (os_membuf_t *)bt_osi_mem_malloc((sizeof(os_membuf_t) * SYSINIT_MSYS_2_MEMPOOL_SIZE));
if (!os_msys_init_2_data) {
#if OS_MSYS_1_BLOCK_COUNT > 0
nimble_platform_mem_free(os_msys_init_1_data);
bt_osi_mem_free(os_msys_init_1_data);
os_msys_init_1_data = NULL;
#endif
return ESP_ERR_NO_MEM;
@@ -284,32 +285,32 @@ os_msys_buf_free(void)
if (os_msys_ctx) {
#if OS_MSYS_1_BLOCK_COUNT > 0
if (os_msys_ctx->init_1_data) {
nimble_platform_mem_free(os_msys_ctx->init_1_data);
bt_osi_mem_free(os_msys_ctx->init_1_data);
os_msys_ctx->init_1_data = NULL;
}
os_mempool_unregister(&os_msys_ctx->init_1_mempool);
#endif
#if OS_MSYS_2_BLOCK_COUNT > 0
if (os_msys_ctx->init_2_data) {
nimble_platform_mem_free(os_msys_ctx->init_2_data);
bt_osi_mem_free(os_msys_ctx->init_2_data);
os_msys_ctx->init_2_data = NULL;
}
os_mempool_unregister(&os_msys_ctx->init_2_mempool);
#endif
nimble_platform_mem_free(os_msys_ctx);
bt_osi_mem_free(os_msys_ctx);
os_msys_ctx = NULL;
}
#else
#if OS_MSYS_1_BLOCK_COUNT > 0
nimble_platform_mem_free(os_msys_init_1_data);
bt_osi_mem_free(os_msys_init_1_data);
os_msys_init_1_data = NULL;
os_mempool_unregister(&os_msys_init_1_mempool);
#endif
#if OS_MSYS_2_BLOCK_COUNT > 0
nimble_platform_mem_free(os_msys_init_2_data);
bt_osi_mem_free(os_msys_init_2_data);
os_msys_init_2_data = NULL;
os_mempool_unregister(&os_msys_init_1_mempool);
#endif
@@ -1,5 +1,5 @@
/*
* SPDX-FileCopyrightText: 2015-2025 Espressif Systems (Shanghai) CO LTD
* SPDX-FileCopyrightText: 2015-2026 Espressif Systems (Shanghai) CO LTD
*
* SPDX-License-Identifier: Apache-2.0
*/
@@ -323,8 +323,7 @@ IRAM_ATTR npl_freertos_eventq_remove(struct ble_npl_eventq *evq,
portYIELD_FROM_ISR();
}
} else {
portMUX_TYPE ble_npl_mut = portMUX_INITIALIZER_UNLOCKED;
portENTER_CRITICAL(&ble_npl_mut);
portENTER_CRITICAL(&ble_port_mutex);
count = uxQueueMessagesWaiting(eventq->q);
for (i = 0; i < count; i++) {
@@ -339,7 +338,7 @@ IRAM_ATTR npl_freertos_eventq_remove(struct ble_npl_eventq *evq,
BLE_LL_ASSERT(ret == pdPASS);
}
portEXIT_CRITICAL(&ble_npl_mut);
portEXIT_CRITICAL(&ble_port_mutex);
}
event->queued = 0;
@@ -102,6 +102,7 @@ hci_driver_uart_rx_task(void *p)
xQueueReceive(s_hci_driver_uart_env.rx_event_queue, &uart_event, portMAX_DELAY);
data = s_hci_driver_uart_env.rx_data;
while (true) {
// TODO: read_len maybe -1, need to handle it
read_len = uart_read_bytes(port, data, CONFIG_BT_LE_HCI_RX_PROC_DATA_LEN, 0);
if (read_len == 0) {
break;
+50
View File
@@ -0,0 +1,50 @@
source "$IDF_PATH/components/bt/porting_btdm/controller/btdm_common/Kconfig.in"
choice BT_CTRL_PINNED_TO_CORE_CHOICE
prompt "The cpu core which bluetooth controller run"
depends on !FREERTOS_UNICORE
help
Specify the cpu core to run bluetooth controller.
Can not specify no-affinity.
config BT_CTRL_PINNED_TO_CORE_CHOICE_0
bool "Core 0 (PRO CPU)"
config BT_CTRL_PINNED_TO_CORE_CHOICE_1
bool "Core 1 (APP CPU)"
depends on !FREERTOS_UNICORE
endchoice
config BT_CTRL_PINNED_TO_CORE
int
default 0 if BT_CTRL_PINNED_TO_CORE_CHOICE_0
default 1 if BT_CTRL_PINNED_TO_CORE_CHOICE_1
default 0
config BT_CTRL_TASK_STACK_SIZE
int "Controller task stack size"
default 5120 if BLE_MESH
default 4096
help
This configures stack size of NimBLE controller task
config BT_CTRL_SLEEP_ENABLE
bool "Enable Bluetooth Controller sleep"
default n
help
Enable Bluetooth Controller sleep
config BT_DUAL_MODE_ARCH
bool
default y
source "$IDF_PATH/components/bt/porting_btdm/transport/Kconfig.in"
menu "BLE Controller Options"
depends on SOC_BLE_SUPPORTED
source "$IDF_PATH/components/bt/porting_btdm/controller/ble/Kconfig.in"
endmenu
menu "BREDR Controller Options"
depends on SOC_BT_CLASSIC_SUPPORTED
source "$IDF_PATH/components/bt/porting_btdm/controller/bredr/Kconfig.in"
endmenu
@@ -93,6 +93,30 @@ config BT_LE_POWER_CONTROL_ENABLED
help
Set this option to enable the Power Control feature on controller
config BT_LE_SUBRATE_ENABLED
bool "Enable BLE connection subrating"
depends on BT_LE_50_FEATURE_SUPPORT && SOC_BLE_SUBRATE_SUPPORTED
default n
help
Set this option to enable the Connection Subrating feature on controller
config BT_LE_CTE_FEATURE_ENABLED
bool "Enable Bluetooth LE Direction Finding (AoA/AoD)"
depends on BT_LE_50_FEATURE_SUPPORT && SOC_BLE_CTE_SUPPORTED
default n
help
Enable this option to activate Bluetooth LE Direction Finding (AoA/AoD) feature.
Note:
This feature allows devices to determine the direction of a Bluetooth CTE signal,
enabling Angle of Arrival (AoA) and Angle of Departure (AoD) functionality.
config BT_LE_PERIODIC_ADV_WITH_RESPONSE_ENABLED
bool "Enable BLE periodic advertising with response"
depends on BT_LE_50_FEATURE_SUPPORT && SOC_BLE_PERIODIC_ADV_WITH_RESPONSE
default n
help
This enables BLE periodic advertising with response feature
menuconfig BT_LE_ISO_SUPPORT
bool "Enable BLE ISO feature"
default n
@@ -733,7 +757,3 @@ config BT_LE_DFT_TX_POWER_LEVEL_DBM_EFF
default 18 if BT_LE_DFT_TX_POWER_LEVEL_P18
default 20 if BT_LE_DFT_TX_POWER_LEVEL_P20
default 0
config BT_LE_ERROR_SIM_ENABLED
bool "Enable controller features for internal testing"
default n
@@ -34,8 +34,10 @@
#define _OS_MEMPOOL_H_
#include <stdbool.h>
#include "os/os.h"
#include "os/os_error.h"
#include "os/queue.h"
#include "btdm_mempool.h"
#ifdef __cplusplus
extern "C" {
@@ -76,10 +78,11 @@ struct os_mempool {
SLIST_HEAD(,os_memblock);
/** Name for memory block */
const char *name;
/** The number of allocated blocks. */
uint32_t mp_alloc_blocks;
};
static_assert(sizeof(struct os_mempool) == sizeof(struct btdm_mempool),
"Error: size of os_mempool");
/**
* Indicates an extended mempool. Address can be safely cast to
* (struct os_mempool_ext *).
@@ -0,0 +1,17 @@
choice BTDM_CTRL_MODE
prompt "Bluetooth Controller Mode (BLE/BREDR/DualMode)"
help
Specify the bluetooth controller mode (BR/EDR, BLE or dual mode).
config BTDM_CTRL_MODE_BLE_ONLY
bool "BLE Only"
depends on SOC_BLE_SUPPORTED
config BTDM_CTRL_MODE_BR_EDR_ONLY
bool "BR/EDR Only"
depends on SOC_BT_CLASSIC_SUPPORTED
config BTDM_CTRL_MODE_BTDM
bool "Bluetooth Dual Mode"
depends on SOC_BLE_SUPPORTED && SOC_BT_CLASSIC_SUPPORTED
endchoice
@@ -190,7 +190,7 @@ btdm_lp_wake_up_cb(void *arg)
s_bt_active = true;
}
#ifdef CONFIG_FREERTOS_USE_TICKLESS_IDLE
#if UC_BT_CTRL_SLEEP_ENABLE && CONFIG_FREERTOS_USE_TICKLESS_IDLE
static esp_err_t
btdm_lp_modem_retention_create(void)
{
@@ -204,10 +204,12 @@ btdm_lp_modem_retention_create(void)
}
#if UC_BT_CTRL_BR_EDR_IS_ENABLE
// TODO: check the return value
sleep_modem_bredr_mac_modem_state_init();
#endif // UC_BT_CTRL_BR_EDR_IS_ENABLE
#if UC_BT_CTRL_BLE_IS_ENABLE
// TODO: check the return value
sleep_modem_ble_mac_modem_state_init();
#endif // UC_BT_CTRL_BLE_IS_ENABLE
return err;
@@ -235,7 +237,7 @@ btdm_lp_modem_state_deinit(void)
assert(err == ESP_OK);
}
}
#endif // CONFIG_FREERTOS_USE_TICKLESS_IDLE
#endif // UC_BT_CTRL_SLEEP_ENABLE && CONFIG_FREERTOS_USE_TICKLESS_IDLE
/*
***************************************************************************************************
@@ -250,7 +252,7 @@ btdm_lp_enable_clock(esp_btdm_controller_config_t *cfg)
modem_clock_module_mac_reset(PERIPH_BT_MODULE);
// TODO: set the clock ion modem_clock_module_enable
REG_WRITE(MODEM_SYSCON_CLK_CONF_POWER_ST_REG, 0XFFFFFFFF);
// btdm_lp_timer_clk_init(cfg);
btdm_lp_timer_clk_init(cfg);
}
void
@@ -333,6 +335,9 @@ btdm_lp_reset(bool enable_stage)
#endif // CONFIG_PM_ENABLE
esp_phy_enable(PHY_MODEM_BT);
// TODO: Need to be deleted.
void phy_set_rfpll_xpd(bool en);
phy_set_rfpll_xpd(0);
esp_btbb_enable();
s_bt_active = true;
} else {
@@ -1,11 +1,12 @@
/*
* SPDX-FileCopyrightText: 2015-2025 Espressif Systems (Shanghai) CO LTD
* SPDX-FileCopyrightText: 2015-2026 Espressif Systems (Shanghai) CO LTD
*
* SPDX-License-Identifier: Apache-2.0
*/
#include <assert.h>
#include <stddef.h>
#include <stdint.h>
#include <string.h>
#include "btdm_osal_freertos.h"
#include "btdm_mempool.h"
@@ -258,8 +259,10 @@ wr_btdm_osal_eventq_remove(struct btdm_osal_eventq *evq, struct btdm_osal_event
portYIELD_FROM_ISR();
}
} else {
portMUX_TYPE btdm_osal_mut = portMUX_INITIALIZER_UNLOCKED;
portENTER_CRITICAL(&btdm_osal_mut);
/* RISK: For multi-core, this mutex can't protect the queue from being changed by other cores
* with wr_btdm_osal_eventq_put(). The count maybe less than the actual.
*/
portENTER_CRITICAL(&s_btsm_osal_intr_mutex);
count = uxQueueMessagesWaiting(eventq->q);
for (i = 0; i < count; i++) {
@@ -274,7 +277,7 @@ wr_btdm_osal_eventq_remove(struct btdm_osal_eventq *evq, struct btdm_osal_event
BTDM_OSAL_ASSERT(ret == pdPASS);
}
portEXIT_CRITICAL(&btdm_osal_mut);
portEXIT_CRITICAL(&s_btsm_osal_intr_mutex);
}
event->queued = 0;
@@ -1152,6 +1155,10 @@ wr_btdm_osal_mmgmt_block_malloc(uint32_t size)
// TODO: Only ble controller uses this function
addr = btdm_osal_malloc(size + 4, BTDM_OSAL_MALLOC_F_INTERNAL);
if (!addr) {
return NULL;
}
*addr = (5 << 29) | ((size + 4) >> 2);
return (void *)((uint32_t)addr + 4);
@@ -1201,133 +1208,24 @@ wr_btdm_osal_srand(uint32_t seed)
int
wr_btdm_osal_rand(void)
{
// TODO: use esp_random
// return (int)esp_random();
static bool first = true;
if (first) {
uint8_t mac[6];
uint32_t seed;
first = false;
btdm_osal_read_efuse_mac(mac);
seed = (mac[2] << 24) | (mac[3] << 16) | (mac[4] << 8) | mac[5];
srand(seed);
}
return rand();
}
/*
***************************************************************************************************
* BTDM OSAL ISO Mutex (TODO: should be deleted)
***************************************************************************************************
*/
btdm_osal_error_t
wr_btdm_osal_iso_mutex_init(struct btdm_osal_mutex *mu)
{
struct btdm_osal_mutex_freertos *mutex;
#if BTDM_MEMPOOL_ALLOC
if (!btdm_memblock_from(&s_btdm_osal_mutex_pool, mu->mutex)) {
mu->mutex = btdm_memblock_get(&s_btdm_osal_mutex_pool);
mutex = (struct btdm_osal_mutex_freertos *)mu->mutex;
if (!mutex) {
return BTDM_OSAL_INVALID_PARM;
}
memset(mutex, 0, sizeof(*mutex));
mutex->handle = xSemaphoreCreateMutex();
BTDM_OSAL_ASSERT(mutex->handle);
}
#else
if (!mu->mutex) {
mu->mutex = malloc(sizeof(struct btdm_osal_mutex_freertos));
mutex = (struct btdm_osal_mutex_freertos *)mu->mutex;
if (!mutex) {
return BTDM_OSAL_INVALID_PARM;
}
memset(mutex, 0, sizeof(*mutex));
mutex->handle = xSemaphoreCreateMutex();
BTDM_OSAL_ASSERT(mutex->handle);
}
#endif
return BTDM_OSAL_OK;
}
btdm_osal_error_t
wr_btdm_osal_iso_mutex_deinit(struct btdm_osal_mutex *mu)
{
struct btdm_osal_mutex_freertos *mutex;
BTDM_OSAL_ASSERT(mu);
mutex = (struct btdm_osal_mutex_freertos *)mu->mutex;
if (!mutex) {
return BTDM_OSAL_INVALID_PARM;
}
BTDM_OSAL_ASSERT(mutex->handle);
vSemaphoreDelete(mutex->handle);
#if BTDM_MEMPOOL_ALLOC
btdm_memblock_put(&s_btdm_osal_mutex_pool, mutex);
#else
free((void *)mutex);
#endif
mu->mutex = NULL;
return BTDM_OSAL_OK;
}
btdm_osal_error_t IRAM_ATTR
wr_btdm_osal_iso_mutex_pend(struct btdm_osal_mutex *mu, btdm_osal_time_t timeout)
{
struct btdm_osal_mutex_freertos *mutex;
BaseType_t woken;
BaseType_t ret;
mutex = (struct btdm_osal_mutex_freertos *)mu->mutex;
if (!mutex) {
return BTDM_OSAL_INVALID_PARM;
}
BTDM_OSAL_ASSERT(mutex->handle);
if (in_isr()) {
(void)timeout;
ret = xSemaphoreTakeFromISR(mutex->handle, &woken);
if (woken == pdTRUE) {
portYIELD_FROM_ISR();
}
} else {
ret = xSemaphoreTake(mutex->handle, timeout);
}
return ret == pdPASS ? BTDM_OSAL_OK : BTDM_OSAL_TIMEOUT;
}
btdm_osal_error_t IRAM_ATTR
wr_btdm_osal_iso_mutex_release(struct btdm_osal_mutex *mu)
{
struct btdm_osal_mutex_freertos *mutex;
BaseType_t woken;
BaseType_t ret;
BTDM_OSAL_ASSERT(mu);
mutex = (struct btdm_osal_mutex_freertos *)mu->mutex;
if (!mutex) {
return BTDM_OSAL_INVALID_PARM;
}
BTDM_OSAL_ASSERT(mutex->handle);
if (in_isr()) {
ret = xSemaphoreGiveFromISR(mutex->handle, &woken);
if (woken == pdTRUE) {
portYIELD_FROM_ISR();
}
} else {
ret = xSemaphoreGive(mutex->handle);
}
BTDM_OSAL_ASSERT(ret == pdPASS);
return BTDM_OSAL_OK;
}
/*
***************************************************************************************************
* BTDM OSAL Initialization
@@ -1397,9 +1295,9 @@ btdm_osal_elem_mempool_init(btdm_osal_elem_num_t *elem_num)
if (!s_btdm_osal_sem_buf) {
return -7;
}
rc =
btdm_mempool_init(&s_btdm_osal_sem_pool, elem_num->sem_count, sizeof(struct btdm_osal_sem_freertos),
s_btdm_osal_sem_buf, "s_btdm_osal_sem_pool");
rc = btdm_mempool_init(&s_btdm_osal_sem_pool, elem_num->sem_count,
sizeof(struct btdm_osal_sem_freertos),
s_btdm_osal_sem_buf, "s_btdm_osal_sem_pool");
if (rc) {
return -8;
}
@@ -0,0 +1,131 @@
menu "Bluetooth controller HCI"
config BT_CTRL_HCI_CMD_NUM
int "HCI CMD buffer number"
range 1 255
default 5
choice BT_CTRL_HCI_INTERFACE
prompt "HCI mode"
default BT_CTRL_HCI_INTERFACE_USE_RAM
config BT_CTRL_HCI_INTERFACE_USE_RAM
bool "VHCI"
help
Use RAM as HCI interface
config BT_CTRL_HCI_INTERFACE_USE_UART
bool "UART(H4)"
help
Use UART as HCI interface
endchoice
choice BT_CTRL_UART_HCI_MODE_CHOICE
prompt "UART HCI mode"
depends on BT_CTRL_HCI_INTERFACE_USE_UART
default BT_CTRL_UART_HCI_NO_DMA_MODE
help
Specify UART HCI mode: DMA or No DMA
config BT_CTRL_UART_HCI_DMA_MODE
bool "UHCI(UART with DMA)(EXPERIMENTAL)"
help
UART HCI Mode with DMA functionality.
config BT_CTRL_UART_HCI_NO_DMA_MODE
bool "UART(NO DMA)"
help
UART HCI Mode without DMA functionality.
endchoice
config BT_CTRL_HCI_UART_PORT
int "HCI UART port"
depends on BT_CTRL_HCI_INTERFACE_USE_UART
default 1
help
Set the port number of HCI UART
config BT_CTRL_HCI_UART_FLOWCTRL
bool "HCI uart Hardware Flow ctrl"
depends on BT_CTRL_HCI_INTERFACE_USE_UART
default n
config BT_CTRL_HCI_UART_TX_PIN
int "HCI uart Tx gpio"
depends on BT_CTRL_HCI_INTERFACE_USE_UART
default 19
config BT_CTRL_HCI_UART_RX_PIN
int "HCI uart Rx gpio"
depends on BT_CTRL_HCI_INTERFACE_USE_UART
default 10
config BT_CTRL_HCI_UART_RTS_PIN
int "HCI uart RTS gpio"
depends on BT_CTRL_HCI_UART_FLOWCTRL
default 4
config BT_CTRL_HCI_UART_CTS_PIN
int "HCI uart CTS gpio"
depends on BT_CTRL_HCI_UART_FLOWCTRL
default 5
config BT_CTRL_HCI_UART_BAUD
int "HCI uart baudrate"
depends on BT_CTRL_HCI_INTERFACE_USE_UART
default 921600
help
HCI uart baud rate 115200 ~ 1000000
choice BT_CTRL_HCI_UART_PARITY
prompt "select uart parity"
depends on BT_CTRL_HCI_INTERFACE_USE_UART
default BT_CTRL_HCI_UART_UART_PARITY_DISABLE
config BT_CTRL_HCI_UART_UART_PARITY_DISABLE
bool "PARITY_DISABLE"
help
UART_PARITY_DISABLE
config BT_CTRL_HCI_UART_UART_PARITY_EVEN
bool "PARITY_EVEN"
help
UART_PARITY_EVEN
config BT_CTRL_HCI_UART_UART_PARITY_ODD
bool "PARITY_ODD"
help
UART_PARITY_ODD
endchoice
config BT_CTRL_HCI_UART_RX_BUFFER_SIZE
int "The size of rx ring buffer memory"
depends on BT_CTRL_UART_HCI_NO_DMA_MODE
default 512
help
The size of rx ring buffer memory
config BT_CTRL_HCI_UART_TX_BUFFER_SIZE
int "The size of tx ring buffer memory"
depends on BT_CTRL_UART_HCI_NO_DMA_MODE
default 256
help
The size of tx ring buffer memory
config BT_CTRL_HCI_TRANS_TASK_STACK_SIZE
int "HCI transport task stack size"
depends on !BT_CTRL_HCI_INTERFACE_USE_RAM
default 1024
help
This configures stack size of hci transport task
config BT_CTRL_HCI_TRANS_RX_MEM_NUM
int "The amount of rx memory received at the same time"
depends on BT_CTRL_UART_HCI_DMA_MODE
default 3
help
The amount of rx memory received at the same time
config BT_CTRL_HCI_LLDESCS_POOL_NUM
int "The amount of lldecs memory for driver dma mode"
depends on BT_CTRL_UART_HCI_DMA_MODE
default 20
help
The amount of lldecs memory for driver dma mode
endmenu
@@ -56,7 +56,6 @@ hci_h4_frame_start(struct hci_h4_sm *rxs, uint8_t pkt_type)
switch (rxs->pkt_type) {
case HCI_H4_CMD:
case HCI_H4_SYNC:
rxs->min_len = 3;
break;
case HCI_H4_ACL:
@@ -130,20 +129,20 @@ hci_h4_sm_w4_header(struct hci_h4_sm *h4sm, struct hci_h4_input_buffer *ib)
conn_handle = btdm_get_le16(&h4sm->hdr[0]) & HCI_INTERNAL_CONN_MASK;
#if UC_BT_CTRL_BLE_IS_ENABLE
if (HCI_INTERNAL_CONN_IS_BLE(conn_handle)) {
assert(h4sm->allocs && h4sm->allocs->acl);
h4sm->om = h4sm->allocs->acl();
if (!h4sm->om) {
return -1;
}
ble_mbuf_append(h4sm->om, h4sm->hdr, h4sm->len);
if (ble_mbuf_append(h4sm->om, h4sm->hdr, h4sm->len)) {
return -1;
}
h4sm->exp_len = btdm_get_le16(&h4sm->hdr[2]) + 4;
break;
}
#endif // UC_BT_CTRL_BLE_IS_ENABLE
#if UC_BT_CTRL_BR_EDR_IS_ENABLE
if (HCI_INTERNAL_CONN_IS_BREDR(conn_handle)) {
assert(h4sm->allocs && h4sm->allocs->bredr_acl);
h4sm->exp_len = btdm_get_le16(&h4sm->hdr[2]) + 4;
h4sm->pkt = h4sm->allocs->bredr_acl(conn_handle);
if (!h4sm->pkt) {
@@ -152,9 +151,9 @@ hci_h4_sm_w4_header(struct hci_h4_sm *h4sm, struct hci_h4_input_buffer *ib)
memcpy(h4sm->pkt->data, h4sm->hdr, h4sm->len);
break;
}
return -1;
case HCI_H4_SYNC:
conn_handle = btdm_get_le16(&h4sm->hdr[0]) & HCI_INTERNAL_CONN_MASK;
assert(h4sm->allocs && h4sm->allocs->sync);
h4sm->exp_len = h4sm->hdr[2] + 3;
h4sm->pkt = h4sm->allocs->sync(conn_handle);
if (!h4sm->pkt) {
@@ -198,7 +197,6 @@ hci_h4_sm_w4_header(struct hci_h4_sm *h4sm, struct hci_h4_input_buffer *ib)
#endif // !CONFIG_BT_CONTROLLER_ENABLED
#if CONFIG_BT_LE_ISO_SUPPORT
case HCI_H4_ISO:
assert(h4sm->allocs && h4sm->allocs->iso);
h4sm->exp_len = (btdm_get_le16(&h4sm->hdr[2]) & 0x7fff) + 4;
h4sm->buf = h4sm->allocs->iso(h4sm->exp_len);
if (!h4sm->buf) {
@@ -209,8 +207,7 @@ hci_h4_sm_w4_header(struct hci_h4_sm *h4sm, struct hci_h4_input_buffer *ib)
break;
#endif // CONFIG_BT_LE_ISO_SUPPORT
default:
assert(0);
break;
return -2;
}
return 0;
@@ -223,23 +220,21 @@ hci_h4_sm_w4_payload(struct hci_h4_sm *h4sm,
uint16_t len;
len = min(ib->len, h4sm->exp_len - h4sm->len);
switch (h4sm->pkt_type) {
case HCI_H4_CMD:
case HCI_H4_SYNC:
if (h4sm->pkt) {
memcpy(&h4sm->pkt->data[h4sm->len], ib->buf, len);
}
break;
case HCI_H4_EVT:
#if !CONFIG_BT_CONTROLLER_ENABLED
case HCI_H4_EVT:
#endif // !CONFIG_BT_CONTROLLER_ENABLED
case HCI_H4_ISO:
if (h4sm->buf) {
memcpy(&h4sm->buf[h4sm->len], ib->buf, len);
}
break;
case HCI_H4_ACL:
HCI_TRANS_ASSERT(h4sm->om, h4sm->pkt_type, len);
uint16_t conn_handle = btdm_get_le16(&h4sm->hdr[0]) & HCI_INTERNAL_CONN_MASK;
#if UC_BT_CTRL_BR_EDR_IS_ENABLE
if (HCI_INTERNAL_CONN_IS_BREDR(conn_handle)) {
@@ -253,8 +248,8 @@ hci_h4_sm_w4_payload(struct hci_h4_sm *h4sm,
int rc = ble_mbuf_append(h4sm->om, ib->buf, len);
if (rc) {
/* Some data may already be appended so need to adjust h4sm only by
* the size of appended data.
*/
* the size of appended data.
*/
len = BLE_MBUF_PKTLEN(h4sm->om) - mbuf_len;
h4sm->len += len;
hci_h4_ib_consume(ib, len);
@@ -264,8 +259,7 @@ hci_h4_sm_w4_payload(struct hci_h4_sm *h4sm,
break;
#endif // UC_BT_CTRL_BLE_IS_ENABLE
default:
assert(0);
break;
return -2;
}
h4sm->len += len;
@@ -281,7 +275,6 @@ hci_h4_sm_completed(struct hci_h4_sm *h4sm)
int rc;
uint8_t data_source = 0xFF;
HCI_TRANS_ASSERT(h4sm->frame_cb, 0, 0);
switch (h4sm->pkt_type) {
#if CONFIG_BT_CONTROLLER_ENABLED
case HCI_H4_ACL:
@@ -306,23 +299,18 @@ hci_h4_sm_completed(struct hci_h4_sm *h4sm)
#endif // UC_BT_CTRL_BR_EDR_IS_ENABLE
break;
case HCI_H4_CMD:
case HCI_H4_SYNC:
case HCI_H4_ISO:
if (h4sm->buf) {
switch(h4sm->pkt_type) {
case HCI_H4_CMD:
data_source = HCI_DRIVER_CMD;
break;
case HCI_H4_SYNC:
data_source = HCI_DRIVER_BREDR_SYNC;
break;
case HCI_H4_ISO:
data_source = HCI_DRIVER_LE_ISO;
break;
}
rc = h4sm->frame_cb(h4sm->pkt_type, (void *)h4sm->buf, h4sm->len, data_source);
HCI_TRANS_ASSERT(rc == 0, rc, 0);
h4sm->buf = NULL;
}
break;
@@ -330,7 +318,6 @@ hci_h4_sm_completed(struct hci_h4_sm *h4sm)
case HCI_H4_CMD:
case HCI_H4_EVT:
if (h4sm->buf) {
assert(h4sm->frame_cb);
rc = h4sm->frame_cb(h4sm->pkt_type, h4sm->buf);
if (rc != 0) {
ble_transport_free(h4sm->buf);
@@ -341,7 +328,6 @@ hci_h4_sm_completed(struct hci_h4_sm *h4sm)
case HCI_H4_ACL:
case HCI_H4_ISO:
if (h4sm->om) {
assert(h4sm->frame_cb);
rc = h4sm->frame_cb(h4sm->pkt_type, h4sm->om);
if (rc != 0) {
os_mbuf_free_chain(h4sm->om);
@@ -416,7 +402,6 @@ hci_h4_sm_free_buf(struct hci_h4_sm *h4sm)
return 0;
}
int
hci_h4_sm_rx(struct hci_h4_sm *h4sm, const uint8_t *buf, uint16_t len)
{
@@ -439,18 +424,18 @@ hci_h4_sm_rx(struct hci_h4_sm *h4sm, const uint8_t *buf, uint16_t len)
/* no break */
case HCI_H4_SM_W4_HEADER:
rc = hci_h4_sm_w4_header(h4sm, &ib);
assert(rc >= 0);
if (rc) {
break;
}
h4sm->state = HCI_H4_SM_W4_PAYLOAD;
/* no break */
case HCI_H4_SM_W4_PAYLOAD:
rc = hci_h4_sm_w4_payload(h4sm, &ib);
assert(rc >= 0);
if (rc) {
break;
}
h4sm->state = HCI_H4_SM_COMPLETED;
/* no break */
case HCI_H4_SM_COMPLETED:
@@ -462,6 +447,11 @@ hci_h4_sm_rx(struct hci_h4_sm *h4sm, const uint8_t *buf, uint16_t len)
}
}
if (rc < 0) {
hci_h4_sm_free_buf(h4sm);
h4sm->state = HCI_H4_SM_W4_PKT_TYPE;
return -1;
}
/* Calculate consumed bytes
*
* Note: we should always consume some bytes unless there is an oom error.
@@ -1,5 +1,5 @@
/*
* SPDX-FileCopyrightText: 2022-2025 Espressif Systems (Shanghai) CO LTD
* SPDX-FileCopyrightText: 2022-2026 Espressif Systems (Shanghai) CO LTD
*
* SPDX-License-Identifier: Apache-2.0
*/
@@ -61,7 +61,7 @@ hci_driver_uart_tx(hci_driver_data_type_t data_type, uint8_t *data, uint32_t len
data_source = HCI_DRIVER_LE_ISO;
}
}
#if UC_BTDM_CTRL_BR_EDR_IS_ENABLE
#if UC_BT_CTRL_BR_EDR_IS_ENABLE
else if (dir == HCI_DRIVER_DIR_BREDRC2H) {
if (data_type == HCI_DRIVER_TYPE_ACL) {
data_source = HCI_DRIVER_BREDR_ACL;
@@ -71,7 +71,7 @@ hci_driver_uart_tx(hci_driver_data_type_t data_type, uint8_t *data, uint32_t len
data_source = HCI_DRIVER_BREDR_EVT;
}
}
#endif // UC_BTDM_CTRL_BR_EDR_IS_ENABLE
#endif // UC_BT_CTRL_BR_EDR_IS_ENABLE
else {
assert(0);
}
@@ -158,19 +158,19 @@ hci_driver_uart_task_create(void)
{
/* !TODO: Set the core id by menuconfig */
xTaskCreatePinnedToCore(hci_driver_uart_tx_task, "hci_driver_uart_tx_task",
UC_BTDM_CTRL_HCI_TRANS_TASK_STACK_SIZE, NULL,
UC_BT_CTRL_HCI_TRANS_TASK_STACK_SIZE, NULL,
ESP_TASK_BT_CONTROLLER_PRIO, &s_hci_driver_uart_env.tx_task_handler,
0);
assert(s_hci_driver_uart_env.tx_task_handler);
xTaskCreatePinnedToCore(hci_driver_uart_rx_task, "hci_driver_uart_rx_task",
UC_BTDM_CTRL_HCI_TRANS_TASK_STACK_SIZE, NULL,
UC_BT_CTRL_HCI_TRANS_TASK_STACK_SIZE, NULL,
ESP_TASK_BT_CONTROLLER_PRIO, &s_hci_driver_uart_env.rx_task_handler,
0);
assert(s_hci_driver_uart_env.rx_task_handler);
ESP_LOGI(TAG, "hci transport task create successfully, prio:%d, stack size: %ld",
ESP_TASK_BT_CONTROLLER_PRIO, UC_BTDM_CTRL_HCI_TRANS_TASK_STACK_SIZE);
ESP_TASK_BT_CONTROLLER_PRIO, UC_BT_CTRL_HCI_TRANS_TASK_STACK_SIZE);
return 0;
}
@@ -228,8 +228,8 @@ hci_driver_uart_init(hci_driver_forward_fn *cb)
hci_driver_uart_config(s_hci_driver_uart_env.hci_uart_params);
/* Currently, the queue size is set to 1. It will be considered as semaphore. */
ESP_ERROR_CHECK(uart_driver_install(s_hci_driver_uart_env.hci_uart_params->hci_uart_port,
UC_BTDM_CTRL_HCI_UART_RX_BUFFER_SIZE,
UC_BTDM_CTRL_HCI_UART_TX_BUFFER_SIZE,
UC_BT_CTRL_HCI_UART_RX_BUFFER_SIZE,
UC_BT_CTRL_HCI_UART_TX_BUFFER_SIZE,
1, &s_hci_driver_uart_env.rx_event_queue,
0));
@@ -254,8 +254,8 @@ hci_driver_uart_reconfig_pin(int tx_pin, int rx_pin, int cts_pin, int rts_pin)
hci_driver_uart_pin_update(tx_pin, rx_pin, cts_pin, rts_pin);
/* Currently, the queue size is set to 1. It will be considered as semaphore. */
ESP_ERROR_CHECK(uart_driver_install(s_hci_driver_uart_env.hci_uart_params->hci_uart_port,
UC_BTDM_CTRL_HCI_UART_RX_BUFFER_SIZE,
UC_BTDM_CTRL_HCI_UART_TX_BUFFER_SIZE,
UC_BT_CTRL_HCI_UART_RX_BUFFER_SIZE,
UC_BT_CTRL_HCI_UART_TX_BUFFER_SIZE,
1, &s_hci_driver_uart_env.rx_event_queue,
0));
rc = hci_driver_uart_task_create();
@@ -1,5 +1,5 @@
/*
* SPDX-FileCopyrightText: 2021-2024 Espressif Systems (Shanghai) CO LTD
* SPDX-FileCopyrightText: 2021-2026 Espressif Systems (Shanghai) CO LTD
*
* SPDX-License-Identifier: Apache-2.0
*/
@@ -33,16 +33,16 @@ typedef struct hci_driver_uart_params_config
} hci_driver_uart_params_config_t;
#define BT_HCI_DRIVER_UART_CONFIG_DEFAULT() { \
.hci_uart_port = UC_BTDM_CTRL_HCI_UART_PORT, \
.hci_uart_baud = UC_BTDM_CTRL_HCI_UART_BAUD, \
.hci_uart_tx_pin = UC_BTDM_CTRL_HCI_UART_TX_PIN , \
.hci_uart_rx_pin = UC_BTDM_CTRL_HCI_UART_RX_PIN, \
.hci_uart_cts_pin = UC_BTDM_CTRL_HCI_UART_CTS_PIN, \
.hci_uart_rts_pin = UC_BTDM_CTRL_HCI_UART_RTS_PIN, \
.hci_uart_data_bits = UC_BTDM_CTRL_HCI_UART_DATA_BITS, \
.hci_uart_stop_bits = UC_BTDM_CTRL_HCI_UART_STOP_BITS, \
.hci_uart_flow_ctrl = UC_BTDM_CTRL_HCI_UART_FLOW_CTRL, \
.hci_uart_parity = UC_BTDM_CTRL_HCI_UART_PARITY, \
.hci_uart_port = UC_BT_CTRL_HCI_UART_PORT, \
.hci_uart_baud = UC_BT_CTRL_HCI_UART_BAUD, \
.hci_uart_tx_pin = UC_BT_CTRL_HCI_UART_TX_PIN , \
.hci_uart_rx_pin = UC_BT_CTRL_HCI_UART_RX_PIN, \
.hci_uart_cts_pin = UC_BT_CTRL_HCI_UART_CTS_PIN, \
.hci_uart_rts_pin = UC_BT_CTRL_HCI_UART_RTS_PIN, \
.hci_uart_data_bits = UC_BT_CTRL_HCI_UART_DATA_BITS, \
.hci_uart_stop_bits = UC_BT_CTRL_HCI_UART_STOP_BITS, \
.hci_uart_flow_ctrl = UC_BT_CTRL_HCI_UART_FLOW_CTRL, \
.hci_uart_parity = UC_BT_CTRL_HCI_UART_PARITY, \
}
/**
@@ -68,7 +68,7 @@ hci_driver_ops_t hci_driver_vhci_ops = {
/* Special APIs used by host to send message. */
int
hci_driver_host_cmd_tx(uint8_t *data, uint32_t length)
hci_driver_host_cmd_tx(uint8_t *data)
{
#if 0
hci_driver_packet_t *pkt = NULL;
@@ -83,7 +83,7 @@ hci_driver_host_cmd_tx(uint8_t *data, uint32_t length)
r_ble_hci_trans_buf_free(data);
return s_hci_driver_vhci_env.forward_cb(HCI_DRIVER_TYPE_CMD, (uint8_t *)pkt, pkt_len, HCI_DRIVER_DIR_H2C, HCI_DRIVER_CMD);
#else
return s_hci_driver_vhci_env.forward_cb(HCI_DRIVER_TYPE_CMD, data, length, HCI_DRIVER_DIR_H2C, HCI_DRIVER_CMD);
return s_hci_driver_vhci_env.forward_cb(HCI_DRIVER_TYPE_CMD, data, 0, HCI_DRIVER_DIR_H2C, HCI_DRIVER_CMD);
#endif
}
@@ -61,6 +61,7 @@ hci_driver_vhci_host_recv_with_type(uint8_t data_type, uint8_t *data, uint16_t l
return -1;
}
#if 0
static void
hci_driver_vhci_host_send_available(void)
{
@@ -71,6 +72,7 @@ hci_driver_vhci_host_send_available(void)
host_recv_cb->notify_host_send_available();
}
}
#endif
static int
hci_driver_vhci_controller_tx(hci_driver_data_type_t data_type, uint8_t *data, uint32_t length, hci_driver_direction_t dir)
@@ -78,10 +78,9 @@ int hci_driver_host_callback_register(hci_driver_host_recv_fn *callback);
/**
* @brief Called to send HCI commands form host to controller.
* @param data Point to the commands data
* @param length Length of data
* @return int 0 on success, non-zero error code on failure.
*/
int hci_driver_host_cmd_tx(uint8_t *data, uint32_t length);
int hci_driver_host_cmd_tx(uint8_t *data);
/**
* @brief Called to send HCI ACL form host to controller.
+1
View File
@@ -3,6 +3,7 @@ menu "Wireless Coexistence"
config ESP_COEX_ENABLED
bool
default n if IDF_TARGET_ESP32H4 #TODO: enable coexistence for ESP32H4
default y if (!SOC_WIRELESS_HOST_SUPPORTED)
if(ESP_COEX_ENABLED)
@@ -225,7 +225,7 @@ IRAM_ATTR uint8_t *modem_clock_domain_icg_config(void)
static DRAM_ATTR uint8_t icg_config_default[MODEM_CLOCK_DOMAIN_MAX] = {
[MODEM_CLOCK_DOMAIN_MODEM_APB] = ICG_NOGATING_ACTIVE | ICG_NOGATING_MODEM,
[MODEM_CLOCK_DOMAIN_MODEM_PERIPH] = ICG_NOGATING_ACTIVE,
// [MODEM_CLOCK_DOMAIN_BT] = ICG_NOGATING_ACTIVE,
[MODEM_CLOCK_DOMAIN_BT] = ICG_NOGATING_ACTIVE,
[MODEM_CLOCK_DOMAIN_MODEM_FE] = ICG_NOGATING_ACTIVE | ICG_NOGATING_MODEM,
[MODEM_CLOCK_DOMAIN_IEEE802154] = ICG_NOGATING_ACTIVE,
[MODEM_CLOCK_DOMAIN_LP_APB] = ICG_NOGATING_ACTIVE | ICG_NOGATING_MODEM,
+2
View File
@@ -1,4 +1,6 @@
INPUT += \
$(PROJECT_PATH)/components/bt/include/$(IDF_TARGET)/include/esp_bt.h \
$(PROJECT_PATH)/components/bt/include/$(IDF_TARGET)/include/esp_bt_vs.h \
$(PROJECT_PATH)/components/esp_phy/include/esp_phy_init.h \
$(PROJECT_PATH)/components/esp_phy/include/esp_phy_cert_test.h \
$(PROJECT_PATH)/components/esp_driver_touch_sens/hw_ver3/include/driver/touch_version_types.h \
+1 -1
View File
@@ -3,7 +3,7 @@ Speed Optimization
:link_to_translation:`zh_CN:[中文]`
{IDF_TARGET_CONTROLLER_CORE_CONFIG:default="CONFIG_BT_CTRL_PINNED_TO_CORE", esp32="CONFIG_BTDM_CTRL_PINNED_TO_CORE_CHOICE", esp32s3="CONFIG_BT_CTRL_PINNED_TO_CORE_CHOICE"}
{IDF_TARGET_CONTROLLER_CORE_CONFIG:default="CONFIG_BT_CTRL_PINNED_TO_CORE_CHOICE", esp32="CONFIG_BTDM_CTRL_PINNED_TO_CORE_CHOICE", esp32s3="CONFIG_BT_CTRL_PINNED_TO_CORE_CHOICE"}
{IDF_TARGET_RF_TYPE:default="Wi-Fi/Bluetooth", esp32s2="Wi-Fi", esp32c6="Wi-Fi/Bluetooth/802.15.4", esp32c61="Wi-Fi/Bluetooth", esp32h2="Bluetooth/802.15.4", esp32h21="Bluetooth/802.15.4", esp32h4="Bluetooth/802.15.4", esp32c5="Wi-Fi/Bluetooth/802.15.4"}
Overview
+5 -5
View File
@@ -40,7 +40,7 @@ The following HCI VS commands are exclusively for Espressif's Bluetooth Host (ES
.. doxygendefine:: ESP_BT_VS_SET_LE_VENDOR_EVTS_MASK_OCF
.. only:: esp32c5 or esp32c6 or esp32h2 or esp32c61
.. only:: esp32c5 or esp32c6 or esp32h2 or esp32c61 or esp32h4 or esp32s31
.. doxygendefine:: ESP_BT_VS_CONFIG_DUP_EXC_LIST_OCF
.. doxygendefine:: ESP_BT_VS_SET_ADV_REPORT_FLOW_CTRL_OCF
@@ -82,7 +82,7 @@ The following HCI VS events are exclusively for Espressif's Bluetooth Host (ESP-
.. doxygendefine:: ESP_BT_VS_LE_ADV_LOST_EVT_SUBCODE
.. only:: esp32c6 or esp32h2 or esp32c5 or esp32c61
.. only:: esp32c6 or esp32h2 or esp32c5 or esp32c61 or esp32h4 or esp32s31
.. doxygendefine:: ESP_BT_VS_LE_CONN_SCAN_REQ_RXED_EVT_SUBCODE
.. doxygendefine:: ESP_BT_VS_LE_CHAN_UPDATE_COMP_EVT_SUBCODE
@@ -206,7 +206,7 @@ The following HCI VS debugging commands are implemented in Bluetooth Low Energy
.. doxygendefine:: ESP_BT_VS_CFG_TEST_RELATED_SUBCMD_MAX
.. only:: esp32c6 or esp32h2 or esp32c5 or esp32c61
.. only:: esp32c6 or esp32h2 or esp32c5 or esp32c61 or esp32h4 or esp32s31
.. doxygendefine:: ESP_BT_VS_CFG_TEST_RELATED_OCF
.. doxygendefine:: ESP_BT_VS_CFG_TEST_ENABLE_SUBCMD
@@ -272,7 +272,7 @@ The following HCI VS debugging commands are implemented in Bluetooth Low Energy
.. only:: esp32 or esp32c5 or esp32c6 or esp32c61 or esp32h2
.. only:: esp32 or esp32c5 or esp32c6 or esp32c61 or esp32h2 or esp32h4 or esp32s31
HCI VS Events for Espressif's Internal-Use Debugging
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
@@ -286,6 +286,6 @@ The following HCI VS debugging commands are implemented in Bluetooth Low Energy
.. doxygendefine:: ESP_BT_VS_CH_CLASSIFICATION_REPORTING_MODE_EVT_SUBCODE
.. only:: esp32c5 or esp32c6 or esp32c61 or esp32h2
.. only:: esp32c5 or esp32c6 or esp32c61 or esp32h2 or esp32h4 or esp32s31
.. doxygendefine:: ESP_BT_VS_LE_RUNNING_STATUS_EVT_SUBCODE
+1 -1
View File
@@ -3,7 +3,7 @@
:link_to_translation:`en:[English]`
{IDF_TARGET_CONTROLLER_CORE_CONFIG:default="CONFIG_BT_CTRL_PINNED_TO_CORE", esp32="CONFIG_BTDM_CTRL_PINNED_TO_CORE_CHOICE", esp32s3="CONFIG_BT_CTRL_PINNED_TO_CORE_CHOICE"}
{IDF_TARGET_CONTROLLER_CORE_CONFIG:default="CONFIG_BT_CTRL_PINNED_TO_CORE_CHOICE", esp32="CONFIG_BTDM_CTRL_PINNED_TO_CORE_CHOICE", esp32s3="CONFIG_BT_CTRL_PINNED_TO_CORE_CHOICE"}
{IDF_TARGET_RF_TYPE:default="Wi-Fi/蓝牙", esp32s2="Wi-Fi", esp32c6="Wi-Fi/蓝牙/802.15.4", esp32c61="Wi-Fi/蓝牙", esp32h2="蓝牙/802.15.4", esp32h21="蓝牙/802.15.4", esp32h4="蓝牙/802.15.4", esp32c5="Wi-Fi/蓝牙/802.15.4"}
概述
@@ -0,0 +1,3 @@
# Override some defaults so BT stack is enabled
# by default in this example
CONFIG_PARTITION_TABLE_SINGLE_APP_LARGE=y
@@ -0,0 +1,4 @@
# This file was generated using idf.py save-defconfig. It can be edited manually.
# Espressif IoT Development Framework (ESP-IDF) Project Minimal Configuration
#
CONFIG_PARTITION_TABLE_SINGLE_APP_LARGE=y
@@ -1,5 +1,5 @@
/*
* SPDX-FileCopyrightText: 2021-2024 Espressif Systems (Shanghai) CO LTD
* SPDX-FileCopyrightText: 2021-2026 Espressif Systems (Shanghai) CO LTD
*
* SPDX-License-Identifier: Unlicense OR CC0-1.0
*/
@@ -966,9 +966,6 @@ void app_main(void)
ble_hs_cfg.store_status_cb = ble_store_util_status_rr;
/* Starting nimble task after gatts is initialized*/
ret = esp_nimble_enable(ble_hid_device_host_task);
if (ret) {
ESP_LOGE(TAG, "esp_nimble_enable failed: %d", ret);
}
nimble_port_freertos_init(ble_hid_device_host_task);
#endif
}
@@ -1,5 +1,5 @@
/*
* SPDX-FileCopyrightText: 2021-2024 Espressif Systems (Shanghai) CO LTD
* SPDX-FileCopyrightText: 2021-2026 Espressif Systems (Shanghai) CO LTD
*
* SPDX-License-Identifier: Unlicense OR CC0-1.0
*/
@@ -238,10 +238,7 @@ void app_main(void)
ble_hs_cfg.store_status_cb = ble_store_util_status_rr;
/* Starting nimble task after gatts is initialized*/
ret = esp_nimble_enable(ble_hid_host_task);
if (ret) {
ESP_LOGE(TAG, "esp_nimble_enable failed: %d", ret);
}
nimble_port_freertos_init(ble_hid_host_task);
vTaskDelay(200);
@@ -50,6 +50,8 @@
#define TEST_CI_ADDRESS_CHIP_OFFSET (7)
#elif CONFIG_IDF_TARGET_ESP32C61
#define TEST_CI_ADDRESS_CHIP_OFFSET (8)
#elif CONFIG_IDF_TARGET_ESP32H4
#define TEST_CI_ADDRESS_CHIP_OFFSET (9)
#endif
#endif
+3 -1
View File
@@ -9,12 +9,14 @@
#include "esp_bt.h"
#ifndef CONFIG_BT_LE_HCI_INTERFACE_USE_UART
#if !CONFIG_BT_LE_HCI_INTERFACE_USE_UART && !CONFIG_BT_CTRL_HCI_INTERFACE_USE_UART
#error "Please Enable Uart for HCI"
#endif
#if (CONFIG_ENABLE_DTM_CONFIGURATION_COMMAND)
#include "dtm_configuration_command.h"
#endif // CONFIG_ENABLE_DTM_CONFIGURATION_COMMAND
#define TAG "BLE_HCI"
void
@@ -3,7 +3,3 @@
#
CONFIG_BT_ENABLED=y
CONFIG_BT_CONTROLLER_ONLY=y
CONFIG_BT_LE_HCI_INTERFACE_USE_UART=y
CONFIG_BT_LE_HCI_UART_TX_PIN=8
CONFIG_BT_LE_HCI_UART_RX_PIN=9
CONFIG_BT_LE_HCI_UART_BAUD=115200
@@ -0,0 +1,6 @@
# Override some defaults so BT stack is enabled
# by default in this example
CONFIG_BT_LE_HCI_INTERFACE_USE_UART=y
CONFIG_BT_LE_HCI_UART_TX_PIN=8
CONFIG_BT_LE_HCI_UART_RX_PIN=9
CONFIG_BT_LE_HCI_UART_BAUD=115200
@@ -0,0 +1,6 @@
# Override some defaults so BT stack is enabled
# by default in this example
CONFIG_BT_LE_HCI_INTERFACE_USE_UART=y
CONFIG_BT_LE_HCI_UART_TX_PIN=8
CONFIG_BT_LE_HCI_UART_RX_PIN=9
CONFIG_BT_LE_HCI_UART_BAUD=115200
@@ -0,0 +1,6 @@
# Override some defaults so BT stack is enabled
# by default in this example
CONFIG_BT_LE_HCI_INTERFACE_USE_UART=y
CONFIG_BT_LE_HCI_UART_TX_PIN=8
CONFIG_BT_LE_HCI_UART_RX_PIN=9
CONFIG_BT_LE_HCI_UART_BAUD=115200
@@ -0,0 +1,6 @@
# Override some defaults so BT stack is enabled
# by default in this example
CONFIG_BT_LE_HCI_INTERFACE_USE_UART=y
CONFIG_BT_LE_HCI_UART_TX_PIN=8
CONFIG_BT_LE_HCI_UART_RX_PIN=9
CONFIG_BT_LE_HCI_UART_BAUD=115200
@@ -0,0 +1,6 @@
# Override some defaults so BT stack is enabled
# by default in this example
CONFIG_BT_LE_HCI_INTERFACE_USE_UART=y
CONFIG_BT_LE_HCI_UART_TX_PIN=8
CONFIG_BT_LE_HCI_UART_RX_PIN=9
CONFIG_BT_LE_HCI_UART_BAUD=115200
@@ -0,0 +1,6 @@
# Override some defaults so BT stack is enabled
# by default in this example
CONFIG_BT_CTRL_HCI_INTERFACE_USE_UART=y
CONFIG_BT_CTRL_HCI_UART_TX_PIN=8
CONFIG_BT_CTRL_HCI_UART_RX_PIN=9
CONFIG_BT_CTRL_HCI_UART_BAUD=115200
@@ -36,6 +36,8 @@
#define TEST_CI_ADDRESS_CHIP_OFFSET (7)
#elif CONFIG_IDF_TARGET_ESP32C61
#define TEST_CI_ADDRESS_CHIP_OFFSET (8)
#elif CONFIG_IDF_TARGET_ESP32H4
#define TEST_CI_ADDRESS_CHIP_OFFSET (9)
#endif
#endif
@@ -16,6 +16,7 @@
#include "services/gap/ble_svc_gap.h"
#include "gatts_sens.h"
#include "../src/ble_hs_hci_priv.h"
#include "esp_timer.h"
#if CONFIG_EXAMPLE_EXTENDED_ADV
static uint8_t ext_adv_pattern[] = {