為了支援特定於車輛的電源管理,Android 提供了CarPowerManagementService
服務和CarPowerManager
介面。
狀態轉換由車輛主控制單元 (VMCU) 觸發。為了與 VMCU 通信,整合商必須實現多個元件。整合商負責與車輛硬體抽象層(VHAL)和核心實現整合。整合商還負責停用喚醒來源並確保關閉不會無限期推遲。
術語
本文檔中使用了這些術語:
suspend()
和shutdown()
的最終呼叫。系統設計
本節介紹 AAOS 如何表示應用處理器的電源狀態以及哪些模組實現電源管理系統。本資料還描述了這些模組如何協同工作以及狀態轉換通常如何發生。
汽車電源狀態機
AAOS 使用狀態機來表示 AP 的電源狀態。狀態機提供如下所示的狀態:
圖 1.汽車電源狀態機。
最常見的轉換以藍色突出顯示。這些是狀態和常見的轉換:
- 掛起至 RAM。車輛和 SoC 已關閉。沒有程式碼正在執行。 SoC RAM 保持供電。
- 等待VHAL。當駕駛員與車輛互動時(例如打開車門),VMCU 會向 SoC 供電。 AAOS 從掛起到 RAM 恢復並進入等待 VHAL,等待與 VHAL 協調。
- 在。 VHAL 通知 AAOS 進入 On 狀態。在此狀態下,AAOS 完全運行並與驅動程式互動。
- 關機準備。當駕駛員完成駕駛後,VHAL 通知 AAOS 進入關機準備狀態。在此狀態下,顯示和音訊關閉,且 AAOS 不與駕駛員互動。 Android系統仍在運行,可以免費更新應用程式和Android系統。當更新(如果有)完成時,Android 系統會進入「等待 VHAL 完成」。
- 等待 VHAL 完成。此時,AAOS 通知 VHAL 它已準備好關閉。 VMCU 預計將 SoC 置於深度睡眠狀態並切斷應用處理器的電源。然後 AAOS 處於掛起至 RAM 狀態,但沒有執行任何程式碼。
電源管理模組
電源管理系統由以下模組組成:
模組名稱 | 描述 |
---|---|
汽車電源管理器 | Java 或 C++ API。 |
汽車電源管理服務 | 協調電源狀態轉換。 |
汽車電源政策守護程式 | 與本機電源原則用戶端通訊。 |
車輛HAL | VMCU 的介面。 |
核心 | 掛起到RAM或磁碟執行。 |
深度睡眠/休眠功能(將 Android 掛起到 RAM/磁碟)是在核心中實現的。此功能會作為位於/sys/power/state
的特殊檔案公開給使用者空間。透過將mem
或disk
寫入此檔案來暫停 AAOS。
CPMS 與其他服務和 HAL 協調電源狀態。 CPMS 實作上述狀態機,並在發生電源狀態轉換時向每個觀察者發送通知。該服務還使用 VHAL 向硬體發送訊息。
CPPD 管理電源策略,直到 CPMS 取得控制權。它也會向本機偵聽器傳送電源原則變更通知。
一些屬性在 VHAL 中定義。為了與 VMCU 通信,CPMS 讀取和寫入這些屬性。應用程式可以使用CPM中定義的介面來監視電源狀態變化。此介面還允許應用程式註冊電源策略偵聽器。該API可以從Java中調用,並使用@hide / @System API進行註釋,這意味著它僅適用於特權應用程式。這些模組、應用程式和服務之間的關係如下所示:
圖 2.電源組件參考圖。
訊息順序
上一節描述了構成電源管理系統的模組。本節使用進入深度睡眠和退出深度睡眠範例來解釋模組和應用程式如何溝通:
進入深度睡眠
只有 VMCU 可以啟動深度睡眠。一旦啟動深度睡眠,VMCU 就會透過 VHAL 向 CPMS 發送通知。 CPMS 將狀態變更為 SHUTDOWN PREPARE,並透過使用 CPM 提供的新狀態 ID 呼叫onStateChanged()
方法,向所有觀察者(監視 CPMS 的應用程式和服務)廣播此狀態轉換。
CPM 在應用程式/服務和 CPMS 之間進行協調。應用程式/服務的onStateChanged()
方法在 CPM 的onStateChanged()
方法中同步呼叫。大多數應用程式和服務都需要在從此呼叫返回之前完成準備工作。返回PRE_SHUTDOWN_PREPARE
、 SUSPEND_ENTER
、 POST_SUSPEND_ENTER
後,特權服務可以繼續非同步準備。在這種情況下,特權服務應該在完成其準備時對所提供的CompletablePowerStateChangeFuture
物件呼叫complete()。請注意, SHUTDOWN_PREPARE
不允許非同步準備。在將DEEP_SLEEP_ENTRY
傳送到 VHAL 之前,CPMS 會定期向 VHAL 發送關閉延後請求。
當所有 CPM 物件完成關閉準備後,CPMS 向 VHAL 發送AP_POWER_STATE_REPORT
,然後 VHAL 通知 VMCU AP 已準備好掛起。 CPMS 也呼叫其掛起方法,該方法掛起核心。
上述順序如下圖所示:
圖 3.進入深度睡眠。
CPM提供的程式介面
本節介紹 CPM 為系統應用程式和服務提供的 Java API。該 API 使系統軟體能夠:
- 監視 AP 中的電源狀態變化。
- 應用電源策略。
使用下列步驟呼叫 CPM 提供的 API:
- 呼叫Car API取得CPM實例。
- 對步驟 1 中建立的物件呼叫適當的方法。
建立 CarPowerManager 對象
若要建立 CPM 對象,請呼叫 Car 物件的getCarManager()
方法。此方法是用於建立 CPM 物件的外觀。指定android.car.Car.POWER_SERVICE
作為參數來建立 CPM 物件。
Car car = Car.createCar(this); CarPowerManager powerManager = (CarPowerManager) car.getCarManager(android.car.Car.POWER_SERVICE);
CarPowerStateListener 和註冊
系統應用程式和服務可以透過實作CarPowerManager.CarPowerStateListener
來接收電源狀態變更通知。此介面定義了一個方法onStateChanged()
,它是當 CPMS 的電源狀態變更時呼叫的回呼函數。以下範例定義了一個實作該介面的新匿名類別:
private final CarPowerManager.CarPowerStateListener powerListener = new CarPowerManager.CarPowerStateListener () { @Override public void onStateChanged(int state) { Log.i(TAG, "onStateChanged() state = " + state); } };
若要指示此偵聽器物件監視電源狀態轉換,請建立新的執行緒並將偵聽器和此執行緒註冊到 CPM 物件:
executor = new ThreadPerTaskExecutor(); powerManager.setListener(powerListener, executor);
當電源狀態變更時,將呼叫偵聽器物件的onStateChanged()
方法,並使用一個值來表示新的電源狀態。實際值和電源狀態之間的關聯在CarPowerManager
中定義,如下表所示:
姓名 | 描述 |
---|---|
狀態開啟 | 進入開機狀態。該系統已全面運作。 |
STATE_SHUTDOWN_CANCELLED | 關閉被取消,電源狀態回到正常狀態。 |
STATE_SHUTDOWN_ENTER | 應用程式預計會清理並準備關閉。 |
STATE_POST_SHUTDOWN_ENTER | 關閉準備工作已完成,VMCU 已準備好關閉。進入關機狀態。 |
STATE_PRE_SHUTDOWN_PREPARE | 已請求關閉過程,但 CPMS 尚未啟動該過程。顯示和音訊仍然打開 |
STATE_SHUTDOWN_PREPARE | 在此期間可能會運行車庫模式。 |
STATE_SUSPEND_ENTER | 應用程式預計會進行清理並準備好掛起至 RAM。 |
STATE_POST_SUSPEND_ENTER | 掛起至 RAM 的準備工作已完成,VMCU 已準備好掛起至 RAM。進入掛起狀態。 |
STATE_SUSPEND_EXIT | 從掛起中喚醒或從取消的掛起中恢復。 |
STATE_HIBERNATION_ENTER | 應用程式預計會進行清理並準備好休眠。 |
STATE_POST_HIBERNATION_ENTER | 休眠準備已完成,VMCU 已準備好休眠 進入休眠狀態。 |
STATE_HIBERNATION_EXIT | 從休眠狀態喚醒或從取消的休眠狀態中復原。 |
STATE_WAIT_FOR_VHAL | 系統正在啟動,但在進入 ON 狀態之前等待與 VHAL 建立通訊。 |
CarPowerStateListener 註銷
若要取消註冊所有已註冊到 CPM 的偵聽器對象,請呼叫clearListener
方法:
powerManager.clearListener();
Android 實現上的系統集成
整合商負責以下事項:
- 實作暫停 Android 的核心介面。
- 實施 VHAL 功能以:
- 將暫停或關閉的啟動從汽車傳播到 Android。
- 將關閉就緒訊息從 Android 發送到汽車。
- 透過 Linux 核心介面啟動 Android 的關閉或掛起。
- 確保裝置處於掛起狀態時會停用所有喚醒來源。
- 確保應用程式關閉得足夠快,以免無限期推遲關閉過程。
- 確保 BSP 根據電源策略開啟(或關閉)裝置組件,以免阻止掛起或休眠
核心介面:/sys/power/state
當應用程式或服務將用於掛起到 RAM 的mem
或用於掛起到磁碟的disk
寫入位於/sys/power/state
檔案中時,AAOS 會將裝置置於掛起模式。整合商必須提供一個功能來監視該檔案並將Linux 置於掛起電源狀態。此函數可以向VMCU發送GPIO以通知VMCU設備已完全關閉。整合商還負責消除 VHAL 向 VMCU 發送最終訊息與系統進入掛起或關閉模式之間的任何競爭條件。
VHAL責任
VHAL 提供車輛網路和 Android 之間的介面。虛擬哈爾:
- 將暫停或關閉的啟動從汽車傳播到 Android。
- 將關閉就緒訊息從 Android 發送到汽車。
- 透過 Linux 核心介面啟動 Android 的關閉或掛起。
當 CPMS 通知 VHAL 準備關閉時,VHAL 會向 VMCU 發送關閉準備訊息。通常,片上週邊(例如 UART、SPI 和 USB)會傳輸訊息。發送訊息後,CPMS 呼叫核心命令來掛起或關閉裝置。在此之前,VHAL 或 BSP 可能會切換 GPIO 以指示 VMCU 可以安全地斷開設備電源。
VHAL 必須支援以下屬性,這些屬性透過 VHAL 控制電源管理:
姓名 | 描述 |
---|---|
AP_POWER_STATE_REPORT | Android 使用 VehicleApPowerStateReport 枚舉值透過此屬性向 VMCU 報告狀態轉換。 |
AP_POWER_STATE_REQ | VMCU 使用此屬性指示 Android 使用 VehicleApPowerStateReq 枚舉值轉換到不同的電源狀態。 |
AP_POWER_STATE_REPORT
使用此屬性報告 Android 目前的電源管理狀態。此屬性包含兩個整數:
-
int32Values[0]
:目前狀態的 VehicleApPowerStateReport 列舉。 -
int32Values[1]
:延遲或休眠或關閉的時間(以毫秒為單位)。該值的含義取決於第一個值。
第一個值可以採用下列值之一。 VehicleApPowerStateReport.aidl
包含更具體的描述,這些描述儲存在hardware/interfaces/automotive/vehicle/aidl/android/hardware/automotive/vehicle
。
值名稱 | 描述 | 第二個值 |
---|---|---|
等待_FOR_VHAL | AP 正在啟動,需要與 VHAL 建立通訊。 | |
深度睡眠進入 | AP正在進入深度睡眠狀態。 VMCU 應在第二個值中指定的時間後重新開啟 AP。 | 必須設定 |
深度睡眠退出 | AP 正在退出深度睡眠狀態。 | |
HIBERNATION_ENTRY | AP 正進入休眠狀態。 VMCU 應在第二個值中指定的時間後重新開啟 AP。 | 必須設定 |
休眠_退出 | AP 正在退出休眠狀態。 | |
SHUTDOWN_POSTPONE | Android 尚未準備好關閉。 VMCU 應在關閉 AP 之前等待第二個值中指定的時間。 Android 可能會透過發出額外的 SHUTDOWN_POSTPONE 報告來請求額外的延遲。 | 必須設定 |
關機_準備 | Android 正準備關閉。 | 必須設定 |
關閉_啟動 | AP 已準備好關閉。 VMCU 應在第二個值中指定的時間後重新開啟 AP。 (VMCU 不需要支援定時開啟功能。) | 必須設定 |
關閉_取消 | Android 不再準備關閉,並將繼續進行 WAIT_FOR_VHAL。 | |
在 | 安卓運作正常。 |
狀態可以自主設定或回應通過 VMCU 的請求。
AP_POWER_STATE_REQ
此屬性由 VMCU 傳送,用於將 Android 轉換到不同的電源狀態,並包含兩個整數:
-
int32Values[0]
:VehicleApPowerStateReq
枚舉值,表示要轉換到的新狀態。 -
int32Values[1]
:VehicleApPowerStateShutdownParam
枚舉值。該值僅針對SHUTDOWN_PREPARE
訊息發送,並將其包含的選項傳輸到 Android。
第一個整數值表示 Android 要轉換到的新狀態。語意在VehicleApPowerStateReq.aidl
中定義並提供如下:
值名稱 | 描述 |
---|---|
在 | AP 應開始全面運作。 |
關閉_準備 | AP 應準備關閉。第二個值指示是否允許 AP 延遲關閉以及 AP 是否應該關閉電源或進入深度睡眠。 |
取消_關閉 | AP 應停止準備關閉並準備開啟。 |
完成的 | AP 現在將被關閉或暫停。 |
VehicleApPowerStateShutdownParam
在VehicleApPowerStateShutdownParam.aidl
中定義。該枚舉具有以下元素:
值名稱 | 描述 |
---|---|
CAN_SLEEP | AP可以進入深度睡眠而不是完全關閉。允許推遲。 |
可以休眠 | AP 可以進入休眠狀態而不是完全關閉。允許推遲。 |
僅關閉 | AP 應關閉。允許推遲。深度睡眠是不允許的。 |
立即睡眠 | AP 可以進入深度睡眠,但必須立即睡眠或關閉。不允許推遲。 |
HIBERNATE_IMMEDIATELY | AP 可以進入磁碟掛起狀態,但必須立即休眠或關閉。不允許推遲。 |
立即關閉 | AP 必須立即關閉。不允許推遲。深度睡眠是不允許的。 |
喚醒來源
當裝置處於掛起模式時,整合器必須停用適當的喚醒來源。常見的喚醒來源包括心跳、數據機、Wi-Fi 和藍牙。唯一有效的喚醒來源必須是來自 VMCU 的中斷才能喚醒 SoC。這假設 VMCU 可以偵聽調變解調器的遠端喚醒事件(例如遠端引擎啟動)。如果將此功能推送到 AP,則必須新增另一個喚醒來源來為數據機提供服務。
應用
OEM 必須小心編寫應用程序,以便能夠快速關閉,而不是無限期地推遲該過程。
附錄
原始碼樹中的目錄
內容 | 目錄 |
---|---|
CarPowerManager相關程式碼。 | packages/services/Car/car-lib/src/android/car/hardware/power |
CarPowerManagementService等。 | packages/services/Car/service/src/com/android/car/power |
處理 VHAL 的服務,例如VehicleHal 和HAlClient 。 | packages/services/Car/service/src/com/android/car/hal |
VHAL 介面和屬性定義。 | hardware/interfaces/automotive/vehicle/aidl/android/hardware/automotive/vehicle/ |
範例應用程式提供有關CarPowerManager 的一些想法 | packages/services/Car/tests/EmbeddedKitchenSinkApp/src/com/google/android/car/kitchensink |
類別圖
此類別圖顯示了電源管理系統中的 Java 類別和介面:
圖 4.功率等級圖。
物件關係
圖 5 說明了哪些物件引用了其他物件。邊緣意味著來源物件持有對目標物件的引用。例如,VehicleHAL 具有對 PropertyHalService 物件的參考。
圖 5.對象參考圖。