Характеристики мощности HAL

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

IPower.hal 1.0 предоставляет интерфейс для передачи подсказок по питанию и отчета о совокупных данных о показателях состояния сна подсистемы. В Android 10 и более поздних версиях функция сбора совокупной статистики находится в API-интерфейсах сбора статистики мощности IPowerStats.hal и обеспечивает способ получения данных об энергопотреблении на устройстве. Это заменяет часть интерфейса IPower.hal , предназначенную для сбора совокупной статистики, для более четкого разделения функций.

Показания службы IPowerStats не являются периодическими. Они происходят в ключевые моменты, например, когда батарея разряжается на 1%. Показания снимаются реже, когда разряд батареи низкий, и чаще, когда он высокий. Данные могут быть отправлены обратно на серверы и могут использоваться в отчетах об ошибках для анализа и сортировки. Это поддерживает текущие усилия по снижению энергопотребления и увеличению срока службы батареи.

IPower.hal и IPowerStats.hal

Интерфейсы IPower.hal и IPowerStats.hal доступны в Android 10, но функция сбора статистики IPower.hal доступна только из интерфейса IPowerStats.hal . Функциональность IPowerStats.hal включает API-интерфейсы для сбора и использования данных, собранных в результате измерений мощности на устройстве для поддерживаемых устройств:

  • Выполняет измерения энергии на уровне рельсов как для низкочастотных ( getRailInfo ), так и для высокочастотных ( streamEnergyData ) клиентов и сообщает о накопленной энергии с момента загрузки.
  • Сообщает информацию, относящуюся к каждому поддерживаемому PowerEntity , для которого доступны данные. PowerEntity — это подсистема платформы, периферийное устройство или домен питания, который влияет на общее энергопотребление устройства.
  • Сообщает набор состояний объекта мощности ( getPowerEntityStateInfo ), для которых указанные объекты предоставляют данные о местонахождении, а затем сообщает накопленные данные для каждого указанного PowerEntity .

API-интерфейсы IPowerStats.hal используются следующими клиентами:

  • Statsd для сбора показателей энергопотребления по каждому каналу.
  • Perfetto для корреляции энергопотребления с активностью процессора.
  • Batterystats , чтобы улучшить атрибуцию батареи за счет использования измеренных данных, а не оценки потребления батареи на основе предопределенных констант в power_profile.xml.

В Android 10 и более поздних версиях производитель устройства может выбирать между функциями IPower.hal и IPowerStats.hal , но все клиенты должны вернуться к IPower.hal , если IPowerStats.hal не реализован.

Варианты реализации IPowerStats.hal

В версиях с Android 7 по Android 9 доступны только функции IPower.hal Устройства, обновленные до Android 10, должны иметь аппаратную подсистему мониторинга питания или другие доступные средства для мониторинга и записи статистики энергопотребления. Некоторые SoC собирают для вас статистику энергопотребления, или вы можете получить информацию о местонахождении энергообъекта с помощью программного обеспечения. Аппаратное обеспечение для мониторинга энергопотребления необходимо только для поддержки getRailInfo() , getEnergyData() streamEnergyData() .

Если вы реализуете IPowerStats.hal без оборудования для мониторинга энергопотребления, getRailInfo(), getEnergyData() streamEnergyData() возвращают NOT_SUPPORTED . Аналогично, getPowerEntityInfo(), getPowerEntityStateInfo() и getPowerEntityStateResidencyData() также могут возвращать NOT_SUPPORTED если он не предназначен для использования.

Примеры данных, возвращаемых API-интерфейсами мониторинга железных дорог, включают:

  • Шина питания дисплея потребляла X мкВт.
  • Шина питания модема потребляла Y мкВт.

Примеры данных, возвращаемых API-интерфейсами спящего режима подсистемы, включают:

  • Модем спал в течение X мс.
  • SoC находился в состоянии сбоя питания в течение Y мс.
  • Графический процессор находился в состоянии ожидания в течение Z мс.

Используйте аппаратную подсистему мониторинга питания.

Если в конструкции вашего устройства имеется аппаратная подсистема мониторинга энергопотребления, реализуйте IPowerStats.hal , создав один узел sysfs , из которого PowerStats.hal сможет анализировать данные, или создав набор системных вызовов типа ioctl .

Вы должны реализовать драйвер ядра таким образом, чтобы предотвратить переполнение аккумулятора. Используемый алгоритм зависит от конструкции вашей уникальной аппаратной подсистемы контроля энергопотребления, которая должна обеспечивать измерения как мгновенного, так и среднего напряжения и тока шины. Драйвер ядра должен собирать эти данные таким образом, чтобы не очищать аккумуляторы энергии, и он должен сохранять накопленные данные об энергии для каждого субрельса с момента загрузки в виде 64-битной переменной, которая увеличивается в зависимости от показаний энергии из каждый запрос аккумулятора.

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

Руководство по проектированию

  • Поддерживайте низкую задержку (максимум 1 мс) при чтении с узла sysfs или выполнении системных вызовов.
  • Убедитесь, что поддержка функций статистики не приводит к заметному увеличению энергопотребления:
    • Не увеличивайте время пробуждения точки доступа (AP) и/или подсистемы для отслеживания таких параметров, как время, проведенное в спящем режиме.
    • По возможности передавайте статистику между процессором приложений и прошивкой вместе с другим трафиком.
  • При необходимости подсистема может использовать следующие функции драйвера:
    • Внутреннее кэширование данных, чтобы избежать задержек и пробуждений за счет слегка устаревших данных.
    • Выполнение экстраполяции, когда подсистема находится в режиме сна, чтобы предоставить обновленное время сна без пробуждения подсистемы.

Выбирайте компоненты, подсистемы и статистику

При выборе компонентов или подсистем для сбора данных IPowerStats.hal выберите на устройстве все, что потребляет значительный ток (5 мА или более) или поддерживает несколько режимов энергопотребления, например следующие:

  • Отдельные подсистемы SoC.
  • Подсистемы, частично или полностью находящиеся вне SoC, например Wi-Fi, процессор изображений или процессор безопасности.
  • Периферийные устройства, такие как мощные светодиоды и камеры.
  • Домены питания, использующие разные режимы (например, домен питания для SoC в целом).

Кастомизация

Эту дополнительную функцию можно настроить. Разработайте варианты использования и настройте свое использование:

  • Решите, какие рельсы и как часто измерять.
  • Решите, когда читать данные и как их интерпретировать.
  • Решите, какое действие и когда предпринять, основываясь на ваших данных.

Проверка

Тесты VTS гарантируют соответствие требованиям Android. Комментарии в IPowerStats.hal используются для проверки соответствия устройства требованиям.

Например, если вы вызываете getRailInfo() и он ничего не возвращает, тест VTS завершится неудачно, поскольку вы не получили информацию о отслеживаемых рельсах или возвращенный статус SUCCESS . Аналогично, если вы получили информацию о железной дороге, но она сопровождалась ответом NON_SUPPORTED или FILE_SYSTEM_ERROR , это тоже ошибка. VTS проверяет соответствие спецификации производителя устройства в файле HAL, используя требования в комментариях IPower.hal и IPowerStats.hal. Ниже приведен пример комментариев, используемых при тестировании VTS:

/**
* Rail information:
* Reports information related to the rails being monitored.
*
* @return rails Information about monitored rails.
* @return status SUCCESS on success or NOT_SUPPORTED if
* feature is not enabled or FILESYSTEM_ERROR on filesystem nodes
* access error.
*/
getRailInfo()
generates(vec<e;RailInfo>e; rails, Status status);