電源管理

車両固有の電源管理をサポートするため、Android には CarPowerManagementService サービスと CarPowerManager インターフェースが用意されています。

状態遷移は車両マスター コントロール ユニット(VMCU)によってトリガーされます。VMCU と通信するために、インテグレータは複数のコンポーネントを実装する必要があります。インテグレータは、Vehicle Hardware Abstraction Layer(VHAL)やカーネル実装との統合を行います。また、復帰ソースを無効にし、シャットダウンが無期限に延期されないようにします。

用語

以下の用語は、このドキュメント全体で使用されています。

アプリ プロセッサ(AP)
システム オン チップ(SoC)の一部。
ボード サポート パッケージ(BSP)
ハードウェア固有のブート ファームウェアと、埋め込みのオペレーティング システムを特定のハードウェア環境(マザーボード)で機能させるためのデバイス ドライバが含まれたソフトウェアのレイヤ。埋め込みのオペレーティング システムに統合されています。
CarPowerManager(CPM)
アプリが電源状態の変更を登録するための API を公開します。
CarPowerManagementService(CPMS)
車両の電源ステートマシンを実装し、VHAL と連携して、suspend() と shutdown() の最終呼び出しを実行します。
CarPowerPolicyDaemon(CPPD)
電源ポリシー リスナーを登録するためのネイティブ プロセス用の AIDL インターフェースを公開します。
汎用入出力(GPIO)
汎用のデジタル信号ピンです。
Hardware Abstraction Layer(HAL)
他のすべての上位モジュールがハードウェア機能にアクセスするためにやり取りする必要があるソフトウェア レイヤ。
休止状態
Suspend to Disk(S2D / S4)とも呼ばれます。SoC は S4 電源モード(休止状態)になり、RAM コンテンツはフラッシュやディスクなどの不揮発性メディアに書き込まれ、システム全体の電源がオフになります。
メディア プロセッサ(MP)
システム オン チップ(SoC)をご覧ください。
電力管理集積回路(PMIC)
ホストシステムの電力要件の管理に使用するチップ。
システム オン チップ(SoC)
AAOS を実行するメイン プロセッサ。通常は Intel、MediaTek、Nvidia、Qualcomm、Renesas、Texas Instruments などのメーカーにより提供されます。
一時停止
Suspend-to-RAM(S2R または STR)とも呼ばれます。SoC は S3 電源モードになり、CPU の電源がオフになりますが、RAM は電源がオンの状態を保持します。
車両 HAL(VHAL)
車両ネットワークとのやり取りに使用される Android API。Tier 1 のパートナーまたは OEM が、このモジュールを作成します。車両ネットワークでは、すべての物理層(CAN、LIN、MOST、イーサネットなど)を使用できます。VHAL はこの車両ネットワークを抽象化して、AAOS が車両と連携することを可能にします。
車両インターフェース プロセッサ(VIP)
車両 MCU をご覧ください。
車両マスター コントロール ユニット(VMCU)
車両ネットワークと SoC 間のインターフェースを備えたマイクロコントローラ。SoC は USB、UART、SPI、GPIO の各信号によって VMCU と通信します。

システム設計

このセクションでは、AAOS がどのようにアプリ プロセッサの電源状態を表し、どのモジュールが電源管理システムを実装するかについて説明します。また、これらのモジュールがどのように連携し、通常どのように状態遷移が発生するのかについても説明します。

車両の電源ステートマシン

AAOS はステートマシンを使用して AP の電源状態を表します。ステートマシンは、次の図に示す状態を表します。

車両の電源ステートマシン

図 1. 車両の電源ステートマシン。

最も一般的な遷移を青色でハイライト表示しています。それぞれの状態と一般的な遷移は次のとおりです。

  • Suspend-to-RAM。車両と SoC がオフの状態です。コードは実行されていません。電力は SoC RAM に対して維持されます。
  • Wait for VHAL。運転手が車両を操作(ドアを開けるなど)すると、VMCU は SoC に電力を適用します。AAOS は Suspend-to-RAM から再開し、Wait for VHAL に移行して VHAL との連携を待機します。
  • On。VHAL は、AAOS に On 状態に移行するように指示します。この状態では、AAOS は完全に動作しており、運転手との通信に応答しています。
  • Shutdown Prepare。運転手が運転を終えると、VHAL は AAOS に対し、シャットダウンの準備に入るよう指示します。この状態では、ディスプレイと音声はオフになっており、AAOS は運転手との通信を行っていません。Android システムは引き続き実行中であり、アプリや Android システムの更新を自由に行うことができます。更新が完了すると、Android システムは Wait for VHAL Finish 状態に入ります。
  • Wait for VHAL Finish。この時点で、AAOS はシャットダウンの準備が完了したことを VHAL に通知します。VMCU は SoC をディープ スリープに移行させ、アプリ プロセッサの電力をオフにします。実行中のコードはありませんが、AAOS は Suspend-to-RAM 状態に移行します。

電源管理モジュール

電源管理システムは、次のモジュールで構成されています。

モジュール名 説明
CarPowerManager Java または C++ API。
CarPowerManagementService 電源状態の遷移を調整。
CarPowerPolicyDaemon ネイティブの電源ポリシー クライアントと通信。
車両 HAL VMCU へのインターフェース。
カーネル Suspend to RAM またはディスクの実装。

ディープ スリープ / 休止状態の機能(Android を一時停止して RAM / ディスクに保存)はカーネルに実装されます。この機能は、/sys/power/state にある特別なファイルとしてユーザー空間に公開されます。AAOS は、このファイルに mem または disk を書き込むことで一時停止されます。

CPMS は、他のサービスや HAL と電源状態を調整します。上記のステートマシンを実装し、電源状態の遷移が発生するとすべてのオブザーバーに通知を送信します。このサービスはまた、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 を送信します。その後、VCU は AP を一時停止する準備ができたことを VMCU に通知します。また、CPMS は一時停止メソッドを呼び出し、カーネルを一時停止します。

上記のシーケンスを以下の図に示します。

ディープ スリープの開始

図 3. ディープ スリープの開始。

CPM が備えるプログラミング インターフェース

このセクションでは、CPM が備えるシステムアプリとサービス用の Java API について説明します。この API を使用すると、システム ソフトウェアで次のことができます。

  • AP の電源状態の変化を監視する。
  • 電源ポリシーを適用する。

CPM に備えられた API を呼び出すには、次の手順を実施します。

  1. CPM インスタンスを取得するために、自動車 API を呼び出します。
  2. ステップ 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_ON ON 状態に移行します。システムは完全に稼働しています。
STATE_SHUTDOWN_CANCELLED シャットダウンはキャンセルされ、電源状態は通常の状態に戻ります。
STATE_SHUTDOWN_ENTER アプリはクリーンアップされ、シャットダウン状態に移行する準備が完了します。
STATE_POST_SHUTDOWN_ENTER シャットダウン状態の準備が完了し、VMCU はシャットダウン状態に移行できるようになり、シャットダウン状態に移行します。
STATE_PRE_SHUTDOWN_PREPARE シャットダウン プロセスがリクエストされましたが、CPMS はまだプロセスを開始していません。ディスプレイと音声はオンのままです。
STATE_SHUTDOWN_PREPARE この間にガレージモードが実行されることがあります。
STATE_SUSPEND_ENTER アプリはクリーンアップされ、suspend-to-RAM 状態に移行する準備が完了します。
STATE_POST_SUSPEND_ENTER suspend-to-RAM 状態の準備が完了し、VMCU は suspend-to-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

AAOS は、アプリまたはサービスが mem(suspend-to-RAM の場合)または disk(suspend-to-disk の場合)を /sys/power/state にあるファイルに書き込むと、デバイスを一時停止モードにします。インテグレータは、このファイルをモニタリングし、Linux の電源を一時停止の状態にする関数を用意する必要があります。この関数で GPIO を VMCU に送信して、デバイスが完全にシャットダウンしたことを VMCU に通知することもできます。インテグレータは、最終的なメッセージを VMCU に送信する VHAL と、一時停止またはシャットダウン モードに移行するシステム間の競合状態を排除する必要もあります。

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 はこのプロパティの VehicleApPowerStateSet 列挙値を使用して、VMCU に状態遷移を通知します。
AP_POWER_STATE_REQ VMCU はこのプロパティの VehicleApPowerStateReq 列挙値を使用して、Android に別の電源状態に移行するよう指示します。

AP_POWER_STATE_REPORT

このプロパティを使用して、Android の現在の電源管理状態を通知します。このプロパティには 2 つの整数型が含まれます。

  • int32Values[0]: 現在の状態の VehicleApPowerStateReport 列挙値。
  • int32Values[1]: 延期、スリープまたはシャットダウンの時間(ミリ秒単位)。この値の意味は、最初の値によって異なります。

最初の値には次のいずれかの値を指定できます。具体的な説明を含む VehicleApPowerStateReport.aidl は、hardware/interfaces/automotive/vehicle/aidl/android/hardware/automotive/vehicle にあります。

値の名前 説明 2 つ目の値
WAIT_FOR_VHAL AP が起動しています。VHAL との通信を確立する必要があります。
DEEP_SLEEP_ENTRY AP がディープ スリープ状態を開始しています。VMCU は、2 番目の値で指定された時間が経過した後に AP を再びオンにする必要があります。 要設定
DEEP_SLEEP_EXIT AP がディープ スリープ状態を終了しています。
HIBERNATION_ENTRY AP が休止状態を開始しています。VMCU は、2 番目の値で指定された時間が経過した後に AP を再びオンにする必要があります。 要設定
HIBERNATION_EXIT AP が休止状態を終了しています。
SHUTDOWN_POSTPONE Android はシャットダウンの準備ができていません。VMCU は AP をシャットダウンする前に、2 番目の値で指定された時間だけ待機する必要があります。Android は、追加の SHUTDOWN_POSTPONE レポートを発行することで、追加の延期をリクエストする場合があります。 要設定
SHUTDOWN_PREPARE Android はシャットダウンの準備をしています。 要設定
SHUTDOWN_START AP はシャットダウンする準備が完了しました。VMCU は、2 番目の値で指定された時間が経過した後に AP を再びオンにする必要があります(VMCU は、時間を指定してオンにする機能をサポートする必要はありません)。 要設定
SHUTDOWN_CANCELLED 現在、Android はシャットダウンの準備を停止しており、WAIT_FOR_VHAL に進みます。
ON Android は正常に動作しています。

状態は、自律的に設定できます。または、VMCU を介したリクエストに応じて設定することもできます。

AP_POWER_STATE_REQ

このプロパティは、Android を別の電源状態に移行するために VMCU によって送信されます。このプロパティには次の 2 つの整数型が含まれます。

  • int32Values[0]: VehicleApPowerStateReq 列挙値。遷移先の新しい状態を表します。
  • int32Values[1]: VehicleApPowerStateShutdownParam 列挙値。この値は、SHUTDOWN_PREPARE メッセージでのみ送信され、含まれるオプションを Android に送信します。

最初の整数値は、Android が遷移する新しい状態を表します。セマンティクスは VehicleApPowerStateReq.aidl で定義されています。以下にその一覧を示します。

値の名前 説明
ON AP がフル オペレーションを開始する必要があります。
SHUTDOWN_PREPARE AP がシャットダウンする準備が必要です。2 番目の値は、AP がシャットダウンを延期できるかどうか、AP が電源をオフにするか、ディープ スリープに入るかどうかを示します。
CANCEL_SHUTDOWN AP がシャットダウンする準備を中止し、ON に切り替わる準備をする必要があります。
FINISHED AP はシャットダウンまたは一時停止されます。

VehicleApPowerStateShutdownParam は VehicleApPowerStateShutdownParam.aidl で定義されます。この列挙値には次の要素があります。

値の名前 説明
CAN_SLEEP AP は完全にシャットダウンする代わりに、ディープ スリープ モードに入ることができます。延期が許可されています。
CAN_HIBERNATE AP は完全にシャットダウンする代わりに、休止状態に入ることができます。延期が許可されています。
SHUTDOWN_ONLY AP はシャットダウンする必要があります。延期が許可されています。ディープ スリープは許可されていません。
SLEEP_IMMEDIATELY AP はディープ スリープ モードに入ることもできますが、直ちにスリープまたはシャットダウンする必要があります。延期は許可されていません。
HIBERNATE_IMMEDIATELY AP は suspend-to-disk 状態に入ることがありますが、すぐに休止状態またはシャットダウン状態になる必要があります。延期は許可されていません。
SHUTDOWN_IMMEDIATELY AP は直ちにシャットダウンする必要があります。延期は許可されていません。ディープ スリープは許可されていません。

復帰ソース

インテグレータは、デバイスが一時停止モードのときに、適切な復帰ソースを無効にする必要があります。一般的な復帰ソースには、ハートビート、モデム、Wi-Fi、Bluetooth があります。SoC を復帰させるための VMCU の割り込みが、唯一の有効な復帰ソースであることが必要です。これは、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. オブジェクト参照図。