mirror of
https://github.com/espressif/esp-idf.git
synced 2025-08-03 20:54:32 +02:00
feat(ble): support host & hci log module
This commit is contained in:
@@ -27,6 +27,14 @@ config BT_BLE_LOG_SPI_OUT_HCI_ENABLED
|
|||||||
help
|
help
|
||||||
Enable logging of HCI packets to the SPI bus when BLE SPI log output is enabled.
|
Enable logging of HCI packets to the SPI bus when BLE SPI log output is enabled.
|
||||||
|
|
||||||
|
config BT_BLE_LOG_SPI_OUT_HCI_BUF_SIZE
|
||||||
|
int "SPI transaction buffer size for HCI logs"
|
||||||
|
depends on BT_BLE_LOG_SPI_OUT_HCI_ENABLED
|
||||||
|
default 1024
|
||||||
|
help
|
||||||
|
SPI transaction buffer size for HCI logs.
|
||||||
|
There will be 2 SPI DMA buffers with the same size.
|
||||||
|
|
||||||
config BT_BLE_LOG_SPI_OUT_HOST_ENABLED
|
config BT_BLE_LOG_SPI_OUT_HOST_ENABLED
|
||||||
bool "Enable Host log output to SPI"
|
bool "Enable Host log output to SPI"
|
||||||
depends on BT_BLE_LOG_SPI_OUT_ENABLED
|
depends on BT_BLE_LOG_SPI_OUT_ENABLED
|
||||||
@@ -35,6 +43,14 @@ config BT_BLE_LOG_SPI_OUT_HOST_ENABLED
|
|||||||
This configuration applies to the logs of both Bluedroid Host and NimBLE Host.
|
This configuration applies to the logs of both Bluedroid Host and NimBLE Host.
|
||||||
When BLE SPI log output is enabled, this option allows host logs to be transmitted via SPI.
|
When BLE SPI log output is enabled, this option allows host logs to be transmitted via SPI.
|
||||||
|
|
||||||
|
config BT_BLE_LOG_SPI_OUT_HOST_BUF_SIZE
|
||||||
|
int "SPI transaction buffer size for host logs"
|
||||||
|
depends on BT_BLE_LOG_SPI_OUT_HOST_ENABLED
|
||||||
|
default 1024
|
||||||
|
help
|
||||||
|
SPI transaction buffer size for host logs.
|
||||||
|
There will be 2 SPI DMA buffers with the same size.
|
||||||
|
|
||||||
config BT_BLE_LOG_SPI_OUT_LL_ENABLED
|
config BT_BLE_LOG_SPI_OUT_LL_ENABLED
|
||||||
bool "Enable Controller log output to SPI"
|
bool "Enable Controller log output to SPI"
|
||||||
depends on BT_BLE_LOG_SPI_OUT_ENABLED
|
depends on BT_BLE_LOG_SPI_OUT_ENABLED
|
||||||
|
@@ -26,6 +26,10 @@
|
|||||||
#define SPI_OUT_FLUSH_TIMEOUT_US (CONFIG_BT_BLE_LOG_SPI_OUT_FLUSH_TIMEOUT * 1000)
|
#define SPI_OUT_FLUSH_TIMEOUT_US (CONFIG_BT_BLE_LOG_SPI_OUT_FLUSH_TIMEOUT * 1000)
|
||||||
#define SPI_OUT_LE_AUDIO_ENABLED CONFIG_BT_BLE_LOG_SPI_OUT_LE_AUDIO_ENABLED
|
#define SPI_OUT_LE_AUDIO_ENABLED CONFIG_BT_BLE_LOG_SPI_OUT_LE_AUDIO_ENABLED
|
||||||
#define SPI_OUT_LE_AUDIO_BUF_SIZE CONFIG_BT_BLE_LOG_SPI_OUT_LE_AUDIO_BUF_SIZE
|
#define SPI_OUT_LE_AUDIO_BUF_SIZE CONFIG_BT_BLE_LOG_SPI_OUT_LE_AUDIO_BUF_SIZE
|
||||||
|
#define SPI_OUT_HOST_ENABLED CONFIG_BT_BLE_LOG_SPI_OUT_HOST_ENABLED
|
||||||
|
#define SPI_OUT_HOST_BUF_SIZE CONFIG_BT_BLE_LOG_SPI_OUT_HOST_BUF_SIZE
|
||||||
|
#define SPI_OUT_HCI_ENABLED CONFIG_BT_BLE_LOG_SPI_OUT_HCI_ENABLED
|
||||||
|
#define SPI_OUT_HCI_BUF_SIZE CONFIG_BT_BLE_LOG_SPI_OUT_HCI_BUF_SIZE
|
||||||
|
|
||||||
// Private defines
|
// Private defines
|
||||||
#define BLE_LOG_TAG "BLE_LOG"
|
#define BLE_LOG_TAG "BLE_LOG"
|
||||||
@@ -60,9 +64,23 @@
|
|||||||
#define SPI_OUT_LE_AUDIO_QUEUE_SIZE (0)
|
#define SPI_OUT_LE_AUDIO_QUEUE_SIZE (0)
|
||||||
#endif // SPI_OUT_LE_AUDIO_ENABLED
|
#endif // SPI_OUT_LE_AUDIO_ENABLED
|
||||||
|
|
||||||
|
#if SPI_OUT_HOST_ENABLED
|
||||||
|
#define SPI_OUT_HOST_QUEUE_SIZE (SPI_OUT_PING_PONG_BUF_CNT)
|
||||||
|
#else
|
||||||
|
#define SPI_OUT_HOST_QUEUE_SIZE (0)
|
||||||
|
#endif // SPI_OUT_HOST_ENABLED
|
||||||
|
|
||||||
|
#if SPI_OUT_HCI_ENABLED
|
||||||
|
#define SPI_OUT_HCI_QUEUE_SIZE (SPI_OUT_PING_PONG_BUF_CNT)
|
||||||
|
#else
|
||||||
|
#define SPI_OUT_HCI_QUEUE_SIZE (0)
|
||||||
|
#endif // SPI_OUT_HCI_ENABLED
|
||||||
|
|
||||||
#define SPI_OUT_SPI_MASTER_QUEUE_SIZE (SPI_OUT_UL_QUEUE_SIZE +\
|
#define SPI_OUT_SPI_MASTER_QUEUE_SIZE (SPI_OUT_UL_QUEUE_SIZE +\
|
||||||
SPI_OUT_LL_QUEUE_SIZE +\
|
SPI_OUT_LL_QUEUE_SIZE +\
|
||||||
SPI_OUT_LE_AUDIO_QUEUE_SIZE)
|
SPI_OUT_LE_AUDIO_QUEUE_SIZE +\
|
||||||
|
SPI_OUT_HOST_QUEUE_SIZE +\
|
||||||
|
SPI_OUT_HCI_QUEUE_SIZE)
|
||||||
|
|
||||||
// Private typedefs
|
// Private typedefs
|
||||||
typedef struct {
|
typedef struct {
|
||||||
@@ -114,6 +132,8 @@ enum {
|
|||||||
LOG_CB_TYPE_LL_ISR,
|
LOG_CB_TYPE_LL_ISR,
|
||||||
LOG_CB_TYPE_LL_HCI,
|
LOG_CB_TYPE_LL_HCI,
|
||||||
LOG_CB_TYPE_LE_AUDIO,
|
LOG_CB_TYPE_LE_AUDIO,
|
||||||
|
LOG_CB_TYPE_HOST,
|
||||||
|
LOG_CB_TYPE_HCI,
|
||||||
};
|
};
|
||||||
|
|
||||||
enum {
|
enum {
|
||||||
@@ -123,6 +143,7 @@ enum {
|
|||||||
LL_LOG_FLAG_ISR,
|
LL_LOG_FLAG_ISR,
|
||||||
LL_LOG_FLAG_HCI,
|
LL_LOG_FLAG_HCI,
|
||||||
LL_LOG_FLAG_RAW,
|
LL_LOG_FLAG_RAW,
|
||||||
|
LL_LOG_FLAG_HCI_UPSTREAM,
|
||||||
};
|
};
|
||||||
|
|
||||||
enum {
|
enum {
|
||||||
@@ -180,10 +201,9 @@ static void spi_out_log_cb_write_loss(spi_out_log_cb_t *log_cb);
|
|||||||
static void spi_out_log_cb_dump(spi_out_log_cb_t *log_cb);
|
static void spi_out_log_cb_dump(spi_out_log_cb_t *log_cb);
|
||||||
static void spi_out_log_flush(void);
|
static void spi_out_log_flush(void);
|
||||||
|
|
||||||
static inline spi_out_log_cb_t *spi_out_get_log_cb(uint8_t source);
|
static void spi_out_write_hex(spi_out_log_cb_t *log_cb, uint8_t source,
|
||||||
static inline uint8_t *spi_out_get_str_buf(uint8_t source);
|
const uint8_t *addr, uint16_t len, bool with_ts);
|
||||||
static void spi_out_log_write(uint8_t source, const uint8_t *addr, uint16_t len, bool with_ts);
|
static int spi_out_write_str(uint8_t *str_buf, const char *format, va_list args, int offset);
|
||||||
static bool spi_out_log_printf(uint8_t source, const char *format, va_list args, int offset);
|
|
||||||
|
|
||||||
#if SPI_OUT_LL_ENABLED
|
#if SPI_OUT_LL_ENABLED
|
||||||
static int spi_out_ll_log_init(void);
|
static int spi_out_ll_log_init(void);
|
||||||
@@ -314,6 +334,14 @@ DECLARE_LOG_MODULE(ul, LOG_CB_TYPE_UL, SPI_OUT_UL_TASK_BUF_SIZE, 1, 1)
|
|||||||
DECLARE_LOG_MODULE(le_audio, LOG_CB_TYPE_LE_AUDIO, SPI_OUT_LE_AUDIO_BUF_SIZE, 0, 0)
|
DECLARE_LOG_MODULE(le_audio, LOG_CB_TYPE_LE_AUDIO, SPI_OUT_LE_AUDIO_BUF_SIZE, 0, 0)
|
||||||
#endif // SPI_OUT_LE_AUDIO_ENABLED
|
#endif // SPI_OUT_LE_AUDIO_ENABLED
|
||||||
|
|
||||||
|
#if SPI_OUT_HOST_ENABLED
|
||||||
|
DECLARE_LOG_MODULE(host, LOG_CB_TYPE_HOST, SPI_OUT_HOST_BUF_SIZE, 0, 1)
|
||||||
|
#endif // SPI_OUT_HOST_ENABLED
|
||||||
|
|
||||||
|
#if SPI_OUT_HCI_ENABLED
|
||||||
|
DECLARE_LOG_MODULE(hci, LOG_CB_TYPE_HCI, SPI_OUT_HCI_BUF_SIZE, 0, 0)
|
||||||
|
#endif // SPI_OUT_HCI_ENABLED
|
||||||
|
|
||||||
// Private functions
|
// Private functions
|
||||||
static int spi_out_init_trans(spi_out_trans_cb_t **trans_cb, uint16_t buf_size)
|
static int spi_out_init_trans(spi_out_trans_cb_t **trans_cb, uint16_t buf_size)
|
||||||
{
|
{
|
||||||
@@ -581,6 +609,14 @@ static void spi_out_log_flush(void)
|
|||||||
#if SPI_OUT_LE_AUDIO_ENABLED
|
#if SPI_OUT_LE_AUDIO_ENABLED
|
||||||
LOG_MODULE_FLUSH(le_audio)();
|
LOG_MODULE_FLUSH(le_audio)();
|
||||||
#endif // SPI_OUT_LE_AUDIO_ENABLED
|
#endif // SPI_OUT_LE_AUDIO_ENABLED
|
||||||
|
|
||||||
|
#if SPI_OUT_HOST_ENABLED
|
||||||
|
LOG_MODULE_FLUSH(host)();
|
||||||
|
#endif // SPI_OUT_HOST_ENABLED
|
||||||
|
|
||||||
|
#if SPI_OUT_HCI_ENABLED
|
||||||
|
LOG_MODULE_FLUSH(hci)();
|
||||||
|
#endif // SPI_OUT_HCI_ENABLED
|
||||||
}
|
}
|
||||||
|
|
||||||
#if SPI_OUT_FLUSH_TIMER_ENABLED
|
#if SPI_OUT_FLUSH_TIMER_ENABLED
|
||||||
@@ -592,31 +628,11 @@ static void esp_timer_cb_log_flush(void)
|
|||||||
}
|
}
|
||||||
#endif // SPI_OUT_FLUSH_TIMER_ENABLED
|
#endif // SPI_OUT_FLUSH_TIMER_ENABLED
|
||||||
|
|
||||||
static inline spi_out_log_cb_t *spi_out_get_log_cb(uint8_t source)
|
static void spi_out_write_hex(spi_out_log_cb_t *log_cb, uint8_t source,
|
||||||
{
|
const uint8_t *addr, uint16_t len, bool with_ts)
|
||||||
spi_out_log_cb_t *log_cb;
|
|
||||||
switch (source) {
|
|
||||||
default:
|
|
||||||
log_cb = LOG_MODULE_CB(ul);
|
|
||||||
}
|
|
||||||
return log_cb;
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline uint8_t *spi_out_get_str_buf(uint8_t source)
|
|
||||||
{
|
|
||||||
uint8_t *str_buf;
|
|
||||||
switch (source) {
|
|
||||||
default:
|
|
||||||
str_buf = LOG_MODULE_STR_BUF(ul);
|
|
||||||
}
|
|
||||||
return str_buf;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void spi_out_log_write(uint8_t source, const uint8_t *addr, uint16_t len, bool with_ts)
|
|
||||||
{
|
{
|
||||||
uint16_t total_len = with_ts? (len + sizeof(uint32_t)): len;
|
uint16_t total_len = with_ts? (len + sizeof(uint32_t)): len;
|
||||||
bool need_append;
|
bool need_append;
|
||||||
spi_out_log_cb_t *log_cb = spi_out_get_log_cb(source);
|
|
||||||
if (spi_out_log_cb_check_trans(log_cb, total_len, &need_append)) {
|
if (spi_out_log_cb_check_trans(log_cb, total_len, &need_append)) {
|
||||||
if (with_ts) {
|
if (with_ts) {
|
||||||
uint32_t os_ts = pdTICKS_TO_MS(xTaskGetTickCount());
|
uint32_t os_ts = pdTICKS_TO_MS(xTaskGetTickCount());
|
||||||
@@ -632,24 +648,19 @@ static void spi_out_log_write(uint8_t source, const uint8_t *addr, uint16_t len,
|
|||||||
spi_out_log_cb_write_loss(log_cb);
|
spi_out_log_cb_write_loss(log_cb);
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool spi_out_log_printf(uint8_t source, const char *format, va_list args, int offset)
|
static int spi_out_write_str(uint8_t *str_buf, const char *format, va_list args, int offset)
|
||||||
{
|
{
|
||||||
uint8_t *str_buf = spi_out_get_str_buf(source);
|
int len = vsnprintf((char *)(str_buf + offset), SPI_OUT_LOG_STR_BUF_SIZE - offset, format, args);
|
||||||
int len = vsnprintf((char *)(str_buf + offset),
|
|
||||||
SPI_OUT_LOG_STR_BUF_SIZE - offset, format, args);
|
|
||||||
if (len < 0) {
|
if (len < 0) {
|
||||||
return false;
|
return 0;
|
||||||
}
|
}
|
||||||
len += offset;
|
len += offset;
|
||||||
|
|
||||||
// Truncate string if overflowed
|
|
||||||
if (len >= SPI_OUT_LOG_STR_BUF_SIZE) {
|
if (len >= SPI_OUT_LOG_STR_BUF_SIZE) {
|
||||||
len = SPI_OUT_LOG_STR_BUF_SIZE - 1;
|
len = SPI_OUT_LOG_STR_BUF_SIZE - 1;
|
||||||
str_buf[len] = '\0';
|
str_buf[len] = '\0';
|
||||||
}
|
}
|
||||||
|
return len;
|
||||||
spi_out_log_write(source, str_buf, len, true);
|
|
||||||
return true;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#if SPI_OUT_LL_ENABLED
|
#if SPI_OUT_LL_ENABLED
|
||||||
@@ -919,6 +930,18 @@ int ble_log_spi_out_init(void)
|
|||||||
}
|
}
|
||||||
#endif // SPI_OUT_LE_AUDIO_ENABLED
|
#endif // SPI_OUT_LE_AUDIO_ENABLED
|
||||||
|
|
||||||
|
#if SPI_OUT_HOST_ENABLED
|
||||||
|
if (LOG_MODULE_INIT(host)() != 0) {
|
||||||
|
goto host_init_failed;
|
||||||
|
}
|
||||||
|
#endif // SPI_OUT_HOST_ENABLED
|
||||||
|
|
||||||
|
#if SPI_OUT_HCI_ENABLED
|
||||||
|
if (LOG_MODULE_INIT(hci)() != 0) {
|
||||||
|
goto hci_init_failed;
|
||||||
|
}
|
||||||
|
#endif // SPI_OUT_HCI_ENABLED
|
||||||
|
|
||||||
#if SPI_OUT_FLUSH_TIMER_ENABLED
|
#if SPI_OUT_FLUSH_TIMER_ENABLED
|
||||||
esp_timer_create_args_t timer_args = {
|
esp_timer_create_args_t timer_args = {
|
||||||
.callback = (esp_timer_cb_t)esp_timer_cb_log_flush,
|
.callback = (esp_timer_cb_t)esp_timer_cb_log_flush,
|
||||||
@@ -943,6 +966,14 @@ int ble_log_spi_out_init(void)
|
|||||||
#if SPI_OUT_FLUSH_TIMER_ENABLED
|
#if SPI_OUT_FLUSH_TIMER_ENABLED
|
||||||
timer_init_failed:
|
timer_init_failed:
|
||||||
#endif // SPI_OUT_FLUSH_TIMER_ENABLED
|
#endif // SPI_OUT_FLUSH_TIMER_ENABLED
|
||||||
|
#if SPI_OUT_HCI_ENABLED
|
||||||
|
LOG_MODULE_DEINIT(hci)();
|
||||||
|
hci_init_failed:
|
||||||
|
#endif // SPI_OUT_HCI_ENABLED
|
||||||
|
#if SPI_OUT_HOST_ENABLED
|
||||||
|
LOG_MODULE_DEINIT(host)();
|
||||||
|
host_init_failed:
|
||||||
|
#endif // SPI_OUT_HOST_ENABLED
|
||||||
#if SPI_OUT_LE_AUDIO_ENABLED
|
#if SPI_OUT_LE_AUDIO_ENABLED
|
||||||
LOG_MODULE_DEINIT(le_audio)();
|
LOG_MODULE_DEINIT(le_audio)();
|
||||||
le_audio_init_failed:
|
le_audio_init_failed:
|
||||||
@@ -995,6 +1026,14 @@ void ble_log_spi_out_deinit(void)
|
|||||||
spi_out_ts_sync_deinit();
|
spi_out_ts_sync_deinit();
|
||||||
#endif // SPI_OUT_TS_SYNC_ENABLED
|
#endif // SPI_OUT_TS_SYNC_ENABLED
|
||||||
|
|
||||||
|
#if SPI_OUT_HCI_ENABLED
|
||||||
|
LOG_MODULE_DEINIT(hci)();
|
||||||
|
#endif // SPI_OUT_HCI_ENABLED
|
||||||
|
|
||||||
|
#if SPI_OUT_HOST_ENABLED
|
||||||
|
LOG_MODULE_DEINIT(host)();
|
||||||
|
#endif // SPI_OUT_HOST_ENABLED
|
||||||
|
|
||||||
#if SPI_OUT_LE_AUDIO_ENABLED
|
#if SPI_OUT_LE_AUDIO_ENABLED
|
||||||
LOG_MODULE_DEINIT(le_audio)();
|
LOG_MODULE_DEINIT(le_audio)();
|
||||||
#endif // SPI_OUT_LE_AUDIO_ENABLED
|
#endif // SPI_OUT_LE_AUDIO_ENABLED
|
||||||
@@ -1056,6 +1095,9 @@ IRAM_ATTR void ble_log_spi_out_ll_write(uint32_t len, const uint8_t *addr, uint3
|
|||||||
} else if (flag & BIT(LL_LOG_FLAG_HCI)) {
|
} else if (flag & BIT(LL_LOG_FLAG_HCI)) {
|
||||||
log_cb = ll_hci_log_cb;
|
log_cb = ll_hci_log_cb;
|
||||||
source = BLE_LOG_SPI_OUT_SOURCE_LL_HCI;
|
source = BLE_LOG_SPI_OUT_SOURCE_LL_HCI;
|
||||||
|
} else if (flag & BIT(LL_LOG_FLAG_HCI_UPSTREAM)) {
|
||||||
|
log_cb = ll_hci_log_cb;
|
||||||
|
source = BLE_LOG_SPI_OUT_SOURCE_HCI_UPSTREAM;
|
||||||
} else {
|
} else {
|
||||||
log_cb = ll_task_log_cb;
|
log_cb = ll_task_log_cb;
|
||||||
source = BLE_LOG_SPI_OUT_SOURCE_ESP;
|
source = BLE_LOG_SPI_OUT_SOURCE_ESP;
|
||||||
@@ -1116,77 +1158,7 @@ int ble_log_spi_out_write(uint8_t source, const uint8_t *addr, uint16_t len)
|
|||||||
}
|
}
|
||||||
|
|
||||||
xSemaphoreTake(LOG_MODULE_MUTEX(ul), portMAX_DELAY);
|
xSemaphoreTake(LOG_MODULE_MUTEX(ul), portMAX_DELAY);
|
||||||
spi_out_log_write(source, addr, len, false);
|
spi_out_write_hex(LOG_MODULE_CB(ul), source, addr, len, false);
|
||||||
xSemaphoreGive(LOG_MODULE_MUTEX(ul));
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
int ble_log_spi_out_printf(uint8_t source, const char *format, ...)
|
|
||||||
{
|
|
||||||
if (!LOG_MODULE_INIT_FLAG(ul)) {
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!format) {
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Get arguments
|
|
||||||
va_list args;
|
|
||||||
va_start(args, format);
|
|
||||||
|
|
||||||
va_list args_copy;
|
|
||||||
va_copy(args_copy, args);
|
|
||||||
|
|
||||||
xSemaphoreTake(LOG_MODULE_MUTEX(ul), portMAX_DELAY);
|
|
||||||
bool ret = spi_out_log_printf(source, format, args_copy, 0);
|
|
||||||
xSemaphoreGive(LOG_MODULE_MUTEX(ul));
|
|
||||||
|
|
||||||
va_end(args_copy);
|
|
||||||
va_end(args);
|
|
||||||
return ret? 0: -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
int ble_log_spi_out_printf_enh(uint8_t source, uint8_t level, const char *tag, const char *format, ...)
|
|
||||||
{
|
|
||||||
if (!LOG_MODULE_INIT_FLAG(ul)) {
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!tag || !format) {
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
va_list args;
|
|
||||||
va_start(args, format);
|
|
||||||
|
|
||||||
va_list args_copy;
|
|
||||||
va_copy(args_copy, args);
|
|
||||||
|
|
||||||
// Create log prefix in the format: "[level][tag] "
|
|
||||||
bool ret = false;
|
|
||||||
xSemaphoreTake(LOG_MODULE_MUTEX(ul), portMAX_DELAY);
|
|
||||||
int prefix_len = snprintf((char *)LOG_MODULE_STR_BUF(ul), SPI_OUT_LOG_STR_BUF_SIZE,
|
|
||||||
"[%d][%s]", level, tag? tag: "NULL");
|
|
||||||
if ((prefix_len < 0) || (prefix_len >= SPI_OUT_LOG_STR_BUF_SIZE)) {
|
|
||||||
goto exit;
|
|
||||||
}
|
|
||||||
ret = spi_out_log_printf(source, format, args_copy, prefix_len);
|
|
||||||
exit:
|
|
||||||
xSemaphoreGive(LOG_MODULE_MUTEX(ul));
|
|
||||||
va_end(args_copy);
|
|
||||||
va_end(args);
|
|
||||||
return ret? 0: -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
int ble_log_spi_out_write_with_ts(uint8_t source, const uint8_t *addr, uint16_t len)
|
|
||||||
{
|
|
||||||
if (!LOG_MODULE_INIT_FLAG(ul)) {
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
xSemaphoreTake(LOG_MODULE_MUTEX(ul), portMAX_DELAY);
|
|
||||||
spi_out_log_write(source, addr, len, true);
|
|
||||||
xSemaphoreGive(LOG_MODULE_MUTEX(ul));
|
xSemaphoreGive(LOG_MODULE_MUTEX(ul));
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@@ -1232,6 +1204,23 @@ void ble_log_spi_out_dump_all(void)
|
|||||||
}
|
}
|
||||||
#endif // SPI_OUT_LE_AUDIO_ENABLED
|
#endif // SPI_OUT_LE_AUDIO_ENABLED
|
||||||
|
|
||||||
|
|
||||||
|
#if SPI_OUT_HOST_ENABLED
|
||||||
|
if (LOG_MODULE_INIT_FLAG(host)) {
|
||||||
|
esp_rom_printf("[HOST_LOG_DUMP_START:\n");
|
||||||
|
spi_out_log_cb_dump(LOG_MODULE_CB(host));
|
||||||
|
esp_rom_printf("\n:HOST_LOG_DUMP_END]\n\n");
|
||||||
|
}
|
||||||
|
#endif // SPI_OUT_HOST_ENABLED
|
||||||
|
|
||||||
|
#if SPI_OUT_HCI_ENABLED
|
||||||
|
if (LOG_MODULE_INIT_FLAG(hci)) {
|
||||||
|
esp_rom_printf("[HCI_LOG_DUMP_START:\n");
|
||||||
|
spi_out_log_cb_dump(LOG_MODULE_CB(hci));
|
||||||
|
esp_rom_printf("\n:HCI_LOG_DUMP_END]\n\n");
|
||||||
|
}
|
||||||
|
#endif // SPI_OUT_HCI_ENABLED
|
||||||
|
|
||||||
portEXIT_CRITICAL_SAFE(&spinlock);
|
portEXIT_CRITICAL_SAFE(&spinlock);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1278,4 +1267,53 @@ IRAM_ATTR void ble_log_spi_out_le_audio_write(const uint8_t *addr, uint16_t len)
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
#endif // CONFIG_BT_BLE_LOG_SPI_OUT_LE_AUDIO_ENABLED
|
#endif // CONFIG_BT_BLE_LOG_SPI_OUT_LE_AUDIO_ENABLED
|
||||||
|
|
||||||
|
#if SPI_OUT_HOST_ENABLED
|
||||||
|
int ble_log_spi_out_host_write(uint8_t source, const char *prefix, const char *format, ...)
|
||||||
|
{
|
||||||
|
if (!LOG_MODULE_INIT_FLAG(host) || !prefix || !format) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Copy prefix to string buffer
|
||||||
|
int prefix_len = strlen(prefix);
|
||||||
|
if (prefix_len >= SPI_OUT_LOG_STR_BUF_SIZE) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
memcpy(LOG_MODULE_STR_BUF(host), prefix, prefix_len);
|
||||||
|
|
||||||
|
// Write string buffer
|
||||||
|
va_list args;
|
||||||
|
va_start(args, format);
|
||||||
|
int total_len = spi_out_write_str(LOG_MODULE_STR_BUF(host), format, args, prefix_len);
|
||||||
|
va_end(args);
|
||||||
|
if (total_len == 0) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Write log control block buffer
|
||||||
|
spi_out_write_hex(LOG_MODULE_CB(host), source,
|
||||||
|
LOG_MODULE_STR_BUF(host), (uint16_t)total_len, true);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
#endif // SPI_OUT_HOST_ENABLED
|
||||||
|
|
||||||
|
#if SPI_OUT_HCI_ENABLED
|
||||||
|
int ble_log_spi_out_hci_write(uint8_t source, const uint8_t *addr, uint16_t len)
|
||||||
|
{
|
||||||
|
if (!LOG_MODULE_INIT_FLAG(hci)) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (source == BLE_LOG_SPI_OUT_SOURCE_HCI_UPSTREAM) {
|
||||||
|
#if SPI_OUT_LL_ENABLED
|
||||||
|
ble_log_spi_out_ll_write(len, addr, 0, NULL, BIT(LL_LOG_FLAG_HCI_UPSTREAM));
|
||||||
|
#endif // SPI_OUT_LL_ENABLED
|
||||||
|
}
|
||||||
|
if (source == BLE_LOG_SPI_OUT_SOURCE_HCI_DOWNSTREAM) {
|
||||||
|
spi_out_write_hex(LOG_MODULE_CB(hci), source, addr, len, true);
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
#endif // SPI_OUT_HCI_ENABLED
|
||||||
#endif // CONFIG_BT_BLE_LOG_SPI_OUT_ENABLED
|
#endif // CONFIG_BT_BLE_LOG_SPI_OUT_ENABLED
|
||||||
|
@@ -33,15 +33,15 @@ enum {
|
|||||||
BLE_LOG_SPI_OUT_SOURCE_LOSS,
|
BLE_LOG_SPI_OUT_SOURCE_LOSS,
|
||||||
};
|
};
|
||||||
|
|
||||||
enum {
|
#define BLE_LOG_SPI_OUT_LEVEL_NONE 0
|
||||||
BLE_LOG_SPI_OUT_LEVEL_NONE = 0,
|
#define BLE_LOG_SPI_OUT_LEVEL_ERROR 1
|
||||||
BLE_LOG_SPI_OUT_LEVEL_ERROR,
|
#define BLE_LOG_SPI_OUT_LEVEL_WARN 2
|
||||||
BLE_LOG_SPI_OUT_LEVEL_WARN,
|
#define BLE_LOG_SPI_OUT_LEVEL_INFO 3
|
||||||
BLE_LOG_SPI_OUT_LEVEL_INFO,
|
#define BLE_LOG_SPI_OUT_LEVEL_DEBUG 4
|
||||||
BLE_LOG_SPI_OUT_LEVEL_DEBUG,
|
#define BLE_LOG_SPI_OUT_LEVEL_VERBOSE 5
|
||||||
BLE_LOG_SPI_OUT_LEVEL_VERBOSE,
|
#define BLE_LOG_SPI_OUT_STR(x) #x
|
||||||
BLE_LOG_SPI_OUT_LEVEL_MAX,
|
#define BLE_LOG_SPI_OUT_XSTR(x) BLE_LOG_SPI_OUT_STR(x)
|
||||||
};
|
#define BLE_LOG_SPI_OUT_BUILD_PREFIX(LEVEL, TAG) "[" BLE_LOG_SPI_OUT_XSTR(LEVEL) "][" TAG "]"
|
||||||
|
|
||||||
// Public functions
|
// Public functions
|
||||||
int ble_log_spi_out_init(void);
|
int ble_log_spi_out_init(void);
|
||||||
@@ -53,12 +53,11 @@ void ble_log_spi_out_ll_write(uint32_t len, const uint8_t *addr, uint32_t len_ap
|
|||||||
void ble_log_spi_out_ll_log_ev_proc(void);
|
void ble_log_spi_out_ll_log_ev_proc(void);
|
||||||
void ble_log_spi_out_ts_sync_start(void);
|
void ble_log_spi_out_ts_sync_start(void);
|
||||||
void ble_log_spi_out_ts_sync_stop(void);
|
void ble_log_spi_out_ts_sync_stop(void);
|
||||||
int ble_log_spi_out_printf(uint8_t source, const char *format, ...);
|
|
||||||
int ble_log_spi_out_printf_enh(uint8_t source, uint8_t level, const char *tag, const char *format, ...);
|
|
||||||
int ble_log_spi_out_write_with_ts(uint8_t source, const uint8_t *addr, uint16_t len);
|
|
||||||
void ble_log_spi_out_dump_all(void);
|
void ble_log_spi_out_dump_all(void);
|
||||||
void ble_log_spi_out_enable(bool enable);
|
void ble_log_spi_out_enable(bool enable);
|
||||||
void ble_log_spi_out_flush(void);
|
void ble_log_spi_out_flush(void);
|
||||||
void ble_log_spi_out_le_audio_write(const uint8_t *addr, uint16_t len);
|
void ble_log_spi_out_le_audio_write(const uint8_t *addr, uint16_t len);
|
||||||
|
int ble_log_spi_out_host_write(uint8_t source, const char *prefix, const char *format, ...);
|
||||||
|
int ble_log_spi_out_hci_write(uint8_t source, const uint8_t *addr, uint16_t len);
|
||||||
|
|
||||||
#endif // __BT_SPI_OUT_H__
|
#endif // __BT_SPI_OUT_H__
|
||||||
|
@@ -231,12 +231,14 @@ static inline void trc_dump_buffer(const char *prefix, uint8_t *data, uint16_t l
|
|||||||
}
|
}
|
||||||
|
|
||||||
#define BTM_TRACE_API(fmt, args...) { \
|
#define BTM_TRACE_API(fmt, args...) { \
|
||||||
ble_log_spi_out_printf_enh(BLE_LOG_SPI_OUT_SOURCE_BLUEDROID, BLE_LOG_SPI_OUT_LEVEL_INFO, "BT_BTM", fmt, ## args); \
|
ble_log_spi_out_host_write(BLE_LOG_SPI_OUT_SOURCE_BLUEDROID, \
|
||||||
|
BLE_LOG_SPI_OUT_BUILD_PREFIX(BLE_LOG_SPI_OUT_LEVEL_INFO, "BT_BTM"), fmt, ## args); \
|
||||||
if (btm_cb.trace_level >= BT_TRACE_LEVEL_API && BT_LOG_LEVEL_CHECK(BTM, API)) BT_PRINT_I("BT_BTM", fmt, ## args); \
|
if (btm_cb.trace_level >= BT_TRACE_LEVEL_API && BT_LOG_LEVEL_CHECK(BTM, API)) BT_PRINT_I("BT_BTM", fmt, ## args); \
|
||||||
}
|
}
|
||||||
|
|
||||||
#define BTM_TRACE_EVENT(fmt, args...) { \
|
#define BTM_TRACE_EVENT(fmt, args...) { \
|
||||||
ble_log_spi_out_printf_enh(BLE_LOG_SPI_OUT_SOURCE_BLUEDROID, BLE_LOG_SPI_OUT_LEVEL_DEBUG, "BT_BTM", fmt, ## args); \
|
ble_log_spi_out_host_write(BLE_LOG_SPI_OUT_SOURCE_BLUEDROID, \
|
||||||
|
BLE_LOG_SPI_OUT_BUILD_PREFIX(BLE_LOG_SPI_OUT_LEVEL_DEBUG, "BT_BTM"), fmt, ## args); \
|
||||||
if (btm_cb.trace_level >= BT_TRACE_LEVEL_EVENT && BT_LOG_LEVEL_CHECK(BTM, EVENT)) BT_PRINT_D("BT_BTM", fmt, ## args); \
|
if (btm_cb.trace_level >= BT_TRACE_LEVEL_EVENT && BT_LOG_LEVEL_CHECK(BTM, EVENT)) BT_PRINT_D("BT_BTM", fmt, ## args); \
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -267,7 +269,8 @@ static inline void trc_dump_buffer(const char *prefix, uint8_t *data, uint16_t l
|
|||||||
}
|
}
|
||||||
|
|
||||||
#define L2CAP_TRACE_API(fmt, args...) { \
|
#define L2CAP_TRACE_API(fmt, args...) { \
|
||||||
ble_log_spi_out_printf_enh(BLE_LOG_SPI_OUT_SOURCE_BLUEDROID, BLE_LOG_SPI_OUT_LEVEL_INFO, "BT_L2CAP", fmt, ## args); \
|
ble_log_spi_out_host_write(BLE_LOG_SPI_OUT_SOURCE_BLUEDROID, \
|
||||||
|
BLE_LOG_SPI_OUT_BUILD_PREFIX(BLE_LOG_SPI_OUT_LEVEL_INFO, "BT_L2CAP"), fmt, ## args); \
|
||||||
if (l2cb.l2cap_trace_level >= BT_TRACE_LEVEL_API && BT_LOG_LEVEL_CHECK(L2CAP, API)) BT_PRINT_I("BT_L2CAP", fmt, ## args); \
|
if (l2cb.l2cap_trace_level >= BT_TRACE_LEVEL_API && BT_LOG_LEVEL_CHECK(L2CAP, API)) BT_PRINT_I("BT_L2CAP", fmt, ## args); \
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -318,7 +321,8 @@ static inline void trc_dump_buffer(const char *prefix, uint8_t *data, uint16_t l
|
|||||||
}
|
}
|
||||||
|
|
||||||
#define GAP_TRACE_API(fmt, args...) { \
|
#define GAP_TRACE_API(fmt, args...) { \
|
||||||
ble_log_spi_out_printf_enh(BLE_LOG_SPI_OUT_SOURCE_BLUEDROID, BLE_LOG_SPI_OUT_LEVEL_INFO, "BT_GAP", fmt, ## args); \
|
ble_log_spi_out_host_write(BLE_LOG_SPI_OUT_SOURCE_BLUEDROID, \
|
||||||
|
BLE_LOG_SPI_OUT_BUILD_PREFIX(BLE_LOG_SPI_OUT_LEVEL_INFO, "BT_GAP"), fmt, ## args); \
|
||||||
if (gap_cb.trace_level >= BT_TRACE_LEVEL_API && BT_LOG_LEVEL_CHECK(GAP, API)) BT_PRINT_I("BT_GAP", fmt, ## args); \
|
if (gap_cb.trace_level >= BT_TRACE_LEVEL_API && BT_LOG_LEVEL_CHECK(GAP, API)) BT_PRINT_I("BT_GAP", fmt, ## args); \
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -420,7 +424,8 @@ static inline void trc_dump_buffer(const char *prefix, uint8_t *data, uint16_t l
|
|||||||
}
|
}
|
||||||
|
|
||||||
#define GATT_TRACE_API(fmt, args...) { \
|
#define GATT_TRACE_API(fmt, args...) { \
|
||||||
ble_log_spi_out_printf_enh(BLE_LOG_SPI_OUT_SOURCE_BLUEDROID, BLE_LOG_SPI_OUT_LEVEL_INFO, "BT_GATT", fmt, ## args); \
|
ble_log_spi_out_host_write(BLE_LOG_SPI_OUT_SOURCE_BLUEDROID, \
|
||||||
|
BLE_LOG_SPI_OUT_BUILD_PREFIX(BLE_LOG_SPI_OUT_LEVEL_INFO, "BT_GATT"), fmt, ## args); \
|
||||||
if (gatt_cb.trace_level >= BT_TRACE_LEVEL_API && BT_LOG_LEVEL_CHECK(GATT, API)) BT_PRINT_I("BT_GATT", fmt, ## args); \
|
if (gatt_cb.trace_level >= BT_TRACE_LEVEL_API && BT_LOG_LEVEL_CHECK(GATT, API)) BT_PRINT_I("BT_GATT", fmt, ## args); \
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -455,7 +460,8 @@ static inline void trc_dump_buffer(const char *prefix, uint8_t *data, uint16_t l
|
|||||||
}
|
}
|
||||||
|
|
||||||
#define SMP_TRACE_API(fmt, args...) { \
|
#define SMP_TRACE_API(fmt, args...) { \
|
||||||
ble_log_spi_out_printf_enh(BLE_LOG_SPI_OUT_SOURCE_BLUEDROID, BLE_LOG_SPI_OUT_LEVEL_INFO, "BT_SMP", fmt, ## args); \
|
ble_log_spi_out_host_write(BLE_LOG_SPI_OUT_SOURCE_BLUEDROID, \
|
||||||
|
BLE_LOG_SPI_OUT_BUILD_PREFIX(BLE_LOG_SPI_OUT_LEVEL_INFO, "BT_SMP"), fmt, ## args); \
|
||||||
if (smp_cb.trace_level >= BT_TRACE_LEVEL_API && BT_LOG_LEVEL_CHECK(SMP, API)) BT_PRINT_I("BT_SMP", fmt, ## args); \
|
if (smp_cb.trace_level >= BT_TRACE_LEVEL_API && BT_LOG_LEVEL_CHECK(SMP, API)) BT_PRINT_I("BT_SMP", fmt, ## args); \
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -219,9 +219,9 @@ static uint16_t transmit_data(serial_data_type_t type,
|
|||||||
#if (BT_HCI_LOG_INCLUDED == TRUE)
|
#if (BT_HCI_LOG_INCLUDED == TRUE)
|
||||||
bt_hci_log_record_hci_data(data[0], &data[1], length - 1);
|
bt_hci_log_record_hci_data(data[0], &data[1], length - 1);
|
||||||
#endif
|
#endif
|
||||||
#if (CONFIG_BT_BLE_LOG_SPI_OUT_HCI_ENABLED && !SOC_ESP_NIMBLE_CONTROLLER)
|
#if CONFIG_BT_BLE_LOG_SPI_OUT_HCI_ENABLED
|
||||||
ble_log_spi_out_write_with_ts(BLE_LOG_SPI_OUT_SOURCE_NIMBLE, data, length);
|
ble_log_spi_out_hci_write(BLE_LOG_SPI_OUT_SOURCE_HCI_DOWNSTREAM, data, length);
|
||||||
#endif // (CONFIG_BT_BLE_LOG_SPI_OUT_HCI_ENABLED && !SOC_ESP_NIMBLE_CONTROLLER)
|
#endif // CONFIG_BT_BLE_LOG_SPI_OUT_HCI_ENABLED
|
||||||
// TX Data to target
|
// TX Data to target
|
||||||
esp_vhci_host_send_packet(data, length);
|
esp_vhci_host_send_packet(data, length);
|
||||||
|
|
||||||
@@ -570,7 +570,7 @@ void bt_record_hci_data(uint8_t *data, uint16_t len)
|
|||||||
static int host_recv_pkt_cb(uint8_t *data, uint16_t len)
|
static int host_recv_pkt_cb(uint8_t *data, uint16_t len)
|
||||||
{
|
{
|
||||||
#if (BT_BLE_LOG_SPI_OUT_HCI_ENABLED && !SOC_ESP_NIMBLE_CONTROLLER)
|
#if (BT_BLE_LOG_SPI_OUT_HCI_ENABLED && !SOC_ESP_NIMBLE_CONTROLLER)
|
||||||
ble_log_spi_out_write_with_ts(BLE_LOG_SPI_OUT_SOURCE_HCI_UPSTREAM, data, len);
|
ble_log_spi_out_hci_write(BLE_LOG_SPI_OUT_SOURCE_HCI_UPSTREAM, data, len);
|
||||||
#endif // (BT_BLE_LOG_SPI_OUT_HCI_ENABLED && !SOC_ESP_NIMBLE_CONTROLLER)
|
#endif // (BT_BLE_LOG_SPI_OUT_HCI_ENABLED && !SOC_ESP_NIMBLE_CONTROLLER)
|
||||||
//Target has packet to host, malloc new buffer for packet
|
//Target has packet to host, malloc new buffer for packet
|
||||||
BT_HDR *pkt = NULL;
|
BT_HDR *pkt = NULL;
|
||||||
|
@@ -73,7 +73,7 @@ void esp_vhci_host_send_packet_wrapper(uint8_t *data, uint16_t len)
|
|||||||
bt_hci_log_record_hci_data(data[0], &data[1], len - 1);
|
bt_hci_log_record_hci_data(data[0], &data[1], len - 1);
|
||||||
#endif
|
#endif
|
||||||
#if (CONFIG_BT_BLE_LOG_SPI_OUT_HCI_ENABLED && !SOC_ESP_NIMBLE_CONTROLLER)
|
#if (CONFIG_BT_BLE_LOG_SPI_OUT_HCI_ENABLED && !SOC_ESP_NIMBLE_CONTROLLER)
|
||||||
ble_log_spi_out_write_with_ts(BLE_LOG_SPI_OUT_SOURCE_HCI_DOWNSTREAM, data, len);
|
ble_log_spi_out_hci_write(BLE_LOG_SPI_OUT_SOURCE_HCI_DOWNSTREAM, data, len);
|
||||||
#endif // (CONFIG_BT_BLE_LOG_SPI_OUT_HCI_ENABLED && !SOC_ESP_NIMBLE_CONTROLLER)
|
#endif // (CONFIG_BT_BLE_LOG_SPI_OUT_HCI_ENABLED && !SOC_ESP_NIMBLE_CONTROLLER)
|
||||||
esp_vhci_host_send_packet(data, len);
|
esp_vhci_host_send_packet(data, len);
|
||||||
}
|
}
|
||||||
@@ -227,7 +227,7 @@ static int dummy_host_rcv_pkt(uint8_t *data, uint16_t len)
|
|||||||
static int host_rcv_pkt(uint8_t *data, uint16_t len)
|
static int host_rcv_pkt(uint8_t *data, uint16_t len)
|
||||||
{
|
{
|
||||||
#if (CONFIG_BT_BLE_LOG_SPI_OUT_HCI_ENABLED && !SOC_ESP_NIMBLE_CONTROLLER)
|
#if (CONFIG_BT_BLE_LOG_SPI_OUT_HCI_ENABLED && !SOC_ESP_NIMBLE_CONTROLLER)
|
||||||
ble_log_spi_out_write_with_ts(BLE_LOG_SPI_OUT_SOURCE_HCI_UPSTREAM, data, len);
|
ble_log_spi_out_hci_write(BLE_LOG_SPI_OUT_SOURCE_HCI_UPSTREAM, data, len);
|
||||||
#endif // (CONFIG_BT_BLE_LOG_SPI_OUT_HCI_ENABLED && !SOC_ESP_NIMBLE_CONTROLLER)
|
#endif // (CONFIG_BT_BLE_LOG_SPI_OUT_HCI_ENABLED && !SOC_ESP_NIMBLE_CONTROLLER)
|
||||||
|
|
||||||
bt_record_hci_data(data, len);
|
bt_record_hci_data(data, len);
|
||||||
|
Reference in New Issue
Block a user