Управление питанием

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

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

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

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

процессор приложений (AP)
Часть системы на кристалле (SoC) .
Пакет поддержки платы (BSP)
Программный слой, содержащий специфичные для оборудования загрузочные микропрограммы и драйверы устройств, позволяющие встроенной операционной системе функционировать в данной аппаратной среде (материнская плата), интегрированный со встроенной операционной системой.
CarPowerManager (CPM)
Предоставляет API для приложений, позволяющий регистрироваться при изменении состояния питания.
CarPowerManagementService (CPMS)
Координирует переходы состояний питания, взаимодействует с VHAL для управления состоянием питания и выполняет окончательные вызовы для приостановки и выключения.
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 (VHAL)
API Android используется для взаимодействия с автомобильной сетью. За разработку этого модуля отвечает партнер первого уровня или OEM-производитель. Автомобильная сеть может использовать любой физический уровень (например, CAN, LIN, MOST и Ethernet). VHAL абстрагирует эту автомобильную сеть, позволяя AAOS взаимодействовать с автомобилем.
Интерфейсный процессор автомобиля (VIP)
См. Микроконтроллер транспортного средства.
Главный блок управления транспортным средством (VMCU)
Микроконтроллер, обеспечивающий интерфейс между автомобильной сетью и SoC. SoC взаимодействует с VMCU через сигналы USB, UART, SPI и GPIO.

Проектирование системы

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

Автомобильный энергетический конечный автомат

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

Автомобильный энергетический конечный автомат

Рисунок 1. Условный автомат управления автомобилем.

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

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

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

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

Название модуля Описание
CarPowerManager API на Java или C++.
CarPowerManagementService Координирует переходы состояний питания и делегирует управление политикой энергопотребления демону CarPowerPolicyDaemon.
CarPowerPolicyDaemon Управляет политиками энергоснабжения и взаимодействует с клиентами, использующими собственные политики энергоснабжения.
Транспортное средство HAL Интерфейс для подключения к VMCU.
Ядро Приостановка работы с сохранением данных в ОЗУ или на диск.

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

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

CPPD является источником достоверной информации о политиках управления питанием. Он управляет политиками управления питанием на протяжении всего жизненного цикла устройства и уведомляет CPMS, VHAL и другие собственные обработчики об изменениях в политиках управления питанием. CPMS делегирует запросы на изменение политик управления питанием CPPD.

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

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

Рисунок 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

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

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

Выполните следующие шаги для вызова API, предоставляемых CPM:

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

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

Для создания объекта CPM вызовите метод getCarManager() объекта Car. Этот метод является фасадом, используемым для создания объектов CPM. В качестве аргумента для создания объекта CPM укажите android.car.Car.POWER_SERVICE .

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_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_WAIT_FOR_VHAL Система запускается, но ожидает установления связи с VHAL, прежде чем перейти в состояние «ВКЛ».

CarPowerStateListener unregistration

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

powerManager.clearListener();

Интеграция системы в вашу Android-реализацию

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

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

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

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

ответственность VHAL

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

  • Передает информацию о начале приостановки или выключения системы с автомобиля на 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 Точка доступа переходит в режим глубокого сна. VMCU должна снова включить точку доступа по истечении времени, указанного во втором значении. Необходимо установить
DEEP_SLEEP_EXIT АП выходит из состояния глубокого сна.
ВСТУПЛЕНИЕ В СПЯЧКУ Точка доступа переходит в режим гибернации. VMCU должна снова включить точку доступа по истечении времени, указанного во втором значении. Необходимо установить
ВЫХОД ИЗ СПЯЧКИ AP выходит из состояния спячки.
ОТЛОЖИТЬ ВЫКЛЮЧЕНИЕ Android не готов к выключению. VMCU должен подождать время, указанное во втором значении, прежде чем выключать точку доступа. Android может запросить дополнительную отсрочку, отправив дополнительные отчеты SHUTDOWN_POSTPONE. Необходимо установить
ПОДГОТОВКА К ОТКЛЮЧЕНИЮ Android готовится к завершению работы. Необходимо установить
SHUTDOWN_START Точка доступа готова к выключению. VMCU должен снова включить точку доступа по истечении времени, указанного во втором значении. (Поддержка функции включения по таймеру не является обязательной для VMCU.) Необходимо установить
ОТМЕНЕНО ОТКЛЮЧЕНИЕ Android прекращает подготовку к завершению работы и перейдет в состояние WAIT_FOR_VHAL.
НА Android работает в обычном режиме.

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

AP_POWER_STATE_REQ

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

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

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

Название значения Описание
НА Точка доступа должна начать полноценную работу.
ПОДГОТОВКА К ОТКЛЮЧЕНИЮ Точка доступа должна быть готова к выключению. Второе значение указывает, разрешено ли точке доступа откладывать выключение и следует ли ожидать выключения или перехода в режим глубокого сна.
ОТМЕНА_ОТКЛЮЧЕНИЯ Агентству скорой помощи следует прекратить подготовку к отключению и начать работу.
ЗАКОНЧЕННЫЙ Теперь работа AP будет приостановлена ​​или отключена.

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

Название значения Описание
CAN_SLEEP Система AP может переходить в режим глубокого сна вместо полного отключения. Допускается отсрочка.
CAN_HIBERNATE Точка доступа может перейти в спящий режим вместо полного отключения. Допускается отсрочка.
ТОЛЬКО ДЛЯ ОТКЛЮЧЕНИЯ AP следует отключить. Отложить отключение разрешено. Режим глубокого сна не допускается.
СПАТЬ НЕМЕДЛЕННО Аппарат может перейти в фазу глубокого сна, но должен либо немедленно перейти в спящий режим, либо отключиться. Откладывать это решение не допускается.
Впасть в спячку немедленно AP может перейти в режим приостановки с сохранением данных на диск, но должен либо немедленно перейти в режим гибернации, либо выключиться. Откладывать это действие не допускается.
НЕМЕДЛЕННО ОТКЛЮЧИТЕСЬ Точка доступа должна быть немедленно отключена. Откладывать это нельзя. Режим глубокого сна запрещен.

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

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

Приложения

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

Приложение

Каталоги в дереве исходного кода

Содержание Каталог
Код, относящийся к 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. Схема расположения объектов.