Правила в отношении питания

Чтобы аппаратные и программные компоненты (например, дисплей, аудио и голосовое взаимодействие) включались и отключались по мере необходимости, AAOS предоставляет правила энергопотребления, которые состоят из набора ожидаемых состояний включения и отключения для аппаратных и программных компонентов. VHAL или системные сервисы поставщика с привилегиями могут применять новую политику питания при переходе в другое состояние питания Android или при выполнении условий, которые они ожидают.

Применять правила энергопотребления можно в состояниях Wait for VHAL, On и Pre Shutdown Prepare (иногда с некоторыми ограничениями). В отличие от вариантов "Ожидание VHAL" и "Включено", для группы правил энергопотребления нельзя настроить правило энергопотребления по умолчанию для этапа подготовки к отключению. На основном этапе подготовки к выключению работает режим гаража, и его не должны нарушать изменения состояния питания. Хотя обычное правило питания применить нельзя, на этапе подготовки к завершению работы применяется специальное правило питания – системное правило питания под названием без взаимодействия с пользователем.

Состояние питания AAOS

Устройства AAOS работают по следующей схеме:

Диаграмма состояний питания AAOS

Рисунок 1. Диаграмма состояний питания AAOS.

Ниже описаны все возможные состояния питания.

Значение Описание
Отключено
  • На процессор приложений, память и периферийные устройства не подается питание.
Ожидание VHAL
  • Когда водитель взаимодействует с автомобилем (например, открывает дверь), VMCU подает питание на AP, память и периферийные устройства.
  • AAOS переходит из одного из трех состояний (Off, Suspend-to-RAM (STR, Wait for VHAL to finish)) и затем входит в состояние Wait for VHAL, в котором ожидает координации с VHAL.
Включено
  • VHAL дает AAOS команду перейти в состояние "Включено". В этом состоянии AAOS полностью запущена и взаимодействует с водителем.
  • Дисплей управляется правилами энергопотребления, а не вызовами Android для включения и отключения дисплея на других типах устройств.
Подготовка к отключению
  • Когда водитель останавливает автомобиль, VHAL дает AAOS команду перейти в режим Shutdown Prepare (Подготовка к выключению), который начинается с этапа Pre Shutdown Prepare (Предварительная подготовка к выключению), а затем переходит к этапу Shutdown Prepare (Подготовка к выключению). На основном этапе дисплей и аудио выключены, а AAOS не взаимодействует с водителем. Система Android работает и может обновлять приложения и ОС. После завершения всех обновлений система Android переходит в режим ожидания завершения VHAL.
Дождитесь завершения работы VHAL
  • AAOS сообщает VHAL, что ее можно отключить. Микроконтроллер автомобиля (VMCU) должен перевести систему на чипе (SoC) в режим глубокого сна и отключить питание от процессора приложений (AP). После этого AAOS переходит в состояние STR, хотя никакой код не выполняется.
  • Если VHAL не завершится и водитель вернется, стереосистема должна перейти непосредственно в режим ожидания VHAL.
Приостановка с сохранением в ОЗУ (STR)
  • Автомобиль и AP выключены, код не выполняется, но питание ОЗУ AP поддерживается.
Режим гибернации (STD)
  • Автомобиль и AP выключены, код не выполняется, питание не подается на процессор и ОЗУ AP.

Как задаются правила управления питанием?

Разработчики определяют правила энергопотребления в файле /vendor/etc/automotive/power_policy.xml, который:

  • Определяет правила энергопотребления.
  • Определяет группы правил энергопотребления, которые включают правила энергопотребления по умолчанию и автоматически применяются при переходе в другое состояние питания.
  • Переопределяет правила питания системы.

Правила в отношении питания

Правила энергопотребления состоят из набора ожидаемых состояний питания аппаратных и программных компонентов. AAOS поддерживает следующие компоненты в правилах энергопотребления:

АУДИО
МУЛЬТИМЕДИА
ДИСПЛЕЙ
BLUETOOTH
WIFI
CELLULAR
ETHERNET
PROJECTION
NFC
INPUT
VOICE_INTERACTION
VISUAL_INTERACTION
TRUSTED_DEVICE_DETECTION
LOCATION
MICROPHONE
CPU

Поставщики также могут определять собственные компоненты питания для использования с правилами питания. Определите специальные компоненты питания в том же XML-файле, что и правила питания, как в следующем примере:

<customComponents>
  CUSTOM_COMPONENT_1000
  CUSTOM_COMPONENT_SPECIAL_SENSOR
  CUSTOM_COMPONENT_AUX_INPUT
</customComponents>

Группа правил энергопотребления

Группа правил энергопотребления определяет правила по умолчанию, которые автоматически применяются при переходе в другое состояние питания. Поставщики могут задать правила энергопотребления по умолчанию для состояний "Ожидание VHAL" и "Включено".

Правила в отношении питания системы

AAOS поддерживает два правила питания системы: без взаимодействия с пользователем и подготовка к приостановке. Правило энергопотребления системы применяется, когда устройство переходит в режим без звука, режим гаража, спящий режим с сохранением данных в ОЗУ или спящий режим с сохранением данных на диск.

В таблицах ниже описано поведение каждого компонента в соответствии с системной политикой энергопотребления. Разработчики могут переопределить обнаружение Bluetooth, NFC и надежных устройств в системном правиле питания без взаимодействия с пользователем. Переопределения применяются в /vendor/etc/automotive/power_policy.xml.

без взаимодействия с пользователем;

Поведение системного правила управления питанием без взаимодействия с пользователем описано в таблице ниже.

Компоненты Состояние питания Настраиваемый
Аудио Отключено Нет
Мультимедиа Отключено Нет
Экран Отключено Нет
Bluetooth Отключено Да
Wi-Fi Включено Нет
Мобильная сеть Включено Нет
Ethernet Включено Нет
Проекция Отключено Нет
NFC Отключено Да
Ввод Отключено Нет
Ассистент Отключено Нет
Взаимодействие с пользователем Отключено Нет
Обнаружение надежных устройств при входе пользователя в аккаунт Включено Да
Местоположение Отключено Нет
Микрофон Отключено Нет
ЦП Включено Нет

подготовка к блокировке

Поведение системного правила управления питанием suspend prep описано в таблице ниже.

Компоненты Состояние питания Настраивается производителем оригинального оборудования
Аудио Отключено Нет
Мультимедиа Н/Д Нет
Экран Н/Д Нет
Bluetooth Отключено Нет
Wi-Fi Отключено Нет
Мобильная сеть Н/Д Нет
Ethernet Н/Д Нет
Проекция Н/Д Нет
NFC Н/Д Нет
Ввод Н/Д Нет
Ассистент Н/Д Нет
Взаимодействие с пользователем Н/Д Нет
Обнаружение надежных устройств при входе пользователя в аккаунт Н/Д Нет
Местоположение Отключено Нет
Микрофон Отключено Нет
ЦП Отключено Нет

Взаимодействие с VHAL

Демон правил энергопотребления автомобиля, работающий на системном уровне, подписывается на два свойства, чтобы получать запросы от VHAL:

  • POWER_POLICY_REQ VHAL записывает идентификатор правила энергопотребления в это свойство.
  • POWER_POLICY_GROUP_REQ VHAL записывает в это свойство идентификатор группы правил энергопотребления.

Текущую политику энергопотребления в системе могут менять не только модули VHAL. В этом случае демон правил питания автомобиля обновляет свойство CURRENT_POWER_POLICY, чтобы уведомить VHAL об изменении.

Взаимодействие с нативными процессами

Сервис CarPowerManagementService (CPMS) делегирует управление правилами энергопотребления демону правил энергопотребления автомобиля. Демон является единственным источником достоверных данных о правилах питания в системе. Демон правил энергопотребления автомобиля управляет состоянием правил энергопотребления и уведомляет CPMS, VHAL и других встроенных клиентов об изменениях.

Демон правил питания автомобиля экспортирует интерфейсы 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.
     * @throws IllegalStateException if the current policy is not set.
     */
    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.
     * @throws IllegalArgumentException if the componentId is invalid.
     */
    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.
     * @throws IllegalArgumentException if the callback is already registered.
     * @throws IllegalStateException if the callback is dead.
     */
    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.
     * @throws IllegalArgumentException if the callback is not registered.
     */
    void unregisterPowerPolicyChangeCallback(in ICarPowerPolicyChangeCallback callback);

    /**
     * Applies the power policy.
     *
     * 

{@code policyId} should be one of power policy IDs defined in * {@code /vendor/etc/automotive/power_policy.xml} or predefined system power policies. * * @param policyId ID of power policy. * @throws IllegalArgumentException if {@code policyId} is invalid. */ void applyPowerPolicy(in @utf8InCpp String policyId); /** * Sets the current power policy group. * *

{@code policyGroupId} should be one of power policy group IDs defined in * {@code /vendor/etc/automotive/power_policy.xml}. * * @param policyGroupId ID of power policy group. * @throws IllegalArgumentException if {@code policyGroupId} is invalid. */ void setPowerPolicyGroup(in @utf8InCpp String policyGroupId); }

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.