歡迎轉載opendevkit文章, 更好排版和效果, 請關注文章原始地址: http://www.opendevkit.com/?e=113
a2dp作為分析的實例很合適,包括l2cap連接的使用, sdp註冊等,完整的使用了 btif, bta等模組!
0. 背景
藍芽有個特點是,不同種類profile可以在同一時刻在兩個設備間存在連結!所以分析一個profile的過程是可以的,不必考慮會影響其他profile!
android上藍芽操作,搜索和連接是分開的,也就是初始化和連接只需要拿到對應的設備即可。
基本框架:
bt interface (有自己的狀態機,傳遞一個回調給) -> bta (有狀態機,每個狀態都有跳轉表) , bta的請求都是以事件的方式發給btu_task,再根據模組調用回調,回調裡再跳轉到對應的處理函數) -> bta向下直接調用stack的接口 -> bta處理完成後,會調用bt interface的接口傳遞狀態!
1. a2dp profile初始化
(1) A2dpStateMachine類構造的時候,調用了initNative
(2) com_android_bluetooth_a2dp.cpp的initNative獲取了a2dp bt interface
158 if ( (sBluetoothA2dpInterface = (btav_interface_t *)
159 btInf->get_profile_interface(BT_PROFILE_ADVANCED_AUDIO_ID))
159 btInf->get_profile_interface(BT_PROFILE_ADVANCED_AUDIO_ID))
接着調用了 sBluetoothA2dpInterface->init(&sBluetoothA2dpCallbacks))
初始化a2dp bt interface!
(3) btif_av.c的init操作
814 static const btav_interface_t bt_av_interface = {
815 sizeof(btav_interface_t),
816 init,
815 sizeof(btav_interface_t),
816 init,
692 bt_status_t btif_av_init(void)
693 {
694 if (btif_av_cb.sm_handle == NULL)
695 {
696 if (btif_a2dp_start_media_task() != GKI_SUCCESS) // 創建media task
697 return BT_STATUS_FAIL;
698
699 btif_enable_service(BTA_A2DP_SERVICE_ID); // 使能a2dp service
700
701 /* Initialize the AVRC CB */
702 btif_rc_init();
703
704 /* Also initialize the AV state machine */
705 btif_av_cb.sm_handle = btif_sm_init((const btif_sm_handler_t*)btif_av_state_handlers, BTIF_AV_STATE_IDLE); // 創建a2dp bt interface狀態機
706
707 btif_a2dp_on_init();
708
709 return BT_STATUS_SUCCESS;
710 }
711
712 return BT_STATUS_DONE;
713 }
693 {
694 if (btif_av_cb.sm_handle == NULL)
695 {
696 if (btif_a2dp_start_media_task() != GKI_SUCCESS) // 創建media task
697 return BT_STATUS_FAIL;
698
699 btif_enable_service(BTA_A2DP_SERVICE_ID); // 使能a2dp service
700
701 /* Initialize the AVRC CB */
702 btif_rc_init();
703
704 /* Also initialize the AV state machine */
705 btif_av_cb.sm_handle = btif_sm_init((const btif_sm_handler_t*)btif_av_state_handlers, BTIF_AV_STATE_IDLE); // 創建a2dp bt interface狀態機
706
707 btif_a2dp_on_init();
708
709 return BT_STATUS_SUCCESS;
710 }
711
712 return BT_STATUS_DONE;
713 }
[1] btif_enable_service(BTA_A2DP_SERVICE_ID); 使能服務
btif_enable_service -> btif_transfer_context -> btif_dm_execute_service_request -> btif_in_execute_service_request -> btif_av_execute_service
btif_av_execute_service分別調用:BTA_AvEnable和BTA_AvRegister完成使能和服務註冊。
[2] 創建a2dp bt interface狀態機
btif_av_cb.sm_handle = btif_sm_init((const btif_sm_handler_t*)btif_av_state_handlers, BTIF_AV_STATE_IDLE); // 創建a2dp bt interface狀態機
創建一個狀態機賦值狀態回調和初始化狀態,以後就可以調用類似btif_sm_dispatch(btif_av_cb.sm_handle, event, (void*)p_param);這個接口來事件驅動狀態機了!
沒有留言:
張貼留言