Просмотр исходного кода

Improve coexistence performance according to specific WiFi/BT/BLE scienario

    1. Improve WiFi performance in some Classic BT scienario(idle, inquire scan,
       connecting, connected, sniff, a2dp pause, etc).

    2. Support WiFi + Classic BT + BLE mesh coexistence scienario.

    3. Improve WiFi scan and connect performance in coexistence scienario.
baohongde 6 лет назад
Родитель
Сommit
78ecc043d5

+ 2 - 2
components/bt/Kconfig

@@ -332,8 +332,8 @@ menu "Bluetooth"
 
         config BTDM_CTRL_FULL_SCAN_SUPPORTED
             bool "BLE full scan feature supported"
-            depends on BTDM_CTRL_MODE_BLE_ONLY
-            default n
+            depends on BTDM_CONTROLLER_MODE_BLE_ONLY || BTDM_CONTROLLER_MODE_BTDM
+            default y
             help
                 The full scan function is mainly used to provide BLE scan performance.
                 This is required for scenes with high scan performance requirements, such as BLE Mesh scenes.

+ 1 - 1
components/bt/controller/lib

@@ -1 +1 @@
-Subproject commit 0a707c811ee824c9777b8712d2edf979fa8d2a2e
+Subproject commit f1ea6a5b8c50de1b561cd75090140ad9af68070a

+ 14 - 0
components/bt/host/bluedroid/bta/av/bta_av_aact.c

@@ -41,6 +41,7 @@
 #if( defined BTA_AR_INCLUDED ) && (BTA_AR_INCLUDED == TRUE)
 #include "bta/bta_ar_api.h"
 #endif
+#include "bta/bta_api.h"
 
 /*****************************************************************************
 **  Constants
@@ -508,8 +509,21 @@ static void bta_av_proc_stream_evt(UINT8 handle, BD_ADDR bd_addr, UINT8 event, t
         /* look up application event */
         if ((p_data == NULL) || (p_data->hdr.err_code == 0)) {
             p_msg->hdr.event = bta_av_stream_evt_ok[event];
+            if (p_msg->hdr.event == BTA_AV_STR_START_OK_EVT) {
+                BTA_DmCoexEventTrigger(BTA_COEX_EVT_STREAMING_STARTED);
+            } else if (p_msg->hdr.event == BTA_AV_STR_START_FAIL_EVT ||
+                p_msg->hdr.event == BTA_AV_STR_SUSPEND_CFM_EVT ||
+                p_msg->hdr.event == BTA_AV_STR_CLOSE_EVT) {
+                BTA_DmCoexEventTrigger(BTA_COEX_EVT_STREAMING_STOPPED);
+            }
         } else {
             p_msg->hdr.event = bta_av_stream_evt_fail[event];
+            if (p_msg->hdr.event == BTA_AV_STR_START_FAIL_EVT ||
+                p_msg->hdr.event == BTA_AV_STR_START_OK_EVT ||
+                p_msg->hdr.event == BTA_AV_STR_SUSPEND_CFM_EVT ||
+                p_msg->hdr.event == BTA_AV_STR_CLOSE_EVT) {
+                BTA_DmCoexEventTrigger(BTA_COEX_EVT_STREAMING_STOPPED);
+            }
         }
 
         p_msg->initiator = FALSE;

+ 2 - 1
components/bt/host/bluedroid/bta/dm/bta_dm_act.c

@@ -821,7 +821,6 @@ void bta_dm_set_visibility(tBTA_DM_MSG *p_data)
     if (p_data->set_visibility.pair_mode != BTA_DM_IGNORE || p_data->set_visibility.conn_paired_only != BTA_DM_IGNORE) {
         BTM_SetPairableMode((BOOLEAN)(!(bta_dm_cb.disable_pair_mode)), bta_dm_cb.conn_paired_only);
     }
-
 }
 
 /*******************************************************************************
@@ -3230,6 +3229,7 @@ static void bta_dm_bl_change_cback (tBTM_BL_EVENT_DATA *p_data)
             p_msg->transport = p_data->conn.transport;
             p_msg->handle = p_data->conn.handle;
 #endif
+            BTA_DmCoexEventTrigger(BTA_COEX_EVT_ACL_CONNECTED);
             break;
         case BTM_BL_DISCN_EVT:
             bdcpy(p_msg->bd_addr, p_data->discn.p_bda);
@@ -3237,6 +3237,7 @@ static void bta_dm_bl_change_cback (tBTM_BL_EVENT_DATA *p_data)
             p_msg->transport = p_data->discn.transport;
             p_msg->handle = p_data->discn.handle;
 #endif
+            BTA_DmCoexEventTrigger(BTA_COEX_EVT_ACL_DISCONNECTED);
             break;
         case BTM_BL_UPDATE_EVT:
             p_msg->busy_level = p_data->update.busy_level;

+ 32 - 0
components/bt/host/bluedroid/bta/dm/bta_dm_main.c

@@ -28,6 +28,7 @@
 #include "osi/allocator.h"
 #include <string.h>
 
+#include "esp_coexist.h"
 
 /*****************************************************************************
 ** Constants and types
@@ -402,6 +403,37 @@ BOOLEAN bta_dm_sm_execute(BT_HDR *p_msg)
     return TRUE;
 }
 
+void BTA_DmCoexEventTrigger(uint32_t event)
+{
+    switch(event) {
+    case BTA_COEX_EVT_SCAN_STARTED:
+    case BTA_COEX_EVT_SCAN_STOPPED:
+    case BTA_COEX_EVT_SNIFF_ENTER:
+    case BTA_COEX_EVT_SNIFF_EXIT:
+    case BTA_COEX_EVT_A2DP_PAUSED_ENTER:
+    case BTA_COEX_EVT_A2DP_PAUSED_EXIT:
+        break;
+    case BTA_COEX_EVT_ACL_CONNECTED:
+        esp_coex_status_bit_clear(ESP_COEX_ST_TYPE_BT, ESP_COEX_BT_ST_A2DP_STREAMING);
+        esp_coex_status_bit_clear(ESP_COEX_ST_TYPE_BT, ESP_COEX_BT_ST_A2DP_PAUSED);
+        break;
+    case BTA_COEX_EVT_ACL_DISCONNECTED:
+        esp_coex_status_bit_clear(ESP_COEX_ST_TYPE_BT, ESP_COEX_BT_ST_A2DP_STREAMING);
+        esp_coex_status_bit_clear(ESP_COEX_ST_TYPE_BT, ESP_COEX_BT_ST_A2DP_PAUSED);
+        break;
+    case BTA_COEX_EVT_STREAMING_STARTED:
+        esp_coex_status_bit_set(ESP_COEX_ST_TYPE_BT, ESP_COEX_BT_ST_A2DP_STREAMING);
+        esp_coex_status_bit_clear(ESP_COEX_ST_TYPE_BT, ESP_COEX_BT_ST_A2DP_PAUSED);
+        break;
+    case BTA_COEX_EVT_STREAMING_STOPPED:
+        esp_coex_status_bit_clear(ESP_COEX_ST_TYPE_BT, ESP_COEX_BT_ST_A2DP_STREAMING);
+        esp_coex_status_bit_clear(ESP_COEX_ST_TYPE_BT, ESP_COEX_BT_ST_A2DP_PAUSED);
+        break;
+    default:
+        break;
+    }
+}
+
 /*******************************************************************************
 **
 ** Function         bta_dm_sm_search_disable

+ 15 - 1
components/bt/host/bluedroid/bta/include/bta/bta_api.h

@@ -2636,9 +2636,23 @@ extern void BTA_VendorInit  (void);
 **
 *******************************************************************************/
 extern void BTA_VendorCleanup (void);
-
 #endif
 
+enum {
+    BTA_COEX_EVT_SCAN_STARTED = 1,
+    BTA_COEX_EVT_SCAN_STOPPED,
+    BTA_COEX_EVT_ACL_CONNECTED,
+    BTA_COEX_EVT_ACL_DISCONNECTED,
+    BTA_COEX_EVT_STREAMING_STARTED,
+    BTA_COEX_EVT_STREAMING_STOPPED,
+    BTA_COEX_EVT_SNIFF_ENTER,
+    BTA_COEX_EVT_SNIFF_EXIT,
+    BTA_COEX_EVT_A2DP_PAUSED_ENTER,
+    BTA_COEX_EVT_A2DP_PAUSED_EXIT,
+};
+
+extern void BTA_DmCoexEventTrigger(uint32_t event);
+
 #ifdef __cplusplus
 }
 #endif

+ 0 - 31
components/esp_wifi/Kconfig

@@ -12,37 +12,6 @@ menu "Wi-Fi"
             If only Bluetooth is used, it is recommended to disable this option to reduce binary file
             size.
 
-    choice ESP32_WIFI_SW_COEXIST_PREFERENCE
-        prompt "WiFi/Bluetooth coexistence performance preference"
-        depends on ESP32_WIFI_SW_COEXIST_ENABLE
-        default ESP32_WIFI_SW_COEXIST_PREFERENCE_BALANCE
-        help
-            Choose Bluetooth/WiFi/Balance for different preference.
-            If choose WiFi, it will make WiFi performance better. Such, keep WiFi Audio more fluent.
-            If choose Bluetooth, it will make Bluetooth performance better. Such, keep Bluetooth(A2DP) Audio more
-            fluent.
-            If choose Balance, the performance of WiFi and bluetooth will be balance. It's default. Normally, just
-            choose balance, the A2DP audio can play fluently, too.
-            Except config preference in menuconfig, you can also call esp_coex_preference_set() dynamically.
-
-        config ESP32_WIFI_SW_COEXIST_PREFERENCE_WIFI
-            bool "WiFi"
-
-        config ESP32_WIFI_SW_COEXIST_PREFERENCE_BT
-            bool "Bluetooth(include BR/EDR and BLE)"
-
-        config ESP32_WIFI_SW_COEXIST_PREFERENCE_BALANCE
-            bool "Balance"
-
-    endchoice
-
-    config ESP32_WIFI_SW_COEXIST_PREFERENCE_VALUE
-        int
-        depends on ESP32_WIFI_SW_COEXIST_ENABLE
-        default 0 if ESP32_WIFI_SW_COEXIST_PREFERENCE_WIFI
-        default 1 if ESP32_WIFI_SW_COEXIST_PREFERENCE_BT
-        default 2 if ESP32_WIFI_SW_COEXIST_PREFERENCE_BALANCE
-
     config ESP32_WIFI_STATIC_RX_BUFFER_NUM
         int "Max number of WiFi static RX buffers"
         range 2 25 if !SPIRAM_TRY_ALLOCATE_WIFI_LWIP

+ 35 - 1
components/esp_wifi/include/esp_coexist.h

@@ -32,6 +32,22 @@ typedef enum {
     ESP_COEX_PREFER_NUM,            /*!< Prefer value numbers */
 } esp_coex_prefer_t;
 
+/**
+ * @brief coex status type
+ */
+typedef enum {
+    ESP_COEX_ST_TYPE_WIFI = 0,
+    ESP_COEX_ST_TYPE_BLE,
+    ESP_COEX_ST_TYPE_BT,
+} esp_coex_status_type_t;
+
+#define ESP_COEX_BLE_ST_MESH_CONFIG        0x08
+#define ESP_COEX_BLE_ST_MESH_TRAFFIC       0x10
+#define ESP_COEX_BLE_ST_MESH_STANDBY       0x20
+
+#define ESP_COEX_BT_ST_A2DP_STREAMING      0x10
+#define ESP_COEX_BT_ST_A2DP_PAUSED         0x20
+
 /**
  * @brief Get software coexist version string
  *
@@ -40,7 +56,8 @@ typedef enum {
 const char *esp_coex_version_get(void);
 
 /**
- * @brief Set coexist preference of performance
+ * @deprecated Use esp_coex_status_bit_set() and esp_coex_status_bit_clear() instead.
+ *  Set coexist preference of performance
  *  For example, if prefer to bluetooth, then it will make A2DP(play audio via classic bt)
  *  more smooth while wifi is runnning something.
  *  If prefer to wifi, it will do similar things as prefer to bluetooth.
@@ -51,6 +68,23 @@ const char *esp_coex_version_get(void);
  */
 esp_err_t esp_coex_preference_set(esp_coex_prefer_t prefer);
 
+/**
+ * @brief Set coex schm status
+ * @param type : WIFI/BLE/BT
+ * @param status : WIFI/BLE/BT STATUS
+ * @return : ESP_OK - success, other - failed
+ */
+esp_err_t esp_coex_status_bit_set(esp_coex_status_type_t type, uint32_t status);
+
+/**
+ * @brief Clear coex schm status
+ * @param type : WIFI/BLE/BT
+ * @param status : WIFI/BLE/BT STATUS
+ * @return : ESP_OK - success, other - failed
+ */
+esp_err_t esp_coex_status_bit_clear(esp_coex_status_type_t type, uint32_t status);
+
+
 #ifdef __cplusplus
 }
 #endif

+ 1 - 1
components/esp_wifi/lib_esp32

@@ -1 +1 @@
-Subproject commit 6de7aa2cd72eb9a423378cf5e4f7e80df091fbca
+Subproject commit 595c6bd742834f02dd659abec437f9e233e3cdf0

+ 0 - 5
components/esp_wifi/sdkconfig.rename

@@ -2,8 +2,3 @@
 # CONFIG_DEPRECATED_OPTION CONFIG_NEW_OPTION
 
 CONFIG_SW_COEXIST_ENABLE                CONFIG_ESP32_WIFI_SW_COEXIST_ENABLE
-CONFIG_SW_COEXIST_PREFERENCE            CONFIG_ESP32_WIFI_SW_COEXIST_PREFERENCE
-CONFIG_SW_COEXIST_PREFERENCE_WIFI       CONFIG_ESP32_WIFI_SW_COEXIST_PREFERENCE_WIFI
-CONFIG_SW_COEXIST_PREFERENCE_BT         CONFIG_ESP32_WIFI_SW_COEXIST_PREFERENCE_BT
-CONFIG_SW_COEXIST_PREFERENCE_BALANCE    CONFIG_ESP32_WIFI_SW_COEXIST_PREFERENCE_BALANCE
-CONFIG_SW_COEXIST_PREFERENCE_VALUE      CONFIG_ESP32_WIFI_SW_COEXIST_PREFERENCE_VALUE

+ 0 - 1
components/esp_wifi/src/phy_init.c

@@ -237,7 +237,6 @@ esp_err_t esp_phy_rf_init(const esp_phy_init_data_t* init_data, esp_phy_calibrat
         uint32_t phy_bt_wifi_mask = BIT(PHY_BT_MODULE) | BIT(PHY_WIFI_MODULE);
         if ((s_module_phy_rf_init & phy_bt_wifi_mask) == phy_bt_wifi_mask) { //both wifi & bt enabled
             coex_init();
-            coex_preference_set(CONFIG_ESP32_WIFI_SW_COEXIST_PREFERENCE_VALUE);
             coex_resume();
         }
     }