博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
bluetooth之power on流程
阅读量:2442 次
发布时间:2019-05-10

本文共 1827 字,大约阅读时间需要 6 分钟。

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

转载地址:http://bdsqb.baihongyu.com/

你可能感兴趣的文章
『推荐』上G的linux视频教程和电子书FTP下载,速度快内容实用!(转)
查看>>
不得不说 僵尸网络导致垃圾邮件猛增(转)
查看>>
linux网络知识:TCP/IP设置内容(转)
查看>>
GNOME帮助Linux应用于商业桌面环境(转)
查看>>
linux网络知识:与网络设置有关的几个文件(转)
查看>>
Linux文件内容查询命令(转)
查看>>
libc.a 文件恢复(转)
查看>>
SCO UNIX上cpio命令详细用法(转)
查看>>
思考-两个大表的关联.txt
查看>>
WIDTH_BUCKET和NTILE函数.txt
查看>>
sql plan baseline(二)
查看>>
第十章 sqlplus的安全性
查看>>
第十三章 sqlplus命令(一)
查看>>
第三章(backup and recovery 笔记)
查看>>
第一章(backup and recovery 笔记)
查看>>
第六章(backup and recovery 笔记)
查看>>
oracle备份功能简述
查看>>
[转]数据库三大范式
查看>>
恢复编录的创建和使用.txt
查看>>
truncate 命令使用
查看>>