1. 程式人生 > >bluedroid 框架

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: 包含HALBTE介面之間的核心功能函式
btif_dm.c: 包含裝置管理(DM)相關功能

btif_hf.c: 擴音模式藍芽介面

btif_hh.c: HID主機配置檔案的藍芽介面

btif_hl.c: 醫療裝置規範的藍芽介面

btif_media_task.c: 這是多媒體模組的BTIF系統。它包含任務的實現avHSHF模式音訊和視訊處理 

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建立

socket通訊的執行緒

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: 高階音訊傳輸模式OMMONAPI(支援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  L2CAPSDPBTIF 為一體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: MCAPL2CAP介面上的實現

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中讀取資料。