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())
- /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。