]> granicus.if.org Git - esp-idf/commitdiff
component/bt : fix bug of sw interrupt cause to run btdm to different cpu core.
authorTian Hao <tianhao@espressif.com>
Fri, 20 Oct 2017 09:09:03 +0000 (17:09 +0800)
committerTian Hao <tianhao@espressif.com>
Tue, 24 Oct 2017 08:13:58 +0000 (16:13 +0800)
1. add sw interrupt cause osi to controller.
2. modify the kconfig to improve the option view.
3. add option of the cpu core which bluedroid run.
4. add option of the cpu core which bluetooth controller run.

components/bt/Kconfig
components/bt/bluedroid/btc/core/btc_task.c
components/bt/bluedroid/btc/profile/std/a2dp/btc_media_task.c
components/bt/bluedroid/hci/hci_hal_h4.c
components/bt/bluedroid/hci/hci_layer.c
components/bt/bluedroid/osi/include/thread.h
components/bt/bluedroid/stack/btu/btu_init.c
components/bt/bt.c
components/bt/lib

index 174b2deefad468806591e2d93ecb3543f06839bd..8a4f5248f0e0e68e012cc8fdf2680ea4f59220ac 100644 (file)
@@ -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
index 52cbf6dcffaccdcb63b4387143aca9e2c35e7069..bed68bbb7bd2397da1ad1ae988806675d46f862a 100644 (file)
@@ -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 */
 
index 6444392a40dd65e04f1553438a2450364bfb8d43..1b6db63c4757c46c602ca82011e0ad03768f0ac3 100644 (file)
@@ -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);
 
index 0cc5db676feb07898103fc8f222d870ab37c62d2..6d823a58fde1b4491e668785efa211d188f01475 100644 (file)
@@ -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);
index 6651fb6f2d31e4688c3b615c1b384fd956c9695f..cbf180f7ecd6f1b1e172803e5480e1e4d0b771c4 100644 (file)
@@ -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);
index 5f023c657fc9dd22a69140a02ff256af0d255157..9ac5da6bd98f5b44b7528b4a92665f8749f15c97 100644 (file)
@@ -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)
index 9776139ec4dd966c1a20f681f01643c8fb4f11ef..a3ffd0e70241878881c2785f62768e9321c46148 100644 (file)
@@ -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);
 
index a0539a19a669adb0e123ee28ea320d018a79d2e9..6f351cad1818c38d0412eefbd83c8371c205e5f0 100644 (file)
@@ -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;
index 0710172bce30dc2478e61b80a8e4f5e80d6f0e05..9a8e4ee159e59bb7308f3b5f6fcb89049da48777 160000 (submodule)
@@ -1 +1 @@
-Subproject commit 0710172bce30dc2478e61b80a8e4f5e80d6f0e05
+Subproject commit 9a8e4ee159e59bb7308f3b5f6fcb89049da48777