mirror of
https://github.com/espressif/esp-idf
synced 2025-03-10 01:29:21 -04:00
Merge branch 'feat/add_hci_log_record_for_nimble_v5.0' into 'release/v5.0'
feat(bt/nimble): support hci log for nimble (backport v5.0) See merge request espressif/esp-idf!31216
This commit is contained in:
commit
add3c94c02
@ -31,8 +31,8 @@ static const char s_hex_to_char_mapping[16] = {
|
|||||||
'8', '9', 'a', 'b', 'c', 'd', 'e', 'f'
|
'8', '9', 'a', 'b', 'c', 'd', 'e', 'f'
|
||||||
};
|
};
|
||||||
|
|
||||||
bt_hci_log_t g_bt_hci_log_data_ctl = {0};
|
static bt_hci_log_t g_bt_hci_log_data_ctl = {0};
|
||||||
bt_hci_log_t g_bt_hci_log_adv_ctl = {0};
|
static bt_hci_log_t g_bt_hci_log_adv_ctl = {0};
|
||||||
|
|
||||||
esp_err_t bt_hci_log_init(void)
|
esp_err_t bt_hci_log_init(void)
|
||||||
{
|
{
|
||||||
@ -98,35 +98,35 @@ static char IRAM_ATTR *bt_data_type_to_str(uint8_t data_type)
|
|||||||
{
|
{
|
||||||
case HCI_LOG_DATA_TYPE_COMMAND:
|
case HCI_LOG_DATA_TYPE_COMMAND:
|
||||||
// hci cmd data
|
// hci cmd data
|
||||||
tag = "CMD";
|
tag = "C";
|
||||||
break;
|
break;
|
||||||
case HCI_LOG_DATA_TYPE_H2C_ACL:
|
case HCI_LOG_DATA_TYPE_H2C_ACL:
|
||||||
// host to controller hci acl data
|
// host to controller hci acl data
|
||||||
tag = "HAL";
|
tag = "H";
|
||||||
break;
|
break;
|
||||||
case HCI_LOG_DATA_TYPE_SCO:
|
case HCI_LOG_DATA_TYPE_SCO:
|
||||||
// hci sco data
|
// hci sco data
|
||||||
tag = "SCO";
|
tag = "S";
|
||||||
break;
|
break;
|
||||||
case HCI_LOG_DATA_TYPE_EVENT:
|
case HCI_LOG_DATA_TYPE_EVENT:
|
||||||
// hci event
|
// hci event
|
||||||
tag = "EVT";
|
tag = "E";
|
||||||
break;
|
break;
|
||||||
case HCI_LOG_DATA_TYPE_ADV:
|
case HCI_LOG_DATA_TYPE_ADV:
|
||||||
// controller adv report data
|
// controller adv report data
|
||||||
tag = "ADV";
|
tag = NULL;
|
||||||
break;
|
break;
|
||||||
case HCI_LOG_DATA_TYPE_C2H_ACL:
|
case HCI_LOG_DATA_TYPE_C2H_ACL:
|
||||||
// controller to host hci acl data
|
// controller to host hci acl data
|
||||||
tag = "CAL";
|
tag = "D";
|
||||||
break;
|
break;
|
||||||
case HCI_LOG_DATA_TYPE_SELF_DEFINE:
|
case HCI_LOG_DATA_TYPE_SELF_DEFINE:
|
||||||
// self-defining data
|
// self-defining data
|
||||||
tag = "ST";
|
tag = "S";
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
// unknown data type
|
// unknown data type
|
||||||
tag = "UK";
|
tag = "U";
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -212,7 +212,7 @@ static uint16_t transmit_data(serial_data_type_t type,
|
|||||||
|
|
||||||
BTTRC_DUMP_BUFFER("Transmit Pkt", data, length);
|
BTTRC_DUMP_BUFFER("Transmit Pkt", data, length);
|
||||||
#if (BT_HCI_LOG_INCLUDED == TRUE)
|
#if (BT_HCI_LOG_INCLUDED == TRUE)
|
||||||
bt_hci_log_record_hci_data(data[0], data, length);
|
bt_hci_log_record_hci_data(data[0], &data[1], length - 1);
|
||||||
#endif
|
#endif
|
||||||
// TX Data to target
|
// TX Data to target
|
||||||
esp_vhci_host_send_packet(data, length);
|
esp_vhci_host_send_packet(data, length);
|
||||||
@ -539,6 +539,26 @@ static void host_send_pkt_available_cb(void)
|
|||||||
hci_downstream_data_post(OSI_THREAD_MAX_TIMEOUT);
|
hci_downstream_data_post(OSI_THREAD_MAX_TIMEOUT);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void bt_record_hci_data(uint8_t *data, uint16_t len)
|
||||||
|
{
|
||||||
|
#if (BT_HCI_LOG_INCLUDED == TRUE)
|
||||||
|
if ((data[0] == DATA_TYPE_EVENT) && (data[1] == HCI_BLE_EVENT) && ((data[3] == HCI_BLE_ADV_PKT_RPT_EVT) || (data[3] == HCI_BLE_DIRECT_ADV_EVT)
|
||||||
|
#if (BLE_ADV_REPORT_FLOW_CONTROL == TRUE)
|
||||||
|
|| (data[3] == HCI_BLE_ADV_DISCARD_REPORT_EVT)
|
||||||
|
#endif // (BLE_ADV_REPORT_FLOW_CONTROL == TRUE)
|
||||||
|
#if (BLE_50_FEATURE_SUPPORT == TRUE)
|
||||||
|
|| (data[3] == HCI_BLE_EXT_ADV_REPORT_EVT) || (data[3] == HCI_BLE_PERIOD_ADV_REPORT_EVT)
|
||||||
|
#endif // (BLE_50_FEATURE_SUPPORT == TRUE)
|
||||||
|
)) {
|
||||||
|
bt_hci_log_record_hci_adv(HCI_LOG_DATA_TYPE_ADV, &data[2], len - 2);
|
||||||
|
} else {
|
||||||
|
uint8_t data_type = ((data[0] == 2) ? HCI_LOG_DATA_TYPE_C2H_ACL : data[0]);
|
||||||
|
bt_hci_log_record_hci_data(data_type, &data[1], len - 1);
|
||||||
|
}
|
||||||
|
#endif // (BT_HCI_LOG_INCLUDED == TRUE)
|
||||||
|
}
|
||||||
|
|
||||||
static int host_recv_pkt_cb(uint8_t *data, uint16_t len)
|
static int host_recv_pkt_cb(uint8_t *data, uint16_t len)
|
||||||
{
|
{
|
||||||
//Target has packet to host, malloc new buffer for packet
|
//Target has packet to host, malloc new buffer for packet
|
||||||
@ -550,13 +570,11 @@ static int host_recv_pkt_cb(uint8_t *data, uint16_t len)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bt_record_hci_data(data, len);
|
||||||
|
|
||||||
bool is_adv_rpt = host_recv_adv_packet(data);
|
bool is_adv_rpt = host_recv_adv_packet(data);
|
||||||
|
|
||||||
if (!is_adv_rpt) {
|
if (!is_adv_rpt) {
|
||||||
#if (BT_HCI_LOG_INCLUDED == TRUE)
|
|
||||||
uint8_t data_type = ((data[0] == 2) ? HCI_LOG_DATA_TYPE_C2H_ACL : data[0]);
|
|
||||||
bt_hci_log_record_hci_data(data_type, data, len);
|
|
||||||
#endif // (BT_HCI_LOG_INCLUDED == TRUE)
|
|
||||||
pkt_size = BT_HDR_SIZE + len;
|
pkt_size = BT_HDR_SIZE + len;
|
||||||
pkt = (BT_HDR *) osi_calloc(pkt_size);
|
pkt = (BT_HDR *) osi_calloc(pkt_size);
|
||||||
if (!pkt) {
|
if (!pkt) {
|
||||||
@ -570,10 +588,6 @@ static int host_recv_pkt_cb(uint8_t *data, uint16_t len)
|
|||||||
memcpy(pkt->data, data, len);
|
memcpy(pkt->data, data, len);
|
||||||
fixed_queue_enqueue(hci_hal_env.rx_q, pkt, FIXED_QUEUE_MAX_TIMEOUT);
|
fixed_queue_enqueue(hci_hal_env.rx_q, pkt, FIXED_QUEUE_MAX_TIMEOUT);
|
||||||
} else {
|
} else {
|
||||||
#if (BT_HCI_LOG_INCLUDED == TRUE)
|
|
||||||
// data type is adv report
|
|
||||||
bt_hci_log_record_hci_adv(HCI_LOG_DATA_TYPE_ADV, data, len);
|
|
||||||
#endif // (BT_HCI_LOG_INCLUDED == TRUE)
|
|
||||||
#if !BLE_ADV_REPORT_FLOW_CONTROL
|
#if !BLE_ADV_REPORT_FLOW_CONTROL
|
||||||
// drop the packets if pkt_queue length goes beyond upper limit
|
// drop the packets if pkt_queue length goes beyond upper limit
|
||||||
if (pkt_queue_length(hci_hal_env.adv_rpt_q) > HCI_HAL_BLE_ADV_RPT_QUEUE_LEN_MAX) {
|
if (pkt_queue_length(hci_hal_env.adv_rpt_q) > HCI_HAL_BLE_ADV_RPT_QUEUE_LEN_MAX) {
|
||||||
|
@ -19,8 +19,6 @@
|
|||||||
#include "freertos/semphr.h"
|
#include "freertos/semphr.h"
|
||||||
#include "esp_compiler.h"
|
#include "esp_compiler.h"
|
||||||
#include "soc/soc_caps.h"
|
#include "soc/soc_caps.h"
|
||||||
#include "bt_common.h"
|
|
||||||
#include "hci_log/bt_hci_log.h"
|
|
||||||
|
|
||||||
#define NIMBLE_VHCI_TIMEOUT_MS 2000
|
#define NIMBLE_VHCI_TIMEOUT_MS 2000
|
||||||
#define BLE_HCI_EVENT_HDR_LEN (2)
|
#define BLE_HCI_EVENT_HDR_LEN (2)
|
||||||
@ -86,9 +84,6 @@ int ble_hci_trans_hs_cmd_tx(uint8_t *cmd)
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (xSemaphoreTake(vhci_send_sem, NIMBLE_VHCI_TIMEOUT_MS / portTICK_PERIOD_MS) == pdTRUE) {
|
if (xSemaphoreTake(vhci_send_sem, NIMBLE_VHCI_TIMEOUT_MS / portTICK_PERIOD_MS) == pdTRUE) {
|
||||||
#if (BT_HCI_LOG_INCLUDED == TRUE)
|
|
||||||
bt_hci_log_record_hci_data(cmd[0], cmd, len);
|
|
||||||
#endif
|
|
||||||
esp_vhci_host_send_packet(cmd, len);
|
esp_vhci_host_send_packet(cmd, len);
|
||||||
} else {
|
} else {
|
||||||
rc = BLE_HS_ETIMEOUT_HCI;
|
rc = BLE_HS_ETIMEOUT_HCI;
|
||||||
@ -128,9 +123,6 @@ int ble_hci_trans_hs_acl_tx(struct os_mbuf *om)
|
|||||||
len += OS_MBUF_PKTLEN(om);
|
len += OS_MBUF_PKTLEN(om);
|
||||||
|
|
||||||
if (xSemaphoreTake(vhci_send_sem, NIMBLE_VHCI_TIMEOUT_MS / portTICK_PERIOD_MS) == pdTRUE) {
|
if (xSemaphoreTake(vhci_send_sem, NIMBLE_VHCI_TIMEOUT_MS / portTICK_PERIOD_MS) == pdTRUE) {
|
||||||
#if (BT_HCI_LOG_INCLUDED == TRUE)
|
|
||||||
bt_hci_log_record_hci_data(data[0], data, len);
|
|
||||||
#endif
|
|
||||||
esp_vhci_host_send_packet(data, len);
|
esp_vhci_host_send_packet(data, len);
|
||||||
} else {
|
} else {
|
||||||
rc = BLE_HS_ETIMEOUT_HCI;
|
rc = BLE_HS_ETIMEOUT_HCI;
|
||||||
@ -370,18 +362,12 @@ static int host_rcv_pkt(uint8_t *data, uint16_t len)
|
|||||||
/* Allocate LE Advertising Report Event from lo pool only */
|
/* Allocate LE Advertising Report Event from lo pool only */
|
||||||
if ((data[1] == BLE_HCI_EVCODE_LE_META) &&
|
if ((data[1] == BLE_HCI_EVCODE_LE_META) &&
|
||||||
(data[3] == BLE_HCI_LE_SUBEV_ADV_RPT || data[3] == BLE_HCI_LE_SUBEV_EXT_ADV_RPT)) {
|
(data[3] == BLE_HCI_LE_SUBEV_ADV_RPT || data[3] == BLE_HCI_LE_SUBEV_EXT_ADV_RPT)) {
|
||||||
#if (BT_HCI_LOG_INCLUDED == TRUE)
|
|
||||||
bt_hci_log_record_hci_adv(HCI_LOG_DATA_TYPE_ADV, data, len);
|
|
||||||
#endif
|
|
||||||
evbuf = ble_hci_trans_buf_alloc(BLE_HCI_TRANS_BUF_EVT_LO);
|
evbuf = ble_hci_trans_buf_alloc(BLE_HCI_TRANS_BUF_EVT_LO);
|
||||||
/* Skip advertising report if we're out of memory */
|
/* Skip advertising report if we're out of memory */
|
||||||
if (!evbuf) {
|
if (!evbuf) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
#if (BT_HCI_LOG_INCLUDED == TRUE)
|
|
||||||
bt_hci_log_record_hci_data(data[0], data, len);
|
|
||||||
#endif
|
|
||||||
evbuf = ble_hci_trans_buf_alloc(BLE_HCI_TRANS_BUF_EVT_HI);
|
evbuf = ble_hci_trans_buf_alloc(BLE_HCI_TRANS_BUF_EVT_HI);
|
||||||
assert(evbuf != NULL);
|
assert(evbuf != NULL);
|
||||||
}
|
}
|
||||||
@ -392,9 +378,6 @@ static int host_rcv_pkt(uint8_t *data, uint16_t len)
|
|||||||
rc = ble_hci_trans_ll_evt_tx(evbuf);
|
rc = ble_hci_trans_ll_evt_tx(evbuf);
|
||||||
assert(rc == 0);
|
assert(rc == 0);
|
||||||
} else if (data[0] == BLE_HCI_UART_H4_ACL) {
|
} else if (data[0] == BLE_HCI_UART_H4_ACL) {
|
||||||
#if (BT_HCI_LOG_INCLUDED == TRUE)
|
|
||||||
bt_hci_log_record_hci_data(HCI_LOG_DATA_TYPE_C2H_ACL, data, len);
|
|
||||||
#endif
|
|
||||||
ble_hci_rx_acl(data + 1, len - 1);
|
ble_hci_rx_acl(data + 1, len - 1);
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
@ -467,10 +450,6 @@ esp_err_t esp_nimble_hci_init(void)
|
|||||||
goto err;
|
goto err;
|
||||||
}
|
}
|
||||||
|
|
||||||
#if (BT_HCI_LOG_INCLUDED == TRUE)
|
|
||||||
bt_hci_log_init();
|
|
||||||
#endif // (BT_HCI_LOG_INCLUDED == TRUE)
|
|
||||||
|
|
||||||
xSemaphoreGive(vhci_send_sem);
|
xSemaphoreGive(vhci_send_sem);
|
||||||
|
|
||||||
#if MYNEWT_VAL(BLE_QUEUE_CONG_CHECK)
|
#if MYNEWT_VAL(BLE_QUEUE_CONG_CHECK)
|
||||||
@ -519,10 +498,6 @@ esp_err_t esp_nimble_hci_deinit(void)
|
|||||||
|
|
||||||
ble_buf_free();
|
ble_buf_free();
|
||||||
|
|
||||||
#if (BT_HCI_LOG_INCLUDED == TRUE)
|
|
||||||
bt_hci_log_deinit();
|
|
||||||
#endif // (BT_HCI_LOG_INCLUDED == TRUE)
|
|
||||||
|
|
||||||
#if MYNEWT_VAL(BLE_QUEUE_CONG_CHECK)
|
#if MYNEWT_VAL(BLE_QUEUE_CONG_CHECK)
|
||||||
ble_adv_list_deinit();
|
ble_adv_list_deinit();
|
||||||
#endif
|
#endif
|
||||||
|
@ -1 +1 @@
|
|||||||
Subproject commit f430a6b6ec07d32dacfe39bce80ccecba7e162be
|
Subproject commit bd533562415b29c965d20d7b580cd4f0fac21ac2
|
Loading…
x
Reference in New Issue
Block a user