電源管理

為支援車輛專屬的電源管理功能,Android 提供 CarPowerManagementService 服務和 CarPowerManager 介面。

狀態轉換是由車輛主控單元 (VMCU) 觸發。如要與 VMCU 通訊,整合人員必須實作多個元件。整合人員負責與車輛硬體抽象層 (VHAL) 和核心實作項目整合,也負責停用喚醒來源,並確保不會無限期延後關機。

術語

本文會使用下列術語:

應用程式處理器 (AP)
晶片系統 (SoC) 的一部分。
開發板支援套件 (BSP)
軟體層,包含硬體專屬的開機韌體和裝置驅動程式,可讓嵌入式作業系統在特定硬體環境 (主機板) 中運作,並與嵌入式作業系統整合。
CarPowerManager (CPM)
:公開 API,供應用程式註冊電源狀態變更。
CarPowerManagementService (CPMS)
協調電源狀態轉換、與 VHAL 介面互動以控制電源狀態,並執行最終呼叫來暫停和關機。
CarPowerPolicyDaemon (CPPD)
管理電源政策,並公開 AIDL 介面,供原生程序註冊電源政策事件監聽器。
通用輸入或輸出 (GPIO)
一般用途的數位信號插腳。
硬體抽象層 (HAL)
所有其他較高層級的模組都必須與這個軟體層互動,才能存取硬體功能。
hibernate
也稱為「暫停至磁碟」(S2D/S4)。SoC 會進入 S4 電源模式 (休眠),RAM 內容會寫入非揮發性媒體 (例如快閃或磁碟),整個系統會關機。
媒體處理器 (MP)
請參閱晶片系統 (SoC)
電源管理積體電路 (PMIC)
:用於管理主機系統的電源需求。
晶片系統 (SoC)
執行 AAOS 的主要處理器,通常由 Intel、MediaTek、Nvidia、Qualcomm、Renesas 和 Texas Instruments 等製造商提供。
暫停
也稱為「暫停到 RAM」(S2R 或 STR)。SoC 會進入 S3 電源模式,CPU 則會關閉電源,但 RAM 仍會保持供電。
車用 HAL (VHAL)
用於與車輛網路介接的 Android API。第 1 層合作夥伴或原始設備製造商 (OEM) 負責撰寫這個模組。車輛網路可使用任何實體層 (例如 CAN、 LIN、MOST 和乙太網路)。VHAL 會將這個車輛網路抽象化,讓 AAOS 與車輛互動。
車輛介面處理器 (VIP)
請參閱車輛 MCU。
車輛主控單元 (VMCU)
微控制器,可提供車輛網路與 SoC 之間的介面。SoC 會透過 USB、UART、SPI 和 GPIO 訊號與 VMCU 通訊。

系統設計

本節說明 AAOS 如何表示應用程式處理器的電源狀態,以及哪些模組會實作電源管理系統。這份資料也說明這些模組如何共同運作,以及狀態轉換通常如何發生。

車輛電源狀態機器

AAOS 會使用狀態機器表示 AP 的電源狀態。狀態機提供下列狀態:

車輛電源狀態機器

圖 1. 車輛電源狀態機器。

最常見的轉換會以藍色醒目顯示。這些是狀態和常見轉換:

  • 暫停至 RAM。車輛和 SoC 關閉,沒有執行任何程式碼。SoC RAM 維持供電。
  • 等待 VHAL。當駕駛人與車輛互動時 (例如開啟車門),VMCU 會為 SoC 供電。AAOS 會從暫停至 RAM 狀態恢復,並進入「等待 VHAL」狀態,等待與 VHAL 協調。
  • 開啟:VHAL 會告知 AAOS 進入「開啟」狀態。在這個狀態下,AAOS 會全面運作並與駕駛人互動。
  • 準備關機。駕駛人結束駕駛後,VHAL 會告知 AAOS 進入準備關機狀態。在此狀態下,螢幕和音訊會關閉,AAOS 也不會與駕駛人互動。Android 系統仍會執行,並可更新應用程式和 Android 系統。完成更新 (如有) 後,Android 系統會進入「等待 VHAL 完成」狀態。
  • 等待 VHAL 完成。此時,AAOS 會通知 VHAL 準備關機。VMCU 預計會將 SoC 置於深層睡眠狀態,並從應用程式處理器移除電源。AAOS 隨後會進入「暫停至 RAM」狀態,但不會執行任何程式碼。

電源管理模組

電源管理系統包含下列模組:

模組名稱 說明
CarPowerManager Java 或 C++ API。
CarPowerManagementService 協調電源狀態轉換,並將電源政策管理作業委派給 CarPowerPolicyDaemon。
CarPowerPolicyDaemon 管理電源政策,並與原生電源政策用戶端通訊。
車用 HAL VMCU 的介面。
核心 暫停至 RAM 或磁碟的實作項目。

深層睡眠/休眠功能 (將 Android 暫停至 RAM/磁碟) 是在核心中實作。這項功能會以特殊檔案的形式向使用者空間公開,該檔案位於 /sys/power/state。只要將 memdisk 寫入這個檔案,即可暫停 AAOS。

CPMS 會與其他服務和 HAL 協調電源狀態,CPMS 會實作上述狀態機器,並在發生電源狀態轉換時,向每個觀察器傳送通知。這項服務也會使用 VHAL 將訊息傳送至硬體。

CPPD 是電源政策的資訊來源,負責管理裝置生命週期內的電源政策,並將電源政策變更通知 CPMS、VHAL 和其他原生監聽器。CPMS 會將電源政策變更要求委派給 CPPD。

CPMS 會讀取及寫入與電源狀態相關的 VHAL 屬性 (例如 AP_POWER_STATE_REQAP_POWER_STATE_REPORT),藉此與 VMCU 通訊。應用程式可以使用 CPM 中定義的介面監控電源狀態變化。應用程式也可以透過這個介面註冊電源政策監聽器。這個 Java API 會使用 @SystemApi@hide 註解,因此只有具備權限的應用程式才能使用。下圖說明這些模組、應用程式和服務之間的關係:

電源元件參考圖

圖 2. 電源元件參考圖。

訊息序列

前一節說明瞭構成電源管理系統的模組。本節將使用「進入深層睡眠」和「退出深層睡眠」範例,說明模組和應用程式的通訊方式:

進入深層睡眠

只有 VMCU 可以啟動深層睡眠。啟動深層睡眠後,VMCU 會透過 VHAL 將通知傳送至 CPMS。CPMS 會將狀態變更為 SHUTDOWN PREPARE,並透過呼叫 onStateChanged() 方法,將這項狀態轉換廣播給所有觀察者 (監控 CPMS 的應用程式和服務),其中包含 CPM 提供的新狀態 ID。

CPM 會在應用程式/服務和 CPMS 之間進行中介。應用程式/服務的 onStateChanged() 方法會在 CPM 的 onStateChanged() 方法中同步叫用。大多數應用程式和服務都必須完成準備作業,才能從這項呼叫傳回。特權服務可在傳回 PRE_SHUTDOWN_PREPARESUSPEND_ENTERPOST_SUSPEND_ENTER 後,繼續以非同步方式準備。在本例中,準備完成時,具備權限的服務應在提供的 CompletablePowerStateChangeFuture 物件上呼叫 complete()。請注意,SHUTDOWN_PREPARE不允許非同步準備。在將 DEEP_SLEEP_ENTRY 傳送至 VHAL 之前,CPMS 會定期將關機延後要求傳送至 VHAL。

所有 CPM 物件完成關機準備後,CPMS 會將 AP_POWER_STATE_REPORT 傳送至 VHAL,然後 VHAL 會通知 VMCU,AP 已準備好暫停。CPMS 也會呼叫其暫停方法,暫停核心。

上述順序如下圖所示:

進入深層睡眠

圖 3. 進入深層睡眠。

CPM 提供的程式設計介面

本節說明 CPM 為系統應用程式和服務提供的 Java API。這個 API 可讓系統軟體執行下列作業:

  • 監控 AP 的電源狀態變化。
  • 套用電源政策。

請按照下列步驟呼叫 CPM 提供的 API:

  1. 如要取得 CPM 執行個體,請呼叫 Car API。
  2. 呼叫在步驟 1 中建立的物件上適當的方法。

建立 CarPowerManager 物件

如要建立 CPM 物件,請呼叫 Car 物件的 getCarManager() 方法。這個方法是建立 CPM 物件的 Facade。請指定 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_ON 輸入開啟狀態。系統運作正常。
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 系統正在啟動,但會等待與 VHAL 建立通訊,再進入 ON 狀態。

取消註冊 CarPowerStateListener

如要取消註冊向 CPM 註冊的所有接聽器物件,請呼叫 clearListener 方法:

powerManager.clearListener();

在 Android 實作中整合系統

整合人員負責下列事項:

  • 實作核心介面,暫停 Android。
  • 實作 VHAL 函式,以:
    • 將暫停或關機的啟動程序從車輛傳播至 Android。
    • 從 Android 裝置傳送關機準備就緒訊息給車輛。
    • 透過 Linux 核心介面啟動 Android 關機或暫停程序。
  • 請確保裝置處於暫停狀態時,所有喚醒來源都已停用。
  • 確保應用程式能快速關閉,以免無限期延後關機程序。
  • 請確保 BSP 會根據電源政策開啟 (或關閉) 裝置元件,以免阻礙暫停或休眠

核心介面:/sys/power/state

當應用程式或服務將 mem (暫停至 RAM) 或 disk (暫停至磁碟) 寫入 /sys/power/state 的檔案時,AAOS 會將裝置置於暫停模式。整合人員必須提供監控這個檔案的函式,並將 Linux 設為暫停電源狀態。這項函式可能會將 GPIO 傳送至 VMCU,通知 VMCU 裝置已完全關機。整合人員也負責移除 VHAL 將最終訊息傳送至 VMCU,以及系統進入暫停或關機模式之間的任何競爭條件。

VHAL 責任

VHAL 可在車輛網路和 Android 之間提供介面。VHAL:

  • 將車輛發出的暫停或關機要求傳播至 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 會使用這項屬性,透過 VehicleApPowerStateReq 列舉值,指示 Android 轉換至不同的電源狀態。

AP_POWER_STATE_REPORT

使用這項屬性回報 Android 目前的電源管理狀態。這項屬性包含兩個整數:

  • int32Values[0]:目前狀態的 VehicleApPowerStateReport 列舉。
  • int32Values[1]:延後、休眠或關機的時間 (以毫秒為單位)。這個值的意義取決於第一個值。

第一個值可採用下列其中一個值。VehicleApPowerStateReport.aidl 包含更具體的說明,這些說明會儲存在 hardware/interfaces/automotive/vehicle/aidl/android/hardware/automotive/vehicle 中。

值名稱 說明 第二個值
WAIT_FOR_VHAL AP 正在啟動,需要與 VHAL 建立通訊。
DEEP_SLEEP_ENTRY AP 即將進入深層睡眠狀態。VMCU 應在第二個值指定的時間過後,重新開啟 AP。 必須設定
DEEP_SLEEP_EXIT AP 正在退出深層睡眠狀態。
HIBERNATION_ENTRY AP 即將進入休眠狀態。VMCU 應在第二個值指定的時間過後,重新開啟 AP。 必須設定
HIBERNATION_EXIT AP 正在結束休眠狀態。
SHUTDOWN_POSTPONE Android 尚未準備好關機。VMCU 應等待第二個值指定的時間,再關閉 AP。Android 可能會發出額外的 SHUTDOWN_POSTPONE 報告,要求延後關機。 必須設定
SHUTDOWN_PREPARE Android 正在準備關機。 必須設定
SHUTDOWN_START AP 即將關機。VMCU 應在第二個值指定的時間過後,重新開啟 AP。(VMCU 不必支援定時開啟功能)。 必須設定
SHUTDOWN_CANCELLED Android 停止準備關機,並繼續執行 WAIT_FOR_VHAL。
開啟 Android 運作正常。

狀態可以自主設定,也可以透過 VMCU 回應要求。

AP_POWER_STATE_REQ

VMCU 會傳送這項屬性,將 Android 轉換為不同的電源狀態,並包含兩個整數:

  • int32Values[0]VehicleApPowerStateReq 列舉值,代表要轉換的新狀態。
  • int32Values[1]VehicleApPowerStateShutdownParam 列舉值。這個值只會針對 SHUTDOWN_PREPARE 訊息傳送,並將所含選項傳輸至 Android。

第一個整數值代表 Android 要轉換的新狀態。語意定義於 VehicleApPowerStateReq.aidl,如下所示:

值名稱 說明
開啟 AP 應會開始全面運作。
SHUTDOWN_PREPARE AP 應準備關機。第二個值表示 AP 是否可延後關機,以及 AP 應預期關機或進入深層睡眠。
CANCEL_SHUTDOWN AP 應停止準備關機,並準備開機。
已完成 AP 現在會關機或暫停運作。

VehicleApPowerStateShutdownParam 是在 VehicleApPowerStateShutdownParam.aidl 中定義的。這個列舉包含下列元素:

值名稱 說明
CAN_SLEEP AP 可以進入深層睡眠,不必完全關機。可延期。
CAN_HIBERNATE AP 可以進入休眠狀態,而不是完全關機。可延期。
SHUTDOWN_ONLY AP 應關機。允許延後,但不允許進入深層睡眠。
SLEEP_IMMEDIATELY AP 可能會進入深層睡眠,但必須立即進入睡眠或關機,不得延後。
HIBERNATE_IMMEDIATELY AP 可能會進入暫停至磁碟狀態,但必須立即休眠或關機,不得延後。
SHUTDOWN_IMMEDIATELY AP 必須立即關機,不得延後或進入深層休眠。

喚醒來源

裝置處於暫停模式時,整合人員必須停用適當的喚醒來源。常見的喚醒來源包括心跳、數據機、Wi-Fi 和藍牙。唯一有效的喚醒來源必須是 VMCU 的中斷,才能喚醒 SoC。這項假設的前提是 VMCU 可以監聽數據機,以接收遠端喚醒事件 (例如遠端啟動引擎)。如果這項功能推送至 AP,則必須新增另一個喚醒來源,才能為數據機提供服務。

應用程式

原始設備製造商必須謹慎編寫應用程式,確保應用程式能快速關閉,不會無限期延後程序。

附錄

原始碼樹中的目錄

滿足 目錄
與 CarPowerManager 相關的程式碼。 packages/services/Car/car-lib/src/android/car/hardware/power
CarPowerManagementService 等等。 packages/services/Car/service/src/com/android/car/power
處理 VHAL 的服務,例如 VehicleHalHAlClient 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. 物件參照圖。