電源管理

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

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

術語

本文件中會使用以下術語:

應用程式處理器 (AP)
晶片系統 (SoC) 的一部分。
開發板支援套件 (BSP)
這個軟體層包含硬體專屬的開機韌體和裝置驅動程式,可讓嵌入式作業系統在特定硬體環境 (主機板) 中運作,並與嵌入式作業系統整合。
CarPowerManager (CPM)
公開 API,讓應用程式註冊電源狀態變更。
CarPowerManagementService (CPMS)
實作車輛電源狀態機器人、與 VHAL 介面,並執行對 suspend()shutdown() 的最終呼叫。
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 省電模式,並在 RAM 保持開啟的情況下關閉 CPU。
車輛 HAL (VHAL)
用於與車輛網路連線的 Android API。第 1 級合作夥伴或原始設備製造商 (OEM) 負責編寫這個模組。車輛網路可使用任何實體層 (例如 CAN、LIN、MOST 和乙太網路)。VHAL 會擷取這個車輛網路,讓 AAOS 與車輛互動。
車輛介面處理器 (VIP)
請參閱「車輛 MCU」。
車輛主控制單元 (VMCU)
微控制器,提供車輛網路與 SoC 之間的介面。SoC 會透過 USB、UART、SPI 和 GPIO 信號與 VMCU 通訊。

系統設計

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

車輛電源狀態機器

AAOS 會使用狀態機器來代表無線基地台的電源狀態。狀態機提供下列狀態:

車輛電源狀態機器

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

最常見的轉場效果會以藍色標示。以下是狀態和常見的轉換:

  • 暫停至 RAM:車輛和 SoC 已關閉,沒有任何程式碼正在執行。維持 SoC RAM 的電源。
  • 等待 VHAL。當駕駛者與車輛互動時 (例如開車門),VMCU 會為 SoC 供電。AAOS 會從暫停至 RAM 的狀態中復原,並進入等待 VHAL 的狀態,等待與 VHAL 協調。
  • 已開啟。VHAL 會指示 AAOS 進入開啟狀態。在這個狀態下,AAOS 會完全執行並與駕駛員互動。
  • Shutdown Prepare。駕駛人完成行車後,VHAL 會通知 AAOS 進入關機準備階段。在這個狀態下,螢幕和音訊會關閉,且 AAOS 不會與駕駛員互動。Android 系統仍在執行,可免費更新應用程式和 Android 系統。更新 (如有) 完成後,Android 系統會進入「等待 VHAL 完成」狀態。
  • 等待 VHAL 完成。此時,AAOS 會通知 VHAL 已準備好關機。VMCU 應將 SoC 置於深度睡眠狀態,並從應用程式處理器移除電源。此時 AAOS 處於「暫停至 RAM」狀態,但沒有任何程式碼正在執行。

電源管理模組

電源管理系統由下列模組組成:

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

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

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

在 CPMS 接管之前,CPPD 會管理電源政策。並向原生事件監聽器傳送電源政策變更通知。

部分屬性是在 VHAL 中定義。為了與 VMCU 通訊,CPMS 會讀取及寫入這些屬性。應用程式可使用 CPM 中定義的介面,監控電源狀態變更。這個介面也能讓應用程式註冊電源政策事件監聽器。這個 API 可從 Java 呼叫,並附加 @hide / @System API 註解,也就是說,只有特權應用程式可使用。下圖說明這些模組、應用程式和服務之間的關係:

電源元件參考圖

圖 2. 電源元件參考圖表。

訊息序列

上一節說明瞭組成電源管理系統的模組。本節將透過「進入深層睡眠狀態」和「退出深層睡眠狀態」的範例說明模組和應用程式如何進行通訊:

進入熟睡

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

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,然後通知 VMCU 表示 AP 已準備好暫停。CPMS 也會呼叫其暫停方法,以便暫停核心。

以下說明上述順序:

進入熟睡

圖 3. 進入深層睡眠。

由 CPM 提供的程式設計介面

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

  • 監控無線基地台的電源狀態變更。
  • 套用電源政策。

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

  1. 如要取得 CPM 例項,請呼叫 Car API。
  2. 對步驟 1 建立的物件呼叫適當方法。

建立 CarPowerManager 物件

如要建立 CPM 物件,請呼叫 Car 物件的 getCarManager() 方法。這個方法是用來建立 CPM 物件的外觀。指定 android.car.Car.POWER_SERVICE 做為建立千次曝光出價物件的引數。

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 建立通訊,再進入開啟狀態。

取消註冊 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 會使用這個屬性,以便指示 Android 使用 VehicleApPowerStateReq 列舉值,轉換為不同的電源狀態。

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 應準備關機。第二個值表示是否允許存取點延遲關機,以及存取點是否應關機或進入深度休眠狀態。
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,則必須新增其他喚醒來源,才能服務數據機。

應用程式

原始設備製造商 (OEM) 必須謹慎編寫應用程式,以便快速關閉應用程式,而不會無限期延遲程序。

附錄

原始碼樹狀結構中的目錄

滿足 Directory
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. 物件參照圖。