蓝牙协议栈初始化流程
btif_init_ok 调用流程分析
btif_init_ok 是蓝牙协议栈启动过程中的关键函数,以下是其完整的调用流程:
1. 启动入口点
text
btu_task_start_up() // BTU任务启动函数
↓
do_in_jni_thread(FROM_HERE, base::Bind(btif_init_ok, 0, nullptr))
↓
2. 线程切换机制
cpp
// 在 btu_task.cc 中
if (do_in_jni_thread(FROM_HERE, base::Bind(btif_init_ok, 0, nullptr)) != BT_STATUS_SUCCESS) {
LOG(FATAL) << "unable to continue starting Bluetooth";
}
关键点:
do_in_jni_thread 将任务从 BTU 线程切换到 JNI 线程执行
这是为了确保蓝牙初始化在正确的线程上下文中进行
3. btif_init_ok 函数内部执行流程
cpp
void btif_init_ok(uint16_t event, char* p_param) {
// 步骤1: 记录初始化事件
BTIF_TRACE_DEBUG("btif_task: received trigger stack init event");
// 步骤2: 加载BLE本地密钥
btif_dm_load_ble_local_keys();
// 步骤3: 启用蓝牙核心栈
BTA_EnableBluetooth(bte_dm_evt);
}
4. 详细调用链分解
系统启动
↓
BluetoothManagerService.enable()
↓
AdapterService.enable()
↓
JNI_Enable() → enableNative()
↓
btif_enable_bluetooth() → btif_dm_enable()
↓
BTU任务启动 (btu_task_start_up)
↓
btu_init_core() // 初始化BTU核心
↓
BTE_InitStack() // 初始化BTE栈
↓
bta_sys_init() // 初始化BTA系统
↓
do_in_jni_thread(btif_init_ok) // 切换到JNI线程执行
↓
[切换到JNI线程]
↓
btif_init_ok() // 蓝牙接口初始化完成
↓
btif_dm_load_ble_local_keys() // 加载BLE本地密钥
↓
BTA_EnableBluetooth(bte_dm_evt) // 启用蓝牙核心功能
↓
bta_dm_enable() // 设备管理启用
↓
bta_sys_hw_register() // 注册硬件回调
↓
bta_sys_sendmsg(BTA_SYS_API_ENABLE_EVT) // 发送启用消息
↓
[系统处理启用事件]
↓
btm_ble_init() // BLE子系统初始化
↓
btm_ble_vsc_init() // BLE Vendor Specific初始化
↓
btm_ble_send_vsc_command() // 发送VSC命令获取芯片能力
5. VSC命令完成回调流程
VSC命令发送完成
↓
btm_ble_vsc_cmpl_cback() // VSC命令通用完成回调
↓
btm_ble_process_vsc_cmpl_cback() // 处理VSC完成事件
↓
根据VSC操作码(opcode)分发处理
↓
case BTM_BLE_VENDOR_CAP_VSC: // 厂商能力VSC
↓
btm_ble_vendor_capability_vsc_cmpl_cback(p_params) // 厂商能力回调
↓
处理厂商特定能力信息:
- 最大广告数据长度
- 支持的PHY类型
- 扩展广告能力
- 周期广告能力
- 其他芯片特定功能
↓
更新BLE能力缓存 (btm_cb.ble_ctr_cb)
↓
通知上层组件能力可用
6. 详细的BLE初始化
btif_init_ok()
↓
BTA_EnableBluetooth(bte_dm_evt)
↓
bta_dm_enable()
↓
bta_sys_hw_register(BTA_SYS_HW_BLUETOOTH, bta_dm_sys_hw_cback)
↓
bta_sys_sendmsg(BTA_SYS_API_ENABLE_EVT)
↓
[系统硬件启用处理]
↓
bta_dm_sys_hw_cback(BTA_SYS_HW_ON_EVT) // 硬件开启事件
↓
bta_dm_enable_bt() // 启用蓝牙核心
↓
BTM_Enable() // 启用BTM管理器
↓
btm_init() // 初始化BTM
↓
btm_ble_init() // 初始化BLE子系统
↓
btm_ble_vsc_init() // 初始化VSC功能
↓
btm_ble_send_vsc_command( // 发送VSC命令获取能力
HCI_BLE_VENDOR_CAP_OCF, // 厂商能力操作码
NULL, 0, // 无参数
btm_ble_vsc_cmpl_cback // VSC完成回调
)
↓
[蓝牙控制器处理VSC命令并返回]
↓
btm_ble_vsc_cmpl_cback() // VSC命令完成
↓
btm_ble_process_vsc_cmpl_cback() // 处理完成事件
↓
case BTM_BLE_VENDOR_CAP_VSC: // 厂商能力VSC码
↓
btm_ble_vendor_capability_vsc_cmpl_cback(p_params) // 厂商能力回调
7. 时序关系
时间轴:
│
├── 系统启动
│ ↓
├── 蓝牙服务启用
│ ↓
├── BTU任务启动
│ ↓
├── btif_init_ok调用 (同步)
│ ↓
├── BTA_EnableBluetooth调用 (同步)
│ ↓
├── VSC命令发送 (异步)
│ ↓
├── 蓝牙控制器处理 (硬件)
│ ↓
└── btm_ble_vendor_capability_vsc_cmpl_cback回调 (异步)
8. 初始化完成后的状态
btif_init_ok 执行完成后:
BLE本地密钥已加载
蓝牙核心栈已启用
协议栈进入可操作状态
可以开始处理上层应用的蓝牙请求