소스 검색

Merge branch 'bugfix/btdm_cpu_core' into 'master'

component/bt : fix bug of sw interrupt cause to run btdm to different cpu core.

See merge request !1434

Jiang Jiang Jian 8 년 전
부모
커밋
a9b63b796e

+ 90 - 44
components/bt/Kconfig

@@ -1,14 +1,96 @@
-menuconfig BT_ENABLED
+menu Bluetooth
+
+
+config BT_ENABLED
     bool "Bluetooth"
     help
         Select this option to enable Bluetooth and show the submenu with Bluetooth configuration choices.
 
-menuconfig BLUEDROID_ENABLED
-	bool "Bluedroid Bluetooth stack enabled"
+choice BTDM_CONTROLLER_PINNED_TO_CORE_CHOICE
+    prompt "The cpu core which bluetooth controller run"
+    depends on BT_ENABLED && !FREERTOS_UNICORE
+    help
+        Specify the cpu core to run bluetooth controller.
+        Can not specify no-affinity.
+
+config BTDM_CONTROLLER_PINNED_TO_CORE_0
+    bool "Core 0 (PRO CPU)"
+config BTDM_CONTROLLER_PINNED_TO_CORE_1
+    bool "Core 1 (APP CPU)"
+    depends on !FREERTOS_UNICORE
+endchoice
+
+config BTDM_CONTROLLER_PINNED_TO_CORE
+    int
+    default 0 if BTDM_CONTROLLER_PINNED_TO_CORE_0
+    default 1 if BTDM_CONTROLLER_PINNED_TO_CORE_1
+    default 0
+
+choice BTDM_CONTROLLER_HCI_MODE_CHOICE
+    prompt "HCI mode"
     depends on BT_ENABLED
-	default y
-	help
-		This enables the default Bluedroid Bluetooth stack
+    help
+        Speicify HCI mode as VHCI or UART(H4)
+
+config BTDM_CONTROLLER_HCI_MODE_VHCI
+    bool "VHCI"
+    help 
+        Normal option. Mostly, choose this VHCI when bluetooth host run on ESP32, too.
+
+config BTDM_CONTROLLER_HCI_MODE_UART_H4
+    bool "UART(H4)"
+    help
+        If use external bluetooth host which run on other hardware and use UART as the HCI interface,
+        choose this option.
+endchoice
+
+menu "HCI UART(H4) Options"
+    visible if BTDM_CONTROLLER_HCI_MODE_UART_H4
+
+config BT_HCI_UART_NO
+    int "UART Number for HCI"
+    depends on BTDM_CONTROLLER_HCI_MODE_UART_H4
+    range 1 2
+    default 1
+    help
+        Uart number for HCI. The available uart is UART1 and UART2.
+
+config BT_HCI_UART_BAUDRATE
+    int "UART Baudrate for HCI"
+    depends on BTDM_CONTROLLER_HCI_MODE_UART_H4
+    range 115200 921600
+    default 921600
+    help
+        UART Baudrate for HCI. Please use standard baudrate.
+endmenu
+
+menuconfig BLUEDROID_ENABLED
+    bool "Bluedroid Enable"
+    depends on BTDM_CONTROLLER_HCI_MODE_VHCI
+    default y
+    help
+        This enables the default Bluedroid Bluetooth stack
+
+choice BLUEDROID_PINNED_TO_CORE_CHOICE
+    prompt "The cpu core which Bluedroid run"
+    depends on BLUEDROID_ENABLED && !FREERTOS_UNICORE
+    help
+        Which the cpu core to run Bluedroid. Can choose core0 and core1.
+        Can not specify no-affinity.
+
+config BLUEDROID_PINNED_TO_CORE_0
+    bool "Core 0 (PRO CPU)"
+config BLUEDROID_PINNED_TO_CORE_1
+    bool "Core 1 (APP CPU)"
+    depends on !FREERTOS_UNICORE
+endchoice
+
+config BLUEDROID_PINNED_TO_CORE
+    int
+    depends on BLUEDROID_ENABLED
+    default 0 if BLUEDROID_PINNED_TO_CORE_0
+    default 1 if BLUEDROID_PINNED_TO_CORE_1
+    default 0
 
 config BTC_TASK_STACK_SIZE
     int "Bluetooth event (callback to application) task stack size"
@@ -67,44 +149,6 @@ config BT_ACL_CONNECTIONS
     help 
         Maximum BT/BLE connection count
 
-#disable now for app cpu due to a known issue
-config BTDM_CONTROLLER_RUN_APP_CPU
-    bool "Run controller on APP CPU"
-    depends on BT_ENABLED && !FREERTOS_UNICORE && 0
-    default n
-    help
-        Run controller on APP CPU.
-
-config BTDM_CONTROLLER_RUN_CPU
-    int
-    depends on BT_ENABLED
-    default 1 if BTDM_CONTROLLER_RUN_APP_CPU
-    default 0
-
-menuconfig BT_HCI_UART
-    bool "HCI use UART as IO"
-    depends on BT_ENABLED && !BLUEDROID_ENABLED
-    default n
-    help
-        Default HCI use VHCI, if this option choose, HCI will use UART(0/1/2) as IO.
-        Besides, it can set uart number and uart baudrate.
-
-config BT_HCI_UART_NO
-    int "UART Number for HCI"
-    depends on BT_HCI_UART
-    range 1 2
-    default 1
-    help
-        Uart number for HCI.
-
-config BT_HCI_UART_BAUDRATE
-    int "UART Baudrate for HCI"
-    depends on BT_HCI_UART
-    range 115200 921600
-    default 921600
-    help
-        UART Baudrate for HCI. Please use standard baudrate.
-
 config SMP_ENABLE
    bool
    depends on BLUEDROID_ENABLED
@@ -115,3 +159,5 @@ config BT_RESERVE_DRAM
     hex
     default 0x10000 if BT_ENABLED
     default 0
+
+endmenu

+ 2 - 2
components/bt/bluedroid/btc/core/btc_task.c

@@ -139,8 +139,8 @@ bt_status_t btc_transfer_context(btc_msg_t *msg, void *arg, int arg_len, btc_arg
 
 int btc_init(void)
 {
-    xBtcQueue = xQueueCreate(BTC_TASK_QUEUE_NUM, sizeof(btc_msg_t));
-    xTaskCreatePinnedToCore(btc_task, "Btc_task", BTC_TASK_STACK_SIZE, NULL, BTC_TASK_PRIO, &xBtcTaskHandle, 0);
+    xBtcQueue = xQueueCreate(BTC_TASK_QUEUE_LEN, sizeof(btc_msg_t));
+    xTaskCreatePinnedToCore(btc_task, "Btc_task", BTC_TASK_STACK_SIZE, NULL, BTC_TASK_PRIO, &xBtcTaskHandle, BTC_TASK_PINNED_TO_CORE);
     btc_gap_callback_init();
     /* TODO: initial the profile_tab */
 

+ 3 - 7
components/bt/bluedroid/btc/profile/std/a2dp/btc_media_task.c

@@ -112,10 +112,6 @@ enum {
 /* 5 frames is equivalent to 6.89*5*2.9 ~= 100 ms @ 44.1 khz, 20 ms mediatick */
 #define MAX_OUTPUT_A2DP_FRAME_QUEUE_SZ         (5)
 
-#define MEDIA_DATA_Q_LEN                       (1)
-#define MEDIA_CTRL_Q_LEN                       (5)
-#define COMBINED_MEDIA_Q_LEN                   (MEDIA_DATA_Q_LEN + MEDIA_CTRL_Q_LEN)
-
 typedef struct {
     UINT16 num_frames_to_be_processed;
     UINT16 len;
@@ -276,13 +272,13 @@ bool btc_a2dp_start_media_task(void)
 
     APPL_TRACE_EVENT("## A2DP START MEDIA THREAD ##");
 
-    xBtcMediaQueueSet = xQueueCreateSet(COMBINED_MEDIA_Q_LEN);
+    xBtcMediaQueueSet = xQueueCreateSet(BTC_MEDIA_TASK_QUEUE_SET_LEN);
     configASSERT(xBtcMediaQueueSet);
-    xBtcMediaDataQueue = xQueueCreate(MEDIA_DATA_Q_LEN, sizeof(void *));
+    xBtcMediaDataQueue = xQueueCreate(BTC_MEDIA_DATA_QUEUE_LEN, sizeof(void *));
     configASSERT(xBtcMediaDataQueue);
     xQueueAddToSet(xBtcMediaDataQueue, xBtcMediaQueueSet);
 
-    xBtcMediaCtrlQueue = xQueueCreate(MEDIA_CTRL_Q_LEN, sizeof(void *));
+    xBtcMediaCtrlQueue = xQueueCreate(BTC_MEDIA_CTRL_QUEUE_LEN, sizeof(void *));
     configASSERT(xBtcMediaCtrlQueue);
     xQueueAddToSet(xBtcMediaCtrlQueue, xBtcMediaQueueSet);
 

+ 2 - 2
components/bt/bluedroid/hci/hci_hal_h4.c

@@ -101,8 +101,8 @@ static bool hal_open(const hci_hal_callbacks_t *upper_callbacks)
 
     hci_hal_env_init(HCI_HAL_SERIAL_BUFFER_SIZE, SIZE_MAX);
 
-    xHciH4Queue = xQueueCreate(HCI_H4_QUEUE_NUM, sizeof(BtTaskEvt_t));
-    xTaskCreatePinnedToCore(hci_hal_h4_rx_handler, HCI_H4_TASK_NAME, HCI_H4_TASK_STACK_SIZE, NULL, HCI_H4_TASK_PRIO, &xHciH4TaskHandle, 0);
+    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);
 
     //register vhci host cb
     esp_vhci_host_register_callback(&vhci_host_cb);

+ 2 - 2
components/bt/bluedroid/hci/hci_layer.c

@@ -107,8 +107,8 @@ int hci_start_up(void)
         goto error;
     }
 
-    xHciHostQueue = xQueueCreate(HCI_HOST_QUEUE_NUM, sizeof(BtTaskEvt_t));
-    xTaskCreatePinnedToCore(hci_host_thread_handler, HCI_HOST_TASK_NAME, HCI_HOST_TASK_STACK_SIZE, NULL, HCI_HOST_TASK_PRIO, &xHciHostTaskHandle, 0);
+    xHciHostQueue = xQueueCreate(HCI_HOST_QUEUE_LEN, sizeof(BtTaskEvt_t));
+    xTaskCreatePinnedToCore(hci_host_thread_handler, HCI_HOST_TASK_NAME, HCI_HOST_TASK_STACK_SIZE, NULL, HCI_HOST_TASK_PRIO, &xHciHostTaskHandle, HCI_HOST_TASK_PINNED_TO_CORE);
 
     packet_fragmenter->init(&packet_fragmenter_callbacks);
     hal->open(&hal_callbacks);

+ 18 - 5
components/bt/bluedroid/osi/include/thread.h

@@ -57,26 +57,39 @@ typedef enum {
     SIG_BTU_NUM,
 } SIG_BTU_t;
 
+#define TASK_PINNED_TO_CORE             (CONFIG_BLUEDROID_PINNED_TO_CORE < portNUM_PROCESSORS ? CONFIG_BLUEDROID_PINNED_TO_CORE : tskNO_AFFINITY)
+
+#define HCI_HOST_TASK_PINNED_TO_CORE    (TASK_PINNED_TO_CORE)
 #define HCI_HOST_TASK_STACK_SIZE        (2048 + BT_TASK_EXTRA_STACK_SIZE)
 #define HCI_HOST_TASK_PRIO              (configMAX_PRIORITIES - 3)
 #define HCI_HOST_TASK_NAME              "hciHostT"
-#define HCI_HOST_QUEUE_NUM              40
+#define HCI_HOST_QUEUE_LEN              40
 
+#define HCI_H4_TASK_PINNED_TO_CORE      (TASK_PINNED_TO_CORE)
 #define HCI_H4_TASK_STACK_SIZE          (2048 + BT_TASK_EXTRA_STACK_SIZE)
 #define HCI_H4_TASK_PRIO                (configMAX_PRIORITIES - 4)
 #define HCI_H4_TASK_NAME                "hciH4T"
-#define HCI_H4_QUEUE_NUM                60
+#define HCI_H4_QUEUE_LEN                60
 
+#define BTU_TASK_PINNED_TO_CORE         (TASK_PINNED_TO_CORE)
 #define BTU_TASK_STACK_SIZE             (4096 + BT_TASK_EXTRA_STACK_SIZE)
 #define BTU_TASK_PRIO                   (configMAX_PRIORITIES - 5)
 #define BTU_TASK_NAME                   "btuT"
-#define BTU_QUEUE_NUM                   50
+#define BTU_QUEUE_LEN                   50
 
+#define BTC_TASK_PINNED_TO_CORE         (TASK_PINNED_TO_CORE)
 #define BTC_TASK_STACK_SIZE             (CONFIG_BTC_TASK_STACK_SIZE + BT_TASK_EXTRA_STACK_SIZE)	//by menuconfig
 #define BTC_TASK_NAME                   "btcT"
 #define BTC_TASK_PRIO                   (configMAX_PRIORITIES - 6)
-#define BTC_TASK_QUEUE_NUM              60
-
+#define BTC_TASK_QUEUE_LEN              60
+
+#define BTC_MEDIA_TASK_PINNED_TO_CORE   (TASK_PINNED_TO_CORE)
+#define BTC_MEDIA_TASK_STACK_SIZE       (CONFIG_BTC_TASK_STACK_SIZE + BT_TASK_EXTRA_STACK_SIZE)
+#define BTC_MEDIA_TASK_NAME             "BtcMediaT"
+#define BTC_MEDIA_TASK_PRIO             (configMAX_PRIORITIES - 3)
+#define BTC_MEDIA_DATA_QUEUE_LEN        (1)
+#define BTC_MEDIA_CTRL_QUEUE_LEN        (5)
+#define BTC_MEDIA_TASK_QUEUE_SET_LEN    (BTC_MEDIA_DATA_QUEUE_LEN + BTC_MEDIA_CTRL_QUEUE_LEN)
 
 #define TASK_POST_NON_BLOCKING          (0)
 #define TASK_POST_BLOCKING              (portMAX_DELAY)

+ 2 - 2
components/bt/bluedroid/stack/btu/btu_init.c

@@ -168,8 +168,8 @@ void BTU_StartUp(void)
 
     osi_mutex_new(&btu_l2cap_alarm_lock);
 
-    xBtuQueue = xQueueCreate(BTU_QUEUE_NUM, sizeof(BtTaskEvt_t));
-    xTaskCreatePinnedToCore(btu_task_thread_handler, BTU_TASK_NAME, BTU_TASK_STACK_SIZE, NULL, BTU_TASK_PRIO, &xBtuTaskHandle, 0);
+    xBtuQueue = xQueueCreate(BTU_QUEUE_LEN, sizeof(BtTaskEvt_t));
+    xTaskCreatePinnedToCore(btu_task_thread_handler, BTU_TASK_NAME, BTU_TASK_STACK_SIZE, NULL, BTU_TASK_PRIO, &xBtuTaskHandle, BTU_TASK_PINNED_TO_CORE);
 
     btu_task_post(SIG_BTU_START_UP, NULL, TASK_POST_BLOCKING);
 

+ 26 - 2
components/bt/bt.c

@@ -24,6 +24,7 @@
 #include "freertos/semphr.h"
 #include "freertos/xtensa_api.h"
 #include "freertos/portmacro.h"
+#include "xtensa/core-macros.h"
 #include "esp_types.h"
 #include "esp_system.h"
 #include "esp_task.h"
@@ -34,6 +35,7 @@
 #include "esp_err.h"
 #include "esp_log.h"
 #include "esp_pm.h"
+#include "esp_ipc.h"
 
 #if CONFIG_BT_ENABLED
 
@@ -135,6 +137,7 @@ struct osi_funcs_t {
     int32_t (* _task_create)(void *task_func, const char *name, uint32_t stack_depth, void *param, uint32_t prio, void *task_handle, uint32_t core_id);
     void (* _task_delete)(void *task_handle);
     bool (* _is_in_isr)(void);
+    int (* _cause_sw_intr_to_core)(int core_id, int intr_no);
     void *(* _malloc)(uint32_t size);
     void (* _free)(void *p);
     int32_t (* _read_efuse_mac)(uint8_t mac[6]);
@@ -274,6 +277,26 @@ static bool IRAM_ATTR is_in_isr_wrapper(void)
     return (bool)xPortInIsrContext();
 }
 
+static void IRAM_ATTR cause_sw_intr(void *arg)
+{
+    /* just convert void * to int, because the width is the same */
+    uint32_t intr_no = (uint32_t)arg;
+    XTHAL_SET_INTSET((1<<intr_no));
+}
+
+static int IRAM_ATTR cause_sw_intr_to_core_wrapper(int core_id, int intr_no)
+{
+    esp_err_t err = ESP_OK;
+
+    if (xPortGetCoreID() == core_id) {
+        cause_sw_intr((void *)intr_no);
+    } else {
+        err = esp_ipc_call(core_id, cause_sw_intr, (void *)intr_no);
+    }
+
+    return err;
+}
+
 static int32_t IRAM_ATTR read_mac_wrapper(uint8_t mac[6])
 {
     return esp_read_mac(mac, ESP_MAC_BT);
@@ -315,6 +338,7 @@ static struct osi_funcs_t osi_funcs = {
     ._task_create = task_create_wrapper,
     ._task_delete = task_delete_wrapper,
     ._is_in_isr = is_in_isr_wrapper,
+    ._cause_sw_intr_to_core = cause_sw_intr_to_core_wrapper,
     ._malloc = malloc,
     ._free = free,
     ._read_efuse_mac = read_mac_wrapper,
@@ -345,10 +369,10 @@ static uint32_t btdm_config_mask_load(void)
         mask |= BTDM_CFG_BT_DATA_RELEASE;
     }
 
-#ifdef CONFIG_BT_HCI_UART
+#if CONFIG_BTDM_CONTROLLER_HCI_MODE_UART_H4
     mask |= BTDM_CFG_HCI_UART;
 #endif
-#ifdef CONFIG_BTDM_CONTROLLER_RUN_APP_CPU
+#if CONFIG_BTDM_CONTROLLER_PINNED_TO_CORE == 1
     mask |= BTDM_CFG_CONTROLLER_RUN_APP_CPU;
 #endif
     return mask;

+ 1 - 1
components/bt/lib

@@ -1 +1 @@
-Subproject commit 0710172bce30dc2478e61b80a8e4f5e80d6f0e05
+Subproject commit 9a8e4ee159e59bb7308f3b5f6fcb89049da48777