本文共 1827 字,大约阅读时间需要 6 分钟。
Bluetooth服务(以及蓝牙的A2DP服务)都是通过SystemServer启动(frameworks/base/services/java/com/android/server/SystemServer.java)
这部分具体实现可以参看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。
转载地址:http://bdsqb.baihongyu.com/