Android bluedroid模块间关系
2015-09-28 18:07
656 查看
一图解百惑整个bluedroid可以分为两大模块:BTIF,BTEBTIF:提供bluedroid对外的接口BTE:bluedroid的内部处理,又细分为BTA,BTU,BTM和HCIBTA:bluedroid中各profile的逻辑实现和处理BTU:承接BTA与HCIBTM:蓝牙配对与链路管理HCI:读取或写入数据到蓝牙hw下面以实际例子来表现个模块间的协作tv与蓝牙音箱建立连接上层应用建立连接时候,会调用到btif_av.c中的connect函数btif_av.c
static bt_status_t connect(bt_bdaddr_t *bd_addr) { BTIF_TRACE_EVENT1("%s", __FUNCTION__); CHECK_BTAV_INIT(); return btif_queue_connect(UUID_SERVCLASS_AUDIO_SOURCE, bd_addr, connect_int); }经过内部逻辑处理后,会调用到bta_av_api.c中的BTA_AvOpen函数
void BTA_AvOpen(BD_ADDR bd_addr, tBTA_AV_HNDL handle, BOOLEAN use_rc, tBTA_SEC sec_mask) 170 { 171 tBTA_AV_API_OPEN *p_buf; 172 173 if ((p_buf = (tBTA_AV_API_OPEN *) GKI_getbuf(sizeof(tBTA_AV_API_OPEN))) != NULL) 174 { 175 p_buf->hdr.event = BTA_AV_API_OPEN_EVT; 176 p_buf->hdr.layer_specific = handle; 177 bdcpy(p_buf->bd_addr, bd_addr); 178 p_buf->use_rc = use_rc; 179 p_buf->sec_mask = sec_mask; 180 p_buf->switch_res = BTA_AV_RS_NONE; 181 bta_sys_sendmsg(p_buf); 182 } 183 }bta_sys_sendmsg最终会将消息发送btu_task.c中的btu_task线程处理
for (;;) 227 { 228 event = GKI_wait (0xFFFF, 0); 229 230 if (event & TASK_MBOX_0_EVT_MASK) 231 { ........ } . . . if (event & TASK_MBOX_2_EVT_MASK) 549 { 550 while ((p_msg = (BT_HDR *) GKI_read_mbox(TASK_MBOX_2)) != NULL) 551 { 552 bta_sys_event(p_msg); 553 } 554 }通过bta_sys_event,消息再次转入bta内部处理,最终经过协议栈a2dp和l2cap和BTM的管理,将建立连接的请求通过bte_main.c的bte_main_hci_send发送给hci处理
void bte_main_hci_send (BT_HDR *p_msg, UINT16 event) 506 { 507 UINT16 sub_event = event & BT_SUB_EVT_MASK; /* local controller ID */ 508 509 p_msg->event = event; 510 511 512 if((sub_event == LOCAL_BR_EDR_CONTROLLER_ID) || \ 513 (sub_event == LOCAL_BLE_CONTROLLER_ID)) 514 { 515 if (bt_hc_if) 516 bt_hc_if->transmit_buf((TRANSAC)p_msg, \ 517 (char *) (p_msg + 1), \ 518 p_msg->len); 519 else 520 GKI_freebuf(p_msg); 521 } 522 else 523 { 524 APPL_TRACE_ERROR0("Invalid Controller ID. Discarding message."); 525 GKI_freebuf(p_msg); 526 } 527 }在hci中,数据被写入bt driver中
static int transmit_buf(TRANSAC transac, char *p_buf, int len) 338 { 339 utils_enqueue(&tx_q, (void *) transac); 340 341 bthc_signal_event(HC_EVENT_TX); 342 343 return BT_HC_STATUS_SUCCESS; 344 }
bt_hc_worker_thread负责处理hci事件:
if (events & HC_EVENT_TX)529 {530 /*531 * We will go through every packets in the tx queue.532 * Fine to clear tx_cmd_pkts_pending.533 */534 tx_cmd_pkts_pending = FALSE;535 HC_BT_HDR * sending_msg_que[64];536 int sending_msg_count = 0;537 int sending_hci_cmd_pkts_count = 0;538 utils_lock();539 p_next_msg = tx_q.p_first;540 while (p_next_msg && sending_msg_count <541 (int)sizeof(sending_msg_que)/sizeof(sending_msg_que[0]))542 {543 if ((p_next_msg->event & MSG_EVT_MASK)==MSG_STACK_TO_HC_HCI_CMD)544 {545 /*546 * if we have used up controller's outstanding HCI command547 * credits (normally is 1), skip all HCI command packets in548 * the queue.549 * The pending command packets will be sent once controller550 * gives back us credits through CommandCompleteEvent or551 * CommandStatusEvent.552 */553 if ((tx_cmd_pkts_pending == TRUE) ||554 (sending_hci_cmd_pkts_count >= num_hci_cmd_pkts))555 {556 tx_cmd_pkts_pending = TRUE;557 p_next_msg = utils_getnext(p_next_msg);558 continue;559 }560 sending_hci_cmd_pkts_count++;561 }562563 p_msg = p_next_msg;564 p_next_msg = utils_getnext(p_msg);565 utils_remove_from_queue_unlocked(&tx_q, p_msg);566 sending_msg_que[sending_msg_count++] = p_msg;567 }utils_unlock();569 int i;570 for(i = 0; i < sending_msg_count; i++)571 p_hci_if->send(sending_msg_que[i]);//将数据发送到bt driver中572 if (tx_cmd_pkts_pending == TRUE)573 BTHCDBG("Used up Tx Cmd credits");574575 }
相关文章推荐
- Cannot parse "1986-05-04": Illegal instant due to time zone offset transition (Asia/Shanghai)
- 破坏神(2)NGUI实现角色选择界面
- easyUI datagrid解析Json
- 前台往后台传送数据出现乱码
- Auto Layout still required after executing -layoutSubViews
- SystemUI简介
- android systemUI--Notification 整理
- 【工作记录0013】easyui中datagrid绑定,后台可读出数据,前台未显示的解决方法
- Linker and Libraries Guide(1)
- Streaming query results
- easy ui 1.2.4的中文API
- 解析:使用easyui的form提交表单,在IE下出现类似附件下载时提示是否保存的现象
- AndroidUI ToolBar
- 树状数组+二分||线段树 HDOJ 5493 Queue
- iOS开发UI篇—常见的项目文件介绍
- UVA - 11235 Frequent values 频繁出现的数值 RMQ+游程编码
- SpriteBuilder中的CCSprite9Slice是个什么鬼?
- SpriteBuilder中的CCSprite9Slice是个什么鬼?
- SpriteBuilder中的CCSprite9Slice是个什么鬼?
- getRequestDispatcher 和sendRedirect区别