电源政策

为了确保根据需要选择性地开启和关闭硬件和软件组件(例如屏幕、音频和语音互动),AAOS 提供了电源政策,其中包含针对硬件和软件组件的一组预期电源开启和关闭状态。VHAL(即系统特权供应商服务)可以在 Android 电源状态转换时或其正在等待的条件达到时应用新的电源政策。

在“等待 VHAL”和“开启”状态下,可以应用电源政策。在“关闭准备”状态下,车库模式运行,不应受电源状态更改的干扰。虽然在“关闭准备”状态下无法应用常规电源政策,但此时会应用一项特殊的电源政策,即名为“没有用户互动”的系统电源政策。

AAOS 电源状态

AAOS 设备遵循以下电源状态图:

AAOS 电源状态图

图 1. AAOS 电源状态图

下面介绍了每种电源状态:

说明
关闭 不会向应用处理器 (AP)、内存和外围设备实际供电。
等待 VHAL
  • 当司机与车辆互动(例如,通过打开车门进行互动)时,VMCU 会向 AP、内存和外围设备供电。
  • AAOS 从三种状态(“关闭”、“挂起到 RAM [STR]”、“等待 VHAL 完成”)之一转换,然后进入“等待 VHAL”状态,在该状态下,它会等待与 VHAL 进行协调。
开启
  • VHAL 指示 AAOS 进入“开启”状态。在此状态下,AAOS 完全运行并与司机互动。
  • 屏幕由电源政策控制,而不是由适用于其他设备类型的 Android 屏幕开启/关闭调用控制。
关闭准备
  • 当司机停止驾驶后,VHAL 指示 AAOS 进入“关闭准备”状态。在此状态下,屏幕和音频处于关闭状态,AAOS 不会与司机互动。Android 系统仍在运行,可以更新应用和 Android 系统。当更新(如有)完成后,Android 系统会进入“等待 VHAL 完成”状态。
等待 VHAL 完成
  • AAOS 通知 VHAL 它可以关闭。车载微控制器单元 (VMCU) 应将系统芯片 (SoC) 置于深度休眠模式,并断开 AP 的电源。然后,AAOS 进入 STR 状态,但不执行任何代码。
  • 如果 VHAL 未完成而驱动程序返回,车机 (HU) 应直接转换为“等待 VHAL”。
挂起到 RAM (STR) 车辆和 AP 断电,不执行任何代码,AP RAM 仍然通电。

软件架构

电源政策的架构如下图所示,其定义请见下一个部分:

图 2. 电源政策架构

电源政策是如何定义的?

实现人员在 /vendor/etc/automotive/power_policy.xml 中定义电源政策,该文件用于如下用途:

  • 定义电源政策。
  • 定义电源政策组,其中包括默认电源政策,并在电源状态转换时自动应用。
  • 替换系统电源政策。

电源政策

电源政策是一组预期的硬件和软件组件电源状态。在电源政策中,AAOS 支持以下组件:

  • AUDIO
  • MEDIA
  • DISPLAY_MAIN
  • DISPLAY_CLUSTER
  • DISPLAY_FRONT_PASSENGER
  • DISPLAY_REAR_PASSENGER
  • BLUETOOTH
  • WIFI
  • CELLULAR
  • ETHERNET
  • PROJECTION
  • NFC
  • INPUT
  • VOICE_INTERACTION
  • VISUAL_INTERACTION
  • TRUSTED_DEVICE_DETECTION
  • LOCATION
  • MICROPHONE
  • CPU

电源政策组

电源状态转换时自动应用的默认电源政策在电源政策组中指定。供应商可以定义以下状态的默认电源政策:“等待 VHAL”、“开启”和“等待 VHAL 完成”(进入深度休眠或开始关闭)。

系统电源政策

AAOS 仅支持一项系统电源政策,即“没有用户互动”。系统电源政策在设备进入“静默模式”或“车库模式”时应用。

下表列出了系统电源政策中每种组件的行为。实现人员可以替换系统电源政策中的蓝牙、NFC 和可信设备检测。替换在 /vendor/etc/power_policy.xml 中应用。

组件 电源状态 可配置
音频 关闭
媒体 关闭
主屏幕 关闭
仪表板屏幕 关闭
前排乘客屏幕 关闭
后排乘客屏幕 关闭
蓝牙 关闭
Wi-Fi 网络 开启
移动网络 开启
以太网 开启
投影 关闭
NFC 关闭
输入 关闭
语音互动 关闭
视觉互动 关闭
可信设备检测 开启
位置信息 关闭
麦克风 关闭
CPU 开启

与 VHAL 交互

在系统层中运行的汽车电源政策守护程序通过订阅两个属性来监听 VHAL 发出的请求:

  • POWER_POLICY_REQ,VHAL 将电源政策 ID 写入此属性。
  • POWER_POLICY_GROUP_REQ,VHAL 将电源政策组 ID 写入此属性。

除 VHAL 外的其他模块可以更改系统中的当前电源政策。在这种情况下,汽车电源政策守护程序会更新 CURRENT_POWER_POLICY 属性,以向 VHAL 通知此更改。

与原生进程交互

如上所述,汽车电源政策守护程序在系统层运行,就电源政策管理而言,其提供的功能与框架层中运行的 CPMS 几乎相同。此外,假设汽车电源政策守护程序与 CPMS 完全同步。

汽车电源政策守护程序会导出 AIDL 接口供 HAL 和其他原生进程使用。当新的电源政策更改时,这些进程会收到通知。换言之,届时每个进程都必须更改其电源状态。

ICarPowerPolicyServer.aidl

package android.frameworks.automotive.powerpolicy;

import android.frameworks.automotive.powerpolicy.CarPowerPolicy;
import android.frameworks.automotive.powerpolicy.CarPowerPolicyFilter;
import android.frameworks.automotive.powerpolicy.ICarPowerPolicyChangeCallback;
import android.frameworks.automotive.powerpolicy.PowerComponent;

/**
 * ICarPowerPolicyServer is an interface implemented by the power policy daemon.
 * VHAL changes the power policy and the power policy daemon notifies the change to registered
 * subscribers. When subscribing to policy changes, a filter can be specified so that the registered
 * callbacks can listen only to a specific power component's change.
 */

@VintfStability
interface ICarPowerPolicyServer {
  /**
   * Gets the current power policy.
   */
  CarPowerPolicy getCurrentPowerPolicy();

  /**
   * Gets whether the power component is turned on or off.
   *
   * @param componentId Power component ID defined in PowerComponent.aidl to check power state.
   * @return True if the component's power state is on.
   */
  boolean getPowerComponentState(in PowerComponent componentId);

  /**
   * Subscribes to power policy change.
   * Notification is sent to the registered callback when the power policy changes and the power
   * state of the components which the callback is interested in changes.
   *
   * @param callback Callback that is invoked when the power policy changes.
   * @param filter The list of components which the callback is interested in.
   */
  void registerPowerPolicyChangeCallback(in ICarPowerPolicyChangeCallback callback,
      in CarPowerPolicyFilter filter);

  /**
   * Unsubscribes from power policy change.
   *
   * @param callback Callback that doesn't want to receive power policy change.
   */
  void unregisterPowerPolicyChangeCallback(in ICarPowerPolicyChangeCallback callback);
}

ICarPowerPolicyChangeCallback.aidl

package android.frameworks.automotive.powerpolicy;

import android.frameworks.automotive.powerpolicy.CarPowerPolicy;

/**
 * ICarPowerPolicyChangeCallback is notified when a power policy changes.
 */

@VintfStability
oneway interface ICarPowerPolicyChangeCallback {
  /**
   * Called when a power policy is fully changed.
   *
   * @param policy The current policy.
   */
  void onPolicyChanged(in CarPowerPolicy policy);
}

与 Java 模块交互

CarPowerManager 提供了用于进行电源政策管理的方法:

  • 获取当前电源政策
  • 获取当前电源政策组
  • 应用新的电源政策
  • 设置新的电源政策组

只有系统特权模块才能使用这些方法。希望在应用电源政策时收到通知的模块可向 CarPowerManager 注册一个电源政策更改监听器。