android 的wake_locks

 

http://source.android.com/porting/power_management.html

介绍

 

wake_locks

Wake Locks类型

探索Wake Lock例子

PowerManager的类

PM驱动注册驱动程序

早期挂起

 

介绍

Android支持其自己的电源(标准的Linux电源管理)设计的前提是的CPU不应该消耗功率,如果没有应用程序或服务需要电源。欲了解更多有关标准的Linux电源管理的信息,请参见Linux的电源管理支持http:/ / kernel.org。

 

Android要求应用程序和服务请求 CPU资源以“wake locks”通过Android framework和native Linux库。如果没有active wake locks, Android会关闭的CPU。

 

下面的图片展示了 Android的电源管理架构。

 

android 的wake_locks_第1张图片

实线表示Android的块元素和虚线代表partner-specific组成部分。

Wake Locks

应用程序和服务使用Wake Locks请求CPU资源。

锁定的wakelock,取决于它的类型,防止进入暂停或其它低功耗状态的系统。本文档介绍了如何运用wakelocks。

有两个一wakelock设置:

•WAKE_LOCK_SUSPEND:防止一个完整的系统挂起。

•WAKE_LOCK_IDLE:低功耗状态,这往往造成大规模的中断延迟或停用的中断设置,将无法再进入了空闲状态,直到wakelocks被释放。

除非指定类型,这种类型的文件,是指WAKE_LOCK_SUSPEND wakelocks。

如果停止作业已经开始锁定wakelock时,系统会中止,停止作业,只要它还没有达到suspend_latestage。这意味着,从一个中断处理程序锁定或freezeable线程wakelock始终工作,但如果你锁定从suspend_late处理程序wakelock,你还必须从该处理程序返回一个错误中止暂停。你可以使用wakelocks允许用户空间来决定哪些键应该唤醒全系统在屏幕上打开。使用set_irq_wake或特定于平台的API,以确保了CPU的键盘中断唤醒。一旦键盘驱动程序已恢复,事件的顺序可以是这样的::

1。该键盘驱动程序收到一个中断,锁键盘扫描wakelock,并开始扫描矩阵键盘。

2。键盘扫描代码检测报告,一个key的变化和它的input-event动程序。

3。该输入事件driver则认为,key的变化,enqueues一个事件,并锁定输入事件队列wakelock。

4。键盘扫描码,没有key持有或解锁键盘扫描wakelock检测。

5。用户空间输入事件的选择/调查线程返回,锁定过程输入事件wakelock,并调用该输入设备读取事件。

6。该输入事件驱动清出键事件队列,而且由于现在是空的队列,解锁输入事件队列wakelock。

7。用户空间的输入事件从读线程返回。它决定,key不应该唤醒全系统,释放过程输入事件wakelock,并要求选择或轮循。

下面简单的序列图说明了这些步骤:

                              Key pressed      Key released
                                         |             |
      keypad-scan                    ++++++++++++++++++++++
      input-event-queue               +++          +++
      process-input-events                      +++          +++
     

驱动程序的API

驱动程序可以通过添加wakelock变量的状态,并调用wake_lock_init如下面的片段所示,使用wakelock的API:

  struct state {
  struct wakelock wakelock;
  }
  init() {
  wake_lock_init(&state->wakelock, WAKE_LOCK_SUSPEND, "wakelockname");
  }
  Before freeing the memory, wake_lock_destroy must be called:
  uninit() {
  wake_lock_destroy(&state->wakelock);
  }
 

当驱动程序确定它需要运行(通常在一个中断处理程序),它调用wake_lock:

  wake_lock(&state->wakelock);
 

当它不再需要运行,它调用wake_unlock:

  wake_unlock(&state->wakelock);
 

它也可以调用wake_lock_timeout拖延后释放wakelock:

  wake_lock_timeout(&state->wakelock, HZ);

不管wakelock是否已经起作用, 它是有用的,如果driver wake up系统不使用wakelocks但仍需要运行的其他部分。要避免这种可能,因为如果超时是长,它会浪费电力,或如果超时很短, 可能无法完成所需的工作。

用户空间的API

    写lockname或lockname超时到/sys/power/wake_lock锁,如果需要,创建一个wakelock。这里是指定超时在纳秒。写lockname到/sys/power/wake_unlock解锁用户wakelock。

不要使用随机生成的wakelock名字,因为wakelock名字没有API来释放一个用户空间wakelock。

    Wake Locks类型

Wake Lock

Description

ACQUIRE_CAUSES_WAKEUP 

Normally wake locks don't actually wake the device, they just cause it to remain on once it's already on. Think of the video player app as the normal behavior. Notifications that pop up and want the device to be on are the exception; use this flag to be like them.

FULL_WAKE_LOCK

Wake lock that ensures that the screen and keyboard are on at full brightness.

ON_AFTER_RELEASE

When this wake lock is released, poke the user activity timer so the screen stays on for a little longer.

PARTIAL_WAKE_LOCK

Wake lock that ensures that the CPU is running. The screen might not be on.

SCREEN_BRIGHT_WAKE_LOCK

Wake lock that ensures that the screen is on at full brightness; the keyboard backlight will be allowed to go off.

SCREEN_DIM_WAKE_LOCK

Wake lock that ensures that the screen is on, but the keyboard backlight will be allowed to go off, and the screen backlight will be allowed to go dim.

探索Wake Lock例子

所有电源管理要求遵循相同的基本格式:

1。获取句柄PowerManager的服务。

2。创建一个唤醒锁,并指定屏幕电源管理标志,超时等

3。获得 wake lock.。

4。执行操作(播放MP3,打开网页,等等)。

5。释放wake lock。

 

下面的代码段说明了这一过程。

PowerManager pm = (PowerManager)mContext.getSystemService(
                                          Context.POWER_SERVICE);
PowerManager.WakeLock wl = pm.newWakeLock(
                                      PowerManager.SCREEN_DIM_WAKE_LOCK
                                      | PowerManager.ON_AFTER_RELEASE,
                                      TAG);
wl.acquire();
 // ...
wl.release();

PowerManager的类

 

Android Framework通过PowerManager的类提供电源管理给services and applications。

 

用户空间native 库(任何在//device/lib/hardware/意味着,作为支持的Android运行时库)应决不会变成Android电源管理直接调用(见上面的图片硬件功能)。绕过在Android运行时的电源管理政策,将破坏该系统。

 

所有调用电源管理应通过Android的Android runtime PowerManager APIs。

例子说明请访问:

http://code.google.com/android/reference/android/os/PowerManager.html。

 

PM Driver注册驱动程序

你可以注册很多Kernel-level drivers的 Android的电源管理器驱动程序,以便在关闭电源之前或之后立即通知了所有Kernel-level drivers。例如,您可能会从用户空间设置一个显示驱动程序完全断电时,请求进入到断电(参见示例实现了Android的MSM MDDI的显示驱动程序)。

 

要注册Android PM driver,用Android PM driver回调处理程序实施注册, 如在以下代码段所示:

android_register_early_suspend(android_early_suspend_t *handler)
android_register_early_resume(android_early_resume_t *handler)

立即返回至关重要的,而不是等待什么发生在调用返回。

 

早期挂起

 

早期,暂停API允许司机在得到通知时,用户空间写入到/sys/power/request_state表明,用户可见的睡眠状态应该改变。暂停处理程序称为低到高顺序(4 - 1),恢复处理程序称为高为低(1 - 4)。

 

1。 EARLY_SUSPEND_LEVEL_BLANK_SCREEN:

suspend:在屏幕上应该被关闭,但仍必须framebuffer的访问。

resume:在屏幕上可以重新打开。

 

2。 EARLY_SUSPEND_LEVEL_STOP_DRAWING:

suspend:此级别通知用户空间,它应停止访问帧缓冲,并等待它完成。

resume:它通知用户空间,它应该恢复屏幕访问。两种方法都提供控制台开关或一个sysfs的接口。

 

3。 EARLY_SUSPEND_LEVEL_DISABLE_FB:关闭打开帧缓冲

suspend:关闭帧缓冲

resume:重新打开帧缓冲。

 

4。 EARLY_SUSPEND_LEVEL_STOP_INPUT:

suspend:关闭输入设备不属于能够唤醒或者被禁用。

resume:把相同的设备重新打开。

你可能感兴趣的:(android 的wake_locks)