|
|
@@ -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);
|
|
|
}
|