You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
239 lines
7.7 KiB
239 lines
7.7 KiB
/****************************************************************************** |
|
* |
|
* Copyright (C) 2009-2012 Broadcom Corporation |
|
* |
|
* 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. |
|
* |
|
******************************************************************************/ |
|
|
|
/****************************************************************************** |
|
* |
|
* Filename: bte_main.cc |
|
* |
|
* Description: Contains BTE core stack initialization and shutdown code |
|
* |
|
******************************************************************************/ |
|
|
|
#define LOG_TAG "bt_main" |
|
|
|
#include <base/logging.h> |
|
#include <base/threading/thread.h> |
|
#include <fcntl.h> |
|
#include <pthread.h> |
|
#include <signal.h> |
|
#include <stdlib.h> |
|
#include <time.h> |
|
|
|
#include <hardware/bluetooth.h> |
|
|
|
#include "bt_common.h" |
|
#include "bt_hci_bdroid.h" |
|
#include "bt_utils.h" |
|
#include "bta_api.h" |
|
#include "btcore/include/module.h" |
|
#include "bte.h" |
|
#include "btif_common.h" |
|
#include "btsnoop.h" |
|
#include "btu.h" |
|
#include "device/include/interop.h" |
|
#include "hci_layer.h" |
|
#include "hcimsgs.h" |
|
#include "osi/include/alarm.h" |
|
#include "osi/include/fixed_queue.h" |
|
#include "osi/include/future.h" |
|
#include "osi/include/log.h" |
|
#include "osi/include/osi.h" |
|
#include "osi/include/thread.h" |
|
#include "stack_config.h" |
|
|
|
#if defined(MTK_STACK_CONFIG_LOG) && (MTK_STACK_CONFIG_LOG == TRUE) |
|
#include "mediatek/include/twrite.h" |
|
#endif |
|
|
|
/******************************************************************************* |
|
* Constants & Macros |
|
******************************************************************************/ |
|
|
|
/* Run-time configuration file for BLE*/ |
|
#ifndef BTE_BLE_STACK_CONF_FILE |
|
// TODO(armansito): Find a better way than searching by a hardcoded path. |
|
#if defined(OS_GENERIC) |
|
#define BTE_BLE_STACK_CONF_FILE "ble_stack.conf" |
|
#else // !defined(OS_GENERIC) |
|
#define BTE_BLE_STACK_CONF_FILE "/etc/bluetooth/ble_stack.conf" |
|
#endif // defined(OS_GENERIC) |
|
#endif // BT_BLE_STACK_CONF_FILE |
|
|
|
/****************************************************************************** |
|
* Variables |
|
*****************************************************************************/ |
|
|
|
/******************************************************************************* |
|
* Static variables |
|
******************************************************************************/ |
|
static const hci_t* hci; |
|
|
|
/******************************************************************************* |
|
* Externs |
|
******************************************************************************/ |
|
extern void btu_hci_msg_process(BT_HDR* p_msg); |
|
|
|
/******************************************************************************* |
|
* Static functions |
|
******************************************************************************/ |
|
|
|
/****************************************************************************** |
|
* |
|
* Function post_to_hci_message_loop |
|
* |
|
* Description Post an HCI event to the hci message queue |
|
* |
|
* Returns None |
|
* |
|
*****************************************************************************/ |
|
void post_to_hci_message_loop(const tracked_objects::Location& from_here, |
|
BT_HDR* p_msg) { |
|
base::MessageLoop* hci_message_loop = get_message_loop(); |
|
if (!hci_message_loop || !hci_message_loop->task_runner().get()) { |
|
LOG_ERROR(LOG_TAG, "%s: HCI message loop not running, accessed from %s", |
|
__func__, from_here.ToString().c_str()); |
|
return; |
|
} |
|
|
|
hci_message_loop->task_runner()->PostTask( |
|
from_here, base::Bind(&btu_hci_msg_process, p_msg)); |
|
} |
|
|
|
/****************************************************************************** |
|
* |
|
* Function bte_main_boot_entry |
|
* |
|
* Description BTE MAIN API - Entry point for BTE chip/stack initialization |
|
* |
|
* Returns None |
|
* |
|
*****************************************************************************/ |
|
void bte_main_boot_entry(void) { |
|
module_init(get_module(INTEROP_MODULE)); |
|
|
|
hci = hci_layer_get_interface(); |
|
if (!hci) { |
|
LOG_ERROR(LOG_TAG, "%s could not get hci layer interface.", __func__); |
|
return; |
|
} |
|
|
|
hci->set_data_cb(base::Bind(&post_to_hci_message_loop)); |
|
|
|
module_init(get_module(STACK_CONFIG_MODULE)); |
|
|
|
} |
|
|
|
/****************************************************************************** |
|
* |
|
* Function bte_main_cleanup |
|
* |
|
* Description BTE MAIN API - Cleanup code for BTE chip/stack |
|
* |
|
* Returns None |
|
* |
|
*****************************************************************************/ |
|
void bte_main_cleanup() { |
|
module_clean_up(get_module(STACK_CONFIG_MODULE)); |
|
|
|
module_clean_up(get_module(INTEROP_MODULE)); |
|
} |
|
|
|
/****************************************************************************** |
|
* |
|
* Function bte_main_enable |
|
* |
|
* Description BTE MAIN API - Creates all the BTE tasks. Should be called |
|
* part of the Bluetooth stack enable sequence |
|
* |
|
* Returns None |
|
* |
|
*****************************************************************************/ |
|
void bte_main_enable() { |
|
APPL_TRACE_DEBUG("%s", __func__); |
|
|
|
#if defined(MTK_STACK_CONFIG_LOG) && (MTK_STACK_CONFIG_LOG == TRUE) |
|
module_start_up(get_module(MTK_BTSNOOP_MODULE)); |
|
#else |
|
module_start_up(get_module(BTSNOOP_MODULE)); |
|
#endif |
|
module_start_up(get_module(HCI_MODULE)); |
|
|
|
BTU_StartUp(); |
|
} |
|
|
|
/****************************************************************************** |
|
* |
|
* Function bte_main_disable |
|
* |
|
* Description BTE MAIN API - Destroys all the BTE tasks. Should be called |
|
* part of the Bluetooth stack disable sequence |
|
* |
|
* Returns None |
|
* |
|
*****************************************************************************/ |
|
void bte_main_disable(void) { |
|
APPL_TRACE_DEBUG("%s", __func__); |
|
|
|
module_shut_down(get_module(HCI_MODULE)); |
|
#if defined(MTK_STACK_CONFIG_LOG) && (MTK_STACK_CONFIG_LOG == TRUE) |
|
module_shut_down(get_module(MTK_BTSNOOP_MODULE)); |
|
#else |
|
module_shut_down(get_module(BTSNOOP_MODULE)); |
|
#endif |
|
|
|
BTU_ShutDown(); |
|
} |
|
|
|
/****************************************************************************** |
|
* |
|
* Function bte_main_postload_cfg |
|
* |
|
* Description BTE MAIN API - Stack postload configuration |
|
* |
|
* Returns None |
|
* |
|
*****************************************************************************/ |
|
void bte_main_postload_cfg(void) { |
|
// TODO(eisenbach): [HIDL] DEPRECATE? |
|
} |
|
|
|
/****************************************************************************** |
|
* |
|
* Function bte_main_hci_send |
|
* |
|
* Description BTE MAIN API - This function is called by the upper stack to |
|
* send an HCI message. The function displays a protocol trace |
|
* message (if enabled), and then calls the 'transmit' function |
|
* associated with the currently selected HCI transport |
|
* |
|
* Returns None |
|
* |
|
*****************************************************************************/ |
|
void bte_main_hci_send(BT_HDR* p_msg, uint16_t event) { |
|
uint16_t sub_event = event & BT_SUB_EVT_MASK; /* local controller ID */ |
|
|
|
p_msg->event = event; |
|
|
|
if ((sub_event == LOCAL_BR_EDR_CONTROLLER_ID) || |
|
(sub_event == LOCAL_BLE_CONTROLLER_ID)) { |
|
hci->transmit_downward(event, p_msg); |
|
} else { |
|
APPL_TRACE_ERROR("Invalid Controller ID. Discarding message."); |
|
osi_free(p_msg); |
|
} |
|
}
|
|
|