您的位置:首页 > 产品设计 > UI/UE

bluetooth之power on流程

2014-03-18 20:05 281 查看
Bluetooth服务(以及蓝牙的A2DP服务)都是通过SystemServer启动(frameworks/base/services/java/com/android/server/SystemServer.java)

Frameworks层(frameworks/base/core/java/android/server/BluetoothService.java, function: enable())

|

| 给蓝牙状态机一个USER_TURN_ON的命令

|

jni层(frameworks/base/core/jni/android_server_BluetoothService.cpp, function: enableNative())

|

HAL层(system/bluetooth/bluedroid/bluetooth.c, function: set_bluetooth_power())

|

| write to rfkill

|

kernel层(net/rfkill/rfkill-gpio.c,或者vendor定制的rfkill driver, function: rfkill_gpio_set_power())

rfkill_id在init.rc和bluetooth.c中已经把bluetooth写定为0,即:/sys/class/rfkill/rfkill0/state。匹配的机制是:

/sys/class/rfkill/rfkill%d/type

读取内容,与bluetooth比较,如果相同,则返回id,并且给

/sys/class/rfkill/rfkill%d/state写值(1或者0)以便开关电

这部分具体实现可以参看rfkill的driver代码。

一般在bt driver中,rfkill的实现代码如下:
bt_rfkill = rfkill_alloc();

dev->class = &rfkill_class;

.dev_attrs
= rfkill_dev_attrs,

__ATTR(state, S_IRUGO|S_IWUSR, rfkill_state_show, rfkill_state_store),
rfkill_init_sw_state(bt_rfkill, false);
ret = rfkill_register(bt_rfkill);
rfkill_init_sw_state(bt_rfkill, false); 表示unblock,即默认加电。
rfkill_init_sw_state(bt_rfkill, true); 表示block,即默认断电。

rfkill_global_states用来记录所有rfkill的状态,echo XXX > /sys/class/rfkill/rfkill0/state不会改变该变量,只有在rfkill_fop_write被调用时才被改写。
neet/rfkill/input.c
static DECLARE_DELAYED_WORK(rfkill_op_work, rfkill_op_handler);
rfkill_op_handler()->__rfkill_handle_normal_op(i, c)
static void __rfkill_handle_normal_op(const enum rfkill_type type,
const bool complement)
{
bool blocked;

blocked = rfkill_get_global_sw_state(type);
if (complement)
blocked = !blocked;
rfkill_switch_all(type, blocked);
}
bool rfkill_get_global_sw_state(const enum rfkill_type type)
{
return rfkill_global_states[type].cur;
}
rfkill_switch_al()->__rfkill_switch_all(type, blocked)->rfkill_set_block(rfkill, blocked)
这里会根据rfkill_global_states设置state。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: