From 3afb8341881c178bd233da4e90904f90d19144d5 Mon Sep 17 00:00:00 2001 From: Zhou Xiao Date: Mon, 29 Dec 2025 16:41:33 +0800 Subject: [PATCH 1/3] fix(ble): add esp timer trigger back for timestamp synchronization --- components/bt/common/ble_log/Kconfig.in | 38 ++++++++++-- components/bt/common/ble_log/src/ble_log_rt.c | 61 ++++++++++++++++--- .../ble_log/src/internal_include/ble_log_rt.h | 5 ++ 3 files changed, 88 insertions(+), 16 deletions(-) diff --git a/components/bt/common/ble_log/Kconfig.in b/components/bt/common/ble_log/Kconfig.in index edf459311d..6eca6ad4e5 100644 --- a/components/bt/common/ble_log/Kconfig.in +++ b/components/bt/common/ble_log/Kconfig.in @@ -110,12 +110,38 @@ if BLE_LOG_ENABLED help Enable BLE Log TS with external logging module - config BLE_LOG_SYNC_IO_NUM - int "GPIO number for Timestamp Synchronization (TS) toggle output" - depends on BLE_LOG_TS_ENABLED - default 0 - help - GPIO number for TS toggle output + if BLE_LOG_TS_ENABLED + config BLE_LOG_SYNC_IO_NUM + int "GPIO number for Timestamp Synchronization (TS) toggle output" + depends on BLE_LOG_TS_ENABLED + default 0 + help + GPIO number for TS toggle output + + config BLE_LOG_TS_TRIGGER_TIMEOUT_MS + int "Timeout (ms) for Timestamp Synchronization toggle" + default 1000 + help + Timeout (ms) for Timestamp Synchronization toggle + + choice BLE_LOG_TS_TRIGGER_CHOICE + prompt "BLE Log Timestamp Synchronization trigger choice" + default BLE_LOG_TS_TRIGGER_TASK_EVENT + help + Choose BLE Log Timestamp Synchronization trigger + + config BLE_LOG_TS_TRIGGER_ESP_TIMER + bool "BLE Log Timestamp Synchronization trigger - ESP Timer" + select ESP_TIMER_SUPPORTS_ISR_DISPATCH_METHOD + help + ESP Timer based periodic TS trigger + + config BLE_LOG_TS_TRIGGER_TASK_EVENT + bool "BLE Log Timestamp Synchronization trigger - Task Event" + help + Task Event based TS trigger (Light Sleep Test Compatibility) + endchoice + endif choice BLE_LOG_PRPH_CHOICE prompt "BLE Log peripheral choice" diff --git a/components/bt/common/ble_log/src/ble_log_rt.c b/components/bt/common/ble_log/src/ble_log_rt.c index 7268797e36..1c9c829f11 100644 --- a/components/bt/common/ble_log/src/ble_log_rt.c +++ b/components/bt/common/ble_log/src/ble_log_rt.c @@ -19,6 +19,15 @@ BLE_LOG_STATIC TaskHandle_t rt_task_handle = NULL; BLE_LOG_STATIC QueueHandle_t rt_queue_handle = NULL; #if CONFIG_BLE_LOG_TS_ENABLED BLE_LOG_STATIC bool rt_ts_enabled = false; +#if CONFIG_BLE_LOG_TS_TRIGGER_ESP_TIMER +BLE_LOG_STATIC esp_timer_handle_t rt_ts_timer = NULL; +#endif /* CONFIG_BLE_LOG_TS_TRIGGER_ESP_TIMER */ +#endif /* CONFIG_BLE_LOG_TS_ENABLED */ + +/* PRIVATE FUNCTION DECLARATION */ +#if CONFIG_BLE_LOG_TS_ENABLED +BLE_LOG_STATIC void ble_log_rt_task(void *pvParameters); +BLE_LOG_STATIC void ble_log_rt_ts_trigger(void *arg); #endif /* CONFIG_BLE_LOG_TS_ENABLED */ /* PRIVATE FUNCTION */ @@ -56,15 +65,9 @@ BLE_LOG_IRAM_ATTR BLE_LOG_STATIC void ble_log_rt_task(void *pvParameters) }; ble_log_write_hex(BLE_LOG_SRC_INTERNAL, (const uint8_t *)&ble_log_info, sizeof(ble_log_info_t)); -#if CONFIG_BLE_LOG_TS_ENABLED - if (rt_ts_enabled) { - ble_log_ts_info_t *ts_info = NULL; - ble_log_ts_info_update(&ts_info); - if (ts_info) { - ble_log_write_hex(BLE_LOG_SRC_INTERNAL, (const uint8_t *)ts_info, sizeof(ble_log_ts_info_t)); - } - } -#endif /* CONFIG_BLE_LOG_TS_ENABLED */ +#if CONFIG_BLE_LOG_TS_TRIGGER_TASK_EVENT + ble_log_rt_ts_trigger(NULL); +#endif /* CONFIG_BLE_LOG_TS_TRIGGER_TASK_EVENT */ #if CONFIG_BLE_LOG_ENH_STAT_ENABLED ble_log_write_enh_stat(); @@ -72,6 +75,21 @@ BLE_LOG_IRAM_ATTR BLE_LOG_STATIC void ble_log_rt_task(void *pvParameters) } } +#if CONFIG_BLE_LOG_TS_ENABLED +BLE_LOG_STATIC void ble_log_rt_ts_trigger(void *arg) +{ + (void)arg; + if (!rt_inited || !rt_ts_enabled) { + return; + } + ble_log_ts_info_t *ts_info = NULL; + ble_log_ts_info_update(&ts_info); + if (ts_info) { + ble_log_write_hex(BLE_LOG_SRC_INTERNAL, (const uint8_t *)ts_info, sizeof(ble_log_ts_info_t)); + } +} +#endif /* CONFIG_BLE_LOG_TS_ENABLED */ + /* INTERFACE */ bool ble_log_rt_init(void) { @@ -92,10 +110,26 @@ bool ble_log_rt_init(void) goto exit; } - rt_inited = true; #if CONFIG_BLE_LOG_TS_ENABLED rt_ts_enabled = false; +#if CONFIG_BLE_LOG_TS_TRIGGER_ESP_TIMER + /* Initialize ESP Timer Trigger */ + esp_timer_create_args_t ts_timer_args = { + .callback = ble_log_rt_ts_trigger, + .arg = NULL, + .dispatch_method = ESP_TIMER_ISR, + .name = "ble_log_ts_timer", + }; + if (esp_timer_create(&ts_timer_args, &rt_ts_timer) != ESP_OK) { + goto exit; + } + if (esp_timer_start_periodic(rt_ts_timer, BLE_LOG_TS_TRIGGER_TIMEOUT_US) != ESP_OK) { + goto exit; + } +#endif /* CONFIG_BLE_LOG_TS_TRIGGER_ESP_TIMER */ #endif /* CONFIG_BLE_LOG_TS_ENABLED */ + + rt_inited = true; return true; exit: @@ -108,6 +142,13 @@ void ble_log_rt_deinit(void) rt_inited = false; #if CONFIG_BLE_LOG_TS_ENABLED rt_ts_enabled = false; +#if CONFIG_BLE_LOG_TS_TRIGGER_ESP_TIMER + if (rt_ts_timer) { + esp_timer_stop(rt_ts_timer); + esp_timer_delete(rt_ts_timer); + rt_ts_timer = NULL; + } +#endif /* CONFIG_BLE_LOG_TS_TRIGGER_ESP_TIMER */ #endif /* CONFIG_BLE_LOG_TS_ENABLED */ /* CRITICAL: diff --git a/components/bt/common/ble_log/src/internal_include/ble_log_rt.h b/components/bt/common/ble_log/src/internal_include/ble_log_rt.h index ae8b4b05a3..7becb1202b 100644 --- a/components/bt/common/ble_log/src/internal_include/ble_log_rt.h +++ b/components/bt/common/ble_log/src/internal_include/ble_log_rt.h @@ -22,7 +22,12 @@ /* MACRO */ #define BLE_LOG_TASK_PRIO (ESP_TASK_PRIO_MAX - 1) #define BLE_LOG_TASK_STACK_SIZE CONFIG_BLE_LOG_TASK_STACK_SIZE +#if CONFIG_BLE_LOG_TS_ENABLED +#define BLE_LOG_TS_TRIGGER_TIMEOUT_US (CONFIG_BLE_LOG_TS_TRIGGER_TIMEOUT_MS * 1000) +#define BLE_LOG_TASK_HOOK_TIMEOUT_MS CONFIG_BLE_LOG_TS_TRIGGER_TIMEOUT_MS +#else /* !CONFIG_BLE_LOG_TS_ENABLED */ #define BLE_LOG_TASK_HOOK_TIMEOUT_MS (1000) +#endif /* CONFIG_BLE_LOG_TS_ENABLED */ /* INTERFACE */ bool ble_log_rt_init(); From 8013603aeb7dd52a0b3b9f5cc09111fd7f603ba4 Mon Sep 17 00:00:00 2001 From: Zhou Xiao Date: Tue, 30 Dec 2025 17:28:58 +0800 Subject: [PATCH 2/3] feat(ble): provide isr dispatch method option for ble log ts --- components/bt/common/ble_log/Kconfig.in | 10 +++++++++- components/bt/common/ble_log/src/ble_log_rt.c | 5 +++++ components/bt/common/ble_log/src/ble_log_ts.c | 3 +++ 3 files changed, 17 insertions(+), 1 deletion(-) diff --git a/components/bt/common/ble_log/Kconfig.in b/components/bt/common/ble_log/Kconfig.in index 6eca6ad4e5..35405367e2 100644 --- a/components/bt/common/ble_log/Kconfig.in +++ b/components/bt/common/ble_log/Kconfig.in @@ -132,7 +132,6 @@ if BLE_LOG_ENABLED config BLE_LOG_TS_TRIGGER_ESP_TIMER bool "BLE Log Timestamp Synchronization trigger - ESP Timer" - select ESP_TIMER_SUPPORTS_ISR_DISPATCH_METHOD help ESP Timer based periodic TS trigger @@ -141,6 +140,15 @@ if BLE_LOG_ENABLED help Task Event based TS trigger (Light Sleep Test Compatibility) endchoice + + config BLE_LOG_TS_TRIGGER_ESP_TIMER_ISR_DISPATCH_METHOD + bool "Utilize ISR dispatch method for ESP Timer as Timestamp Synchronization trigger" + default n + select ESP_TIMER_SUPPORTS_ISR_DISPATCH_METHOD + select GPIO_CTRL_FUNC_IN_IRAM + depends on BLE_LOG_TS_TRIGGER_ESP_TIMER + help + Utilize ISR dispatch method for ESP Timer as Timestamp Synchronization trigger endif choice BLE_LOG_PRPH_CHOICE diff --git a/components/bt/common/ble_log/src/ble_log_rt.c b/components/bt/common/ble_log/src/ble_log_rt.c index 1c9c829f11..951d4d2a45 100644 --- a/components/bt/common/ble_log/src/ble_log_rt.c +++ b/components/bt/common/ble_log/src/ble_log_rt.c @@ -76,6 +76,9 @@ BLE_LOG_IRAM_ATTR BLE_LOG_STATIC void ble_log_rt_task(void *pvParameters) } #if CONFIG_BLE_LOG_TS_ENABLED +#if CONFIG_BLE_LOG_TS_TRIGGER_ESP_TIMER_ISR_DISPATCH_METHOD +BLE_LOG_IRAM_ATTR +#endif /* CONFIG_BLE_LOG_TS_TRIGGER_ESP_TIMER_ISR_DISPATCH_METHOD */ BLE_LOG_STATIC void ble_log_rt_ts_trigger(void *arg) { (void)arg; @@ -117,7 +120,9 @@ bool ble_log_rt_init(void) esp_timer_create_args_t ts_timer_args = { .callback = ble_log_rt_ts_trigger, .arg = NULL, +#if CONFIG_BLE_LOG_TS_TRIGGER_ESP_TIMER_ISR_DISPATCH_METHOD .dispatch_method = ESP_TIMER_ISR, +#endif /* CONFIG_BLE_LOG_TS_TRIGGER_ESP_TIMER_ISR_DISPATCH_METHOD */ .name = "ble_log_ts_timer", }; if (esp_timer_create(&ts_timer_args, &rt_ts_timer) != ESP_OK) { diff --git a/components/bt/common/ble_log/src/ble_log_ts.c b/components/bt/common/ble_log/src/ble_log_ts.c index e01611da10..db719b3dc5 100644 --- a/components/bt/common/ble_log/src/ble_log_ts.c +++ b/components/bt/common/ble_log/src/ble_log_ts.c @@ -61,6 +61,9 @@ void ble_log_ts_deinit(void) gpio_reset_pin(CONFIG_BLE_LOG_SYNC_IO_NUM); } +#if CONFIG_BLE_LOG_TS_TRIGGER_ESP_TIMER_ISR_DISPATCH_METHOD +BLE_LOG_IRAM_ATTR +#endif /* CONFIG_BLE_LOG_TS_TRIGGER_ESP_TIMER_ISR_DISPATCH_METHOD */ void ble_log_ts_info_update(ble_log_ts_info_t **info) { if (!ts_inited) { From a18f531aa39a68cb05b3c0f8b573c8c5e3a9cdc2 Mon Sep 17 00:00:00 2001 From: Zhou Xiao Date: Sun, 4 Jan 2026 10:17:34 +0800 Subject: [PATCH 3/3] fix(ble): fixed cache error risk in ble log module --- components/bt/common/ble_log/src/ble_log_lbm.c | 3 ++- components/bt/common/ble_log/src/ble_log_util.c | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/components/bt/common/ble_log/src/ble_log_lbm.c b/components/bt/common/ble_log/src/ble_log_lbm.c index 0cc996c721..4504663c5f 100644 --- a/components/bt/common/ble_log/src/ble_log_lbm.c +++ b/components/bt/common/ble_log/src/ble_log_lbm.c @@ -107,7 +107,8 @@ void ble_log_lbm_write_trans(ble_log_prph_trans_t **trans, ble_log_src_t src_cod } if (len_append) { #if CONFIG_SOC_ESP_NIMBLE_CONTROLLER - if (omdata) { + if (omdata && !BLE_LOG_IN_ISR()) { + /* os_mbuf_copydata is in flash and not safe to call from ISR */ os_mbuf_copydata((struct os_mbuf *)addr_append, 0, len_append, buf + BLE_LOG_FRAME_HEAD_LEN + len); } diff --git a/components/bt/common/ble_log/src/ble_log_util.c b/components/bt/common/ble_log/src/ble_log_util.c index c084d6d249..aac709e4e1 100644 --- a/components/bt/common/ble_log/src/ble_log_util.c +++ b/components/bt/common/ble_log/src/ble_log_util.c @@ -20,7 +20,8 @@ portMUX_TYPE ble_log_spin_lock = portMUX_INITIALIZER_UNLOCKED; #if CONFIG_BLE_LOG_XOR_CHECKSUM_ENABLED #include "esp_compiler.h" -static inline uint32_t ror32(uint32_t word, uint32_t shift) +BLE_LOG_IRAM_ATTR BLE_LOG_STATIC BLE_LOG_INLINE +uint32_t ror32(uint32_t word, uint32_t shift) { if (unlikely(shift == 0)) { return word;