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创建socket通信的线程
btif_sock_util.c: socket操作的一些相关函数
btif_storage.c: 存储在本地的BT适配器和远程设备属性(xml)
btif_util.c: 其它辅助功能
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: 帮助功能函数
bte_conf.c: 根据目前在conf文件条目进行运行时模块配置
bte_init.c: 此模块包含了初始化堆栈组件的例程,在BTU任务开始之前调用。
bte_logmsg.c: BTE日志信息封装
bte_main.c: BTE核心堆栈初始化和关闭代码
bte_version.c: BTE版本
a2d_api.c: 高级音频传输模式OMMON的API(支持A2DP)
a2d_sbc.c: 实用功能,以帮助建立和解析SBC编解码信息单元与媒体有效载荷。
avct_api.c: 音频/视频控制传输协议的API
avct_ccb.c: 操作AVCTP连接控制块的函数
avct_l2c.c: AVCTP模块接口至L2CAP
avct_lcb.c: 此模块包含链路控制状态机和操作链路控制块函数
avct_lcb_act.c: 链路控制状态机的行为函数
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: 流控制块状态机相关的操作功能函数
avrc_api.c: AVRCP必须命令接口API
avrc_opt.c: AVRCP可选命令接口API
avrc_sdp.c: AVRCP SDP相关的功能
bnep_api.c: BNEP API
bnep_main.c: BNEP 主要功能函数
bnep_utils.c: BNEP实用功能函数
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: 蓝牙安全管理器功能
btu_hcif.c: HCI传输接口,(事件接受至l2cap等事件处理程序,命令传输)
btu_init.c: 加载和关闭核心协议栈组件的例程
btu_task.c: 蓝牙上层处理循环,RFCOMM L2CAP,SDP和BTIF 为一体GKI任务。他们之间的这种btu_task切换
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实用函数
Hciblecmds.c: HCIC单元格式和发送HCI命令
Hcicmds.c:
hidh_api.c: HID主机API
hidh_conn.c: 连接接口功能函数
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实用函数
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主控制块的实现
pan_api.c: pan规范接口api
pan_main.c: 支持pan命令和事件的功能函数
pan_utils.c:
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单元的实用函数
sdp_api.c: SDP接口API
sdp_db.c: 处理数据库函数
sdp_discovery.c: SDP发现功能
sdp_main.c: SDP主函数
sdp_server.c: SDP服务器功能。这主要是处理客户端请求
sdp_utils.c: SDP实用函数
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
下面对各个部分进行简介。
Bluetooth app运行于Java层,并通过JNI和协议栈的接口(stack’s Interface Layer,BTIF)进行如下交互:
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。
这一层实现了各种Profile状态机。用户通过驱动状态机来操作Profile。
Profile状态机包含以下几个主要组成部分:
例如,调用“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)会被编译成一个linux动态库,其中包含的模块如下图所示。每一个模块都由api函数和函数回调接口组成。
+------------------------------------------+
| +--------------------+ |
| | LIBBT_BRCM_Stack | |
| +--------------------+ |
| +---------+ +-----+ +------+ +-----+ |
| | | |A2DP | |AVCTP | |AVDTP| |
| | | +-----+ +------+ +-----+ |
| | | +-----+ +------+ +-----+ |
| | | |BNEP | | PAN | |HID | |
| | BT | +-----+ +------+ +-----+ |
| | Manager | +-----+ +------+ +-----+ |
| | | |L2CAP| |RFCOMM| |SDP | |
| | | +-----+ +------+ +-----+ |
| | | +-----+ +------+ +-----+ |
| | | |MCAP | |SMP | |GATT | |
| +---------+ +-----+ +------+ +-----+ |
| +------------------------+ |
| | Host Control Interface | |
| +------------------------+ |
+------------------------------------------+
HCI层由libbt-hci共享库组成,负责通讯层(transport layer,如UART H4或者SMD channel)和协议栈之间的交互。
HAL层libbt-vendor共享库组成,是各厂商的解决方案的特定实现。HAL层实现了各厂商对OPCODE的处理逻辑,这些OPCODE声明在HCI层的bt_vendor_lib.h中。
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中读取数据。