From b305a96a74525e4da6d3bdd3c92c9e3ece3e7ca4 Mon Sep 17 00:00:00 2001 From: zwj Date: Mon, 29 Oct 2018 21:27:39 +0800 Subject: [PATCH 1/2] component/bt: add vendor hci cmd --- .../bt/bluedroid/stack/btm/btm_ble_gap.c | 31 +++++++++ .../bluedroid/stack/include/stack/hcidefs.h | 66 +++++++++++++++---- components/esp32/ld/esp32.rom.ld | 1 + 3 files changed, 84 insertions(+), 14 deletions(-) diff --git a/components/bt/bluedroid/stack/btm/btm_ble_gap.c b/components/bt/bluedroid/stack/btm/btm_ble_gap.c index 445cf0357..5540728ad 100644 --- a/components/bt/bluedroid/stack/btm/btm_ble_gap.c +++ b/components/bt/bluedroid/stack/btm/btm_ble_gap.c @@ -708,6 +708,37 @@ extern void BTM_BleReadControllerFeatures(tBTM_BLE_CTRL_FEATURES_CBACK *p_vsc_c return ; } +void BTM_VendorHciEchoCmdCallback(tBTM_VSC_CMPL *p1) +{ + if (!p1) { + return; + } + uint8_t *p = p1->p_param_buf; + uint8_t status, echo; + STREAM_TO_UINT8 (status, p); + STREAM_TO_UINT8 (echo, p); + BTM_TRACE_DEBUG("%s status 0x%x echo 0x%x", __func__, status, echo); +} + +/****************************************************************************** +** +** Function BTM_VendorHciEchoCmdTest +** +** Description vendor common echo hci cmd test, controller will return status and echo +** +** Parameters: echo : echo value +** +** Returns void +** +*******************************************************************************/ +void BTM_VendorHciEchoCmdTest(uint8_t echo) +{ + BTM_VendorSpecificCommand (HCI_VENDOR_COMMON_ECHO_CMD_OPCODE, + 1, + &echo, + BTM_VendorHciEchoCmdCallback); +} + /******************************************************************************* ** ** Function BTM_BleEnableMixedPrivacyMode diff --git a/components/bt/bluedroid/stack/include/stack/hcidefs.h b/components/bt/bluedroid/stack/include/stack/hcidefs.h index 0169ba8cc..486cce8ab 100644 --- a/components/bt/bluedroid/stack/include/stack/hcidefs.h +++ b/components/bt/bluedroid/stack/include/stack/hcidefs.h @@ -45,7 +45,7 @@ #define HCI_GRP_VENDOR_SPECIFIC (0x3F << 10) /* 0xFC00 */ /* Group occupies high 6 bits of the HCI command rest is opcode itself */ -#define HCI_OGF(p) (UINT8)((0xFC00 & (p)) >> 10) +#define HCI_OGF(p) (UINT8)(0x003F & (p >> 10)) #define HCI_OCF(p) ( 0x3FF & (p)) /* @@ -352,27 +352,65 @@ #define HCI_BLE_READ_RESOLVABLE_ADDR_LOCAL (0x002C | HCI_GRP_BLE_CMDS) #define HCI_BLE_SET_ADDR_RESOLUTION_ENABLE (0x002D | HCI_GRP_BLE_CMDS) #define HCI_BLE_SET_RAND_PRIV_ADDR_TIMOUT (0x002E | HCI_GRP_BLE_CMDS) +// Vendor OGF define +#define HCI_VENDOR_OGF 0x3F -/* LE Get Vendor Capabilities Command OCF */ -#define HCI_BLE_VENDOR_CAP_OCF (0x0153 | HCI_GRP_VENDOR_SPECIFIC) +// ESP vendor group define +#define HCI_ESP_GROUP_COMMON 0x01 +#define HCI_ESP_GROUP_BLE 0x02 +#define HCI_ESP_GROUP_BT 0x03 +#define HCI_ESP_GROUP_END 0x07 +//ESP common subcode define +#define HCI_SUBCODE_COMMON_INIT 0x00 +#define HCI_SUBCODE_COMMON_ECHO 0x01 +#define HCI_SUBCODE_COMMON_MAX 0x7F + +//ESP BLE subcode define +#define HCI_SUBCODE_BLE_INIT 0x00 +#define HCI_SUBCODE_BLE_MULTI_ADV 0x01 +#define HCI_SUBCODE_BLE_BATCH_SCAN 0x02 +#define HCI_SUBCODE_BLE_ADV_FILTER 0x03 +#define HCI_SUBCODE_BLE_TRACK_ADV 0x04 +#define HCI_SUBCODE_BLE_ENERGY_INFO 0x05 +#define HCI_SUBCODE_BLE_EXTENDED_SCAN_PARAMS 0x06 +#define HCI_SUBCODE_BLE_MAX 0x7F + +//ESP BT subcode define +#define HCI_SUBCODE_BT_INIT 0x00 +#define HCI_SUBCODE_BT_MAX 0x7F + +#define HCI_ESP_VENDOR_OPCODE_BUILD(ogf, group, subcode) ((ogf << 10) | (group <<7) | (subcode << 0)) +/* +* | OGF | VENDIOR GROUP | GROUP SUBCODE | +* | 1 1 1 1 1 1 | 0 0 0 | X X X X X X X | Already Exist +* | 1 1 1 1 1 1 | 0 0 1 | X X X X X X X | ESP VENDOR COMMON HCI CMD +* | 1 1 1 1 1 1 | 0 1 0 | X X X X X X X | ESP VENDOR BLE HCI CMD +* | 1 1 1 1 1 1 | 0 1 1 | X X X X X X X | ESP VENDOR BT HCI CMD +* | 1 1 1 1 1 1 | 1 0 0 | X X X X X X X | RESERVED FOR FUTURE USE +* | 1 1 1 1 1 1 | 1 0 1 | X X X X X X X | RESERVED FOR FUTURE USE +* | 1 1 1 1 1 1 | 1 1 0 | X X X X X X X | RESERVED FOR FUTURE USE +* | 1 1 1 1 1 1 | 1 1 1 | X X X X X X X | RESERVED FOR FUTURE USE +*/ + +// ESP COMMON HCI CMD +#define HCI_VENDOR_COMMON_ECHO_CMD_OPCODE HCI_ESP_VENDOR_OPCODE_BUILD(HCI_VENDOR_OGF, HCI_ESP_GROUP_COMMON, HCI_SUBCODE_COMMON_ECHO) + +//ESP BLE HCI CMD /* Multi adv OCF */ -#define HCI_BLE_MULTI_ADV_OCF (0x0154 | HCI_GRP_VENDOR_SPECIFIC) - +#define HCI_BLE_MULTI_ADV_OCF HCI_ESP_VENDOR_OPCODE_BUILD(HCI_VENDOR_OGF, HCI_ESP_GROUP_COMMON, HCI_SUBCODE_BLE_MULTI_ADV) /* Batch scan OCF */ -#define HCI_BLE_BATCH_SCAN_OCF (0x0156 | HCI_GRP_VENDOR_SPECIFIC) - +#define HCI_BLE_BATCH_SCAN_OCF HCI_ESP_VENDOR_OPCODE_BUILD(HCI_VENDOR_OGF, HCI_ESP_GROUP_COMMON, HCI_SUBCODE_BLE_BATCH_SCAN) /* ADV filter OCF */ -#define HCI_BLE_ADV_FILTER_OCF (0x0157 | HCI_GRP_VENDOR_SPECIFIC) - +#define HCI_BLE_ADV_FILTER_OCF HCI_ESP_VENDOR_OPCODE_BUILD(HCI_VENDOR_OGF, HCI_ESP_GROUP_COMMON, HCI_SUBCODE_BLE_ADV_FILTER) /* Tracking OCF */ -#define HCI_BLE_TRACK_ADV_OCF (0x0158 | HCI_GRP_VENDOR_SPECIFIC) - +#define HCI_BLE_TRACK_ADV_OCF HCI_ESP_VENDOR_OPCODE_BUILD(HCI_VENDOR_OGF, HCI_ESP_GROUP_COMMON, HCI_SUBCODE_BLE_TRACK_ADV) /* Energy info OCF */ -#define HCI_BLE_ENERGY_INFO_OCF (0x0159 | HCI_GRP_VENDOR_SPECIFIC) - +#define HCI_BLE_ENERGY_INFO_OCF HCI_ESP_VENDOR_OPCODE_BUILD(HCI_VENDOR_OGF, HCI_ESP_GROUP_COMMON, HCI_SUBCODE_BLE_ENERGY_INFO) /* Extended BLE Scan parameters OCF */ -#define HCI_BLE_EXTENDED_SCAN_PARAMS_OCF (0x0160 | HCI_GRP_VENDOR_SPECIFIC) +#define HCI_BLE_EXTENDED_SCAN_PARAMS_OCF HCI_ESP_VENDOR_OPCODE_BUILD(HCI_VENDOR_OGF, HCI_ESP_GROUP_COMMON, HCI_SUBCODE_BLE_EXTENDED_SCAN_PARAMS) + +//ESP BT HCI CMD /* subcode for multi adv feature */ #define BTM_BLE_MULTI_ADV_SET_PARAM 0x01 diff --git a/components/esp32/ld/esp32.rom.ld b/components/esp32/ld/esp32.rom.ld index 7b3dc08a4..c1e3e94bc 100644 --- a/components/esp32/ld/esp32.rom.ld +++ b/components/esp32/ld/esp32.rom.ld @@ -57,6 +57,7 @@ PROVIDE ( _bss_start_btdm = 0x3ffb8000); PROVIDE ( _bss_end_btdm = 0x3ffbff70); PROVIDE ( _daylight = 0x3ffae0a4 ); PROVIDE ( dbg_default_handler = 0x3ff97218 ); +PROVIDE ( dbg_default_state = 0x3ff97220 ); PROVIDE ( dbg_state = 0x3ffb8d5d ); PROVIDE ( DebugE256PublicKey_x = 0x3ff97428 ); PROVIDE ( DebugE256PublicKey_y = 0x3ff97408 ); From 6628fddae6e5010d8bab1659582eda0c4c174a8c Mon Sep 17 00:00:00 2001 From: zhiweijian Date: Fri, 1 Mar 2019 21:59:55 +0800 Subject: [PATCH 2/2] Component/bt: add BLE adv report flow control --- components/bt/Kconfig | 33 +++++++++++++++ .../api/include/api/esp_gap_ble_api.h | 2 + components/bt/bluedroid/bta/dm/bta_dm_act.c | 27 +++++++++++- .../bt/bluedroid/bta/include/bta/bta_api.h | 7 ++++ .../btc/profile/std/gap/btc_gap_ble.c | 3 ++ .../common/include/common/bt_target.h | 18 ++++++++ components/bt/bluedroid/device/controller.c | 6 ++- components/bt/bluedroid/hci/hci_hal_h4.c | 42 +++++++++++++++++-- components/bt/bluedroid/hci/hci_layer.c | 6 ++- .../bt/bluedroid/hci/hci_packet_factory.c | 13 ++++++ .../hci/include/hci/hci_packet_factory.h | 1 + .../bt/bluedroid/stack/btm/btm_ble_gap.c | 14 ++++++- .../bluedroid/stack/btm/include/btm_ble_int.h | 2 + components/bt/bluedroid/stack/btu/btu_hcif.c | 9 ++++ .../bt/bluedroid/stack/hcic/hciblecmds.c | 22 ++++++++++ .../bluedroid/stack/include/stack/btm_api.h | 3 +- .../stack/include/stack/btm_ble_api.h | 2 +- .../bluedroid/stack/include/stack/hcidefs.h | 31 +++++++++----- .../bluedroid/stack/include/stack/hcimsgs.h | 6 +++ components/bt/lib | 2 +- 20 files changed, 227 insertions(+), 22 deletions(-) diff --git a/components/bt/Kconfig b/components/bt/Kconfig index b84c07b27..53967ddf5 100644 --- a/components/bt/Kconfig +++ b/components/bt/Kconfig @@ -243,6 +243,39 @@ config MESH_DUPLICATE_SCAN_CACHE_SIZE Maximum number of adv packets which can be recorded in duplicate scan cache for BLE Mesh. When the maximum amount of device in the filter is reached, the cache will be refreshed. +config BLE_ADV_REPORT_FLOW_CONTROL_SUPPORTED + bool "BLE adv report flow control supported" + depends on (BTDM_CONTROLLER_MODE_BTDM || BTDM_CONTROLLER_MODE_BLE_ONLY) + default y + help + The function is mainly used to enable flow control for advertising reports. When it is enabled, + advertising reports will be discarded by the controller if the number of unprocessed advertising + reports exceeds the size of BLE adv report flow control. + +config BLE_ADV_REPORT_FLOW_CONTROL_NUM + int "BLE adv report flow control number" + depends on BLE_ADV_REPORT_FLOW_CONTROL_SUPPORTED + range 50 1000 + default 100 + help + The number of unprocessed advertising report that Bluedroid can save.If you set + `BLE_ADV_REPORT_FLOW_CONTROL_NUM` to a small value, this may cause adv packets lost. + If you set `BLE_ADV_REPORT_FLOW_CONTROL_NUM` to a large value, Bluedroid may cache a + lot of adv packets and this may cause system memory run out. For example, if you set + it to 50, the maximum memory consumed by host is 35 * 50 bytes. Please set + `BLE_ADV_REPORT_FLOW_CONTROL_NUM` according to your system free memory and handle adv + packets as fast as possible, otherwise it will cause adv packets lost. + +config BLE_ADV_REPORT_DISCARD_THRSHOLD + int "BLE adv lost event threshold value" + depends on BLE_ADV_REPORT_FLOW_CONTROL_SUPPORTED + range 1 1000 + default 20 + help + When adv report flow control is enabled, The ADV lost event will be generated when the number + of ADV packets lost in the controller reaches this threshold. It is better to set a larger value. + If you set `BLE_ADV_REPORT_DISCARD_THRSHOLD` to a small value or printf every adv lost event, it + may cause adv packets lost more. endmenu diff --git a/components/bt/bluedroid/api/include/api/esp_gap_ble_api.h b/components/bt/bluedroid/api/include/api/esp_gap_ble_api.h index 54f6c9ef4..76d74473b 100644 --- a/components/bt/bluedroid/api/include/api/esp_gap_ble_api.h +++ b/components/bt/bluedroid/api/include/api/esp_gap_ble_api.h @@ -552,6 +552,7 @@ typedef enum { ESP_GAP_SEARCH_DISC_CMPL_EVT = 4, /*!< Discovery complete. */ ESP_GAP_SEARCH_DI_DISC_CMPL_EVT = 5, /*!< Discovery complete. */ ESP_GAP_SEARCH_SEARCH_CANCEL_CMPL_EVT = 6, /*!< Search cancelled */ + ESP_GAP_SEARCH_INQ_DISCARD_NUM_EVT = 7, /*!< The number of pkt discarded by flow control */ } esp_gap_search_evt_t; /** @@ -607,6 +608,7 @@ typedef union { int num_resps; /*!< Scan result number */ uint8_t adv_data_len; /*!< Adv data length */ uint8_t scan_rsp_len; /*!< Scan response length */ + uint32_t num_dis; /*!< The number of discard packets */ } scan_rst; /*!< Event parameter of ESP_GAP_BLE_SCAN_RESULT_EVT */ /** * @brief ESP_GAP_BLE_ADV_DATA_RAW_SET_COMPLETE_EVT diff --git a/components/bt/bluedroid/bta/dm/bta_dm_act.c b/components/bt/bluedroid/bta/dm/bta_dm_act.c index bfc052c2c..77aed3824 100644 --- a/components/bt/bluedroid/bta/dm/bta_dm_act.c +++ b/components/bt/bluedroid/bta/dm/bta_dm_act.c @@ -127,6 +127,7 @@ static void bta_dm_remove_sec_dev_entry(BD_ADDR remote_bd_addr); #endif ///SMP_INCLUDED == TRUE static void bta_dm_observe_results_cb(tBTM_INQ_RESULTS *p_inq, UINT8 *p_eir); static void bta_dm_observe_cmpl_cb(void *p_result); +static void bta_dm_observe_discard_cb (uint32_t num_dis); static void bta_dm_delay_role_switch_cback(TIMER_LIST_ENT *p_tle); extern void sdpu_uuid16_to_uuid128(UINT16 uuid16, UINT8 *p_uuid128); static void bta_dm_disable_timer_cback(TIMER_LIST_ENT *p_tle); @@ -4258,6 +4259,28 @@ static void bta_dm_observe_cmpl_cb (void *p_result) } } +/******************************************************************************* +** +** Function bta_dm_observe_discard_cb +** +** Description Callback for BLE Observe lost +** +** +** Returns void +** +*******************************************************************************/ +static void bta_dm_observe_discard_cb (uint32_t num_dis) +{ + tBTA_DM_SEARCH data; + + APPL_TRACE_DEBUG("bta_dm_observe_discard_cb"); + + data.inq_dis.num_dis = num_dis; + if (bta_dm_search_cb.p_scan_cback) { + bta_dm_search_cb.p_scan_cback(BTA_DM_INQ_DISCARD_NUM_EVT, &data); + } +} + #if (SMP_INCLUDED == TRUE) /******************************************************************************* ** @@ -4789,7 +4812,7 @@ void bta_dm_ble_scan (tBTA_DM_MSG *p_data) bta_dm_search_cb.p_scan_cback = p_data->ble_scan.p_cback; if ((status = BTM_BleScan(TRUE, p_data->ble_scan.duration, - bta_dm_observe_results_cb, bta_dm_observe_cmpl_cb)) != BTM_CMD_STARTED) { + bta_dm_observe_results_cb, bta_dm_observe_cmpl_cb, bta_dm_observe_discard_cb)) != BTM_CMD_STARTED) { APPL_TRACE_WARNING(" %s start scan failed. status=0x%x\n", __FUNCTION__, status); } @@ -4799,7 +4822,7 @@ void bta_dm_ble_scan (tBTA_DM_MSG *p_data) } } else { bta_dm_search_cb.p_scan_cback = NULL; - status = BTM_BleScan(FALSE, 0, NULL, NULL); + status = BTM_BleScan(FALSE, 0, NULL, NULL, NULL); if (status != BTM_CMD_STARTED){ APPL_TRACE_WARNING(" %s stop scan failed, status=0x%x\n", __FUNCTION__, status); diff --git a/components/bt/bluedroid/bta/include/bta/bta_api.h b/components/bt/bluedroid/bta/include/bta/bta_api.h index d3528eb77..74c987c1a 100644 --- a/components/bt/bluedroid/bta/include/bta/bta_api.h +++ b/components/bt/bluedroid/bta/include/bta/bta_api.h @@ -1022,6 +1022,7 @@ typedef struct { #define BTA_DM_DISC_CMPL_EVT 4 /* Discovery complete. */ #define BTA_DM_DI_DISC_CMPL_EVT 5 /* Discovery complete. */ #define BTA_DM_SEARCH_CANCEL_CMPL_EVT 6 /* Search cancelled */ +#define BTA_DM_INQ_DISCARD_NUM_EVT 7 /* The number of inquiry discarded packets */ typedef UINT8 tBTA_DM_SEARCH_EVT; @@ -1053,6 +1054,11 @@ typedef struct { UINT8 num_resps; /* Number of inquiry responses. */ } tBTA_DM_INQ_CMPL; +/* Structure associated with BTA_DM_INQ_DISCARD_NUM_EVT */ +typedef struct { + UINT32 num_dis; /* The number of inquiry discarded packets. */ +} tBTA_DM_INQ_DISCARD; + /* Structure associated with BTA_DM_DI_DISC_CMPL_EVT */ typedef struct { BD_ADDR bd_addr; /* BD address peer device. */ @@ -1090,6 +1096,7 @@ typedef union { tBTA_DM_DISC_RES disc_res; /* Discovery result for a peer device. */ tBTA_DM_DISC_BLE_RES disc_ble_res; /* Discovery result for GATT based service */ tBTA_DM_DI_DISC_CMPL di_disc; /* DI discovery result for a peer device */ + tBTA_DM_INQ_DISCARD inq_dis; /* the discarded packets information of inquiry */ } tBTA_DM_SEARCH; /* Structure of search callback event and structures */ diff --git a/components/bt/bluedroid/btc/profile/std/gap/btc_gap_ble.c b/components/bt/bluedroid/btc/profile/std/gap/btc_gap_ble.c index 2058320cf..36432c164 100644 --- a/components/bt/bluedroid/btc/profile/std/gap/btc_gap_ble.c +++ b/components/bt/bluedroid/btc/profile/std/gap/btc_gap_ble.c @@ -575,6 +575,9 @@ static void btc_search_callback(tBTA_DM_SEARCH_EVT event, tBTA_DM_SEARCH *p_data case BTA_DM_SEARCH_CANCEL_CMPL_EVT: BTC_TRACE_DEBUG("BTA_DM_SEARCH_CANCEL_CMPL_EVT\n"); break; + case BTA_DM_INQ_DISCARD_NUM_EVT: + param.scan_rst.num_dis = p_data->inq_dis.num_dis; + break; default: BTC_TRACE_ERROR("%s : Unknown event 0x%x\n", __FUNCTION__, event); return; diff --git a/components/bt/bluedroid/common/include/common/bt_target.h b/components/bt/bluedroid/common/include/common/bt_target.h index 3cf75b918..02e00088e 100644 --- a/components/bt/bluedroid/common/include/common/bt_target.h +++ b/components/bt/bluedroid/common/include/common/bt_target.h @@ -130,6 +130,24 @@ #define BLE_PRIVACY_SPT FALSE #endif /* CONFIG_SMP_ENABLE */ +#ifndef CONFIG_BLE_ADV_REPORT_FLOW_CONTROL_SUPPORTED +#define BLE_ADV_REPORT_FLOW_CONTROL FALSE +#else +#define BLE_ADV_REPORT_FLOW_CONTROL CONFIG_BLE_ADV_REPORT_FLOW_CONTROL_SUPPORTED +#endif /* CONFIG_BLE_ADV_REPORT_FLOW_CONTROL_SUPPORTED */ + +#ifndef CONFIG_BLE_ADV_REPORT_FLOW_CONTROL_NUM +#define BLE_ADV_REPORT_FLOW_CONTROL_NUM 100 +#else +#define BLE_ADV_REPORT_FLOW_CONTROL_NUM CONFIG_BLE_ADV_REPORT_FLOW_CONTROL_NUM +#endif /* CONFIG_BLE_ADV_REPORT_FLOW_CONTROL_NUM */ + +#ifndef CONFIG_BLE_ADV_REPORT_DISCARD_THRSHOLD +#define BLE_ADV_REPORT_DISCARD_THRSHOLD 20 +#else +#define BLE_ADV_REPORT_DISCARD_THRSHOLD CONFIG_BLE_ADV_REPORT_DISCARD_THRSHOLD +#endif /* CONFIG_BLE_ADV_REPORT_DISCARD_THRSHOLD */ + #if (CONFIG_BT_ACL_CONNECTIONS) #define MAX_ACL_CONNECTIONS CONFIG_BT_ACL_CONNECTIONS #define GATT_MAX_PHY_CHANNEL CONFIG_BT_ACL_CONNECTIONS diff --git a/components/bt/bluedroid/device/controller.c b/components/bt/bluedroid/device/controller.c index 2d4d29a4f..94ec46601 100644 --- a/components/bt/bluedroid/device/controller.c +++ b/components/bt/bluedroid/device/controller.c @@ -100,7 +100,11 @@ static void start_up(void) response = AWAIT_COMMAND(packet_factory->make_set_c2h_flow_control(HCI_HOST_FLOW_CTRL_ACL_ON)); packet_parser->parse_generic_command_complete(response); #endif ///C2H_FLOW_CONTROL_INCLUDED == TRUE - +#if (BLE_ADV_REPORT_FLOW_CONTROL == TRUE) + // Enable adv flow control + response = AWAIT_COMMAND(packet_factory->make_set_adv_report_flow_control(HCI_HOST_FLOW_CTRL_ADV_REPORT_ON, (uint16_t)BLE_ADV_REPORT_FLOW_CONTROL_NUM, (uint16_t)BLE_ADV_REPORT_DISCARD_THRSHOLD)); + packet_parser->parse_generic_command_complete(response); +#endif // Tell the controller about our buffer sizes and buffer counts next // TODO(zachoverflow): factor this out. eww l2cap contamination. And why just a hardcoded 10? response = AWAIT_COMMAND( diff --git a/components/bt/bluedroid/hci/hci_hal_h4.c b/components/bt/bluedroid/hci/hci_hal_h4.c index 84aec2e9c..e742b6240 100644 --- a/components/bt/bluedroid/hci/hci_hal_h4.c +++ b/components/bt/bluedroid/hci/hci_hal_h4.c @@ -55,6 +55,7 @@ static const uint16_t outbound_event_types[] = { typedef struct { size_t buffer_size; fixed_queue_t *rx_q; + uint16_t adv_free_num; } hci_hal_env_t; @@ -81,6 +82,7 @@ static void hci_hal_env_init( assert(max_buffer_count > 0); hci_hal_env.buffer_size = buffer_size; + hci_hal_env.adv_free_num = 0; hci_hal_env.rx_q = fixed_queue_new(max_buffer_count); if (hci_hal_env.rx_q) { @@ -102,8 +104,11 @@ static bool hal_open(const hci_hal_callbacks_t *upper_callbacks) { assert(upper_callbacks != NULL); callbacks = upper_callbacks; - +#if (BLE_ADV_REPORT_FLOW_CONTROL == TRUE) + hci_hal_env_init(HCI_HAL_SERIAL_BUFFER_SIZE, BLE_ADV_REPORT_FLOW_CONTROL_NUM + L2CAP_HOST_FC_ACL_BUFS + QUEUE_SIZE_MAX); // adv flow control num + ACL flow control num + hci cmd numeber +#else hci_hal_env_init(HCI_HAL_SERIAL_BUFFER_SIZE, QUEUE_SIZE_MAX); +#endif xHciH4Queue = xQueueCreate(HCI_H4_QUEUE_LEN, sizeof(BtTaskEvt_t)); xTaskCreatePinnedToCore(hci_hal_h4_rx_handler, HCI_H4_TASK_NAME, HCI_H4_TASK_STACK_SIZE, NULL, HCI_H4_TASK_PRIO, &xHciH4TaskHandle, HCI_H4_TASK_PINNED_TO_CORE); @@ -223,12 +228,37 @@ static void hci_packet_complete(BT_HDR *packet){ bool host_recv_adv_packet(BT_HDR *packet) { assert(packet); - if(packet->data[0] == DATA_TYPE_EVENT && packet->data[1] == HCI_BLE_EVENT && packet->data[3] == HCI_BLE_ADV_PKT_RPT_EVT) { - return true; + if(packet->data[0] == DATA_TYPE_EVENT && packet->data[1] == HCI_BLE_EVENT) { + if(packet->data[3] == HCI_BLE_ADV_PKT_RPT_EVT +#if (BLE_ADV_REPORT_FLOW_CONTROL == TRUE) + || packet->data[3] == HCI_BLE_ADV_DISCARD_REPORT_EVT +#endif + ) { + return true; + } } return false; } +#if (BLE_ADV_REPORT_FLOW_CONTROL == TRUE) +static void hci_update_adv_report_flow_control(BT_HDR *packet) +{ + // this is adv packet + if(host_recv_adv_packet(packet)) { + // update adv free number + hci_hal_env.adv_free_num ++; + if (esp_vhci_host_check_send_available()){ + // send hci cmd + btsnd_hcic_ble_update_adv_report_flow_control(hci_hal_env.adv_free_num); + hci_hal_env.adv_free_num = 0; + } else { + //do nothing + } + } + +} +#endif + static void hci_hal_h4_hdl_rx_packet(BT_HDR *packet) { uint8_t type, hdr_size; @@ -282,6 +312,11 @@ static void hci_hal_h4_hdl_rx_packet(BT_HDR *packet) osi_free(packet); return; } + +#if (BLE_ADV_REPORT_FLOW_CONTROL == TRUE) + hci_update_adv_report_flow_control(packet); +#endif + #if SCAN_QUEUE_CONGEST_CHECK if(BTU_check_queue_is_congest() && host_recv_adv_packet(packet)) { HCI_TRACE_ERROR("BtuQueue is congested"); @@ -289,7 +324,6 @@ static void hci_hal_h4_hdl_rx_packet(BT_HDR *packet) return; } #endif - packet->event = outbound_event_types[PACKET_TYPE_TO_INDEX(type)]; callbacks->packet_ready(packet); } diff --git a/components/bt/bluedroid/hci/hci_layer.c b/components/bt/bluedroid/hci/hci_layer.c index 87d187c8d..c2b6223ce 100644 --- a/components/bt/bluedroid/hci/hci_layer.c +++ b/components/bt/bluedroid/hci/hci_layer.c @@ -317,7 +317,11 @@ static void event_command_ready(fixed_queue_t *queue) wait_entry = fixed_queue_dequeue(queue); - if(wait_entry->opcode == HCI_HOST_NUM_PACKETS_DONE){ + if(wait_entry->opcode == HCI_HOST_NUM_PACKETS_DONE +#if (BLE_ADV_REPORT_FLOW_CONTROL == TRUE) + || wait_entry->opcode == HCI_VENDOR_BLE_ADV_REPORT_FLOW_CONTROL +#endif + ){ packet_fragmenter->fragment_and_dispatch(wait_entry->command); osi_free(wait_entry->command); osi_free(wait_entry); diff --git a/components/bt/bluedroid/hci/hci_packet_factory.c b/components/bt/bluedroid/hci/hci_packet_factory.c index ecf7e75fa..19641d104 100644 --- a/components/bt/bluedroid/hci/hci_packet_factory.c +++ b/components/bt/bluedroid/hci/hci_packet_factory.c @@ -53,6 +53,18 @@ static BT_HDR *make_set_c2h_flow_control(uint8_t enable) return packet; } +static BT_HDR *make_set_adv_report_flow_control(uint8_t enable, uint16_t num, uint16_t lost_threshold) +{ + uint8_t *stream; + const uint8_t parameter_size = 1 + 2 + 2; + BT_HDR *packet = make_command(HCI_VENDOR_BLE_SET_ADV_FLOW_CONTROL, parameter_size, &stream); + + UINT8_TO_STREAM(stream, enable); + UINT16_TO_STREAM(stream, num); + UINT16_TO_STREAM(stream, lost_threshold); + return packet; +} + static BT_HDR *make_host_buffer_size(uint16_t acl_size, uint8_t sco_size, uint16_t acl_count, uint16_t sco_count) { uint8_t *stream; @@ -239,6 +251,7 @@ static const hci_packet_factory_t interface = { make_reset, make_read_buffer_size, make_set_c2h_flow_control, + make_set_adv_report_flow_control, make_host_buffer_size, make_read_local_version_info, make_read_bd_addr, diff --git a/components/bt/bluedroid/hci/include/hci/hci_packet_factory.h b/components/bt/bluedroid/hci/include/hci/hci_packet_factory.h index 21bd2c9a6..fd8731fbc 100644 --- a/components/bt/bluedroid/hci/include/hci/hci_packet_factory.h +++ b/components/bt/bluedroid/hci/include/hci/hci_packet_factory.h @@ -26,6 +26,7 @@ typedef struct { BT_HDR *(*make_reset)(void); BT_HDR *(*make_read_buffer_size)(void); BT_HDR *(*make_set_c2h_flow_control)(uint8_t enable); + BT_HDR *(*make_set_adv_report_flow_control)(uint8_t enable, uint16_t num, uint16_t lost_threshold); BT_HDR *(*make_host_buffer_size)(uint16_t acl_size, uint8_t sco_size, uint16_t acl_count, uint16_t sco_count); BT_HDR *(*make_read_local_version_info)(void); BT_HDR *(*make_read_bd_addr)(void); diff --git a/components/bt/bluedroid/stack/btm/btm_ble_gap.c b/components/bt/bluedroid/stack/btm/btm_ble_gap.c index 5540728ad..64a078a48 100644 --- a/components/bt/bluedroid/stack/btm/btm_ble_gap.c +++ b/components/bt/bluedroid/stack/btm/btm_ble_gap.c @@ -439,7 +439,7 @@ tBTM_STATUS BTM_BleObserve(BOOLEAN start, UINT32 duration, ** *******************************************************************************/ tBTM_STATUS BTM_BleScan(BOOLEAN start, UINT32 duration, - tBTM_INQ_RESULTS_CB *p_results_cb, tBTM_CMPL_CB *p_cmpl_cb) + tBTM_INQ_RESULTS_CB *p_results_cb, tBTM_CMPL_CB *p_cmpl_cb, tBTM_INQ_DIS_CB *p_discard_cb) { tBTM_BLE_INQ_CB *p_inq = &btm_cb.ble_ctr_cb.inq_var; tBTM_STATUS status = BTM_WRONG_MODE; @@ -457,6 +457,7 @@ tBTM_STATUS BTM_BleScan(BOOLEAN start, UINT32 duration, btm_cb.ble_ctr_cb.p_scan_results_cb = p_results_cb; btm_cb.ble_ctr_cb.p_scan_cmpl_cb = p_cmpl_cb; + btm_cb.ble_ctr_cb.p_obs_discard_cb = p_discard_cb; status = BTM_CMD_STARTED; /* scan is not started */ @@ -3467,6 +3468,17 @@ static void btm_ble_process_adv_pkt_cont(BD_ADDR bda, UINT8 addr_type, UINT8 evt } } +void btm_ble_process_adv_discard_evt(UINT8 *p) +{ +#if (BLE_ADV_REPORT_FLOW_CONTROL == TRUE) + uint32_t num_dis = 0; + STREAM_TO_UINT32 (num_dis, p); + tBTM_INQ_DIS_CB *p_obs_discard_cb = btm_cb.ble_ctr_cb.p_obs_discard_cb; + if(p_obs_discard_cb) { + (p_obs_discard_cb)(num_dis); + } +#endif +} /******************************************************************************* ** ** Function btm_ble_start_scan diff --git a/components/bt/bluedroid/stack/btm/include/btm_ble_int.h b/components/bt/bluedroid/stack/btm/include/btm_ble_int.h index b3b8ad10c..9679afffa 100644 --- a/components/bt/bluedroid/stack/btm/include/btm_ble_int.h +++ b/components/bt/bluedroid/stack/btm/include/btm_ble_int.h @@ -317,6 +317,7 @@ typedef struct { /* observer callback and timer */ tBTM_INQ_RESULTS_CB *p_obs_results_cb; tBTM_CMPL_CB *p_obs_cmpl_cb; + tBTM_INQ_DIS_CB *p_obs_discard_cb; TIMER_LIST_ENT obs_timer_ent; /* scan callback and timer */ @@ -365,6 +366,7 @@ extern "C" { void btm_ble_timeout(TIMER_LIST_ENT *p_tle); void btm_ble_process_adv_pkt (UINT8 *p); +void btm_ble_process_adv_discard_evt(UINT8 *p); void btm_ble_proc_scan_rsp_rpt (UINT8 *p); tBTM_STATUS btm_ble_read_remote_name(BD_ADDR remote_bda, tBTM_INQ_INFO *p_cur, tBTM_CMPL_CB *p_cb); BOOLEAN btm_ble_cancel_remote_name(BD_ADDR remote_bda); diff --git a/components/bt/bluedroid/stack/btu/btu_hcif.c b/components/bt/bluedroid/stack/btu/btu_hcif.c index 6374d0b0a..a82f683a8 100644 --- a/components/bt/bluedroid/stack/btu/btu_hcif.c +++ b/components/bt/bluedroid/stack/btu/btu_hcif.c @@ -122,6 +122,7 @@ static void btu_hcif_ssr_evt (UINT8 *p, UINT16 evt_len); #if BLE_INCLUDED == TRUE static void btu_ble_ll_conn_complete_evt (UINT8 *p, UINT16 evt_len); static void btu_ble_process_adv_pkt (UINT8 *p); +static void btu_ble_process_adv_dis(UINT8 *p); static void btu_ble_read_remote_feat_evt (UINT8 *p); static void btu_ble_ll_conn_param_upd_evt (UINT8 *p, UINT16 evt_len); static void btu_ble_ll_get_conn_param_format_err_from_contoller (UINT8 status, UINT16 handle); @@ -331,6 +332,9 @@ void btu_hcif_process_event (UNUSED_ATTR UINT8 controller_id, BT_HDR *p_msg) case HCI_BLE_ADV_PKT_RPT_EVT: /* result of inquiry */ btu_ble_process_adv_pkt(p); break; + case HCI_BLE_ADV_DISCARD_REPORT_EVT: + btu_ble_process_adv_dis(p); + break; case HCI_BLE_CONN_COMPLETE_EVT: btu_ble_ll_conn_complete_evt(p, hci_evt_len); break; @@ -1764,6 +1768,11 @@ static void btu_ble_process_adv_pkt (UINT8 *p) btm_ble_process_adv_pkt(p); } +static void btu_ble_process_adv_dis(UINT8 *p) +{ + btm_ble_process_adv_discard_evt(p); +} + static void btu_ble_ll_conn_complete_evt ( UINT8 *p, UINT16 evt_len) { btm_ble_conn_complete(p, evt_len, FALSE); diff --git a/components/bt/bluedroid/stack/hcic/hciblecmds.c b/components/bt/bluedroid/stack/hcic/hciblecmds.c index 89d4fd94c..a34806fdb 100644 --- a/components/bt/bluedroid/stack/hcic/hciblecmds.c +++ b/components/bt/bluedroid/stack/hcic/hciblecmds.c @@ -999,5 +999,27 @@ BOOLEAN btsnd_hcic_ble_set_data_length(UINT16 conn_handle, UINT16 tx_octets, UIN return TRUE; } +BOOLEAN btsnd_hcic_ble_update_adv_report_flow_control (UINT16 num) +{ + BT_HDR *p; + UINT8 *pp; + + if ((p = HCI_GET_CMD_BUF (1)) == NULL) { + return (FALSE); + } + + pp = (UINT8 *)(p + 1); + + p->len = HCIC_PREAMBLE_SIZE + 2; + p->offset = 0; + + UINT16_TO_STREAM (pp, HCI_VENDOR_BLE_ADV_REPORT_FLOW_CONTROL); + UINT8_TO_STREAM (pp, 2); + UINT16_TO_STREAM (pp, num); + + btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID, p); + return TRUE; +} + #endif diff --git a/components/bt/bluedroid/stack/include/stack/btm_api.h b/components/bt/bluedroid/stack/include/stack/btm_api.h index f686a1217..6aa833c03 100644 --- a/components/bt/bluedroid/stack/include/stack/btm_api.h +++ b/components/bt/bluedroid/stack/include/stack/btm_api.h @@ -169,6 +169,8 @@ typedef void (tBTM_VS_EVT_CB) (UINT8 len, UINT8 *p); */ typedef void (tBTM_CMPL_CB) (void *p1); +typedef void (tBTM_INQ_DIS_CB) (uint32_t num_dis); + /* VSC callback function for notifying an application that a synchronous ** BTM function is complete. The pointer contains the address of any returned data. */ @@ -677,7 +679,6 @@ typedef struct { UINT8 num_resp; /* Number of results from the current inquiry */ } tBTM_INQUIRY_CMPL; - /* Structure returned with remote name request */ typedef struct { UINT16 status; diff --git a/components/bt/bluedroid/stack/include/stack/btm_ble_api.h b/components/bt/bluedroid/stack/include/stack/btm_ble_api.h index e375ea34b..a019dd4fe 100644 --- a/components/bt/bluedroid/stack/include/stack/btm_ble_api.h +++ b/components/bt/bluedroid/stack/include/stack/btm_ble_api.h @@ -1242,7 +1242,7 @@ tBTM_STATUS BTM_BleObserve(BOOLEAN start, UINT32 duration, *******************************************************************************/ //extern tBTM_STATUS BTM_BleScan(BOOLEAN start, UINT32 duration, - tBTM_INQ_RESULTS_CB *p_results_cb, tBTM_CMPL_CB *p_cmpl_cb); + tBTM_INQ_RESULTS_CB *p_results_cb, tBTM_CMPL_CB *p_cmpl_cb, tBTM_INQ_DIS_CB *p_discard_cb); /******************************************************************************* diff --git a/components/bt/bluedroid/stack/include/stack/hcidefs.h b/components/bt/bluedroid/stack/include/stack/hcidefs.h index 486cce8ab..7fab1d830 100644 --- a/components/bt/bluedroid/stack/include/stack/hcidefs.h +++ b/components/bt/bluedroid/stack/include/stack/hcidefs.h @@ -367,14 +367,18 @@ #define HCI_SUBCODE_COMMON_MAX 0x7F //ESP BLE subcode define -#define HCI_SUBCODE_BLE_INIT 0x00 -#define HCI_SUBCODE_BLE_MULTI_ADV 0x01 -#define HCI_SUBCODE_BLE_BATCH_SCAN 0x02 -#define HCI_SUBCODE_BLE_ADV_FILTER 0x03 -#define HCI_SUBCODE_BLE_TRACK_ADV 0x04 -#define HCI_SUBCODE_BLE_ENERGY_INFO 0x05 -#define HCI_SUBCODE_BLE_EXTENDED_SCAN_PARAMS 0x06 -#define HCI_SUBCODE_BLE_MAX 0x7F +#define HCI_SUBCODE_BLE_INIT 0x00 +#define HCI_SUBCODE_BLE_MULTI_ADV 0x01 +#define HCI_SUBCODE_BLE_BATCH_SCAN 0x02 +#define HCI_SUBCODE_BLE_ADV_FILTER 0x03 +#define HCI_SUBCODE_BLE_TRACK_ADV 0x04 +#define HCI_SUBCODE_BLE_ENERGY_INFO 0x05 +#define HCI_SUBCODE_BLE_EXTENDED_SCAN_PARAMS 0x06 +#define HCI_SUBCODE_BLE_LONG_ADV 0x07 +#define HCI_SUBCODE_BLE_DUPLICATE_EXCEPTIONAL_LIST 0x08 +#define HCI_SUBCODE_BLE_SET_ADV_FLOW_CONTROL 0x09 +#define HCI_SUBCODE_BLE_ADV_REPORT_FLOW_CONTROL 0x0A +#define HCI_SUBCODE_BLE_MAX 0x7F //ESP BT subcode define #define HCI_SUBCODE_BT_INIT 0x00 @@ -408,8 +412,13 @@ /* Energy info OCF */ #define HCI_BLE_ENERGY_INFO_OCF HCI_ESP_VENDOR_OPCODE_BUILD(HCI_VENDOR_OGF, HCI_ESP_GROUP_COMMON, HCI_SUBCODE_BLE_ENERGY_INFO) /* Extended BLE Scan parameters OCF */ -#define HCI_BLE_EXTENDED_SCAN_PARAMS_OCF HCI_ESP_VENDOR_OPCODE_BUILD(HCI_VENDOR_OGF, HCI_ESP_GROUP_COMMON, HCI_SUBCODE_BLE_EXTENDED_SCAN_PARAMS) - +#define HCI_BLE_EXTENDED_SCAN_PARAMS_OCF HCI_ESP_VENDOR_OPCODE_BUILD(HCI_VENDOR_OGF, HCI_ESP_GROUP_BLE, HCI_SUBCODE_BLE_EXTENDED_SCAN_PARAMS) +/* Long BLE Adv data OCF */ +#define HCI_VENDOR_BLE_LONG_ADV_DATA HCI_ESP_VENDOR_OPCODE_BUILD(HCI_VENDOR_OGF, HCI_ESP_GROUP_BLE, HCI_SUBCODE_BLE_LONG_ADV) +/* BLE update duplicate scan exceptional list */ +#define HCI_VENDOR_BLE_UPDATE_DUPLICATE_EXCEPTIONAL_LIST HCI_ESP_VENDOR_OPCODE_BUILD(HCI_VENDOR_OGF, HCI_ESP_GROUP_BLE, HCI_SUBCODE_BLE_DUPLICATE_EXCEPTIONAL_LIST) +#define HCI_VENDOR_BLE_SET_ADV_FLOW_CONTROL HCI_ESP_VENDOR_OPCODE_BUILD(HCI_VENDOR_OGF, HCI_ESP_GROUP_BLE, HCI_SUBCODE_BLE_SET_ADV_FLOW_CONTROL) +#define HCI_VENDOR_BLE_ADV_REPORT_FLOW_CONTROL HCI_ESP_VENDOR_OPCODE_BUILD(HCI_VENDOR_OGF, HCI_ESP_GROUP_BLE, HCI_SUBCODE_BLE_ADV_REPORT_FLOW_CONTROL) //ESP BT HCI CMD /* subcode for multi adv feature */ @@ -744,6 +753,8 @@ #define HCI_BLE_DATA_LENGTH_CHANGE_EVT 0x07 #define HCI_BLE_ENHANCED_CONN_COMPLETE_EVT 0x0a #define HCI_BLE_DIRECT_ADV_EVT 0x0b +/* ESP vendor BLE Event sub code */ +#define HCI_BLE_ADV_DISCARD_REPORT_EVT 0XF0 /* Definitions for LE Channel Map */ #define HCI_BLE_CHNL_MAP_SIZE 5 diff --git a/components/bt/bluedroid/stack/include/stack/hcimsgs.h b/components/bt/bluedroid/stack/include/stack/hcimsgs.h index 37b64c7d1..cc5dc1d61 100644 --- a/components/bt/bluedroid/stack/include/stack/hcimsgs.h +++ b/components/bt/bluedroid/stack/include/stack/hcimsgs.h @@ -555,6 +555,10 @@ BOOLEAN btsnd_hcic_write_voice_settings(UINT16 flags); /* Write Voice #define HCI_HOST_FLOW_CTRL_SCO_ON 2 #define HCI_HOST_FLOW_CTRL_BOTH_ON 3 +#define HCI_HOST_FLOW_CTRL_ADV_REPORT_OFF 0 +#define HCI_HOST_FLOW_CTRL_ADV_REPORT_ON 1 + + BOOLEAN btsnd_hcic_write_auto_flush_tout(UINT16 handle, UINT16 timeout); /* Write Retransmit Timout */ @@ -806,6 +810,8 @@ BOOLEAN btsnd_hcic_read_authenticated_payload_tout(UINT16 handle); BOOLEAN btsnd_hcic_write_authenticated_payload_tout(UINT16 handle, UINT16 timeout); +BOOLEAN btsnd_hcic_ble_update_adv_report_flow_control (UINT16 num); + #define HCIC_PARAM_SIZE_WRITE_AUTHENT_PAYLOAD_TOUT 4 #define HCI__WRITE_AUTHENT_PAYLOAD_TOUT_HANDLE_OFF 0 diff --git a/components/bt/lib b/components/bt/lib index 1f6837b9c..aee5ed577 160000 --- a/components/bt/lib +++ b/components/bt/lib @@ -1 +1 @@ -Subproject commit 1f6837b9c9a272d515d7736045da93f7a107389c +Subproject commit aee5ed577e52fb45feaa6a10c4444176b890b84b