蓝牙协议栈初始化流程

蓝牙协议栈初始化流程

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本地密钥已加载

蓝牙核心栈已启用

协议栈进入可操作状态

可以开始处理上层应用的蓝牙请求
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值