電源管理

車両固有の電源管理をサポートするために、Android はCarPowerManagementServiceサービスとCarPowerManagerインターフェイスを提供します。

状態遷移は、車両マスター コントロール ユニット (VMCU) によってトリガーされます。 VMCU と通信するには、インテグレーターはいくつかのコンポーネントを実装する必要があります。インテグレーターは、車両ハードウェア抽象化レイヤー (VHAL) およびカーネル実装との統合を担当します。インテグレーターは、スリープ解除ソースを無効にし、シャットダウンが無期限に延期されないようにする責任もあります。

用語

このドキュメント全体で次の用語が使用されます。

アプリプロセッサー (AP)
システムオンチップ (SoC)の一部。
ボードサポートパッケージ (BSP)
組み込みオペレーティング システムと統合された、特定のハードウェア環境 (マザーボード) で組み込みオペレーティング システムが機能できるようにする、ハードウェア固有のブート ファームウェアとデバイス ドライバーを含むソフトウェア層。
CarPowerManager (CPM)
アプリが電源状態の変更を登録するための API を公開します。
CarPowerManagementService (CPMS)
車の電源ステート マシンを実装し、VHAL とインターフェイスし、 suspend()shutdown()の最終呼び出しを実行します。
CarPowerPolicyDaemon (CPPD)
ネイティブ プロセスが電源ポリシー リスナーを登録するための AIDL インターフェイスを公開します。
汎用入力または出力 (GPIO)
汎用のデジタル信号ピンです。
ハードウェア抽象化レイヤー (HAL)
ハードウェア機能にアクセスするために、他のすべての上位モジュールが対話する必要があるソフトウェア層。
冬眠する
サスペンドトゥディスク(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.車の電源ステートマシン。

最も一般的なトランジションは青色で強調表示されます。以下に、状態と一般的な遷移を示します。

  • RAMへのサスペンド。車両と SoC がオフになっています。コードは実行されていません。 SoC RAM への電力は維持されます。
  • VHALを待ちます。ドライバーがドアを開けるなどして車両と対話すると、VMCU が SoC に電力を供給します。 AAOS は Suspend-to-RAM から再開し、Wait for VHAL に入り、VHAL との調整を待ちます。
  • の上。 VHAL は AAOS にオン状態になるように指示します。この状態では、AAOS は完全に実行されており、ドライバーと対話しています。
  • シャットダウンの準備。ドライバーが運転を終了すると、VHAL は AAOS にシャットダウン準備に入るよう指示します。この状態では、ディスプレイとオーディオはオフになっており、AAOS はドライバーと対話していません。 Android システムは引き続き稼働しており、アプリと Android システムを無料で更新できます。更新が完了すると、Android システムは「VHAL 終了を待機」状態になります。
  • VHAL の終了を待ちます。この時点で、AAOS は VHAL にシャットダウンの準備ができたことを通知します。 VMCU は、SoC をディープ スリープ状態にし、アプリ プロセッサから電力を除去することが期待されます。コードは実行されていませんが、AAOS は Suspend-to-RAM 状態になります。

電源管理モジュール

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

モジュール名説明
カーパワーマネージャーJava または C++ API。
CarPowerManagementサービス電源状態の遷移を調整します。
CarPowerPolicyデーモンネイティブ電源ポリシー クライアントと通信します。
車両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_PREPARESUSPEND_ENTERPOST_SUSPEND_ENTERに戻った後、非同期で準備を続行できます。この場合、特権サービスは、準備が完了したときに、提供されたCompletablePowerStateChangeFutureオブジェクトに対して complete() を呼び出すことになっています。 SHUTDOWN_PREPAREでは非同期準備が許可されていないことに注意してください。 DEEP_SLEEP_ENTRYが VHAL に送信される前に、CPMS は定期的にシャットダウン延期要求を VHAL に送信します。

すべての CPM オブジェクトがシャットダウンの準備を完了すると、CPMS はAP_POWER_STATE_REPORT VHAL に送信し、AP がサスペンドの準備ができていることを VMCU に通知します。 CPMS はまた、カーネルを一時停止するサスペンド メソッドを呼び出します。

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

深い眠りに入る

図 3.深いスリープに入る。

CPM が提供するプログラミング インターフェイス

このセクションでは、システム アプリおよびサービス用に CPM によって提供される Java API について説明します。この API により、システム ソフトウェアは次のことが可能になります。

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

CPM が提供する API を呼び出すには、次の手順を使用します。

  1. CPM インスタンスを取得するには、Car 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を実装することで、電源状態の変更通知を受信できます。このインターフェイスは、CPMS の電源状態が変更されたときに呼び出されるコールバック関数である 1 つのメソッドonStateChanged()を定義します。次の例では、インターフェイスを実装する新しい匿名クラスを定義します。

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 のシャットダウンまたはサスペンドを開始します。
  • デバイスがサスペンド状態にあるときは、すべての wakesource が無効になっていることを確認してください。
  • シャットダウン プロセスが無期限に延期されないように、アプリが十分に早くシャットダウンするようにしてください。
  • サスペンドや休止状態をブロックしないように、BSP が電源ポリシーに従ってデバイス コンポーネントをオン (またはオフ) にするようにします。

カーネルインターフェイス: /sys/power/state

AAOS は、アプリまたはサービスが/sys/power/stateにあるファイルにサスペンドツー RAM の場合はmem 、またはサスペンドツーディスクの場合はdiskを書き込むと、デバイスをサスペンド モードにします。インテグレーターは、このファイルを監視し、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 の現在の電源管理状態を報告します。このプロパティには 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 レポートを発行することで、追加の延期を要求する場合があります。必ず設定してください
シャットダウン_準備Android はシャットダウンの準備をしています。必ず設定してください
シャットダウン_スタートAP をシャットダウンする準備ができています。 VMCU は、2 番目の値で指定された時間が経過した後に AP をオンに戻す必要があります。 (VMCU は時間指定電源オン機能をサポートする必要はありません。)必ず設定してください
SHUTDOWN_CANCELLED Android はシャットダウンの準備を停止し、WAIT_FOR_VHAL に進みます。
の上Androidは正常に動作しています。

状態は自律的に設定することも、VMCU を介した要求に応じて設定することもできます。

AP_POWER_STATE_REQ

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

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

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

値の名前説明
の上AP は完全な動作を開始する必要があります。
シャットダウン_準備AP はシャットダウンの準備をする必要があります。 2 番目の値は、AP がシャットダウンを延期できるかどうか、および AP が電源をオフにするかディープ スリープに入る必要があるかを示します。
キャンセル_シャットダウンAP はシャットダウンの準備を停止し、オンに移行する準備をする必要があります。
終了したAP はシャットダウンまたは一時停止されます。

VehicleApPowerStateShutdownParamVehicleApPowerStateShutdownParam.aidlで定義されています。この列挙型には次の要素が含まれます。

値の名前説明
CAN_SLEEP AP は完全にシャットダウンするのではなく、ディープ スリープに入ることができます。延期は許されます。
CAN_HIBERNATE AP は完全にシャットダウンするのではなく、休止状態に入ることができます。延期は許されます。
シャットダウンのみAP はシャットダウンする必要があります。延期は許されます。深い睡眠は禁止です。
SLEEP_IMMEDIATELY AP はディープ スリープに入る可能性がありますが、すぐにスリープするかシャットダウンする必要があります。延期は認められません。
HIBERNATE_IMMEDIATELY AP はディスクへのサスペンド状態に入ることができますが、休止状態になるか、ただちにシャットダウンする必要があります。延期は認められません。
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
VehicleHalHAlClientなど、VHAL を扱うサービス。 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.オブジェクト参照図。