diff --git a/components/bt/controller/lib_esp32s31/esp32s31-bt-lib b/components/bt/controller/lib_esp32s31/esp32s31-bt-lib index e9a13372bc4..945cc25c8dc 160000 --- a/components/bt/controller/lib_esp32s31/esp32s31-bt-lib +++ b/components/bt/controller/lib_esp32s31/esp32s31-bt-lib @@ -1 +1 @@ -Subproject commit e9a13372bc479c887b17df609369a0bad303e2cd +Subproject commit 945cc25c8dcfcca6952a35523cdcb68eb3b16648 diff --git a/components/bt/porting_btdm/controller/bredr/src/bredr.c b/components/bt/porting_btdm/controller/bredr/src/bredr.c index 67e68b68778..7d6f5947246 100644 --- a/components/bt/porting_btdm/controller/bredr/src/bredr.c +++ b/components/bt/porting_btdm/controller/bredr/src/bredr.c @@ -6,6 +6,7 @@ #include #include #include +#include #include #include "sdkconfig.h" @@ -68,7 +69,10 @@ #define BREDR_P192_COORD_LEN 24U #define BREDR_PUB_KEY_LEN_P256 (1U + BREDR_P256_COORD_LEN * 2) #define BREDR_PUB_KEY_LEN_P192 (1U + BREDR_P192_COORD_LEN * 2) -#define BREDR_LOG_TAG "BREDR_INIT" +#define BREDR_LOG_TAG "BREDR_INIT" +#define BREDR_LOG_BUFFER_SIZE (256) +#define BREDR_LOG_LEVEL_PREFIX_LEN 4U /* "[X] " */ +#define BREDR_LOG_TAG_PREFIX_LEN 4U /* "%s: " */ #if CONFIG_BT_SMP_CRYPTO_STACK_MBEDTLS static const char *TAG_BREDR_CRYPTO = "bredr_crypto"; #endif @@ -85,6 +89,8 @@ typedef struct vhci_host_callback { typedef int (*bredr_ctrl_callback_t)(void); +typedef int (*bredr_log_printf_fn)(const char *fmt, ...); + /* External functions or values ************************************************************************ */ @@ -119,6 +125,7 @@ extern int bredr_ctrl_feat_lk_store_en(void); extern int bredr_ctrl_feat_coex_en(void); extern const char *co_orca_get_git_version_str(void); +extern void r_orca_log_set_printf(bredr_log_printf_fn printf_fn); /* Shutdown */ extern void bredr_controller_shutdown(void); @@ -716,6 +723,49 @@ static int bredr_ctrl_ext_dep_callback(void) return ret; } +static int bredr_log_printf(const char *fmt, ...) +{ + if (fmt == NULL) { + return -1; + } + + char level_ch = 'I'; + const char *log_fmt = fmt; + size_t log_fmt_len = strnlen(fmt, BREDR_LOG_BUFFER_SIZE); + + if (log_fmt_len >= BREDR_LOG_LEVEL_PREFIX_LEN && fmt[0] == '[' && fmt[2] == ']' && fmt[3] == ' ') { + level_ch = fmt[1]; + log_fmt += BREDR_LOG_LEVEL_PREFIX_LEN; + log_fmt_len = strnlen(log_fmt, BREDR_LOG_BUFFER_SIZE); + } + + va_list ap; + va_start(ap, fmt); + const char *tag = va_arg(ap, const char *); + + if (log_fmt_len >= BREDR_LOG_TAG_PREFIX_LEN && log_fmt[0] == '%' && log_fmt[1] == 's' && log_fmt[2] == ':' && + log_fmt[3] == ' ') { + log_fmt += BREDR_LOG_TAG_PREFIX_LEN; + } + + char buf[BREDR_LOG_BUFFER_SIZE]; + int len = vsnprintf(buf, sizeof(buf), log_fmt, ap); + va_end(ap); + if (len <= 0) { + return len; + } + + switch (level_ch) { + case 'E': ESP_LOGE(tag, "%s", buf); break; + case 'W': ESP_LOGW(tag, "%s", buf); break; + case 'D': ESP_LOGD(tag, "%s", buf); break; + case 'V': ESP_LOGV(tag, "%s", buf); break; + default: ESP_LOGI(tag, "%s", buf); break; + } + + return len; +} + int esp_bredr_controller_init(esp_bt_controller_config_t *cfg) { int status; @@ -733,6 +783,8 @@ int esp_bredr_controller_init(esp_bt_controller_config_t *cfg) if (status != 0) { ESP_LOGE(BREDR_LOG_TAG, "bredr_controller_init failed, status:%d", status); err = ESP_ERR_NO_MEM; + } else { + r_orca_log_set_printf(bredr_log_printf); } return err;