車両固有の電源管理をサポートするために、Android はCarPowerManagementService
サービスとCarPowerManager
インターフェイスを提供します。
状態遷移は、車両マスター コントロール ユニット (VMCU) によってトリガーされます。 VMCU と通信するには、インテグレーターはいくつかのコンポーネントを実装する必要があります。インテグレーターは、車両ハードウェア抽象化レイヤー (VHAL) およびカーネル実装との統合を担当します。インテグレーターは、スリープ解除ソースを無効にし、シャットダウンが無期限に延期されないようにする責任もあります。
用語
このドキュメント全体で次の用語が使用されます。
suspend()
とshutdown()
の最終呼び出しを実行します。システムデザイン
このセクションでは、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_PREPARE
、 SUSPEND_ENTER
、 POST_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 を呼び出すには、次の手順を使用します。
- CPM インスタンスを取得するには、Car API を呼び出します。
- ステップ 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 はシャットダウンまたは一時停止されます。 |
VehicleApPowerStateShutdownParam
はVehicleApPowerStateShutdownParam.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 |
VehicleHal やHAlClient など、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.オブジェクト参照図。