bluetooth之power on流程

Bluetooth服务(以及蓝牙的A2DP服务)都是通过SystemServer启动(frameworks/base/services/java/com/android/server/SystemServer.java) 

  1. Frameworks层(frameworks/base/core/java/android/server/BluetoothService.java, function: enable()) 
  2.              | 
  3.              | 给蓝牙状态机一个USER_TURN_ON的命令 
  4.              | 
  5. jni层(frameworks/base/core/jni/android_server_BluetoothService.cpp, function: enableNative())
  6.              | 
  7. HAL层(system/bluetooth/bluedroid/bluetooth.c, function: set_bluetooth_power())
  8.              | 
  9.              | write to rfkill
  10.              | 
  11. 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。匹配的机制是:
  1.   /sys/class/rfkill/rfkill%d/type 
  2.   读取内容,与bluetooth比较,如果相同,则返回id,并且给 
  3.   /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

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值