Android Bluedroid 框架图


蓝牙组件

Bluetooth core stack library

HCI library

Vendor Specific HCI library

UART, RFKILL,TUN/TAP and UHID device drivers


相关模块

bluetooth.apk : packages\apps\Bluetooth目录下 libbluetooth_jni: packages\apps\Bluetooth\jni目录下
libhardware:hardware\libhardware目录下 加载 module.{vendor}.so ,蓝牙模块就是bluetooth.{vendor}.so
bluetooth.default.so:external\bluetooth\bluedroid\main ,external\bluetooth\bluedroid 打开各个厂商的动态库libbt-vendor_{vendor}.so, eg:libbt-vendor_rtk.so 依赖libbt-hci.so、libbt-utils.so、libbt-vendor_xxx.so
libbt-vendor_xxx.so: bluetooth.default.so 或者bluetooth.{vendor}.so会打开该库
audio.a2dp.default.so:高级音频传输库


主体调用流程

(1) BluetoothManagerService == mBluetooth(AdapterService) ==>
(2) AdapterService == classInitNative, initNative, enableNative ==>
(3) com_android_bluetooth_btservice_AdapterService == hw_get_module // libhardware.so ==>
classInitNative:
1. ro.hardware.bluetooth= vendor
2. load(../../bluetooth. vendor.so)
3. module->methods->open()
initNative:
1. sBluetoothInterface->init() // bluetooth.default.so (external\bluetooth\bluedroid\btif\src\bluetooth.c)
bt_utils_init ,
btif_init_bluetooth() //btif_core.c BTIF main task prepares BT scheduler for startup
--->btif_config_init
--->bte_main_boot_entry
--->GKI_init()
--->bte_main_in_hw_init() //Internal helper function for chip hardware init
---> bt_hc_get_interface() // libbt-hci.so
--->bte_load_conf()
--->bte_load_ble_conf()
--->....
--->btif_fetch_local_bdaddr
--->GKI_create_task(btif_task,...,..)

2. sBluetoothInterface->set_os_callouts()
3. sBluetoothInterface->get_profile_interface(BT_PROFILE_SOCKETS_ID)
4. sBluetoothInterface->get_profile_interface(BT_PROFILE_MAP_CLIENT_ID)
5. sBluetoothMceInterface->init()
enableNative:
1. enable() // bluetooth.default.so external\bluetooth\bluedroid\btif\src\bluetooth.c
2. btif_enable_bluetooth()
3. bte_main_enable()
--->GKI_create_task(btu_task,...,..)
--->bte_hci_enable()
---->bt_hc_if->init() // bt_hc_if为bt_hc_interface_t类型,也bt_hci_bdroid.c中init
---> vendor_open() // 打开libbt-vendor.so 可以配置成各个厂商的库,eg:bcm的libbt-vendor_bcm.so
--->utils_init()
--->userial_init()
--->....

主干流程: Bluetooth.apk --> libhardware.so --> bluetooth.{vendor}.so --> libbt-hci.so --> libbt-vendor_xxx.so

hardware层移植任务

(1)对应厂商的bluetooth.{vendor}.so库的实现 // 参考bluetooth.default.so 完成hw_module_t 结构体HAL_MODULE_INFO_SYM的填充,相关结构体hw_module_methods_t,bt_interface_t方法的实现
typedef struct {    /** set to sizeof(bt_interface_t) */    size_t size;    /**     * Opens the interface and provides the callback routines     * to the implemenation of this interface.     */    int (*init)(bt_callbacks_t* callbacks );    /** Enable Bluetooth. */    int (*enable)(void);    /** Disable Bluetooth. */    int (*disable)(void);    /** Closes the interface. */    void (*cleanup)(void);    /** Get all Bluetooth Adapter properties at init */    int (*get_adapter_properties)(void);    /** Get Bluetooth Adapter property of 'type' */    int (*get_adapter_property)(bt_property_type_t type);    /** Set Bluetooth Adapter property of 'type' */    /* Based on the type, val shall be one of     * bt_bdaddr_t or bt_bdname_t or bt_scanmode_t etc     */    int (*set_adapter_property)(const bt_property_t *property);    /** Get all Remote Device properties */    int (*get_remote_device_properties)(bt_bdaddr_t *remote_addr);    /** Get Remote Device property of 'type' */    int (*get_remote_device_property)(bt_bdaddr_t *remote_addr,                                      bt_property_type_t type);    /** Set Remote Device property of 'type' */    int (*set_remote_device_property)(bt_bdaddr_t *remote_addr,                                      const bt_property_t *property);    /** Get Remote Device's service record  for the given UUID */    int (*get_remote_service_record)(bt_bdaddr_t *remote_addr,                                     bt_uuid_t *uuid);    /** Start SDP to get remote services */    int (*get_remote_services)(bt_bdaddr_t *remote_addr);    /** Start Discovery */    int (*start_discovery)(void);    /** Cancel Discovery */    int (*cancel_discovery)(void);    /** Create Bluetooth Bonding */    int (*create_bond)(const bt_bdaddr_t *bd_addr, int transport);    /** Remove Bond */    int (*remove_bond)(const bt_bdaddr_t *bd_addr);    /** Cancel Bond */    int (*cancel_bond)(const bt_bdaddr_t *bd_addr);    /**     * Get the connection status for a given remote device.     * return value of 0 means the device is not connected,     * non-zero return status indicates an active connection.     */    int (*get_connection_state)(const bt_bdaddr_t *bd_addr);    /** BT Legacy PinKey Reply */    /** If accept==FALSE, then pin_len and pin_code shall be 0x0 */    int (*pin_reply)(const bt_bdaddr_t *bd_addr, uint8_t accept,                     uint8_t pin_len, bt_pin_code_t *pin_code);    /** BT SSP Reply - Just Works, Numeric Comparison and Passkey     * passkey shall be zero for BT_SSP_VARIANT_PASSKEY_COMPARISON &     * BT_SSP_VARIANT_CONSENT     * For BT_SSP_VARIANT_PASSKEY_ENTRY, if accept==FALSE, then passkey     * shall be zero */    int (*ssp_reply)(const bt_bdaddr_t *bd_addr, bt_ssp_variant_t variant,                     uint8_t accept, uint32_t passkey);    /** Get Bluetooth profile interface */    const void* (*get_profile_interface) (const char *profile_id);    /** Bluetooth Test Mode APIs - Bluetooth must be enabled for these APIs */    /* Configure DUT Mode - Use this mode to enter/exit DUT mode */    int (*dut_mode_configure)(uint8_t enable);    /* Send any test HCI (vendor-specific) command to the controller. Must be in DUT Mode */    int (*dut_mode_send)(uint16_t opcode, uint8_t *buf, uint8_t len);    /** BLE Test Mode APIs */    /* opcode MUST be one of: LE_Receiver_Test, LE_Transmitter_Test, LE_Test_End */    int (*le_test_mode)(uint16_t opcode, uint8_t *buf, uint8_t len);    /* enable or disable bluetooth HCI snoop log */    int (*config_hci_snoop_log)(uint8_t enable);    /** Sets the OS call-out functions that bluedroid needs for alarms and wake locks.      * This should be called immediately after a successful |init|.      */    int (*set_os_callouts)(bt_os_callouts_t *callouts);    /** Read Energy info details - return value indicates BT_STATUS_SUCCESS or BT_STATUS_NOT_READY      * Success indicates that the VSC command was sent to controller      */    int (*read_energy_info)();    // MStar Android Patch Begin    /** This ensures the chip is Powered ON  to support other radios in the combo chip.     * If the chip is OFF it set the chip to ON, if it is already ON it just increases the radio ref count     * to keep track when to Power OFF */    int (*enableRadio)(void);    /** This decreases radio ref count  and ensures that chip is Powered OFF     * when the radio ref count becomes zero. */    int (*disableRadio)(void);     /* Send any test HCI (vendor-specific) command */     int (*send_vsc)(uint16_t opcode, uint8_t *buf, uint8_t len);     /**Set secure mode configurations*/     int (*secure_mode_configure)(uint8_t secure_mode, uint8_t scans_disabled,                                 uint8_t insec_pair_disabled);     /**Force disable bluetooth*/     void (*force_disable) ();     /** Add/remove SDP record */     int (*set_sdp_record)(uint8_t enable, uint16_t uuid);    // MStar Android Patch End} bt_interface_t;


详参external\bluetooth\bluedroid\btif\src\bluetooth.c
(2)完成libbt-vendor_{vendor}.so模块的实现 主要bt_vendor_interface_t结构体中init,op,cleanup方法的实现
typedef struct {    /** Set to sizeof(bt_vndor_interface_t) */    size_t          size;    /*     * Functions need to be implemented in Vendor libray (libbt-vendor.so).     */    /**     * Caller will open the interface and pass in the callback routines     * to the implemenation of this interface.     */    int   (*init)(const bt_vendor_callbacks_t* p_cb, unsigned char *local_bdaddr);    /**  Vendor specific operations */    int (*op)(bt_vendor_opcode_t opcode, void *param);    /** Closes the interface */    void  (*cleanup)(void);} bt_vendor_interface_t;

动态加载节点

(1) hardware层 bluetooth.{vendor}.so 加载 hardware.c文件中可以看到, load 加载的库在/system/lib64/hw,/system/lib/hw,/vendor/lib64/hw,/vendor/lib/hw之中,但是加载的库名称根据 定义的ro.hardware.bluetooth的值来确定
(2)bluetooth.{vendor}.so加载 libbt-hci.so
(3)libbt-hci.so加载libbt-vendor_xxx.so external\bluetooth\bluedroid\hci\src\vendor.c 文件会根据VENDOR_LIBRARY_NAME定义的值来加载动态库,默认是libbt-vendor.so

相关链接: 移植:http://blog.csdn.net/xiaojsj111/article/details/12647923#t2 蓝牙简介:http://blog.chinaunix.net/uid-24227137-id-3359410.html Hiconfig:http://blog.csdn.net/xubin341719/article/details/38640533

更多相关文章

  1. android ListView监听滚动条滚动到底部时继续加载
  2. 图片加载库Glide的使用
  3. Android Wifi模块分析(一)
  4. csr8811蓝牙芯片porting总结
  5. Android ROM研究---Android build system增加模块
  6. android使用webview加载flash文件

随机推荐

  1. android入门级小软件身高体重计算器源代
  2. Android(安卓)Activity的生命周期
  3. Android(安卓)SDK 26以后ant编译错误解决
  4. Android(安卓)ontouch 手速
  5. Android(安卓)Studio开发环境配置
  6. Qualcomm Android(安卓)display架构分析
  7. Notes on the implementation of encrypt
  8. Android(安卓)通过Intent调用系统功能和A
  9. Android(安卓)获取设备各种信息以及其它
  10. android 发送短信的两种方式