1 /******************************************************************************
3 * Copyright (C) 2009-2012 Broadcom Corporation
5 * Licensed under the Apache License, Version 2.0 (the "License");
6 * you may not use this file except in compliance with the License.
7 * You may obtain a copy of the License at:
9 * http://www.apache.org/licenses/LICENSE-2.0
11 * Unless required by applicable law or agreed to in writing, software
12 * distributed under the License is distributed on an "AS IS" BASIS,
13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 * See the License for the specific language governing permissions and
15 * limitations under the License.
17 ******************************************************************************/
19 /******************************************************************************
21 * Filename: bte_main.c
23 * Description: Contains BTE core stack initialization and shutdown code
25 ******************************************************************************/
27 #include <cutils/properties.h>
29 #include <hardware/bluetooth.h>
34 #include <utils/Log.h>
39 #include "bt_hci_bdroid.h"
41 #include "btif_common.h"
45 #include "fixed_queue.h"
48 #include "hash_functions.h"
50 #include "hci_layer.h"
53 #include "stack_config.h"
56 /*******************************************************************************
58 *******************************************************************************/
60 /* Run-time configuration file for BLE*/
61 #ifndef BTE_BLE_STACK_CONF_FILE
62 #define BTE_BLE_STACK_CONF_FILE "/etc/bluetooth/ble_stack.conf"
65 /******************************************************************************
67 ******************************************************************************/
69 /*******************************************************************************
71 *******************************************************************************/
72 static const hci_t *hci;
74 /*******************************************************************************
76 *******************************************************************************/
78 /*******************************************************************************
80 *******************************************************************************/
81 extern void bte_load_ble_conf(const char *p_path);
82 fixed_queue_t *btu_hci_msg_queue;
84 /******************************************************************************
86 ** Function bte_main_boot_entry
88 ** Description BTE MAIN API - Entry point for BTE chip/stack initialization
92 ******************************************************************************/
93 void bte_main_boot_entry(void)
95 module_init(get_module(GKI_MODULE));
97 hci = hci_layer_get_interface();
99 ALOGE("%s could not get hci layer interface.", __func__);
101 btu_hci_msg_queue = fixed_queue_new(SIZE_MAX);
102 if (btu_hci_msg_queue == NULL) {
103 ALOGE("%s unable to allocate hci message queue.", __func__);
107 data_dispatcher_register_default(hci->upward_dispatcher, btu_hci_msg_queue);
109 #if (defined(BLE_INCLUDED) && (BLE_INCLUDED == TRUE))
110 bte_load_ble_conf(BTE_BLE_STACK_CONF_FILE);
112 module_init(get_module(STACK_CONFIG_MODULE));
114 #if (BTTRC_INCLUDED == TRUE)
115 /* Initialize trace feature */
116 BTTRC_TraceInit(MAX_TRACE_RAM_SIZE, &BTE_TraceLogBuf[0], BTTRC_METHOD_RAM);
120 /******************************************************************************
122 ** Function bte_main_shutdown
124 ** Description BTE MAIN API - Shutdown code for BTE chip/stack
128 ******************************************************************************/
129 void bte_main_shutdown()
131 data_dispatcher_register_default(hci_layer_get_interface()->upward_dispatcher, NULL);
132 fixed_queue_free(btu_hci_msg_queue, NULL);
134 btu_hci_msg_queue = NULL;
136 module_clean_up(get_module(STACK_CONFIG_MODULE));
138 module_clean_up(get_module(GKI_MODULE));
141 /******************************************************************************
143 ** Function bte_main_enable
145 ** Description BTE MAIN API - Creates all the BTE tasks. Should be called
146 ** part of the Bluetooth stack enable sequence
150 ******************************************************************************/
151 void bte_main_enable()
153 APPL_TRACE_DEBUG("%s", __FUNCTION__);
155 module_start_up(get_module(BTSNOOP_MODULE));
156 module_start_up(get_module(HCI_MODULE));
161 /******************************************************************************
163 ** Function bte_main_disable
165 ** Description BTE MAIN API - Destroys all the BTE tasks. Should be called
166 ** part of the Bluetooth stack disable sequence
170 ******************************************************************************/
171 void bte_main_disable(void)
173 APPL_TRACE_DEBUG("%s", __FUNCTION__);
175 module_shut_down(get_module(HCI_MODULE));
176 module_shut_down(get_module(BTSNOOP_MODULE));
181 /******************************************************************************
183 ** Function bte_main_postload_cfg
185 ** Description BTE MAIN API - Stack postload configuration
189 ******************************************************************************/
190 void bte_main_postload_cfg(void)
195 #if (defined(HCILP_INCLUDED) && HCILP_INCLUDED == TRUE)
196 /******************************************************************************
198 ** Function bte_main_enable_lpm
200 ** Description BTE MAIN API - Enable/Disable low power mode operation
204 ******************************************************************************/
205 void bte_main_enable_lpm(BOOLEAN enable)
207 hci->send_low_power_command(enable ? LPM_ENABLE : LPM_DISABLE);
210 /******************************************************************************
212 ** Function bte_main_lpm_allow_bt_device_sleep
214 ** Description BTE MAIN API - Allow BT controller goest to sleep
218 ******************************************************************************/
219 void bte_main_lpm_allow_bt_device_sleep()
221 hci->send_low_power_command(LPM_WAKE_DEASSERT);
224 /******************************************************************************
226 ** Function bte_main_lpm_wake_bt_device
228 ** Description BTE MAIN API - Wake BT controller up if it is in sleep mode
232 ******************************************************************************/
233 void bte_main_lpm_wake_bt_device()
235 hci->send_low_power_command(LPM_WAKE_ASSERT);
237 #endif // HCILP_INCLUDED
241 * Definitions for audio state structure, this type needs to match to
242 * the bt_vendor_op_audio_state_t type defined in bt_vendor_lib.h
248 } bt_hc_audio_state_t;
250 struct bt_audio_state_tag {
252 bt_hc_audio_state_t audio;
255 /******************************************************************************
257 ** Function set_audio_state
259 ** Description Sets audio state on controller state for SCO (PCM, WBS, FM)
261 ** Parameters handle: codec related handle for SCO: sco cb idx, unused for
262 ** codec: BTA_AG_CODEC_MSBC, BTA_AG_CODEC_CSVD or FM codec
263 ** state: codec state, eg. BTA_AG_CO_AUD_STATE_SETUP
264 ** param: future extensions, e.g. call-in structure/event.
268 ******************************************************************************/
269 int set_audio_state(UINT16 handle, UINT16 codec, UINT8 state, void *param)
271 struct bt_audio_state_tag *p_msg;
274 APPL_TRACE_API("set_audio_state(handle: %d, codec: 0x%x, state: %d)", handle,
277 APPL_TRACE_WARNING("set_audio_state() non-null param not supported");
278 p_msg = (struct bt_audio_state_tag *)GKI_getbuf(sizeof(*p_msg));
281 p_msg->audio.handle = handle;
282 p_msg->audio.peer_codec = codec;
283 p_msg->audio.state = state;
285 p_msg->hdr.event = MSG_CTRL_TO_HC_CMD | (MSG_SUB_EVT_MASK & BT_HC_AUDIO_STATE);
286 p_msg->hdr.len = sizeof(p_msg->audio);
287 p_msg->hdr.offset = 0;
288 /* layer_specific shall contain return path event! for BTA events!
289 * 0 means no return message is expected. */
290 p_msg->hdr.layer_specific = 0;
291 hci->transmit_downward(MSG_STACK_TO_HC_HCI_CMD, p_msg);
296 /******************************************************************************
298 ** Function bte_main_hci_send
300 ** Description BTE MAIN API - This function is called by the upper stack to
301 ** send an HCI message. The function displays a protocol trace
302 ** message (if enabled), and then calls the 'transmit' function
303 ** associated with the currently selected HCI transport
307 ******************************************************************************/
308 void bte_main_hci_send (BT_HDR *p_msg, UINT16 event)
310 UINT16 sub_event = event & BT_SUB_EVT_MASK; /* local controller ID */
312 p_msg->event = event;
315 if((sub_event == LOCAL_BR_EDR_CONTROLLER_ID) || \
316 (sub_event == LOCAL_BLE_CONTROLLER_ID))
318 hci->transmit_downward(event, p_msg);
322 APPL_TRACE_ERROR("Invalid Controller ID. Discarding message.");