Androidkernel间,通过设备节点建立关联

待机APIkernel建立提供,待机请求由android通过节点向kernel发送。

# ls sys/android_power/staterequest_stateacquire_full_wake_lockacquire_partial_wake_lockrelease_wake_lock# 

这些节点中,statelinux待机接口

# echo standby > /sys/android_power/state 

2.6.25 kernel目前没在使用此节点待机。

request_state是用于android请求待机时候写入的节点,后面三个是androidkerenl间关于几种锁的保存交互用的节点。

# echo idle > /sys/android_power/request_state 

就可以进入idle模式待机,standby类似。

android./hardware/libhardware_legacy/power/power.c

引用kernel创建的节点:

const char * const PATHS[] = {    "/sys/android_power/acquire_partial_wake_lock",    "/sys/android_power/release_wake_lock",    "/sys/android_power/request_state"};

static int set_state(const char* state){    LOGI("*** set_state :%s ", state);    initialize_fds();    if (g_error) return g_error;    char buf[32];    int len;    len = sprintf(buf, state);    len = write(g_fds[REQUEST_STATE], buf, len);    if(len < 0) {        LOGE("Failed setting last user activity: g_error=%d, len=%d\n",         g_error, len);    }    return 0;}Int wake()//往request_state节点写入wake{    return set_state(wake_state);}Int idle()//往request_state节点写入idle{    return set_state(idle_state);}Int standby()//往request_state节点写入standby{    return set_state(standby_state);}

问题:待机唤醒后,系统立即又进入待机

这是因为/sys/android_power/request_state节点里面的命令在待机唤醒后,没有被写入wake,还是idle或者standby;kernel2.6.25

while(g_user_suspend_state == USER_SLEEP) {ret = pm_suspend(PM_SUSPEND_MEM);}

而在写入wake/sys/android_power/request_state

g_user_suspend_state = USER_AWAKE;

android系统,往/sys/android_power/request_state写入命令是由android操作,写入idlestandby或者是wake;而android决定是否去写命令、写什么命令,却是根据kernel上报事件来裁决的。一般唤醒时候,如果案件唤醒就会有上报按键操作,RTCtimer、异常唤醒需要开发者主动上报一个事件,android收到按键上报消息,在和kernel沟通情况下,过滤掉某个键值,然后去写命令。

如果是QT这种非android系统,容易碰到唤醒后立即待机的问题。

解决方法是:在待机唤醒后,立即改写/sys/android_power/request_state节点的命令为wake

系统如何调用request_state_store

[22][<c02f95ac>](request_state_store+0x0/0x160)from[<c01e515c>](kobj_attr_store+0x20/0x24)[22][<c01e513c>](kobj_attr_store+0x0/0x24) from [<c014111c>] (sysfs_write_file+0x104/0x188)[22] [<c0141018>] (sysfs_write_file+0x0/0x188) from [<c0101e08>] (vfs_write+0x190/0x1b4)[22] [<c0101c78>] (vfs_write+0x0/0x1b4) from [<c0101efc>] (sys_write+0x44/0x74)[22] [<c0101eb8>] (sys_write+0x0/0x74) from [<c009da40>] (ret_fast_syscall+0x0/0x2c)

从调用关系可以看到,sys_write操作会发起_store的调用。也就是说每一次对节点的写操作,就会调用一次_store函数。


更多相关文章

  1. Android命令行获取WiFi列表以及参数
  2. android sqlite 操作
  3. Android Java执行Shell命令
  4. Android中activity触摸操作dispatchTouchEvent
  5. Android——文件操作
  6. 解析ANDROID ps命令执行后各项参数的含义
  7. 谷歌推出新操作系统Andromeda,那Android真的将死吗
  8. execlp启动android进程命令窗口通过adb shell 进入android 的Lin

随机推荐

  1. Android Handle,Looper,Message消息机制
  2. Android 自定义View及其在布局文件中的使
  3. Android Native 绘图方法
  4. Dojo Mobile:iPhone/Android的Web应用开发
  5. Android adb shell命令详解及实例
  6. android 搜索框(二)
  7. PC端连接Android设备进行adb调试
  8. Android我还可以相信你多少系列文章三之
  9. 2020了,安卓程序员该何去何从?
  10. 【Android学习笔记】再探Android Service