bluedroid 框架
bluedroid專案程式碼的框架:
Bta:
1. ag(audio gateway):藍芽音訊閘道器的實現
2. Ar(audio/video registration):音訊/視訊註冊模組的實現
3. Av(advanced audio/video):更先進的音訊/視訊實現
4. Dm(device manager):bta裝置管理實現
5. Fs(file system):包含bta檔案系統編譯時間可配置常數以及回撥函式
6. Gatt:gatt客戶端的主要功能和狀態機
7. Hh(HID host):人性化介面裝置(HID),連線滑鼠鍵盤
8. Hl(HeaLth):健康裝置模式的主要功能函式和狀態機
9.Jv(Java):
10.Pan(藍芽個人區域網):pan主要功能實現和狀態機
11.Pb(phone book):電話薄訪問伺服器的私人檔案
12.sys(system):bta系統管理的實現
Btif:
1. Co:call-out(bta的調出函式)
2. Src:
Bluetooth.c: 藍芽HAL實現
btif_av.c: 藍芽av實現
btif_config.c: 儲存在本地的BT介面卡和遠端裝置屬性(xml)
btif_core.c: 包含HAL和BTE介面之間的核心功能函式
btif_dm.c: 包含裝置管理(DM)相關功能
btif_hf.c: 擴音模式藍芽介面
btif_hh.c: HID主機配置檔案的藍芽介面
btif_hl.c: 醫療裝置規範的藍芽介面
btif_media_task.c: 這是多媒體模組的BTIF系統。它包含任務的實現av,HS和HF模式音訊和視訊處理
btif_pan.c: PAN模式藍芽介面
btif_profile_queue.c:藍芽遠端裝置的連線佇列的實現。
btif_rc.c: 藍芽AVRC實現
btif_sm.c: 通用BTIF狀態機的API
btif_sock.c: 藍芽Socket介面
btif_sock_rfc.c: 虛擬串列埠模式藍芽介面
btif_sock_sdp.c: 服務發現
btif_sock_thread.c: socket select thread建立
btif_sock_util.c: socket操作的一些相關函式
btif_storage.c: 儲存在本地的BT介面卡和遠端裝置屬性(xml)
btif_util.c: 其它輔助功能
Gki:
1. Common:
2.Ulinux
HCI:
bt_hci_bdroid.c: 藍芽主機/控制器介面庫實現
bt_hw.c: 藍芽供應商提供的回撥函式
bt_utils.c: 其它輔助功能
Btsnoop.c: 生成一個藍芽窺探檔案
hci_h4.c: HCI傳輸傳送/接收
hci_mct.c: HCI多通道傳輸
Lpm.c: 低功耗模式實現
Userial.c: 串列埠開啟/讀取/寫入/關閉實現
userial_mct.c: 多通道開啟/讀/寫/關閉功能
Utils.c: 幫助功能函式
Main:
bte_conf.c: 根據目前在conf檔案條目進行執行時模組配置
bte_init.c: 此模組包含了初始化堆疊元件的例程,在BTU任務開始之前呼叫。
bte_logmsg.c: BTE日誌資訊封裝
bte_main.c: BTE核心堆疊初始化和關閉程式碼
bte_version.c: BTE版本
Stack:
1. a2dp:
a2d_api.c: 高階音訊傳輸模式OMMON的API(支援A2DP)
a2d_sbc.c: 實用功能,以幫助建立和解析SBC編解碼資訊單元與媒體有效載荷。
2. Avct:
avct_api.c: 音訊/視訊控制傳輸協議的API
avct_ccb.c: 操作AVCTP連線控制塊的函式
avct_l2c.c: AVCTP模組介面至L2CAP
avct_lcb.c: 此模組包含鏈路控制狀態機和操作鏈路控制塊函式
avct_lcb_act.c: 鏈路控制狀態機的行為函式
3. avdt:
avdt_ad.c: 此模組包含AVDTP適配層(adaption)
avdt_api.c: 音訊/視訊分發傳輸協議的API
avdt_ccb.c: 通道控制塊狀態機和操作該通道控制塊的功能函式
avdt_ccb_act.c: 與通道控制塊狀態機相關的操作功能函式
avdt_l2c.c: AVDTP適配層模組介面L2CAP
avdt_msg.c: 用於分析和生成AVDTP信令訊息的功能
avdt_scb.c: 流控制塊及其操作函式
avdt_scb_act.c: 流控制塊狀態機相關的操作功能函式
4. Avrc:
avrc_api.c: AVRCP必須命令介面API
avrc_opt.c: AVRCP可選命令介面API
avrc_sdp.c: AVRCP SDP相關的功能
5. Bnep:
bnep_api.c: BNEP API
bnep_main.c: BNEP 主要功能函式
bnep_utils.c: BNEP實用功能函式
6. Btm:
btm_acl.c: 處理ACL連線,保持和嗅探模式,支援資料包型別。
btm_ble.c: BLE裝置的控制及安全功能
btm_ble_addr.c: BLE地址管理
btm_ble_bgconn.c:BLE白名單的操作
btm_ble_gap.c: BLE GAP
btm_dev.c: 藍芽裝置管理
btm_devctl.c: 處理BTM介面功能,包括休息,HCl緩衝大小等
btm_inq.c: 處理查詢(handle inquiries),包括設定發現模式,控制基帶的方式, 維護查詢響應的小型資料庫
btm_main.c: BTM控制塊的定義
btm_pm.c: 管理ACL鏈路模式功能(活躍,持有,停和嗅探模式)
btm_sco.c: 處理SCO連線,連線,斷開連線,改變支援資料包型別。
btm_sec.c: 藍芽安全管理器功能
7. Btu:
btu_hcif.c: HCI傳輸介面,(事件接受至l2cap等事件處理程式,命令傳輸)
btu_init.c: 載入和關閉核心協議棧元件的例程
btu_task.c: 藍芽上層處理迴圈,RFCOMM L2CAP,SDP和BTIF 為一體GKI任務。他們之間的這種btu_task切換
8. Gatt:
att_protocol.c: ATT協議功能
gatt_api.c: GATT介面API
gatt_attr.c: GATT伺服器屬性訪問請求處理函式。
gatt_auth.c: GATT認證處理功能
gatt_cl.c: GATT客戶端功能函式
gatt_db.c: GATT資料庫的建立和查詢
gatt_main.c: 主要的ATT功能函式
gatt_sr.c: GATT伺服器功能函式
gatt_utils.c: GATT實用函式
9. Hcic:
Hciblecmds.c: HCIC單元格式和傳送HCI命令
Hcicmds.c:
10. Hid:
hidh_api.c: HID主機API
hidh_conn.c: 連線介面功能函式
11. L2cap:
l2c_api.c: L2CAP介面API
l2c_ble.c: 與ble管理相關的功能函式
l2c_csm.c: L2CAP通道狀態機(channel state machine)
l2c_fcr.c: 流量控制和重傳(Flow Control and retransmissions)
l2c_link.c: 與鏈路管理相關
l2c_main.c: L2CAP入口點
l2c_ucd.c: L2CAP UCD 程式碼
l2c_utils.c: L2cap實用函式
12. Mcap(多通道適配協議):
mca_api.c: Multi-Channel Adaptation Protocol 介面API
mca_cact.c: 控制通道操作功能函式的實現
mca_csm.c: 控制通道的狀態機的實現。
mca_dact.c: 資料通道功能的實現
mca_dsm.c: 資料通道狀態機
mca_l2c.c: MCAP在L2CAP介面上的實現
mca_main.c: MCAP主控制塊的實現
13. Pan:
pan_api.c: pan規範介面api
pan_main.c: 支援pan命令和事件的功能函式
pan_utils.c:
14. Rfcomm:
port_api.c: 串列埠API
port_rfc.c: 埠模擬實體和RFCOMM通訊
port_utils.c: 埠模擬實體函式
rfc_l2cap_if.c: L2CAP介面函式
rfc_mx_fsm.c: RFCOMM單元的多路通道的狀態機和操作例程
rfc_port_fsm.c: RFCOMM單元的埠的狀態機和操作例程
rfc_port_if.c: 供RFCOMM之上執行的應用程式呼叫
rfc_ts_frames.c: 傳送TS 07.10幀
rfc_utils.c: 使用的RFCOMM單元的實用函式
15. Sdp:
sdp_api.c: SDP介面API
sdp_db.c: 處理資料庫函式
sdp_discovery.c: SDP發現功能
sdp_main.c: SDP主函式
sdp_server.c: SDP伺服器功能。這主要是處理客戶端請求
sdp_utils.c: SDP實用函式
16. Smp:
Aes.c: AES實現,使用唯一的8位位元組操作加密狀態
smp_act.c:
smp_api.c: SMP的應用程式介面。
smp_cmac.c: AES128 CMAC演算法實現
smp_keys.c:
smp_l2c.c: SMP l2cap介面上的實現
smp_main.c: SMP主函式
smp_utils.c: SMP L2Cap實用函式
Bluedroid總框架圖如下所示:
Java
+--------------------------------+
+-----------------+ C++/C
| BTIF |
+-----------------+
| BTA |
+-----------------+
| Bluedroid Stack |
+-----------------+ user space
+---------------------------------+
kernel space
下面對各個部分進行簡介。
Java Application/JNI
Bluetooth app運行於Java層,並通過JNI和協議棧的介面(stack’s Interface Layer,BTIF)進行如下互動:
- JNI層的作用是將Java呼叫轉化為C函式的呼叫,同時為應用和協議棧提供了呼叫/回撥的互動能力。
BTIF (Bluetooth Profile Interface)
Bluetooth Profile Interface在Bluetooth Application task (BTA)和JNI層之間充當了膠水層的角色,對上層(JNI)提供了所有profile功能性的介面。這一層上有一個Bluetooth Interface Instance,所有Profile的操作函式都註冊在其中(GAP, AV, DM, PAN, HF,HH, HL, Storage, Sockets)。Client應用通過操作這個Instance來操作Profile。
BTA
這一層實現了各種Profile狀態機。使用者通過驅動狀態機來操作Profile。
Profile狀態機包含以下幾個主要組成部分:
- BTA_profilexx_act.c => 包含對應Profile的“Action”函式,一般來說由Profile狀態機呼叫。
- BTA_profilexx_api.c => 對應Profile的API的具體實現。通常它們是提供給使用者使用,完成usecase的函式和回撥
- BTA_profilexx_ci.c => 對應Profile的“call-in”函式的實現(供Profile以外的模組呼叫)
- BTA_profilexx_co.c => 對應Profile的“call-out”函式的實現(呼叫Profile以外的模組)
- BTA_profilexx_main.c => 對應Profile的狀態機和處理協議棧上傳訊息的handler的具體實現。主要負責維護Profile狀態的變化及其引起的“Action”
例如,呼叫“BTA_profilexx_act.c”中的API函式時,各部分的執行流程圖如下所示:
seq2 +---------------------+ seq3 +-----------------------+
+----> BTA_Profilexx_API.c <----------> BTA's SYS Msg Posting |
| +----------^----------+ +-----------^-----------+
| | |
| |seq7 | seq4
| | |
+--------------+ seq1 +------------------+ | +----------v-----------+ seq5 +-----------v-------+
| User Command <---------> BTIF_Exposed_API +----+----> BTA_Profilexx_Main.c <---------> OS Message Posted |
+--------------+ seq9 +------------------+ seq8 +----------^-----------+ +-------------------+
|
|seq6
|
+----------v---------+
| BTA_Profilexx.Ci.c |
+--------------------+
Core Stack
核心協議棧(Core Stack)會被編譯成一個linux動態庫,其中包含的模組如下圖所示。每一個模組都由api函式和函式回撥介面組成。
+------------------------------------------+
| +--------------------+ |
| | LIBBT_BRCM_Stack | |
| +--------------------+ |
| +---------+ +-----+ +------+ +-----+ |
| | | |A2DP | |AVCTP | |AVDTP| |
| | | +-----+ +------+ +-----+ |
| | | +-----+ +------+ +-----+ |
| | | |BNEP | | PAN | |HID | |
| | BT | +-----+ +------+ +-----+ |
| | Manager | +-----+ +------+ +-----+ |
| | | |L2CAP| |RFCOMM| |SDP | |
| | | +-----+ +------+ +-----+ |
| | | +-----+ +------+ +-----+ |
| | | |MCAP | |SMP | |GATT | |
| +---------+ +-----+ +------+ +-----+ |
| +------------------------+ |
| | Host Control Interface | |
| +------------------------+ |
+------------------------------------------+
HCI and HAL Layers
HCI層由libbt-hci共享庫組成,負責通訊層(transport layer,如UART H4或者SMD channel)和協議棧之間的互動。
HAL層libbt-vendor共享庫組成,是各廠商的解決方案的特定實現。HAL層實現了各廠商對OPCODE的處理邏輯,這些OPCODE宣告在HCI層的bt_vendor_lib.h中。
TASK管理
Bluedroid中,協議棧,藍芽規範和藍芽應用都執行在一個使用者程序"com.android.bluetooth"之中。
藍芽程式碼在以下四種task代表的上下文(context)中執行:
* BTIF_TASK
* BTU_TASK
* A2DP_MEDIA_TASK
* GKI_TIMER_TASK
task之間通過訊息(message)來交換資訊。
呼叫JNI層的API函式會通過訊息轉發機制,在BTIF_TASK中執行。
JNI,HAL回撥在BTIF_TASK中執行。
有需要時,BTIF_TASK中的呼叫可切換到BTU_TASK中執行。
藍芽規範(Profiles)和協議的實現程式碼在BTU_TASK中執行。
藍芽傳輸驅動程式中有一條rx執行緒(bt_hc_worker_thread)負責從UART/SMD中讀取資料。