1 /****************************************************************************** 2 * 3 * Copyright (C) 1999-2012 Broadcom Corporation 4 * 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: 8 * 9 * http://www.apache.org/licenses/LICENSE-2.0 10 * 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. 16 * 17 ******************************************************************************/ 18 19 #define LOG_TAG "bt_btu_task" 20 21 #include <assert.h> 22 #include <pthread.h> 23 #include <stdio.h> 24 #include <stdlib.h> 25 #include <string.h> 26 27 #include "bt_target.h" 28 #include "bt_trace.h" 29 #include "bt_types.h" 30 #include "bt_utils.h" 31 #include "btcore/include/module.h" 32 #include "btif_common.h" 33 #include "btm_api.h" 34 #include "btm_int.h" 35 #include "btu.h" 36 #include "gap_int.h" 37 #include "bt_common.h" 38 #include "hcimsgs.h" 39 #include "l2c_int.h" 40 #include "osi/include/alarm.h" 41 #include "osi/include/fixed_queue.h" 42 #include "osi/include/future.h" 43 #include "osi/include/hash_map.h" 44 #include "osi/include/log.h" 45 #include "osi/include/osi.h" 46 #include "osi/include/thread.h" 47 #include "port_api.h" 48 #include "port_ext.h" 49 #include "sdpint.h" 50 51 #if (defined(BNEP_INCLUDED) && BNEP_INCLUDED == TRUE) 52 #include "bnep_int.h" 53 #endif 54 55 #if (defined(PAN_INCLUDED) && PAN_INCLUDED == TRUE) 56 #include "pan_int.h" 57 #endif 58 59 #if (defined(HID_HOST_INCLUDED) && HID_HOST_INCLUDED == TRUE ) 60 #include "hidh_int.h" 61 #endif 62 63 #if (defined(AVDT_INCLUDED) && AVDT_INCLUDED == TRUE) 64 #include "avdt_int.h" 65 #else 66 extern void avdt_rcv_sync_info (BT_HDR *p_buf); /* this is for hci_test */ 67 #endif 68 69 #if (defined(MCA_INCLUDED) && MCA_INCLUDED == TRUE) 70 #include "mca_api.h" 71 #include "mca_defs.h" 72 #include "mca_int.h" 73 #endif 74 75 #include "bta_sys.h" 76 77 #if (BLE_INCLUDED == TRUE) 78 #include "gatt_int.h" 79 #if (SMP_INCLUDED == TRUE) 80 #include "smp_int.h" 81 #endif 82 #include "btm_ble_int.h" 83 #endif 84 85 extern void BTE_InitStack(void); 86 87 /* Define BTU storage area 88 */ 89 uint8_t btu_trace_level = HCI_INITIAL_TRACE_LEVEL; 90 91 // Communication queue between btu_task and bta. 92 extern fixed_queue_t *btu_bta_msg_queue; 93 94 // Communication queue between btu_task and hci. 95 extern fixed_queue_t *btu_hci_msg_queue; 96 97 // General timer queue. 98 extern fixed_queue_t *btu_general_alarm_queue; 99 100 extern fixed_queue_t *event_queue; 101 extern fixed_queue_t *btif_msg_queue; 102 103 extern thread_t *bt_workqueue_thread; 104 105 static void btu_hci_msg_process(BT_HDR *p_msg); 106 107 void btu_hci_msg_ready(fixed_queue_t *queue, UNUSED_ATTR void *context) { 108 BT_HDR *p_msg = (BT_HDR *)fixed_queue_dequeue(queue); 109 btu_hci_msg_process(p_msg); 110 } 111 112 void btu_bta_msg_ready(fixed_queue_t *queue, UNUSED_ATTR void *context) { 113 BT_HDR *p_msg = (BT_HDR *)fixed_queue_dequeue(queue); 114 bta_sys_event(p_msg); 115 } 116 117 static void btu_hci_msg_process(BT_HDR *p_msg) { 118 /* Determine the input message type. */ 119 switch (p_msg->event & BT_EVT_MASK) 120 { 121 case BTU_POST_TO_TASK_NO_GOOD_HORRIBLE_HACK: // TODO(zachoverflow): remove this 122 ((post_to_task_hack_t *)(&p_msg->data[0]))->callback(p_msg); 123 #if (defined(HCILP_INCLUDED) && HCILP_INCLUDED == TRUE) 124 /* If the host receives events which it doesn't responsd to, */ 125 /* it should start an idle timer to enter sleep mode. */ 126 btu_check_bt_sleep (); 127 #endif 128 break; 129 case BT_EVT_TO_BTU_HCI_ACL: 130 /* All Acl Data goes to L2CAP */ 131 l2c_rcv_acl_data (p_msg); 132 break; 133 134 case BT_EVT_TO_BTU_L2C_SEG_XMIT: 135 /* L2CAP segment transmit complete */ 136 l2c_link_segments_xmitted (p_msg); 137 break; 138 139 case BT_EVT_TO_BTU_HCI_SCO: 140 #if BTM_SCO_INCLUDED == TRUE 141 btm_route_sco_data (p_msg); 142 break; 143 #endif 144 145 case BT_EVT_TO_BTU_HCI_EVT: 146 btu_hcif_process_event ((UINT8)(p_msg->event & BT_SUB_EVT_MASK), p_msg); 147 osi_free(p_msg); 148 149 #if (defined(HCILP_INCLUDED) && HCILP_INCLUDED == TRUE) 150 /* If host receives events which it doesn't response to, */ 151 /* host should start idle timer to enter sleep mode. */ 152 btu_check_bt_sleep (); 153 #endif 154 break; 155 156 case BT_EVT_TO_BTU_HCI_CMD: 157 btu_hcif_send_cmd ((UINT8)(p_msg->event & BT_SUB_EVT_MASK), p_msg); 158 break; 159 160 default: 161 osi_free(p_msg); 162 break; 163 } 164 } 165 166 void btu_task_start_up(UNUSED_ATTR void *context) { 167 BT_TRACE(TRACE_LAYER_BTU, TRACE_TYPE_API, 168 "btu_task pending for preload complete event"); 169 170 LOG_INFO(LOG_TAG, "Bluetooth chip preload is complete"); 171 172 BT_TRACE(TRACE_LAYER_BTU, TRACE_TYPE_API, 173 "btu_task received preload complete event"); 174 175 /* Initialize the mandatory core stack control blocks 176 (BTU, BTM, L2CAP, and SDP) 177 */ 178 btu_init_core(); 179 180 /* Initialize any optional stack components */ 181 BTE_InitStack(); 182 183 bta_sys_init(); 184 185 /* Initialise platform trace levels at this point as BTE_InitStack() and bta_sys_init() 186 * reset the control blocks and preset the trace level with XXX_INITIAL_TRACE_LEVEL 187 */ 188 #if ( BT_USE_TRACES==TRUE ) 189 module_init(get_module(BTE_LOGMSG_MODULE)); 190 #endif 191 192 // Inform the bt jni thread initialization is ok. 193 btif_transfer_context(btif_init_ok, 0, NULL, 0, NULL); 194 195 fixed_queue_register_dequeue(btu_bta_msg_queue, 196 thread_get_reactor(bt_workqueue_thread), 197 btu_bta_msg_ready, 198 NULL); 199 200 fixed_queue_register_dequeue(btu_hci_msg_queue, 201 thread_get_reactor(bt_workqueue_thread), 202 btu_hci_msg_ready, 203 NULL); 204 205 alarm_register_processing_queue(btu_general_alarm_queue, bt_workqueue_thread); 206 } 207 208 void btu_task_shut_down(UNUSED_ATTR void *context) { 209 fixed_queue_unregister_dequeue(btu_bta_msg_queue); 210 fixed_queue_unregister_dequeue(btu_hci_msg_queue); 211 alarm_unregister_processing_queue(btu_general_alarm_queue); 212 213 #if ( BT_USE_TRACES==TRUE ) 214 module_clean_up(get_module(BTE_LOGMSG_MODULE)); 215 #endif 216 217 bta_sys_free(); 218 btu_free_core(); 219 } 220 221 #if (defined(HCILP_INCLUDED) && HCILP_INCLUDED == TRUE) 222 /******************************************************************************* 223 ** 224 ** Function btu_check_bt_sleep 225 ** 226 ** Description This function is called to check if controller can go to sleep. 227 ** 228 ** Returns void 229 ** 230 *******************************************************************************/ 231 void btu_check_bt_sleep (void) 232 { 233 // TODO(zachoverflow) take pending commands into account? 234 if (l2cb.controller_xmit_window == l2cb.num_lm_acl_bufs) 235 { 236 bte_main_lpm_allow_bt_device_sleep(); 237 } 238 } 239 #endif 240