ANDROID Porting系列十一、Power Management

來源:互聯網
上載者:User

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的塊元素和虛線代表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:把相同的裝置重新開啟。

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.