Home | History | Annotate | Download | only in btu
      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