Управление энергопотреблением

Для поддержки управления питанием конкретного автомобиля Android предоставляет службу CarPowerManagementService и интерфейс CarPowerManager .

Смена состояний инициируется главным блоком управления автомобилем (VMCU). Для связи с VMCU интеграторам необходимо реализовать несколько компонентов. Интеграторы отвечают за интеграцию с уровнем абстракции аппаратного обеспечения транспортного средства (VHAL) и реализацией ядра. Интеграторы также несут ответственность за отключение источников пробуждения и обеспечение того, чтобы отключения не откладывались на неопределенный срок.

Терминология

В этом документе используются следующие термины:

процессор приложений (AP)
Часть системы на кристалле (SoC) .
Пакет поддержки платы (BSP)
Уровень программного обеспечения, который содержит загрузочную прошивку для конкретного оборудования и драйверы устройств, которые позволяют встроенной операционной системе функционировать в заданной аппаратной среде (материнской плате), интегрированной со встроенной операционной системой.
КарПауэрМенеджер (CPM)
Предоставляет приложениям API для регистрации изменений состояния питания.
Служба CarPowerManagementService (CPMS)
Реализует конечный автомат мощности автомобиля, взаимодействует с VHAL и выполняет заключительные вызовы suspend() и shutdown() .
CarPowerPolicyDaemon (CPPD)
Предоставляет интерфейсы AIDL для собственных процессов для регистрации прослушивателя политики электропитания.
ввод или вывод общего назначения (GPIO)
Цифровой сигнальный контакт общего назначения.
уровень аппаратной абстракции (HAL)
Программный уровень, с которым должны взаимодействовать все остальные модули более высокого уровня, чтобы получить доступ к аппаратным функциям.
впадать в спячку
Также называется Suspend-to-Disk (S2D/S4). SoC переводится в режим питания S4 (спящий режим), содержимое оперативной памяти записывается на энергонезависимый носитель (например, флэш-память или диск), а вся система выключается.
медиапроцессор (МП)
См. систему на кристалле (SoC) .
Интегральная схема управления питанием (PMIC)
Чип, используемый для управления требованиями к питанию хост-системы.
система на кристалле (SoC)
Главный процессор, работающий под управлением AAOS, обычно поставляется такими производителями, как Intel, MediaTek, Nvidia, Qualcomm, Renesas и Texas Instruments.
приостановить
Также называется Suspend-to-RAM (S2R или STR). SoC переводится в режим питания S3, процессор выключается, а ОЗУ остается включенным.
Транспортное средство HAL (ВХАЛ)
API Android, используемый для взаимодействия с сетью автомобиля. За написание этого модуля отвечает партнер уровня 1 или OEM. Сеть автомобиля может использовать любой физический уровень (например, CAN, LIN, MOST и Ethernet). VHAL абстрагирует эту сеть транспортного средства, чтобы позволить AAOS взаимодействовать с транспортным средством.
Процессор интерфейса автомобиля (VIP)
См. MCU автомобиля.
Главный блок управления автомобилем (VMCU)
Микроконтроллер, обеспечивающий интерфейс между сетью автомобиля и SoC. SoC взаимодействует с VMCU через сигналы USB, UART, SPI и GPIO.

Системный дизайн

В этом разделе описывается, как AAOS представляет состояние питания процессора приложения и какие модули реализуют систему управления питанием. В этом материале также описывается, как эти модули работают вместе и как обычно происходят переходы между состояниями.

Машина состояния мощности автомобиля

AAOS использует конечный автомат для представления состояния питания точки доступа. Конечный автомат предоставляет состояния, показанные ниже:

Машина состояния мощности автомобиля

Рисунок 1. Конечный автомат мощности автомобиля.

Наиболее распространенные переходы выделены синим цветом. Это состояния и общие переходы:

  • Приостановка в оперативной памяти. Автомобиль и SoC выключены. Никакой код не выполняется. Питание подается в ОЗУ SoC.
  • Подождите ВХАЛ. Когда водитель взаимодействует с транспортным средством, например, открывая дверь, VMCU подает питание на SoC. AAOS возобновляет работу из режима Suspend-to-RAM и переходит в режим ожидания VHAL, где ожидает координации с VHAL.
  • На. VHAL сообщает AAOS перейти в состояние «Включено». В этом состоянии AAOS полностью работает и взаимодействует с драйвером.
  • Выключение. Подготовьтесь. Когда водитель завершает вождение, VHAL сообщает AAOS о необходимости перейти в режим подготовки к завершению работы. В этом состоянии дисплей и звук выключены, а AAOS не взаимодействует с драйвером. Система Android все еще работает, и вы можете бесплатно обновлять приложения и систему Android. Когда обновления, если таковые имеются, будут завершены, система Android перейдет в режим ожидания завершения VHAL.
  • Дождитесь завершения VHAL. В этот момент AAOS сообщает VHAL о готовности к отключению. Ожидается, что VMCU переведет SoC в глубокий сон и отключит питание процессора приложения. В этом случае AAOS находится в состоянии Suspend-to-RAM, хотя никакой код не выполняется.

Модули управления питанием

Система управления питанием состоит из следующих модулей:

Имя модуля Описание
CarPowerManager API Java или C++.
АвтомобильЭнергияМенеджментСервис Координирует переходы состояний питания.
АвтомобильВластьПолитикаДемон Общается с собственными клиентами политики электропитания.
Автомобиль ХАЛ Интерфейс к VMCU.
Ядро Приостановить реализацию в ОЗУ или на диске.

Функция глубокого сна/гибернации (приостановка работы Android в оперативной памяти/диске) реализована в ядре. Эта функция доступна в пространстве пользователя в виде специального файла, расположенного в /sys/power/state . AAOS приостанавливается записью mem или на disk этого файла.

CPMS координирует состояние электропитания с другими службами и HAL. CPMS реализует описанный выше конечный автомат и отправляет уведомления каждому наблюдателю, когда происходит переход состояния электропитания. Эта служба также использует VHAL для отправки сообщений на оборудование.

CPPD управляет политикой электропитания до тех пор, пока CPMS не возьмет на себя управление. Он также отправляет уведомления об изменении политики электропитания собственным прослушивателям.

Некоторые свойства определены в VHAL. Для связи с VMCU CPMS считывает и записывает эти свойства. приложения могут использовать интерфейс, определенный в CPM, для отслеживания изменений состояния питания. Этот интерфейс также позволяет приложениям регистрировать прослушиватели политики электропитания . Этот API можно вызывать из Java, и он помечен аннотацией @hide/@System API, что означает, что он доступен только привилегированным приложениям. Взаимосвязь между этими модулями, приложениями и службами показана ниже:

Справочная схема силовых компонентов

Рисунок 2. Справочная схема силовых компонентов.

Последовательность сообщений

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

Войдите в глубокий сон

Только VMCU может инициировать глубокий сон. После запуска глубокого сна VMCU отправляет уведомление в CPMS через VHAL. CPMS меняет состояние на SHUTDOWN PREPARE и передает этот переход состояния всем наблюдателям (приложениям и службам, которые контролируют CPMS), вызывая метод onStateChanged() с новым идентификатором состояния, предоставленным CPM.

CPM является посредником между приложениями/сервисами и CPMS. Метод onStateChanged() для приложений/служб вызывается синхронно в методе onStateChanged() CPM. Большинству приложений и служб необходимо завершить подготовку перед возвратом из этого вызова. Привилегированным службам разрешено продолжить подготовку асинхронно после возврата к PRE_SHUTDOWN_PREPARE , SUSPEND_ENTER , POST_SUSPEND_ENTER . В этом случае привилегированная служба должна вызвать функцию Complete() для предоставленного объекта CompletablePowerStateChangeFuture , когда она завершит свою подготовку. Обратите внимание, что асинхронная подготовка не разрешена для SHUTDOWN_PREPARE . Прежде чем DEEP_SLEEP_ENTRY будет отправлен на VHAL, CPMS периодически отправляет запросы на отсрочку завершения работы на VHAL.

Когда все объекты CPM завершили подготовку к завершению работы, CPMS отправляет AP_POWER_STATE_REPORT в VHAL, который затем уведомляет VMCU о том, что точка доступа готова к приостановке. CPMS также вызывает свой метод suspend, который приостанавливает работу ядра.

Описанная выше последовательность проиллюстрирована ниже:

Войдите в глубокий сон

Рисунок 3. Войдите в глубокий сон.

Интерфейсы программирования, предоставляемые CPM

В этом разделе описывается API Java, предоставляемый CPM для системных приложений и служб. Этот API позволяет системному программному обеспечению:

  • Отслеживайте изменения состояния питания точки доступа.
  • Применяйте политику власти.

Используйте эти шаги для вызова API, предоставляемых CPM:

  1. Чтобы получить экземпляр CPM, вызовите Car API.
  2. Вызовите соответствующий метод объекта, созданного на шаге 1.

Создайте объект CarPowerManager.

Чтобы создать объект CPM, вызовите метод getCarManager() объекта Car. Этот метод представляет собой фасад, используемый для создания объектов 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 Войдите во включенное состояние. Система полностью работоспособна.
STATE_SHUTDOWN_CANCELLED Выключение отменяется, и состояние питания возвращается в нормальное состояние.
STATE_SHUTDOWN_ENTER Ожидается, что приложения будут очищены и готовы к завершению работы.
STATE_POST_SHUTDOWN_ENTER Подготовка к отключению завершена, и VMCU готов к отключению. Войдите в состояние выключения.
STATE_PRE_SHUTDOWN_PREPARE Запрошен процесс завершения работы, но CPMS еще не запускает его. Дисплей и звук все еще включены
STATE_SHUTDOWN_PREPARE В течение этого периода может работать режим гаража.
STATE_SUSPEND_ENTER Ожидается, что приложения будут очищены и готовы к приостановке в оперативной памяти.
STATE_POST_SUSPEND_ENTER Подготовка к приостановке в ОЗУ завершена, и VMCU готов к приостановке в ОЗУ. Войдите в состояние ожидания.
STATE_SUSPEND_EXIT Выход из режима ожидания или возобновление после отмены режима ожидания.
STATE_HIBERNATION_ENTER Ожидается, что приложения очистятся и будут готовы к переходу в спящий режим.
STATE_POST_HIBERNATION_ENTER Подготовка к переходу в спящий режим завершена, и VMCU готов к переходу в спящий режим. Войдите в состояние гибернации.
STATE_HIBERNATION_EXIT Выйдите из спящего режима или возобновите работу из отмененного спящего режима.
STATE_WAIT_FOR_VHAL Система запускается, но ожидает установления связи с VHAL, прежде чем перейти в состояние ВКЛ.

Отмена регистрации CarPowerStateListener

Чтобы отменить регистрацию всех объектов-прослушивателей, зарегистрированных в CPM, вызовите clearListener :

powerManager.clearListener();

Системная интеграция в вашей реализации Android

Интеграторы несут ответственность за следующие пункты:

  • Реализация интерфейса ядра для приостановки работы Android.
  • Реализация функций VHAL для:
    • Распространите инициацию приостановки или выключения автомобиля на Android.
    • Отправьте сообщение о готовности к выключению с Android на автомобиль.
    • Инициируйте завершение работы или приостановку работы Android через интерфейс ядра Linux.
  • Убедитесь, что все источники пробуждения отключены, когда устройство находится в режиме ожидания.
  • Убедитесь, что приложения закрываются достаточно быстро, чтобы не откладывать процесс завершения работы на неопределенный срок.
  • Убедитесь, что BSP включает (или выключает) компоненты устройства в соответствии с политикой электропитания, чтобы не блокировать приостановку или спящий режим.

Интерфейс ядра: /sys/power/state

AAOS переводит устройство в режим ожидания, когда приложение или служба записывает mem для приостановки в ОЗУ или disk для приостановки на диск в файл, расположенный по адресу /sys/power/state . Интегратор должен предоставить функцию, которая отслеживает этот файл и переводит Linux в состояние приостановки питания. Эта функция может отправлять GPIO в VMCU, чтобы уведомить VMCU о полном выключении устройства. Интегратор также несет ответственность за устранение любых условий конкуренции между VHAL, отправляющим последнее сообщение в VMCU, и переходом системы в режим приостановки или завершения работы.

Ответственность ВХАЛ

VHAL обеспечивает интерфейс между сетью автомобиля и Android. ВХАЛ:

  • Передаёт инициацию приостановки или выключения автомобиля на Android.
  • Отправляет сообщение о готовности к выключению с Android на автомобиль.
  • Инициирует завершение работы или приостановку работы Android через интерфейс ядра Linux.

Когда CPMS сообщает VHAL о своей готовности к завершению работы, VHAL отправляет сообщение о готовности к завершению работы в VMCU. Обычно сообщение передают встроенные периферийные устройства, такие как UART, SPI и USB. После отправки сообщения CPMS вызывает команду ядра для приостановки или выключения устройства. Прежде чем сделать это, VHAL или BSP могут переключить GPIO, чтобы проинструктировать VMCU о том, что отключить питание устройства можно безопасно.

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

Имя Описание
AP_POWER_STATE_REPORT Android сообщает о переходах состояний в VMCU с помощью этого свойства, используя значения перечисления VehicleApPowerStateReport.
AP_POWER_STATE_REQ VMCU использует это свойство, чтобы указать Android переходить в разные состояния питания, используя значения перечисления VehicleApPowerStateReq.

AP_POWER_STATE_REPORT

Используйте это свойство, чтобы сообщить о текущем состоянии управления питанием Android. Это свойство содержит два целых числа:

  • int32Values[0] : перечисление VehicleApPowerStateReport текущего состояния.
  • int32Values[1] : время в миллисекундах для отсрочки, перехода в режим сна или завершения работы. Значение этого значения зависит от первого значения.

Первое значение может принимать одно из следующих значений. VehicleApPowerStateReport.aidl содержит более конкретные описания, которые хранятся в файле hardware/interfaces/automotive/vehicle/aidl/android/hardware/automotive/vehicle .

Имя значения Описание Второе значение
WAIT_FOR_VHAL Точка доступа запускается и ей необходимо установить связь с VHAL.
DEEP_SLEEP_ENTRY AP входит в состояние глубокого сна. VMCU должен снова включить точку доступа по истечении времени, указанного во втором значении. Должно быть установлено
DEEP_SLEEP_EXIT Точка доступа выходит из состояния глубокого сна.
HIBERNATION_ENTRY Точка доступа переходит в состояние гибернации. VMCU должен снова включить точку доступа по истечении времени, указанного во втором значении. Должно быть установлено
HIBERNATION_EXIT Точка доступа выходит из состояния гибернации.
SHUTDOWN_POSTPONE Android не готов к выключению. VMCU должен подождать время, указанное во втором значении, прежде чем выключить точку доступа. Android может запросить дополнительную отсрочку, отправив дополнительные отчеты SHUTDOWN_POSTPONE. Должно быть установлено
SHUTDOWN_PREPARE Android готовится к выключению. Должно быть установлено
SHUTDOWN_START AP готова к отключению. VMCU должен снова включить точку доступа по истечении времени, указанного во втором значении. (VMCU не требуется для поддержки функции включения по времени.) Должно быть установлено
SHUTDOWN_CANCELLED Android перестает готовиться к завершению работы и переходит к WAIT_FOR_VHAL.
НА Андроид работает нормально.

Состояние может устанавливаться автономно или в ответ на запрос через VMCU.

AP_POWER_STATE_REQ

Это свойство отправляется VMCU для перевода Android в другое состояние питания и содержит два целых числа:

  • int32Values[0] : значение перечисления VehicleApPowerStateReq , которое представляет новое состояние, в которое осуществляется переход.
  • int32Values[1] : значение перечисления VehicleApPowerStateShutdownParam . Это значение отправляется только для сообщения SHUTDOWN_PREPARE и передает Android содержащиеся в нем параметры.

Первое целочисленное значение представляет новое состояние, в которое должен перейти Android. Семантика определена в VehicleApPowerStateReq.aidl и представлена ​​ниже:

Имя значения Описание
НА AP должен начать полноценную работу.
SHUTDOWN_PREPARE Точка доступа должна подготовиться к отключению. Второе значение указывает, разрешено ли точке доступа откладывать выключение и должна ли точка доступа ожидать выключения или перехода в глубокий сон.
CANCEL_SHUTDOWN Точка доступа должна прекратить подготовку к выключению и подготовиться к включению.
ЗАКОНЧЕННЫЙ Точка доступа будет отключена или приостановлена.

VehicleApPowerStateShutdownParam определяется в VehicleApPowerStateShutdownParam.aidl . Это перечисление имеет следующие элементы:

Имя значения Описание
CAN_SLEEP Точка доступа может перейти в глубокий сон вместо полного выключения. Отсрочка допускается.
CAN_HIBERNATE Точка доступа может перейти в спящий режим вместо полного выключения. Отсрочка допускается.
SHUTDOWN_ONLY АП должен отключиться. Отсрочка допускается. Глубокий сон не допускается.
СПАТЬ_СРАЗУ Точка доступа может войти в глубокий сон, но должна либо перейти в режим сна, либо немедленно отключиться. Отсрочка не допускается.
HIBERNATE_IMMEDIATELY Точка доступа может перейти в режим ожидания на диске, но должна либо перейти в спящий режим, либо немедленно завершить работу. Отсрочка не допускается.
SHUTDOWN_IMMEDIATELY Точка доступа должна немедленно отключиться. Отсрочка не допускается. Глубокий сон не допускается.

Источники пробуждения

Интегратор должен отключить соответствующие источники пробуждения, когда устройство находится в режиме ожидания. Общие источники пробуждения включают сердцебиение, модем, Wi-Fi и Bluetooth. Единственным допустимым источником пробуждения должно быть прерывание от VMCU для пробуждения SoC. Это предполагает, что VMCU может прослушивать модем на предмет событий удаленного пробуждения (например, удаленного запуска двигателя). Если эта функция передается точке доступа, необходимо добавить еще один источник пробуждения для обслуживания модема.

Программы

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. Справочная диаграмма объекта.