fix(nimble): Migrate to NimBLE 1.9.0

This commit is contained in:
Rahul Tank
2026-07-27 14:14:35 +05:30
parent eaa88e26dc
commit e08609e451
37 changed files with 484 additions and 65 deletions
+21 -3
View File
@@ -170,6 +170,12 @@ else()
endif()
endif()
if(CONFIG_BT_DUAL_MODE_ARCH AND CONFIG_BT_CONTROLLER_ENABLED)
list(APPEND nimble_host_srcs
"${CMAKE_CURRENT_LIST_DIR}/../../porting/mem/bt_osi_mem.c"
)
endif()
# Reuse the code from the controller to reduce flash usage
if(CONFIG_BT_CONTROLLER_DISABLED OR NOT CONFIG_SOC_ESP_NIMBLE_CONTROLLER)
list(APPEND nimble_host_srcs
@@ -179,10 +185,17 @@ if(CONFIG_BT_CONTROLLER_DISABLED OR NOT CONFIG_SOC_ESP_NIMBLE_CONTROLLER)
"${CMAKE_CURRENT_LIST_DIR}/nimble/porting/nimble/src/mem.c"
"${CMAKE_CURRENT_LIST_DIR}/nimble/porting/nimble/src/os_mbuf.c"
"${CMAKE_CURRENT_LIST_DIR}/nimble/porting/nimble/src/os_msys_init.c"
"${CMAKE_CURRENT_LIST_DIR}/nimble/porting/npl/freertos/src/npl_os_freertos.c"
"${CMAKE_CURRENT_LIST_DIR}/../../porting/mem/bt_osi_mem.c"
)
if(NOT CONFIG_BT_DUAL_MODE_ARCH)
list(APPEND nimble_host_srcs
"${CMAKE_CURRENT_LIST_DIR}/nimble/porting/npl/freertos/src/npl_os_freertos.c"
)
endif()
endif()
list(REMOVE_DUPLICATES nimble_host_srcs)
list(APPEND nimble_host_include_dirs
${CMAKE_CURRENT_LIST_DIR}/nimble/nimble/host/include
${CMAKE_CURRENT_LIST_DIR}/nimble/nimble/include
@@ -209,6 +222,7 @@ list(APPEND nimble_host_include_dirs
${CMAKE_CURRENT_LIST_DIR}/nimble/porting/nimble/include
${CMAKE_CURRENT_LIST_DIR}/port/include
${CMAKE_CURRENT_LIST_DIR}/../../porting/include
${CMAKE_CURRENT_LIST_DIR}/nimble/nimble/transport/include
)
@@ -218,13 +232,17 @@ if(CONFIG_BT_CONTROLLER_DISABLED)
)
endif()
if(CONFIG_BT_CONTROLLER_DISABLED OR NOT CONFIG_SOC_ESP_NIMBLE_CONTROLLER)
# Add NPL include directories based on which NPL implementation is being used
if(CONFIG_BT_DUAL_MODE_ARCH)
# esp-idf NPL include already added above
else()
# freertos NPL include needed for non-dual-mode targets
list(APPEND nimble_host_include_dirs
${CMAKE_CURRENT_LIST_DIR}/../../porting/include
${CMAKE_CURRENT_LIST_DIR}/nimble/porting/npl/freertos/include
)
endif()
# BLE NIMBLE MESH (Deprecated)
if(CONFIG_BT_NIMBLE_MESH)
list(APPEND nimble_host_srcs
+8
View File
@@ -359,6 +359,14 @@ menu "GAP"
Required when the host delays CONNECT so applications never receive other
events before CONNECT event.
config BT_NIMBLE_UNHANDLED_HCI_EVENT
bool "Post unhandled HCI events to GAP"
depends on BT_NIMBLE_ENABLED
default n
help
For events that are not handled by stack, they would be directly posted to application
Application is responsible for handling such events.
endmenu #GAP
menu "GATT / ATT"
@@ -215,6 +215,7 @@ static void ble_hci_rx_acl(uint8_t *data, uint16_t len)
os_mbuf_free_chain(m);
return;
}
/* Host path may block on the NimBLE event queue; must not run inside OS critical. */
ble_transport_to_hs_acl(m);
}
#endif
@@ -102,6 +102,10 @@
#define MYNEWT_VAL_BLE_EXT_ADV (CONFIG_BT_NIMBLE_EXT_ADV)
#endif
#ifndef MYNEWT_VAL_BLE_HS_EXT_ADV_LEGACY_INSTANCE
#define MYNEWT_VAL_BLE_HS_EXT_ADV_LEGACY_INSTANCE (0)
#endif
#ifndef MYNEWT_VAL_BLE_EXT_ADV_V2
#ifdef CONFIG_BT_NIMBLE_EXT_ADV_V2
#define MYNEWT_VAL_BLE_EXT_ADV_V2 (CONFIG_BT_NIMBLE_EXT_ADV_V2)
@@ -228,6 +232,18 @@
#define MYNEWT_VAL_BLE_MULTI_ADV_INSTANCES (CONFIG_BT_NIMBLE_MAX_EXT_ADV_INSTANCES)
#endif
#ifndef MYNEWT_VAL_BLE_HS_16_COMPAT
#define MYNEWT_VAL_BLE_HS_16_COMPAT (1)
#endif
#ifndef MYNEWT_VAL_BLE_HS_GAP_UNHANDLED_HCI_EVENT
#ifdef CONFIG_BT_NIMBLE_UNHANDLED_HCI_EVENT
#define MYNEWT_VAL_BLE_HS_GAP_UNHANDLED_HCI_EVENT CONFIG_BT_NIMBLE_UNHANDLED_HCI_EVENT
#else
#define MYNEWT_VAL_BLE_HS_GAP_UNHANDLED_HCI_EVENT (0)
#endif
#endif
#ifndef CONFIG_BT_NIMBLE_ENABLE_PERIODIC_ADV
#define MYNEWT_VAL_BLE_PERIODIC_ADV (0)
#else
@@ -601,8 +617,13 @@
#endif
#ifndef MYNEWT_VAL_BLE_ATT_PREFERRED_MTU
#ifdef CONFIG_BT_NIMBLE_ATT_PREFERRED_MTU
#define MYNEWT_VAL_BLE_ATT_PREFERRED_MTU CONFIG_BT_NIMBLE_ATT_PREFERRED_MTU
#else
#define MYNEWT_VAL_BLE_ATT_PREFERRED_MTU (23)
#endif
#endif
#ifndef MYNEWT_VAL_BLE_ATT_SVR_FIND_INFO
#define MYNEWT_VAL_BLE_ATT_SVR_FIND_INFO (1)
@@ -2025,10 +2046,14 @@
#endif
#ifndef MYNEWT_VAL_BLE_HCI_VS
#ifdef CONFIG_BT_NIMBLE_VS_SUPPORT
#define MYNEWT_VAL_BLE_HCI_VS CONFIG_BT_NIMBLE_VS_SUPPORT
#define MYNEWT_VAL_BLE_HCI_VS_OCF_OFFSET (0)
#else
#define MYNEWT_VAL_BLE_HCI_VS (0)
#define MYNEWT_VAL_BLE_HCI_VS (0)
#endif
#endif
#ifndef MYNEWT_VAL_BLE_HCI_VS_OCF_OFFSET
#define MYNEWT_VAL_BLE_HCI_VS_OCF_OFFSET (0)
#endif
#ifndef MYNEWT_VAL_OPTIMIZE_MULTI_CONN
@@ -2119,6 +2144,14 @@
#endif
#endif
#ifndef MYNEWT_VAL_BLE_ISO_MAX_BISES
#ifdef CONFIG_BT_NIMBLE_ISO_MAX_BISES
#define MYNEWT_VAL_BLE_ISO_MAX_BISES CONFIG_BT_NIMBLE_ISO_MAX_BISES
#else
#define MYNEWT_VAL_BLE_ISO_MAX_BISES (4)
#endif
#endif
#ifndef MYNEWT_VAL_BLE_ISO_BIS_PER_BIG
#ifdef CONFIG_BT_NIMBLE_ISO_BIS_PER_BIG
#define MYNEWT_VAL_BLE_ISO_BIS_PER_BIG CONFIG_BT_NIMBLE_ISO_BIS_PER_BIG
@@ -2223,6 +2256,39 @@
#ifndef MYNEWT_VAL_BLE_TRANSPORT_UART_STOP_BITS
#define MYNEWT_VAL_BLE_TRANSPORT_UART_STOP_BITS (1)
#endif
#ifndef MYNEWT_VAL_BLE_TRANSPORT_UART_LL_PORT
#define MYNEWT_VAL_BLE_TRANSPORT_UART_LL_PORT MYNEWT_VAL_BLE_TRANSPORT_UART_PORT
#endif
#ifndef MYNEWT_VAL_BLE_TRANSPORT_UART_LL_PARITY__none
#define MYNEWT_VAL_BLE_TRANSPORT_UART_LL_PARITY__none MYNEWT_VAL_BLE_TRANSPORT_UART_PARITY__none
#endif
#ifndef MYNEWT_VAL_BLE_TRANSPORT_UART_LL_PARITY__odd
#define MYNEWT_VAL_BLE_TRANSPORT_UART_LL_PARITY__odd MYNEWT_VAL_BLE_TRANSPORT_UART_PARITY__odd
#endif
#ifndef MYNEWT_VAL_BLE_TRANSPORT_UART_LL_PARITY__even
#define MYNEWT_VAL_BLE_TRANSPORT_UART_LL_PARITY__even MYNEWT_VAL_BLE_TRANSPORT_UART_PARITY__even
#endif
#ifndef MYNEWT_VAL_BLE_TRANSPORT_UART_LL_FLOW_CONTROL__rtscts
#define MYNEWT_VAL_BLE_TRANSPORT_UART_LL_FLOW_CONTROL__rtscts \
MYNEWT_VAL_BLE_TRANSPORT_UART_FLOW_CONTROL__rtscts
#endif
#ifndef MYNEWT_VAL_BLE_TRANSPORT_UART_LL_BAUDRATE
#define MYNEWT_VAL_BLE_TRANSPORT_UART_LL_BAUDRATE MYNEWT_VAL_BLE_TRANSPORT_UART_BAUDRATE
#endif
#ifndef MYNEWT_VAL_BLE_TRANSPORT_UART_LL_DATA_BITS
#define MYNEWT_VAL_BLE_TRANSPORT_UART_LL_DATA_BITS MYNEWT_VAL_BLE_TRANSPORT_UART_DATA_BITS
#endif
#ifndef MYNEWT_VAL_BLE_TRANSPORT_UART_LL_STOP_BITS
#define MYNEWT_VAL_BLE_TRANSPORT_UART_LL_STOP_BITS MYNEWT_VAL_BLE_TRANSPORT_UART_STOP_BITS
#endif
#endif
#ifndef MYNEWT_VAL_BLE_PERIODIC_ADV_WITH_RESPONSES
@@ -8,6 +8,7 @@
#define __ESP_NIMBLE_MEM_H__
#include <stdlib.h>
#include "bt_osi_mem.h"
#ifdef __cplusplus
extern "C" {
@@ -101,7 +102,9 @@ uint32_t nimble_mem_dbg_get_max_size_section(uint8_t index);
void *p; \
do { \
p = nimble_mem_malloc(size); \
nimble_mem_dbg_record(p, size, __func__, __LINE__); \
if (p) { \
nimble_mem_dbg_record(p, size, __func__, __LINE__); \
} \
} while (0); \
p; \
})
@@ -111,7 +114,9 @@ uint32_t nimble_mem_dbg_get_max_size_section(uint8_t index);
void *p; \
do { \
p = nimble_mem_calloc(count, size); \
nimble_mem_dbg_record(p, (count) * (size), __func__, __LINE__); \
if (p) { \
nimble_mem_dbg_record(p, (count) * (size), __func__, __LINE__); \
} \
} while (0); \
p; \
})
@@ -12,12 +12,14 @@
static uint8_t log_count;
#if CONFIG_BT_LE_USED_MEM_STATISTICS_ENABLED
static size_t host_mem_used_size = 0;
static _Atomic size_t host_mem_used_size = 0;
#endif // CONFIG_BT_LE_USED_MEM_STATISTICS_ENABLED
void *nimble_mem_realloc(void *ptr, size_t size);
#if CONFIG_BT_NIMBLE_MEM_DEBUG
#define NIMBLE_MEM_DBG_INFO_MAX (1024*3)
#define NIMBLE_MEM_DBG_INFO_MAX (1024 * 3)
typedef struct {
void *p;
int size;
@@ -118,7 +120,7 @@ void nimble_mem_dbg_clean(void *p, const char *func, int line)
}
if (i >= NIMBLE_MEM_DBG_INFO_MAX) {
ESP_LOGE("BT_NIMBLE_MEM", "%s full %s %d !!\n", __func__, func, line);
ESP_LOGE("BT_NIMBLE_MEM", "%s pointer %s %d not found!!\n", __func__, func, line);
}
}
@@ -191,6 +193,67 @@ uint32_t nimble_mem_dbg_get_max_size_section(uint8_t index)
return nimble_mem_dbg_max_size_section[index].max_size;
}
void *nimble_mem_dbg_realloc(void *ptr, size_t new_size, const char *func, int line)
{
size_t old_size = 0;
int i;
void *new_ptr = nimble_mem_realloc(ptr, new_size);
if (new_ptr == NULL && new_size > 0) {
// realloc failed, keep old ptr record
return NULL;
}
// Find and clean old record if ptr is not NULL
if (ptr != NULL) {
for (i = 0; i < NIMBLE_MEM_DBG_INFO_MAX; i++) {
if (nimble_mem_dbg_info[i].p == ptr) {
old_size = nimble_mem_dbg_info[i].size;
nimble_mem_dbg_current_size -= old_size;
nimble_mem_dbg_info[i].p = NULL;
nimble_mem_dbg_info[i].size = 0;
nimble_mem_dbg_info[i].func = NULL;
nimble_mem_dbg_info[i].line = 0;
nimble_mem_dbg_count--;
break;
}
}
}
// Record the new allocation if new_size > 0
if (new_ptr != NULL && new_size > 0) {
for (i = 0; i < NIMBLE_MEM_DBG_INFO_MAX; i++) {
if (nimble_mem_dbg_info[i].p == NULL) {
nimble_mem_dbg_info[i].p = new_ptr;
nimble_mem_dbg_info[i].size = new_size;
nimble_mem_dbg_info[i].func = func;
nimble_mem_dbg_info[i].line = line;
nimble_mem_dbg_count++;
break;
}
}
if (i >= NIMBLE_MEM_DBG_INFO_MAX) {
ESP_LOGE("BT_NIMBLE_MEM", "%s full %s %d !!\n", __func__, func, line);
return new_ptr;
}
nimble_mem_dbg_current_size += new_size;
if (nimble_mem_dbg_max_size < nimble_mem_dbg_current_size) {
nimble_mem_dbg_max_size = nimble_mem_dbg_current_size;
}
for (i = 0; i < NIMBLE_MEM_DBG_MAX_SECTION_NUM; i++) {
if (nimble_mem_dbg_max_size_section[i].used &&
nimble_mem_dbg_max_size_section[i].max_size < nimble_mem_dbg_current_size) {
nimble_mem_dbg_max_size_section[i].max_size = nimble_mem_dbg_current_size;
}
}
}
return new_ptr;
}
#endif // CONFIG_BT_NIMBLE_MEM_DEBUG
#if !CONFIG_BT_NIMBLE_LOW_SPEED_MODE
@@ -218,7 +281,8 @@ void *nimble_mem_malloc(size_t size)
}
#if CONFIG_BT_LE_USED_MEM_STATISTICS_ENABLED
if(mem) {
host_mem_used_size += heap_caps_get_allocated_size(mem);
size_t alloc_size = heap_caps_get_allocated_size(mem);
__atomic_fetch_add(&host_mem_used_size, alloc_size, __ATOMIC_RELAXED);
}
#endif // CONFIG_BT_LE_USED_MEM_STATISTICS_ENABLED
return mem;
@@ -241,7 +305,8 @@ void *nimble_mem_calloc(size_t n, size_t size)
#endif
#if CONFIG_BT_LE_USED_MEM_STATISTICS_ENABLED
if(mem) {
host_mem_used_size += heap_caps_get_allocated_size(mem);
size_t alloc_size = heap_caps_get_allocated_size(mem);
__atomic_fetch_add(&host_mem_used_size, alloc_size, __ATOMIC_RELAXED);
}
#endif // CONFIG_BT_LE_USED_MEM_STATISTICS_ENABLED
return mem;
@@ -274,17 +339,21 @@ void *nimble_mem_realloc(void *ptr, size_t size)
#if CONFIG_BT_LE_USED_MEM_STATISTICS_ENABLED
if (mem) {
/* Successful realloc: replace old_size contribution with new block size. */
size_t new_size = heap_caps_get_allocated_size(mem);
host_mem_used_size = host_mem_used_size - old_size + new_size;
__atomic_fetch_sub(&host_mem_used_size, old_size, __ATOMIC_RELAXED);
__atomic_fetch_add(&host_mem_used_size, new_size, __ATOMIC_RELAXED);
} else if (ptr && size == 0) {
host_mem_used_size -= old_size;
/* realloc(ptr, 0) freed the block and returned NULL; deduct old_size. */
__atomic_fetch_sub(&host_mem_used_size, old_size, __ATOMIC_RELAXED);
}
/* If mem == NULL and size != 0, realloc failed; ptr is still valid and
* host_mem_used_size remains unchanged, which is the correct state. */
#endif // CONFIG_BT_LE_USED_MEM_STATISTICS_ENABLED
return mem;
}
#if !CONFIG_BT_NIMBLE_LOW_SPEED_MODE
IRAM_ATTR
#endif
@@ -293,8 +362,7 @@ void nimble_mem_free(void *ptr)
#if CONFIG_BT_LE_USED_MEM_STATISTICS_ENABLED
if (ptr) {
size_t alloc_size = heap_caps_get_allocated_size(ptr);
// assert(host_mem_used_size >= alloc_size);
host_mem_used_size -= alloc_size;
__atomic_fetch_sub(&host_mem_used_size, alloc_size, __ATOMIC_RELAXED);
}
#endif // CONFIG_BT_LE_USED_MEM_STATISTICS_ENABLED
if (ptr) {