Android Bluetooth蓝牙init过程

原文:https://blog.csdn.net/u012408797/article/details/109849555

 

Android Bluetooth框架

 

init的过程从AdapterService开始,下面我们就从AdapterService开始分析。

 

一、AdapterService的创建

在蓝牙enable的时候,BluetoothManagerService在其中enable方法会启动一个service,这个service就是AdapterService

 

class BluetoothManagerService extends IBluetoothManager.Stub

|enable()

     |sendEnableMsg(false);

        |mHandler.sendMessage(mHandler.obtainMessage(MESSAGE_ENABLE,0, 0));

 

在他的内部类BluetoothHandler继承了Handler类,处理传递的消息:

 

|handleMessage(Message msg)

     |case MESSAGE_ENABLE   

        |handleEnable(msg.arg1 == 1); // msg.arg1 = 0

            |if ((mBluetooth == null) && (!mBinding))

                |Intent i = new Intent(IBluetooth.class.getName());

                |doBind(i, mConnection,Context.BIND_AUTO_CREATE | Context.BIND_IMPORTANT, UserHandle.CURRENT);

 

启动AdapterService服务

 

|doBind(Intent intent, ServiceConnection conn, int flags, UserHandle user) {

        |mContext.bindServiceAsUser(intent, conn, flags, user);

 

// 启动AdapterService服务后会回调mConnectiononServiceConnected()方法

| onServiceConnected(ComponentName className, IBinder service)

    | Message msg = mHandler.obtainMessage(MESSAGE_BLUETOOTH_SERVICE_CONNECTED);

    | if (className.getClassName().equals("com.android.bluetooth.btservice.AdapterService"))

        |msg.arg1 = SERVICE_IBLUETOOTH;

    |else if (className.getClassName().equals("com.android.bluetooth.gatt.GattService"))

       |msg.arg1 = SERVICE_IBLUETOOTHGATT;

    |msg.obj = service;

    |mHandler.sendMessage(msg);

 

发出的MESSAGE_BLUETOOTH_SERVICE_CONNECTED消息在handleMessage处理,继续打开蓝牙,此处不做描述。

 

二、init过程源码跟踪

1.AdapterService.java(packages\apps\bluetooth\src\com\android\bluetooth\btservice)

1classInitNative

 

static {

    classInitNative();

}

 

2InitNative

 

public void onCreate

initNative();

 

查看packages/apps/Bluetooth下的Android.mk文件

 

LOCAL_PACKAGE_NAME := Bluetooth

LOCAL_JNI_SHARED_LIBRARIES := libbluetooth_jni

LOCAL_REQUIRED_MODULES := bluetooth.default

 

可知它加载了动态链接库libbluetooth_jni.so,也就意味着InitNativeenableNative函数的具体实现打包在这个动态链接库中。

进到目录packages/apps/bluetooth/jni目录,查看面的Android.mk,其中有打包成库的名称

 

LOCAL_MODULE := libbluetooth_jni

1

正好是我们要找的动态链接库,我们要找的函数就是在这个目录下了。

mk文件中也提供了编译的时候包含的源文件:

 

LOCAL_SRC_FILES:= \

    com_android_bluetooth_btservice_AdapterService.cpp \

    com_android_bluetooth_btservice_QAdapterService.cpp \

    com_android_bluetooth_hfp.cpp \

    com_android_bluetooth_hfpclient.cpp \

    com_android_bluetooth_a2dp.cpp \

    com_android_bluetooth_a2dp_sink.cpp \

    com_android_bluetooth_avrcp.cpp \

    com_android_bluetooth_avrcp_controller.cpp \

    com_android_bluetooth_hid.cpp \

    com_android_bluetooth_hidd.cpp \

    com_android_bluetooth_hdp.cpp \

    com_android_bluetooth_pan.cpp \

    com_android_bluetooth_gatt.cpp \

    android_hardware_wipower.cpp

 

JNI函数最终都是通过jniRegisterNativeMethods完成注册,将类名和Native函数对应起来。

进入packages/apps/Bluetooth/jni目录搜索:

 

$ grep "com/android/bluetooth/btservice/AdapterService" * -nR

com_android_bluetooth_btservice_AdapterService.cpp:1272:    return jniRegisterNativeMethods(env, "com/android/bluetooth/btservice/AdapterService",

 

发现类AdapterService对应的JNI函数在com_android_bluetooth_btservice_AdapterService.cpp注册。。

 

2.com_android_bluetooth_btservice_AdapterService.cpp (packages\apps\bluetooth\jni)

1classInitNative

 

static void classInitNative(JNIEnv* env, jclass clazz) {

    int err;

    hw_module_t* module;

 

    jclass jniCallbackClass =

        env->FindClass("com/android/bluetooth/btservice/JniCallbacks");

    sJniCallbacksField = env->GetFieldID(clazz, "mJniCallbacks",

        "Lcom/android/bluetooth/btservice/JniCallbacks;");

 

    method_stateChangeCallback = env->GetMethodID(jniCallbackClass, "stateChangeCallback", "(I)V");

 

    char value[PROPERTY_VALUE_MAX];

    property_get("bluetooth.mock_stack", value, "");

    const char *id = (strcmp(value, "1")? BT_STACK_MODULE_ID : BT_STACK_TEST_MODULE_ID);

 

    err = hw_get_module(id, (hw_module_t const**)&module);

    hw_device_t* abstraction;

    err = module->methods->open(module, id, &abstraction);

    if (err == 0) {

        bluetooth_module_t* btStack = (bluetooth_module_t *)abstraction;

        sBluetoothInterface = btStack->get_bluetooth_interface();

}

 

classInitNative主要做两件事:

 

Jni层获取AdapterService中的callback接口,stack上报状态时,需要通过这些接口反馈到framework

解析bt so,获取它暴露给上层的接口,用来将framework的操作请求真正下发到协议栈中。主要是dlopen方式操作so、拿到操作handle的等。

2initNative

 

static bool initNative(JNIEnv* env, jobject obj) {

    if (sBluetoothInterface) {

        int ret = sBluetoothInterface->init(&sBluetoothCallbacks);

        if (ret != BT_STATUS_SUCCESS) {

            ALOGE("Error while setting the callbacks: %d\n", ret);

            sBluetoothInterface = NULL;

            return JNI_FALSE;

        }

        ret = sBluetoothInterface->set_os_callouts(&sBluetoothOsCallouts);

        if (ret != BT_STATUS_SUCCESS) {

            ALOGE("Error while setting Bluetooth callouts: %d\n", ret);

            sBluetoothInterface->cleanup();

            sBluetoothInterface = NULL;

            return JNI_FALSE;

        }

 

        if ( (sBluetoothSocketInterface = (btsock_interface_t *)

                  sBluetoothInterface->get_profile_interface(BT_PROFILE_SOCKETS_ID)) == NULL) {

                ALOGE("Error getting socket interface");

        }

        return JNI_TRUE;

    }

 

其中的sBluetoothInterfaceclassInitNative中初始化,实际操作的是Bluetooth.c里面的bluetoothInterface

 

3.bluetooth.c (external\bluetooth\bluedroid\btif\src)

 

|static const bt_interface_t bluetoothInterface

      |init

        |btif_init_bluetooth()

 

4.btif_core.c (external\bluetooth\bluedroid\btif\src)

 

btif_init_bluetooth(void)

bt_status_t btif_init_bluetooth()

    btif_config_init();/初始化初始化/data/misc/bluedroid/bt_config.xml中相关数据

    bte_main_boot_entry();

     GKI_init(); // gki init

     bte_main_in_hw_init();

     static bt_hc_interface_t *bt_hc_if=NULL;

     bt_hc_if = (bt_hc_interface_t *) bt_hc_get_interface() // bt_hci_bdroid.c中的 bluetoothHCLibInterface

     bte_load_conf(BTE_STACK_CONF_FILE); //加载配置文件/etc/bluetooth/bt_stack.conf

#if (defined(BLE_INCLUDED) && (BLE_INCLUDED == TRUE))

     bte_load_ble_conf(BTE_BLE_STACK_CONF_FILE);  //加载配置文件 etc/bluetooth/ble_stack.conf

#endif

    memset(&btif_local_bd_addr, 0, sizeof(bt_bdaddr_t));

    btif_fetch_local_bdaddr(&btif_local_bd_addr);//获取本地蓝牙地址

 

    /* 创建 btif task */

    status = GKI_create_task(btif_task, BTIF_TASK, BTIF_TASK_STR,

                (UINT16 *) ((UINT8 *)btif_task_stack + BTIF_TASK_STACK_SIZE),

                sizeof(btif_task_stack));

 

5.btif_core.c (external\bluetooth\bluedroid\btif\src)

BTIF task处理程序,管理通过蓝牙HALBTA传递的所有消息。

 

static void btif_task(UINT32 params)

{

    UINT16   event;

    BT_HDR   *p_msg;

    for(;;)

    {

        event = GKI_wait(0xFFFF, 0);

        // bt enable时回创建btu_task, btu_task线程运行起来后会发送

        // BT_EVT_TRIGGER_STACK_INIT消息给btif_task,告知蓝牙初始化完成

        if (event == BT_EVT_TRIGGER_STACK_INIT)

        {

            btif_dm_load_ble_local_keys();// 加载bt keys

            BTA_EnableBluetooth(bte_dm_evt); //Enables bluetooth service

        }

 

        if (event == BT_EVT_HARDWARE_INIT_FAIL)

            bte_main_disable();

            btif_queue_release();

            GKI_task_self_cleanup(BTIF_TASK);

            bte_main_shutdown();

            break;

        }

 

        if(event & TASK_MBOX_1_EVT_MASK)

        {

            while((p_msg = GKI_read_mbox(BTU_BTIF_MBOX)) != NULL)

            {

                switch (p_msg->event)

                {

                    case BT_EVT_CONTEXT_SWITCH_EVT:

                        btif_context_switched(p_msg);

                        break;

                }

                GKI_freebuf(p_msg);

            }

        }

    }

}

 

下面简单看一下BTA_EnableBluetooth函数

bta_dm_api.c (external\bluetooth\bluedroid\bta\dm)

 

/* Calculate start of event enumeration; id is top 8 bits of event */

#define BTA_SYS_EVT_START(id)       ((id) << 8)

#define BTA_ID_DM           1            /* device manager */

BTA_DM_API_ENABLE_EVT = BTA_SYS_EVT_START(BTA_ID_DM),

static const tBTA_SYS_REG bta_dm_reg =

{

    bta_dm_sm_execute,

    bta_dm_sm_disable

};

tBTA_STATUS BTA_EnableBluetooth(tBTA_DM_SEC_CBACK *p_cback)

{

    tBTA_DM_API_ENABLE    *p_msg;

    memset(&bta_dm_cb, 0, sizeof(bta_dm_cb));

 

    bta_sys_register (BTA_ID_DM, &bta_dm_reg );

    bta_sys_register (BTA_ID_DM_SEARCH, &bta_dm_search_reg );

bta_sys_cb.reg[id] = (tBTA_SYS_REG *) p_reg;

bta_sys_cb.is_reg[id] = TRUE;

    if ((p_msg = (tBTA_DM_API_ENABLE *) GKI_getbuf(sizeof(tBTA_DM_API_ENABLE))) != NULL)

    {

        p_msg->hdr.event = BTA_DM_API_ENABLE_EVT;

        p_msg->p_sec_cback = p_cback;

        bta_sys_sendmsg(p_msg); //最终调用bta_dm_enable

         GKI_send_msg(bta_sys_cb.task_id, p_bta_sys_cfg->mbox, p_msg);

        return BTA_SUCCESS;

    }

    return BTA_FAILURE;

}

 

代码处理文件流程:

 

--------------------------------------------bluetooth apk------------------------------------------

1.AdapterService.java(packages\apps\bluetooth\src\com\android\bluetooth\btservice)

--------------------------------------------jni--------------------------------------------

2.com_android_bluetooth_btservice_AdapterService.cpp (packages\apps\bluetooth\jni)

--------------------------------------------bluetooth.default.so------------------------------------------

3.bluetooth.c (external\bluetooth\bluedroid\btif\src)

4.btif_core.c (external\bluetooth\bluedroid\btif\src)

 

延伸:

bta_sys_sendmsg(p_msg)消息跟踪: 根据event idBTA_DM_API_ENABLE_EVT的消息一步步跟踪到最终要调用的函数bta_dm_enable

 

#define EVENT_MASK(evt)       ((UINT16)(0x0001 << (evt)))

void bta_sys_sendmsg(void *p_msg)

{

    GKI_send_msg(bta_sys_cb.task_id, p_bta_sys_cfg->mbox, p_msg);

     GKI_send_event(task_id, (UINT16)EVENT_MASK(mbox));

}

 

查看bta_sys_cb.task_id的赋值:

 

BTA_API void bta_sys_init(void)

    bta_sys_cb.task_id = GKI_get_taskid();

bta_sys_initbtu_task中被调用,因此task_id 等于btu_tasktask id,消息在btu_task中接收处理。

 

查看p_bta_sys_cfg->mbox的赋值:

 

// gki.h (external\bluetooth\bluedroid\gki\common)

/************************************************************************

** Mailbox definitions. Each task has 4 mailboxes that are used to

** send buffers to the task.

*/

#define TASK_MBOX_0    0

#define TASK_MBOX_1    1

#define TASK_MBOX_2    2

#define TASK_MBOX_3    3

 

#define NUM_TASK_MBOX  4

 

/************************************************************************

** Event definitions.

**

** There are 4 reserved events used to signal messages rcvd in task mailboxes.

** There are 4 reserved events used to signal timeout events.

** There are 8 general purpose events available for applications.

*/

#define MAX_EVENTS              16

 

#define TASK_MBOX_0_EVT_MASK   0x0001

#define TASK_MBOX_1_EVT_MASK   0x0002

#define TASK_MBOX_2_EVT_MASK   0x0004

#define TASK_MBOX_3_EVT_MASK   0x0008

 

//bta_sys.h (external\bluetooth\bluedroid\bta\sys)

/* system manager configuration structure */

typedef struct

{

    UINT16          mbox_evt;                       /* GKI mailbox event */

    UINT8           mbox;                           /* GKI mailbox id */

    UINT8           timer;                          /* GKI timer id */

    UINT8           trace_level;                    /* initial trace level */

} tBTA_SYS_CFG;

 

// bta_sys_cfg.c (external\bluetooth\bluedroid\bta\sys)

/* GKI task mailbox event for BTA. */

#define BTA_MBOX_EVT                TASK_MBOX_2_EVT_MASK

 

/* GKI task mailbox for BTA. */

#define BTA_MBOX                    TASK_MBOX_2

 

const tBTA_SYS_CFG bta_sys_cfg =

{

    BTA_MBOX_EVT,               /* GKI mailbox event */

    BTA_MBOX,                   /* GKI mailbox id */

    BTA_TIMER,                  /* GKI timer id */

    APPL_INITIAL_TRACE_LEVEL    /* initial trace level */

};

 

tBTA_SYS_CFG *p_bta_sys_cfg = (tBTA_SYS_CFG *)&bta_sys_cfg;

 

所以p_bta_sys_cfg->mbox等于TASK_MBOX_2, EVENT_MASK(mbox)则等于TASK_MBOX_2_EVT_MASK

 

btu_task.c (external\bluetooth\bluedroid\stack\btu)

 

 

/*******************************************************************************

**

** Function         btu_task

**

** Description      This is the main task of the Bluetooth Upper Layers unit.

**                  It sits in a loop waiting for messages, and dispatches them

**                  to the appropiate handlers.

**

** Returns          should never return

**

*******************************************************************************/

BTU_API UINT32 btu_task (UINT32 param)

{

    UINT16           event;

    BT_HDR          *p_msg;

    UINT8            i;

    UINT16           mask;

    BOOLEAN          handled;

 

    /* Initialize the mandatory core stack control blocks

       (BTU, BTM, L2CAP, and SDP)

     */

    btu_init_core();

 

    /* Initialize any optional stack components */

    BTE_InitStack();

 

#if (defined(BTU_BTA_INCLUDED) && BTU_BTA_INCLUDED == TRUE)

    bta_sys_init(); // bta init

#endif

 

    /* Send a startup evt message to BTIF_TASK to kickstart the init procedure */

    GKI_send_event(BTIF_TASK, BT_EVT_TRIGGER_STACK_INIT);

 

    /* Wait for, and process, events */

    for (;;)

    {

        event = GKI_wait (0xFFFF, 0);

        if (event & TASK_MBOX_0_EVT_MASK)

        {

            /* Process all messages in the queue */

        }

        if (event & TIMER_0_EVT_MASK) {

 

        }

 

#if (defined(BTU_BTA_INCLUDED) && BTU_BTA_INCLUDED == TRUE)

        if (event & TASK_MBOX_2_EVT_MASK)

        {

            while ((p_msg = (BT_HDR *) GKI_read_mbox(TASK_MBOX_2)) != NULL)

            {

                bta_sys_event(p_msg);

UINT8       id;

BOOLEAN     freebuf = TRUE;

//event等于BTA_DM_API_ENABLE_EVTid等于BTA_ID_DM,对应的cb函数bta_dm_reg(BTA_EnableBluetooth注册)

id = (UINT8) (p_msg->event >> 8);

//调用bta_dm_regbta_dm_sm_execute函数

freebuf = (*bta_sys_cb.reg[id]->evt_hdlr)(p_msg);

 

        if (event & TIMER_1_EVT_MASK)

        {

            bta_sys_timer_update();

        }

#endif

        if (event & TIMER_3_EVT_MASK) {

 

        }

        if (event & EVENT_MASK(APPL_EVT_7))

            break;

    }

 

    return(0);

}

 

bta_dm_pm.c (external\bluetooth\bluedroid\bta\dm)

 

/* action function list */

const tBTA_DM_ACTION bta_dm_action[] =

{

 

    /* device manager local device API events */

    bta_dm_enable,            /* 0  BTA_DM_API_ENABLE_EVT */

    bta_dm_disable,           /* 1  BTA_DM_API_DISABLE_EVT */

    bta_dm_set_dev_name,      /* 2  BTA_DM_API_SET_NAME_EVT */

    bta_dm_set_visibility,    /* 3  BTA_DM_API_SET_VISIBILITY_EVT */

    bta_dm_set_afhchannels,   /* 4  BTA_DM_API_SET_AFH_CHANNELS_EVT */

    bta_dm_signal_strength,   /* 5  BTA_API_DM_SIG_STRENGTH_EVT */

    bta_dm_vendor_spec_command,/* 6  BTA_DM_API_VENDOR_SPECIFIC_COMMAND_EVT */

    bta_dm_tx_inqpower,       /* 7  BTA_DM_API_SIG_STRENGTH_EVT */

    bta_dm_acl_change,        /* 8  BTA_DM_ACL_CHANGE_EVT */

    bta_dm_add_device,        /* 9  BTA_DM_API_ADD_DEVICE_EVT */

    bta_dm_close_acl,         /* 10 BTA_DM_API_ADD_DEVICE_EVT */

 

    /* security API events */

    bta_dm_bond,              /* 11  BTA_DM_API_BOND_EVT */

    bta_dm_bond_cancel,       /* 12  BTA_DM_API_BOND_CANCEL_EVT */

    bta_dm_pin_reply,         /* 13 BTA_DM_API_PIN_REPLY_EVT */

    bta_dm_link_policy,       /* 14 BTA_DM_API_LINK_POLICY_EVT */

    bta_dm_auth_reply,        /* 15 BTA_DM_API_AUTH_REPLY_EVT */

 

    /* power manger events */

    bta_dm_pm_btm_status,     /* 16 BTA_DM_PM_BTM_STATUS_EVT */

    bta_dm_pm_timer,          /* 17 BTA_DM_PM_TIMER_EVT*/

 

    /* simple pairing events */

    bta_dm_confirm,           /* 18 BTA_DM_API_CONFIRM_EVT */

 

    bta_dm_set_encryption,    /* BTA_DM_API_SET_ENCRYPTION_EVT */

 

#if (BTM_LOCAL_IO_CAPS != BTM_IO_CAP_NONE)

    bta_dm_passkey_cancel,    /* 19 BTA_DM_API_PASKY_CANCEL_EVT */

#endif

#if (BTM_OOB_INCLUDED == TRUE)

    bta_dm_loc_oob,           /* 20 BTA_DM_API_LOC_OOB_EVT */

    bta_dm_ci_io_req_act,     /* 21 BTA_DM_CI_IO_REQ_EVT */

    bta_dm_ci_rmt_oob_act,    /* 22 BTA_DM_CI_RMT_OOB_EVT */

#endif /* BTM_OOB_INCLUDED */

 

    bta_dm_remove_device,      /*  BTA_DM_API_REMOVE_DEVICE_EVT */

 

#if BLE_INCLUDED == TRUE

    bta_dm_add_blekey,          /*  BTA_DM_API_ADD_BLEKEY_EVT           */

    bta_dm_add_ble_device,      /*  BTA_DM_API_ADD_BLEDEVICE_EVT        */

    bta_dm_ble_passkey_reply,   /*  BTA_DM_API_BLE_PASSKEY_REPLY_EVT    */

    bta_dm_security_grant,

    bta_dm_ble_set_bg_conn_type,

    bta_dm_ble_set_conn_params,      /* BTA_DM_API_BLE_CONN_PARAM_EVT */

    bta_dm_ble_set_scan_params,      /* BTA_DM_API_BLE_SCAN_PARAM_EVT */

    bta_dm_ble_observe,

    bta_dm_ble_update_conn_params,   /* BTA_DM_API_UPDATE_CONN_PARAM_EVT */

#if BLE_PRIVACY_SPT == TRUE

    bta_dm_ble_config_local_privacy,   /* BTA_DM_API_LOCAL_PRIVACY_EVT */

#endif

    bta_dm_ble_set_adv_params,     /* BTA_DM_API_BLE_SCAN_PARAM_EVT */

    bta_dm_ble_set_adv_config,     /* BTA_DM_API_BLE_SET_ADV_CONFIG_EVT */

    bta_dm_ble_set_scan_rsp,       /* BTA_DM_API_BLE_SET_SCAN_RSP_EVT */

    bta_dm_ble_broadcast,          /* BTA_DM_API_BLE_BROADCAST_EVT */

#if BLE_ANDROID_CONTROLLER_SCAN_FILTER == TRUE

    bta_dm_cfg_filter_cond,         /* BTA_DM_API_CFG_FILTER_COND_EVT */

    bta_dm_scan_filter_param_setup, /* BTA_DM_API_SCAN_FILTER_SETUP_EVT */

    bta_dm_enable_scan_filter,      /* BTA_DM_API_SCAN_FILTER_ENABLE_EVT */

#endif

    bta_dm_ble_multi_adv_enb,           /*  BTA_DM_API_BLE_MULTI_ADV_ENB_EVT*/

    bta_dm_ble_multi_adv_upd_param,     /*  BTA_DM_API_BLE_MULTI_ADV_PARAM_UPD_EVT */

    bta_dm_ble_multi_adv_data,          /*  BTA_DM_API_BLE_MULTI_ADV_DATA_EVT */

    btm_dm_ble_multi_adv_disable,       /*  BTA_DM_API_BLE_MULTI_ADV_DISABLE_EVT */

    bta_dm_ble_setup_storage,      /* BTA_DM_API_BLE_SETUP_STORAGE_EVT */

    bta_dm_ble_enable_batch_scan,  /* BTA_DM_API_BLE_ENABLE_BATCH_SCAN_EVT */

    bta_dm_ble_disable_batch_scan, /* BTA_DM_API_BLE_DISABLE_BATCH_SCAN_EVT */

    bta_dm_ble_read_scan_reports,  /* BTA_DM_API_BLE_READ_SCAN_REPORTS_EVT */

    bta_dm_ble_track_advertiser,   /* BTA_DM_API_BLE_TRACK_ADVERTISER_EVT */

    bta_dm_ble_get_energy_info,    /* BTA_DM_API_BLE_ENERGY_INFO_EVT */

#endif

 

#if ( BTM_EIR_SERVER_INCLUDED == TRUE )&&( BTA_EIR_CANNED_UUID_LIST != TRUE )&&(BTA_EIR_SERVER_NUM_CUSTOM_UUID > 0)

    bta_dm_update_eir_uuid,     /*  BTA_DM_API_UPDATE_EIR_UUID_EVT      */

#endif

#if (BTM_EIR_SERVER_INCLUDED == TRUE)

    bta_dm_set_eir_config,      /*  BTA_DM_API_SET_EIR_CONFIG_EVT       */

#endif

 

    bta_dm_enable_test_mode,    /*  BTA_DM_API_ENABLE_TEST_MODE_EVT     */

    bta_dm_disable_test_mode,   /*  BTA_DM_API_DISABLE_TEST_MODE_EVT    */

    bta_dm_execute_callback,     /*  BTA_DM_API_EXECUTE_CBACK_EVT        */

    bta_dm_set_afh_channel_assesment      /* BTA_DM_API_SET_AFH_CHANNEL_ASSESMENT_EVT */

};

 

BOOLEAN bta_dm_sm_execute(BT_HDR *p_msg)

{

    UINT16  event = p_msg->event & 0x00ff;

 

    /* execute action functions */

    if(event < BTA_DM_NUM_ACTIONS)

    {

        (*bta_dm_action[event])( (tBTA_DM_MSG*) p_msg); // 调用bta_dm_enable

    }

 

    return TRUE;

}

posted @ 2024-12-03 22:05  petercao  阅读(17)  评论(0编辑  收藏  举报