feat(ble): add CONFIG_BT_LE_CTRL_DL_ITVL_PHY_SYNC_EN config on ESP32-C6

This commit is contained in:
zhaoweiliang
2025-12-03 14:28:13 +08:00
parent 5f2825ff37
commit 6c4f33798f
4 changed files with 57 additions and 10 deletions
@@ -985,3 +985,11 @@ config BT_LE_CTRL_SLV_FAST_RX_CONN_DATA_EN
When this option is enabled, the Controller continues receiving PDUs When this option is enabled, the Controller continues receiving PDUs
In the next connection event instead of entering latency In the next connection event instead of entering latency
After a data packet is received. After a data packet is received.
config BT_LE_CTRL_DL_ITVL_PHY_SYNC_EN
bool "Enables the automatic initiation of a data length update(Experimental)."
default n
help
When this option is enabled, the Controller automatically initiates a data length update
Using the appropriate data length parameters
When a PHY update or a connection interval update occurs.
+37 -7
View File
@@ -34,8 +34,8 @@
#include "os/endian.h" #include "os/endian.h"
#include "esp_bt.h" #include "esp_bt.h"
#include "esp_intr_alloc.h"
#include "ble_priv.h" #include "ble_priv.h"
#include "esp_intr_alloc.h"
#include "esp_sleep.h" #include "esp_sleep.h"
#include "esp_pm.h" #include "esp_pm.h"
#ifdef CONFIG_ESP_PHY_ENABLED #ifdef CONFIG_ESP_PHY_ENABLED
@@ -133,7 +133,6 @@ typedef union {
}; };
uint32_t val; uint32_t val;
} bt_wakeup_params_t; } bt_wakeup_params_t;
/* External functions or variables /* External functions or variables
************************************************************************ ************************************************************************
*/ */
@@ -192,6 +191,7 @@ extern int r_ble_get_npl_element_info(esp_bt_controller_config_t *cfg, ble_npl_c
extern char *ble_controller_get_compile_version(void); extern char *ble_controller_get_compile_version(void);
extern int esp_ble_register_bb_funcs(void); extern int esp_ble_register_bb_funcs(void);
extern void esp_ble_unregister_bb_funcs(void); extern void esp_ble_unregister_bb_funcs(void);
extern bool esp_ble_controller_lib_check(void);
extern uint32_t _bt_bss_start; extern uint32_t _bt_bss_start;
extern uint32_t _bt_bss_end; extern uint32_t _bt_bss_end;
extern uint32_t _bt_controller_bss_start; extern uint32_t _bt_controller_bss_start;
@@ -233,6 +233,11 @@ static void esp_bt_ctrl_log_partition_get_and_erase_first_block(void);
#if CONFIG_FREERTOS_USE_TICKLESS_IDLE #if CONFIG_FREERTOS_USE_TICKLESS_IDLE
static bool esp_bt_check_wakeup_by_bt(void); static bool esp_bt_check_wakeup_by_bt(void);
#endif // CONFIG_FREERTOS_USE_TICKLESS_IDLE #endif // CONFIG_FREERTOS_USE_TICKLESS_IDLE
#if (CONFIG_BT_CONTROLLER_ONLY) && (CONFIG_BT_LE_SM_SC) && (!CONFIG_BT_LE_CRYPTO_STACK_MBEDTLS)
#include "tinycrypt/ecc.h"
static int ecc_rand_func(uint8_t *dst, unsigned int len);
#endif // (CONFIG_BT_CONTROLLER_ONLY) && (CONFIG_BT_LE_SM_SC) && (!CONFIG_BT_LE_CRYPTO_STACK_MBEDTLS)
/* Local variable definition /* Local variable definition
*************************************************************************** ***************************************************************************
*/ */
@@ -1055,6 +1060,7 @@ static void ble_rtc_clk_init(esp_bt_controller_config_t *cfg)
esp_bt_rtc_slow_clk_select(s_bt_lpclk_src); esp_bt_rtc_slow_clk_select(s_bt_lpclk_src);
} }
esp_err_t esp_bt_controller_init(esp_bt_controller_config_t *cfg) esp_err_t esp_bt_controller_init(esp_bt_controller_config_t *cfg)
{ {
uint8_t mac[6]; uint8_t mac[6];
@@ -1191,6 +1197,13 @@ esp_err_t esp_bt_controller_init(esp_bt_controller_config_t *cfg)
goto free_controller; goto free_controller;
} }
if (!esp_ble_controller_lib_check()) {
ESP_LOGW(NIMBLE_PORT_LOG_TAG, "Controller lib version mismatch!");
}
#if (CONFIG_BT_CONTROLLER_ONLY) && (CONFIG_BT_LE_SM_SC) && (!CONFIG_BT_LE_CRYPTO_STACK_MBEDTLS)
uECC_set_rng(ecc_rand_func);
#endif // (CONFIG_BT_CONTROLLER_ONLY) && (CONFIG_BT_LE_SM_SC) && (!CONFIG_BT_LE_CRYPTO_STACK_MBEDTLS)
return ESP_OK; return ESP_OK;
free_controller: free_controller:
hci_transport_deinit(); hci_transport_deinit();
@@ -1443,7 +1456,6 @@ esp_err_t esp_bt_mem_release(esp_bt_mode_t mode)
return ret; return ret;
} }
esp_bt_controller_status_t esp_bt_controller_get_status(void) esp_bt_controller_status_t esp_bt_controller_get_status(void)
{ {
return ble_controller_status; return ble_controller_status;
@@ -1664,6 +1676,25 @@ static mbedtls_ecp_keypair keypair;
#if CONFIG_BT_LE_SM_SC #if CONFIG_BT_LE_SM_SC
#include "tinycrypt/cmac_mode.h" #include "tinycrypt/cmac_mode.h"
#include "tinycrypt/ecc_dh.h" #include "tinycrypt/ecc_dh.h"
/* Used by uECC to get random data */
static int ecc_rand_func(uint8_t *dst, unsigned int len)
{
int offset_cnt = 0;
uint8_t *u8ptr = dst;
uint64_t random_64 = 0;
while(len > 0) {
random64 = (uint64_t)esp_random();
random64 = (random64 << 32)| (uint64_t)esp_random();;
offset_cnt = len < sizeof(uint64_t) ? len : sizeof(uint64_t);
memcpy(u8ptr, &random64, offset_cnt);
len -= offset_cnt;
u8ptr += offset_cnt;
}
return 1;
}
#endif // CONFIG_BT_LE_SM_SC #endif // CONFIG_BT_LE_SM_SC
#endif // CONFIG_BT_LE_CRYPTO_STACK_MBEDTLS #endif // CONFIG_BT_LE_CRYPTO_STACK_MBEDTLS
@@ -1755,11 +1786,11 @@ exit:
} }
#else #else
if (uECC_valid_public_key(pk, &curve_secp256r1) < 0) { if (uECC_valid_public_key(pk, uECC_secp256r1()) < 0) {
return BLE_SM_KEY_ERR; return BLE_SM_KEY_ERR;
} }
rc = uECC_shared_secret(pk, priv, dh, &curve_secp256r1); rc = uECC_shared_secret(pk, priv, dh, uECC_secp256r1());
if (rc == TC_CRYPTO_FAIL) { if (rc == TC_CRYPTO_FAIL) {
return BLE_SM_KEY_ERR; return BLE_SM_KEY_ERR;
} }
@@ -1835,7 +1866,7 @@ int ble_sm_alg_gen_key_pair(uint8_t *pub, uint8_t *priv)
return BLE_SM_KEY_ERR; return BLE_SM_KEY_ERR;
} }
#else #else
if (uECC_make_key(pk, priv, &curve_secp256r1) != TC_CRYPTO_SUCCESS) { if (uECC_make_key(pk, priv, uECC_secp256r1()) != TC_CRYPTO_SUCCESS) {
return BLE_SM_KEY_ERR; return BLE_SM_KEY_ERR;
} }
#endif // CONFIG_BT_LE_CRYPTO_STACK_MBEDTLS #endif // CONFIG_BT_LE_CRYPTO_STACK_MBEDTLS
@@ -1851,7 +1882,6 @@ int ble_sm_alg_gen_key_pair(uint8_t *pub, uint8_t *priv)
#endif // CONFIG_BT_LE_SM_LEGACY || CONFIG_BT_LE_SM_SC #endif // CONFIG_BT_LE_SM_LEGACY || CONFIG_BT_LE_SM_SC
#endif // (!CONFIG_BT_NIMBLE_ENABLED) && (CONFIG_BT_CONTROLLER_ENABLED) #endif // (!CONFIG_BT_NIMBLE_ENABLED) && (CONFIG_BT_CONTROLLER_ENABLED)
#if CONFIG_BT_LE_DEBUG_REMAIN_SCENE_ENABLED #if CONFIG_BT_LE_DEBUG_REMAIN_SCENE_ENABLED
#include "esp_gdbstub.h" #include "esp_gdbstub.h"
#endif // CONFIG_BT_LE_DEBUG_REMAIN_SCENE_ENABLED #endif // CONFIG_BT_LE_DEBUG_REMAIN_SCENE_ENABLED
@@ -218,6 +218,13 @@ extern "C" {
#define DEFAULT_BT_LE_CTRL_SLV_FAST_RX_CONN_DATA_EN (0) #define DEFAULT_BT_LE_CTRL_SLV_FAST_RX_CONN_DATA_EN (0)
#endif #endif
#if defined(CONFIG_BT_LE_CTRL_DL_ITVL_PHY_SYNC_EN)
#define DEFAULT_BT_LE_CTRL_DL_ITVL_PHY_SYNC_EN (CONFIG_BT_LE_CTRL_DL_ITVL_PHY_SYNC_EN)
#else
#define DEFAULT_BT_LE_CTRL_DL_ITVL_PHY_SYNC_EN (0)
#endif
#ifdef CONFIG_BT_LE_HCI_INTERFACE_USE_UART #ifdef CONFIG_BT_LE_HCI_INTERFACE_USE_UART
#define HCI_UART_EN CONFIG_BT_LE_HCI_INTERFACE_USE_UART #define HCI_UART_EN CONFIG_BT_LE_HCI_INTERFACE_USE_UART
#else #else
@@ -307,7 +314,6 @@ extern "C" {
#define RUN_QA_TEST (0) #define RUN_QA_TEST (0)
#define NIMBLE_DISABLE_SCAN_BACKOFF (0) #define NIMBLE_DISABLE_SCAN_BACKOFF (0)
#define BT_LL_CTRL_PRIO_LVL_CFG ((CONFIG_BT_LE_DFT_SYNC_SCHED_PRIO_LEVEL << 4) | (CONFIG_BT_LE_DFT_PERIODIC_ADV_SCHED_PRIO_LEVEL << 2) | CONFIG_BT_LE_DFT_ADV_SCHED_PRIO_LEVEL) #define BT_LL_CTRL_PRIO_LVL_CFG ((CONFIG_BT_LE_DFT_SYNC_SCHED_PRIO_LEVEL << 4) | (CONFIG_BT_LE_DFT_PERIODIC_ADV_SCHED_PRIO_LEVEL << 2) | CONFIG_BT_LE_DFT_ADV_SCHED_PRIO_LEVEL)
#ifdef __cplusplus #ifdef __cplusplus
} }
#endif #endif
@@ -156,7 +156,7 @@ esp_err_t esp_ble_tx_power_set_enhanced(esp_ble_enhanced_power_type_t power_type
*/ */
esp_power_level_t esp_ble_tx_power_get_enhanced(esp_ble_enhanced_power_type_t power_type, uint16_t handle); esp_power_level_t esp_ble_tx_power_get_enhanced(esp_ble_enhanced_power_type_t power_type, uint16_t handle);
#define CONFIG_VERSION 0x20251104 #define CONFIG_VERSION 0x20251125
#define CONFIG_MAGIC 0x5A5AA5A5 #define CONFIG_MAGIC 0x5A5AA5A5
/** /**
@@ -236,6 +236,7 @@ typedef struct {
uint8_t conn_rsv_cnt; /*!< BLE conn state machine reserve count number */ uint8_t conn_rsv_cnt; /*!< BLE conn state machine reserve count number */
uint8_t priority_level_cfg; /*!< The option for priority level configuration */ uint8_t priority_level_cfg; /*!< The option for priority level configuration */
uint8_t slv_fst_rx_lat_en; /*!< The option for enabling slave fast PDU reception during latency. */ uint8_t slv_fst_rx_lat_en; /*!< The option for enabling slave fast PDU reception during latency. */
uint8_t dl_itvl_phy_sync_en; /*!< The option for automatically initiate the data length update when phy update or connect interval update. */
uint32_t config_magic; /*!< Magic number for configuration validation */ uint32_t config_magic; /*!< Magic number for configuration validation */
} esp_bt_controller_config_t; } esp_bt_controller_config_t;
@@ -301,7 +302,8 @@ typedef struct {
.adv_rsv_cnt = BLE_LL_ADV_SM_RESERVE_CNT_N, \ .adv_rsv_cnt = BLE_LL_ADV_SM_RESERVE_CNT_N, \
.conn_rsv_cnt = BLE_LL_CONN_SM_RESERVE_CNT_N, \ .conn_rsv_cnt = BLE_LL_CONN_SM_RESERVE_CNT_N, \
.priority_level_cfg = BT_LL_CTRL_PRIO_LVL_CFG, \ .priority_level_cfg = BT_LL_CTRL_PRIO_LVL_CFG, \
.slv_fst_rx_lat_en = DEFAULT_BT_LE_CTRL_SLV_FAST_RX_CONN_DATA_EN, \ .slv_fst_rx_lat_en = DEFAULT_BT_LE_CTRL_SLV_FAST_RX_CONN_DATA_EN, \
.dl_itvl_phy_sync_en = DEFAULT_BT_LE_CTRL_DL_ITVL_PHY_SYNC_EN, \
.config_magic = CONFIG_MAGIC, \ .config_magic = CONFIG_MAGIC, \
} }
#elif CONFIG_IDF_TARGET_ESP32C61 #elif CONFIG_IDF_TARGET_ESP32C61
@@ -365,6 +367,7 @@ typedef struct {
.conn_rsv_cnt = BLE_LL_CONN_SM_RESERVE_CNT_N, \ .conn_rsv_cnt = BLE_LL_CONN_SM_RESERVE_CNT_N, \
.priority_level_cfg = BT_LL_CTRL_PRIO_LVL_CFG, \ .priority_level_cfg = BT_LL_CTRL_PRIO_LVL_CFG, \
.slv_fst_rx_lat_en = DEFAULT_BT_LE_CTRL_SLV_FAST_RX_CONN_DATA_EN, \ .slv_fst_rx_lat_en = DEFAULT_BT_LE_CTRL_SLV_FAST_RX_CONN_DATA_EN, \
.dl_itvl_phy_sync_en = DEFAULT_BT_LE_CTRL_DL_ITVL_PHY_SYNC_EN, \
.config_magic = CONFIG_MAGIC, \ .config_magic = CONFIG_MAGIC, \
} }
#endif #endif