2019-03-11

2.enable()流程

//bluetooth.cc  btif\src
static int enable(bool start_restricted) {
  LOG_INFO(LOG_TAG, "%s: start restricted = %d", __func__, start_restricted);

  restricted_mode = start_restricted;

  if (!interface_ready()) return BT_STATUS_NOT_READY;

  stack_manager_get_interface()->start_up_stack_async();
  return BT_STATUS_SUCCESS;
}

和init函數(shù)相似,通過stack_manager_get_interface()返回的interface接口變量缀棍,找到并調(diào)用start_up_stack_async()函數(shù)

關(guān)于start_up_stack_async()函數(shù)

static void start_up_stack_async(void) {
  thread_post(management_thread, event_start_up_stack, NULL);
}

向線程棧發(fā)送消息坞生,創(chuàng)建event_start_up_stackd線程岔留,并綁定到線程工作隊(duì)列management_thread后吨拗,等待執(zhí)行

關(guān)注event_start_up_stack函數(shù)

//stack_manager.cc  btif\src    
// Synchronous function to start up the stack
static void event_start_up_stack(UNUSED_ATTR void* context) {
  if (stack_is_running) {
    LOG_INFO(LOG_TAG, "%s stack already brought up", __func__);
    return;
  }

  ensure_stack_is_initialized();

  LOG_INFO(LOG_TAG, "%s is bringing up the stack", __func__);
  future_t* local_hack_future = future_new();
  hack_future = local_hack_future;

  // Include this for now to put btif config into a shutdown-able state
  module_start_up(get_module(BTIF_CONFIG_MODULE));
  bte_main_enable();

  if (future_await(local_hack_future) != FUTURE_SUCCESS) {
    LOG_ERROR(LOG_TAG, "%s failed to start up the stack", __func__);
    stack_is_running = true;  // So stack shutdown actually happens
    event_shut_down_stack(NULL);
    return;
  }

  stack_is_running = true;
  LOG_INFO(LOG_TAG, "%s finished", __func__);
  btif_thread_post(event_signal_stack_up, NULL);
}

該函數(shù)做如下工作
1.ensure_stack_is_initialized()
確保該隊(duì)列已經(jīng)被初始化(如果沒進(jìn)行過初始化就進(jìn)行初始化操作)

2.module_start_up
啟動(dòng)BTIF_CONFIG_MODULE模塊

3.bte_main_enable()

//bte_main.cc   
void bte_main_enable() {
  APPL_TRACE_DEBUG("%s", __func__);

  module_start_up(get_module(BTSNOOP_MODULE));
  module_start_up(get_module(HCI_MODULE));

  BTU_StartUp();
}

1.啟動(dòng)BTSNOOP_MODULE庵佣,HCI_MODULE模塊

2.BTU_StartUp();

void BTU_StartUp(void) {
  btu_trace_level = HCI_INITIAL_TRACE_LEVEL;

  bt_workqueue_thread = thread_new(BT_WORKQUEUE_NAME);
  if (bt_workqueue_thread == NULL) goto error_exit;

  thread_set_rt_priority(bt_workqueue_thread, BTU_TASK_RT_PRIORITY);

  // Continue startup on bt workqueue thread.
  thread_post(bt_workqueue_thread, btu_task_start_up, NULL);
  return;

error_exit:;
  LOG_ERROR(LOG_TAG, "%s Unable to allocate resources for bt_workqueue",
            __func__);
  BTU_ShutDown();
}
  1. bt_workqueue_thread = thread_new(BT_WORKQUEUE_NAME);
    新建一個(gè)新的工作線程隊(duì)列bt_workqueue_thread

  2. thread_set_rt_priority(bt_workqueue_thread, BTU_TASK_RT_PRIORITY);
    設(shè)置bt_workqueue_thread

3.thread_post(bt_workqueue_thread, btu_task_start_up, NULL);
向bt_workqueue_thread中添加btu_task_start_up線程歉胶,等待執(zhí)行

關(guān)注btu_task_start_up執(zhí)行函數(shù)

//btu_task.cc   stack\btu   
void btu_task_start_up(UNUSED_ATTR void* context) {
  LOG(INFO) << "Bluetooth chip preload is complete";

  /* Initialize the mandatory core stack control blocks
     (BTU, BTM, L2CAP, and SDP)
   */
  btu_init_core();

  /* Initialize any optional stack components */
  BTE_InitStack();

  bta_sys_init();

  /* Initialise platform trace levels at this point as BTE_InitStack() and
   * bta_sys_init()
   * reset the control blocks and preset the trace level with
   * XXX_INITIAL_TRACE_LEVEL
   */
  module_init(get_module(BTE_LOGMSG_MODULE));

  message_loop_thread_ = thread_new("btu message loop");
  if (!message_loop_thread_) {
    LOG(FATAL) << __func__ << " unable to create btu message loop thread.";
  }

  thread_set_rt_priority(message_loop_thread_, THREAD_RT_PRIORITY);
  thread_post(message_loop_thread_, btu_message_loop_run, nullptr);

}

1.btu_init_core()

void btu_init_core(void) {
  /* Initialize the mandatory core stack components */
  btm_init();

  l2c_init();

  sdp_init();

  gatt_init();

  SMP_Init();

  btm_ble_init();
}

2.BTE_InitStack();

void BTE_InitStack(void) {
  /* Initialize the optional stack components */
  RFCOMM_Init();

/**************************
 * BNEP and its profiles **
 **************************/
#if (BNEP_INCLUDED == TRUE)
  BNEP_Init();

#if (PAN_INCLUDED == TRUE)
  PAN_Init();
#endif /* PAN */
#endif /* BNEP Included */

/**************************
 * AVDT and its profiles **
 **************************/
  A2DP_Init();

  AVRC_Init();
///[android-aries-dev](http://172.16.26.250:18080/source/xref/android-aries-dev/)/[system](http://172.16.26.250:18080/source/xref/android-aries-dev/system/)/[bt](http://172.16.26.250:18080/source/xref/android-aries-dev/system/bt/)/[stack](http://172.16.26.250:18080/source/xref/android-aries-dev/system/bt/stack/)/[avrc](http://172.16.26.250:18080/source/xref/android-aries-dev/system/bt/stack/avrc/)/[avrc_sdp.cc](http://172.16.26.250:18080/source/xref/android-aries-dev/system/bt/stack/avrc/avrc_sdp.cc)

  /***********
   * Others **
   ***********/
  GAP_Init();

#if (HID_HOST_INCLUDED == TRUE)
  HID_HostInit();
#endif

#if (MCA_INCLUDED == TRUE)
  MCA_Init();
#endif
}

進(jìn)入A2DP_Init()看一下

void A2DP_Init(void) {
  memset(&a2dp_cb, 0, sizeof(tA2DP_CB));

  a2dp_cb.avdt_sdp_ver = AVDT_VERSION;

#if defined(A2DP_INITIAL_TRACE_LEVEL)
  a2dp_cb.trace_level = A2DP_INITIAL_TRACE_LEVEL;
#else
  a2dp_cb.trace_level = BT_TRACE_LEVEL_NONE;
#endif
}

可以看到(a2dp_api.cc stack\a2dp)文件內(nèi)除了init接口外還有
A2DP_FindService等用于操作A2DP協(xié)議的接口函數(shù)

3.bta_sys_init();

void bta_sys_init(void) {
  memset(&bta_sys_cb, 0, sizeof(tBTA_SYS_CB));

  appl_trace_level = APPL_INITIAL_TRACE_LEVEL;

  /* register BTA SYS message handler */
  bta_sys_register(BTA_ID_SYS, &bta_sys_hw_reg);

  /* register for BTM notifications */
  BTM_RegisterForDeviceStatusNotif(&bta_sys_hw_btm_cback);

#if (defined BTA_AR_INCLUDED) && (BTA_AR_INCLUDED == TRUE)
  bta_ar_init();
#endif
}

4.module_init(get_module(BTE_LOGMSG_MODULE));
BTE_LOGMSG_MODULE模塊初始化

5.message_loop_thread_ = thread_new("btu message loop");
創(chuàng)建message_loop_thread_線程隊(duì)列

6.thread_set_rt_priority(message_loop_thread_, THREAD_RT_PRIORITY);
設(shè)置message_loop_thread_線程隊(duì)列

7.thread_post(message_loop_thread_, btu_message_loop_run, nullptr);
將btu_message_loop_run線程加入message_loop_thread_,等待執(zhí)行

關(guān)注btu_message_loop_run函數(shù)

void btu_message_loop_run(UNUSED_ATTR void* context) {
  message_loop_ = new base::MessageLoop();
  run_loop_ = new base::RunLoop();

  // Inform the bt jni thread initialization is ok.
  message_loop_->task_runner()->PostTask(
      FROM_HERE, base::Bind(base::IgnoreResult(&btif_transfer_context),
                            btif_init_ok, 0, nullptr, 0, nullptr));

  run_loop_->Run();

  delete message_loop_;
  message_loop_ = NULL;

  delete run_loop_;
  run_loop_ = NULL;
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市巴粪,隨后出現(xiàn)的幾起案子通今,更是在濱河造成了極大的恐慌,老刑警劉巖肛根,帶你破解...
    沈念sama閱讀 218,451評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件衡创,死亡現(xiàn)場離奇詭異,居然都是意外死亡晶通,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,172評論 3 394
  • 文/潘曉璐 我一進(jìn)店門哟玷,熙熙樓的掌柜王于貴愁眉苦臉地迎上來狮辽,“玉大人,你說我怎么就攤上這事巢寡『聿保” “怎么了?”我有些...
    開封第一講書人閱讀 164,782評論 0 354
  • 文/不壞的土叔 我叫張陵抑月,是天一觀的道長树叽。 經(jīng)常有香客問我,道長谦絮,這世上最難降的妖魔是什么题诵? 我笑而不...
    開封第一講書人閱讀 58,709評論 1 294
  • 正文 為了忘掉前任,我火速辦了婚禮层皱,結(jié)果婚禮上性锭,老公的妹妹穿的比我還像新娘。我一直安慰自己叫胖,他們只是感情好草冈,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,733評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著瓮增,像睡著了一般怎棱。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上绷跑,一...
    開封第一講書人閱讀 51,578評論 1 305
  • 那天拳恋,我揣著相機(jī)與錄音,去河邊找鬼你踩。 笑死诅岩,一個(gè)胖子當(dāng)著我的面吹牛讳苦,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播吩谦,決...
    沈念sama閱讀 40,320評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼鸳谜,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了式廷?” 一聲冷哼從身側(cè)響起咐扭,我...
    開封第一講書人閱讀 39,241評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎滑废,沒想到半個(gè)月后蝗肪,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,686評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡蠕趁,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,878評論 3 336
  • 正文 我和宋清朗相戀三年薛闪,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片俺陋。...
    茶點(diǎn)故事閱讀 39,992評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡豁延,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出腊状,到底是詐尸還是另有隱情诱咏,我是刑警寧澤,帶...
    沈念sama閱讀 35,715評論 5 346
  • 正文 年R本政府宣布缴挖,位于F島的核電站袋狞,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏映屋。R本人自食惡果不足惜苟鸯,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,336評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望棚点。 院中可真熱鬧倔毙,春花似錦、人聲如沸乙濒。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,912評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽颁股。三九已至么库,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間甘有,已是汗流浹背诉儒。 一陣腳步聲響...
    開封第一講書人閱讀 33,040評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留亏掀,地道東北人忱反。 一個(gè)月前我還...
    沈念sama閱讀 48,173評論 3 370
  • 正文 我出身青樓泛释,卻偏偏與公主長得像,于是被迫代替她去往敵國和親温算。 傳聞我的和親對象是個(gè)殘疾皇子怜校,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,947評論 2 355

推薦閱讀更多精彩內(nèi)容