Для поддержки управления питанием конкретного автомобиля Android предоставляет службу CarPowerManagementService
и интерфейс CarPowerManager
.
Смена состояний инициируется главным блоком управления автомобилем (VMCU). Для связи с VMCU интеграторам необходимо реализовать несколько компонентов. Интеграторы отвечают за интеграцию с уровнем абстракции аппаратного обеспечения транспортного средства (VHAL) и реализацией ядра. Интеграторы также несут ответственность за отключение источников пробуждения и обеспечение того, чтобы отключения не откладывались на неопределенный срок.
Терминология
В этом документе используются следующие термины:
suspend()
и shutdown()
.Системный дизайн
В этом разделе описывается, как 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:
- Чтобы получить экземпляр CPM, вызовите Car API.
- Вызовите соответствующий метод объекта, созданного на шаге 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. Справочная диаграмма объекта.