From 993287af6132924f952d2368d45fec2882e79a8b Mon Sep 17 00:00:00 2001 From: snake Date: Thu, 22 Sep 2016 16:40:31 +0800 Subject: [PATCH] add btdm_controller 1st --- components/bt/bt.c | 117 +++++++++++++++++++++++++++++ components/bt/component.mk | 25 ++++++ components/bt/include/bt.h | 30 ++++++++ components/bt/lib/libbtdm_app.a | Bin 0 -> 61822 bytes components/esp32/cpu_start.c | 8 +- components/esp32/include/soc/soc.h | 6 +- components/esp32/lib | 2 +- 7 files changed, 183 insertions(+), 5 deletions(-) create mode 100644 components/bt/bt.c create mode 100644 components/bt/component.mk create mode 100644 components/bt/include/bt.h create mode 100644 components/bt/lib/libbtdm_app.a diff --git a/components/bt/bt.c b/components/bt/bt.c new file mode 100644 index 0000000000..4b623ca20f --- /dev/null +++ b/components/bt/bt.c @@ -0,0 +1,117 @@ +// Copyright 2015-2016 Espressif Systems (Shanghai) PTE LTD +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at + +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#include +#include +#include + +#include "freertos/FreeRTOS.h" +#include "freertos/task.h" +#include "freertos/queue.h" +#include "freertos/semphr.h" +#include "freertos/xtensa_api.h" +#include "freertos/portmacro.h" +#include "esp_types.h" +#include "esp_system.h" +#include "esp_intr.h" +#include "esp_attr.h" +#include "bt.h" + +#if CONFIG_BT_ENABLED + +static bt_app_startup_cb_t app_startup_cb; +static void *app_startup_ctx; + +#define BT_DEBUG(...) +#define BT_API_CALL_CHECK(info, api_call, ret) \ +do{\ + esp_err_t __err = (api_call);\ + if ((ret) != __err) {\ + BT_DEBUG("%s %d %s ret=%d\n", __FUNCTION__, __LINE__, (info), __err);\ + return __err;\ + }\ +} while(0) + +extern void btdm_controller_init(void); +extern void API_osi_funcs_register(void *osi_funcs); + +struct osi_funcs_t { + xt_handler (*_set_isr)(int n, xt_handler f, void *arg); + void (*_ints_on)(unsigned int mask); + void (*_interrupt_disable)(void); + void (*_interrupt_restore)(void); + void (*_task_yield)(void); + void *(*_semphr_create)(uint32_t max, uint32_t init); + void *(*_semphr_give_from_isr)(void *semphr, void *hptw); + void *(*_semphr_take)(void *semphr, uint32_t block_time); + esp_err_t (* _read_efuse_mac)(uint8_t mac[6]); +}; + +static portMUX_TYPE global_int_mux = portMUX_INITIALIZER_UNLOCKED; + +static inline void IRAM_ATTR interrupt_disable(void) +{ + portENTER_CRITICAL(&global_int_mux); +} + +static inline void IRAM_ATTR interrupt_restore(void) +{ + portEXIT_CRITICAL(&global_int_mux); +} + +static inline void *IRAM_ATTR semphr_take_wrapped(void *semphr, uint32_t block_time) +{ + return (void *)xSemaphoreTake(semphr, block_time); +} + +static struct osi_funcs_t osi_funcs = { + ._set_isr = xt_set_interrupt_handler, + ._ints_on = xt_ints_on, + ._interrupt_disable = interrupt_disable, + ._interrupt_restore = interrupt_restore, + ._task_yield = vPortYield, + ._semphr_create = xQueueCreateCountingSemaphore, + ._semphr_give_from_isr = (void *)xQueueGiveFromISR, + ._semphr_take = semphr_take_wrapped, + ._read_efuse_mac = system_efuse_read_mac, +}; + +static void bt_controller_task(void *pvParam) +{ + API_osi_funcs_register(&osi_funcs); + btdm_controller_init(); +} + + +static void bt_init_task(void *pvParameters) +{ + xTaskCreatePinnedToCore(bt_controller_task, "btControllerTask", BT_CONTROLLER_TASK_STACK_SIZE, NULL, BT_CONTROLLER_TASK_PRIO, NULL, 0); + + if (app_startup_cb) + app_startup_cb(app_startup_ctx); + + vTaskDelete(NULL); +} + + +esp_err_t esp_bt_startup(bt_app_startup_cb_t cb, void *ctx) +{ + app_startup_cb = cb; + app_startup_ctx = ctx; + + xTaskCreatePinnedToCore(bt_init_task, "btInitTask", BT_INIT_TASK_STACK_SIZE, NULL, BT_INIT_TASK_PRIO, NULL, 0); + + return ESP_OK; +} +#endif diff --git a/components/bt/component.mk b/components/bt/component.mk new file mode 100644 index 0000000000..110d022672 --- /dev/null +++ b/components/bt/component.mk @@ -0,0 +1,25 @@ +# +# Component Makefile +# + +#COMPONENT_ADD_INCLUDEDIRS := + +CURRENT_DIR=$(IDF_PATH)/components/bt + +COMPONENT_ADD_INCLUDEDIRS := ./include + +CFLAGS += -Wno-error=unused-label -Wno-error=return-type -Wno-error=missing-braces -Wno-error=pointer-sign -Wno-error=parentheses + +LIBS := btdm_app + +COMPONENT_ADD_LDFLAGS := -lbt -L$(abspath lib) \ + $(addprefix -l,$(LIBS)) \ + $(LINKER_SCRIPTS) + + +ALL_LIB_FILES := $(patsubst %,$(COMPONENT_PATH)/lib/lib%.a,$(LIBS)) +$(COMPONENT_LIBRARY): $(ALL_LIB_FILES) + +COMPONENT_SRCDIRS := ./ + +include $(IDF_PATH)/make/component_common.mk diff --git a/components/bt/include/bt.h b/components/bt/include/bt.h new file mode 100644 index 0000000000..04bb466c45 --- /dev/null +++ b/components/bt/include/bt.h @@ -0,0 +1,30 @@ +#ifndef __BT_H__ +#define __BT_H__ + +#include "freertos/FreeRTOS.h" +#include "esp_err.h" + +#define BT_TASK_PRIO_MAX (configMAX_PRIORITIES) +#define BT_TASK_PRIO_MIN (0) + +/* bt init */ +#define BT_INIT_TASK_PRIO (BT_TASK_PRIO_MAX-1) +#define BT_INIT_TASK_STACK_SIZE (2048) +/* controller */ +#define BT_CONTROLLER_TASK_PRIO (BT_TASK_PRIO_MAX-3) +#define BT_CONTROLLER_TASK_STACK_SIZE (4096) + +typedef void (* bt_app_startup_cb_t)(void *param); + +esp_err_t esp_bt_startup(bt_app_startup_cb_t cb, void *ctx); + +typedef struct vhci_host_callback { + void (*notify_host_send_available)(void); + int (*notify_host_recv)(uint8_t *data, uint16_t len); +} vhci_host_callback_t; + +extern bool API_vhci_host_check_send_available(void); +extern void API_vhci_host_send_packet(uint8_t *data, uint16_t len); +extern void API_vhci_host_register_callback(const vhci_host_callback_t *callback); + +#endif /* __BT_H__ */ diff --git a/components/bt/lib/libbtdm_app.a b/components/bt/lib/libbtdm_app.a new file mode 100644 index 0000000000000000000000000000000000000000..4c93a93b0fcdbb1548a7bf6b00c616a3a645a944 GIT binary patch literal 61822 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 literal 0 HcmV?d00001 diff --git a/components/esp32/cpu_start.c b/components/esp32/cpu_start.c index 85f4ace512..45a4bcec3c 100644 --- a/components/esp32/cpu_start.c +++ b/components/esp32/cpu_start.c @@ -48,6 +48,9 @@ static void IRAM_ATTR call_user_start_cpu1(); static void IRAM_ATTR user_start_cpu1(void); extern void ets_setup_syscalls(void); extern esp_err_t app_main(void *ctx); +#if CONFIG_BT_ENABLED +extern void bt_app_main(void *param); +#endif extern int _bss_start; extern int _bss_end; @@ -161,7 +164,10 @@ void user_start_cpu0(void) #if CONFIG_WIFI_ENABLED && CONFIG_WIFI_AUTO_STARTUP #include "esp_wifi.h" - esp_wifi_startup(app_main, NULL); + esp_wifi_startup(app_main, NULL); +#elif CONFIG_BT_ENABLED +#include "bt.h" + esp_bt_startup(bt_app_main, NULL); #else app_main(NULL); #endif diff --git a/components/esp32/include/soc/soc.h b/components/esp32/include/soc/soc.h index 0b8cdfecba..4ffdfb069e 100755 --- a/components/esp32/include/soc/soc.h +++ b/components/esp32/include/soc/soc.h @@ -260,14 +260,14 @@ /************************************************************************************************************* * Intr num Level Type PRO CPU usage APP CPU uasge * 0 1 extern level WMAC Reserved - * 1 1 extern level BT/BLE Host Reserved + * 1 1 extern level BT/BLE Host VHCI Reserved * 2 1 extern level FROM_CPU FROM_CPU * 3 1 extern level TG0_WDT Reserved * 4 1 extern level WBB - * 5 1 extern level Reserved + * 5 1 extern level BT Controller * 6 1 timer FreeRTOS Tick(L1) FreeRTOS Tick(L1) * 7 1 software Reserved Reserved - * 8 1 extern level Reserved + * 8 1 extern level BLE Controller * 9 1 extern level * 10 1 extern edge Internal Timer * 11 3 profiling diff --git a/components/esp32/lib b/components/esp32/lib index 9f26b9a190..ab3c510e51 160000 --- a/components/esp32/lib +++ b/components/esp32/lib @@ -1 +1 @@ -Subproject commit 9f26b9a190e6a6ca42656685df9287253badfa46 +Subproject commit ab3c510e51f312d919df6830efbc04c6de9cfd2a