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。
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。
相关文章推荐
- QWEST 2Wire 2700HG-D无线一体路由猫的简单端口映射设置流程
- 数据传递不准确,流程怎么改?
- 一个故事阐述流程管理全过程
- 框架初始化流程
- 【转】MFC 程序入口和执行流程
- Android 4.4Telephony流程分析SIM卡开机时的初始化
- [团队项目]典型用户 - 场景(用户故事) - 任务 - 具体工作流程
- 杭州办理临时牌照流程
- Android短信发送流程之普通短信发送(原)
- activiti学习-02环境准备+安装流程设计器+对流程设计器的使用+对流程设计器的使用+核心API的认识
- ASP.NET Core启动流程
- 一步一步学习Ultimus - 七、流程设计简介_(精简表单)
- 对象建模开发流程
- JBPM4基础篇02-管理流程定义
- Java学习第二课--流程控制
- 集成activiti-modeler 到 自己的业务系统(集成流程跟踪-完美支持IE)
- 数据包发送流程
- 2015年注册APPLE企业级开发者账号流程
- OpenGL学习笔记1:环境配置和基本流程