Поделиться через


Программно-определяемая батарея

Примечание.

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

Введение

Цель этой статьи — ввести программные батареи (SDB), описать архитектуру Windows SDB и подробные сведения о контрактах Windows и DDI для этой функции.

В этой статье описывается алгоритм SDB простой балансировки возраста для гипотетической системы батареи. За этим следует макет архитектуры и контракт API, необходимый для реализации алгоритма SDB.

Номенклатура

  • BattC — драйвер класса батареи

  • CAD - Драйвер арбитража заряда (CAD) — это драйвер Майкрософт, который арбитражирует мощность между устаревшими USB, USB Type-C и беспроводными источниками зарядки

  • Холодные переключаемые батареи — батареи, которые не могут быть удалены из системы без риска браунаутов или полного сбоя питания

  • Число циклов — количество полных циклов заряда, прошедших батареей, как описано в спецификации ACPI.

  • Горячие переключения батареи — батареи, которые можно безопасно удалить во время работы системы, без каких-либо рисков браунутов

  • HPMI — аппаратный интерфейс Power Manager

  • Неотключаемые батареи с горячей заменой — одна или несколько холодных переключения батарей, установленных в системе

  • Неизменяемые батареи — батареи, которые не предназначены и предназначены для удаления конечным пользователем

Обзор SDB

Здесь можно найти научно-исследовательский документ MSR по программно-определяемым батареям: https://www.microsoft.com/research/wp-content/uploads/2016/02/multibattery_sosp2015.pdf

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

Представьте себе две батареи. Где одна батарея является несъемной батареей, расположенной рядом с SOC , давайте называем эту внутреннюю батарею. Другая батарея является горячей переключаемой батареей, расположенной рядом с съемным клавиатурой- давайте вызовем эту внешнюю батарею.

Система с несколькими батареями

Схема многозарядной системы с внутренними и внешними батареями.

Так как клавиатура подключена отсоединяется в течение определенного периода времени, она заставляет две батареи возрасти по-разному. Это создает область для балансировки возраста батареи и продления периода удобства использования системы, используя простой алгоритм балансировки возраста SDB.

Простой алгоритм балансировки возраста SDB

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

Простой алгоритм балансировки возраста SDB

Схема, иллюстрирующая простой алгоритм балансировки возраста SDB.

Основная идея, лежащая в основе простого алгоритма балансировки возраста, заключается в том, чтобы просто использовать батарею, которая начислила наименьшие числа циклов батареи, как показано в поле принятия решений (2) в блок-схеме выше. Гипотетическая система в этом примере позволяет использовать либо внутренние, либо внешние батареи. Однако это может быть не так для всех систем. Другие системы могут не быть как гибкими или могут иметь электрические ограничения на использование батареи. В таких случаях алгоритм ожидает наилучшей попытки балансировки возраста. Например, рассмотрим следующее.

  1. Система, которая не может поддерживать питание исключительно на внешней батарее (может быть потому, что внешний аккумулятор предназначен только для дополнительного источника питания). Эта система может реализовать простой алгоритм балансировки возраста, одновременно выгрузив внутренние и внешние батареи в блоке обработки (A) в приведенной выше блок-схеме.

  2. Система, требующая использования внешней батареи всякий раз, когда она присутствует (может быть из-за дополнительной нагрузки питания, связанной с сохранением съемной клавиатуры с питанием): эта система может реализовать простой алгоритм балансировки возраста, одновременно выгрузив внутренние и внешние батареи в блоке обработки (B) в приведенной выше блок-схеме.

Простой алгоритм балансировки возраста может использоваться только в том случае, если в внутренней и внешней батареях достаточно заряда для запуска системы, поле принятия решений (1) показывает это условие проверка в приведенной выше блок-схеме. Например, (снова возвращаясь к гипотетической системе), если внешняя батарея не имеет в нем заряда, нет область для балансировки возрастных батарей и поля принятия решений (1) приведет к ветвью "НЕТ".

Изготовитель оборудования может выбрать ограничения и условия, когда простой алгоритм балансировки возраста не ввелся в силу, помимо того, когда внутренние или внешние батареи выходят из питания. Например, изготовитель оборудования может не выполнять балансировку возраста, если:

  1. SoC/Processor работает в режиме высокой производительности
  2. Система является теплово нестабильной

Если простой алгоритм балансировки возраста не используется (из-за одного или нескольких описанных выше условий), логика отменить изменения обратно в частную политику использования батареи OEM, как показано в поле обработки (3) в приведенной выше блок-схеме. Поле процесса (3) — это логическая изготовитель оборудования логики, внося в силу, если SDB не поддерживается.

Адаптация алгоритма SDB для использования с горячей заменой батареи

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

В двух системах батареи, описанных выше, рассмотрим следующую ситуацию:

  1. Ожидается, что пользователь будет использовать систему достаточно долго, пока плата не будет исчерпана как во внутренних, так и во внешних батареях.

  2. Внешний аккумулятор в возрасте больше по сравнению с внутренней батареей.

Когда в этой системе выполняется простой алгоритм балансировки возраста, он попытается очертить заряд, хранящийся во внутренней батарее сначала (на основе условий #1 и #2, перечисленных выше). Когда пользователь решает отключить внешнюю батарею через некоторое время, это приведет к плохому опыту пользователя, так как емкость батареи, доступная для использования, резко уменьшается после отключения внешней батареи, так как внутренняя батарея будет использована.

В системе, отличной от SDB, эта проблема обычно не возникает, так как в большинстве случаев внешний аккумулятор истощается до использования внутренней батареи.

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

Чтобы свести к выводу, что каждый раз, когда пользователь должен использовать систему в течение длительного времени при удалении внешней батареи, оптимально отключить алгоритм SDB и отменить изменения использовать политику использования батареи OEM (которая обычно предпочитает использовать внешнюю батарею первым).

Windows вычисляет доступность батареи и создает подсказку "Сохранить неототключаемые батареи". Если это указание используется алгоритмом SDB, как показано в поле принятия решений (X) на следующей схеме потока.

Простой алгоритм балансировки времени SDB, адаптированный для горячих переключений батареи

Схема простого алгоритма балансировки возраста SDB, адаптированного для горячей переключения батареи.

Реализация алгоритма SDB в встроенном ПО

В этом разделе показана полная логика управления разрядом батареи, реализованная в системном встроенном ПО. Это основывается на логике балансировки возраста батареи, описанной выше, чтобы продемонстрировать, как с ним будет включена существующая логика разряда с несколькими батареями (помеченная в блоке Y).

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

Полная реализация встроенного ПО простого алгоритма балансировки возраста SDB

Схема полной реализации алгоритма SDB балансировки возраста.

Архитектура Power Stack

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

Схема архитектуры power stack с компонентом HPMI.

Минипорт батареи

Интерфейсы мини-порта батареи остаются неизменными.

Интерфейсы SDB не влияют на желание изготовителя оборудования полагаться на механизм ACPI/CmBatt или разрабатывать собственный минипорт.

Windows перенаправит все команды IOCTL_BATTERY_SET_INFORMATION на все устройства батареи, перечисленные в системе.

HPMI

Аппаратный интерфейс Power Manager (HPMI) — это новый компонент, представленный в стеке питания.

HPMI — это драйвер, разработанный изготовителем оборудования или устройства.

HPMI имеет интимные знания о базовой конфигурации оборудования и состоянии и имеет доступ к системным встроенному ПО.

Чтобы реализовать функцию SDB, драйвер HPMI будет выполнять следующие действия:

  1. Зарегистрируйтесь в Windows.
  2. Объявление поддержки SDB.
  3. Использование параметров управления SDB, предоставляемых Windows.

Для реализации интерфейса HPMI необходимо использовать многозарядные системы, поддерживающие SDB. Протокол API HPMI — это новый стандарт для реализации нескольких систем батареи.

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

Характеристики драйвера

В системе должно присутствовать не более одного экземпляра драйвера HPMI. HPMI может быть реализован как пользовательский режим или драйвер режима ядра.

Установка

HPMI может быть манифестирован как устройство ACPI или быть корневым перечислением одной из других служб или драйверов OEM по усмотрению ИЗГОТОВИТЕЛЯ.

Реализация алгоритма SDB

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

Схема реализации стека алгоритмов SDB и HPMI и встроенного ПО.

HPMI реализует алгоритм SDB

HPMI может выбрать реализацию алгоритма SDB, для этого потребуется HPMI перенаправлять указания по заряду и разгрузке встроенному ПО.

Встроенное ПО реализует алгоритм SDB

Кроме того, HPMI может выступать в качестве средства пересылки и просто пересылать указания по использованию батареи Windows в встроенное ПО, где реализован алгоритм SDB, как показано на приведенном выше рисунке. Использование этой модели рекомендуется по следующим причинам:

  1. Сведения, необходимые для реализации алгоритма SDB, легко доступны. Эта информация не требуется передавать в HPMI.

  2. Алгоритм SDB — это расширение для разгрузки логики, уже реализованной в нескольких системах батареи.

Полная модель блок-диаграммы, показывая, как реализован алгоритм SDB, показан в реализации алгоритма SDB в встроенном ПО.

Определения интерфейса

Представлен новый GUID класса интерфейса устройства для устройства HPMI. Устройство HPMI должно определять себя как реализацию классов интерфейса устройства. Дополнительные сведения см. в разделе "Использование интерфейсов устройств" в WDK.

Windows использует уведомление о прибытии устройства для запроса и настройки устройства HPMI.

//
// HPMI Device Interface Class.
//

// {DEDAE202-1D20-4C40-A6F3-1897E319D54F}
DEFINE_GUID(GUID_DEVINTERFACE_HPMI, 
            0xdedae202, 0x1d20, 0x4c40, 0xa6, 0xf3, 0x18, 0x97, 0xe3, 0x19, 0xd5, 0x4f);

HPMI должен иметь возможность выполнять службы нескольких одновременных вызовов IOCTL.

Обратите внимание, что индекс устройства должен иметь значение нулю.

Обнаружение компонентов

IOCTL_HPMI_QUERY_CAPABILITIES используется для обнаружения функций, поддерживаемых HPMI. IOCTL_HPMI_QUERY_CAPABILITIES является обязательным IOCTL.

Windows будет выдавать этот ioCL в HPMI один раз после обнаружения нового экземпляра драйвера HPMI.

//
// Query command sent to HPMI to query features supported by HPMI and Windows
// services requested by HPMI.
//
// This IOCTL may be issued multiple times, HPMI must respond with same 
// information in HPMI_QUERY_CAPABILITIES_RESPONSE, as a response to all
// subsequent IOCTL calls.
//

#define IOCTL_HPMI_QUERY_CAPABILITIES                     
    CTL_CODE(FILE_DEVICE_BATTERY, 0x200, 
             METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS)
//
// IOCTL_HPMI_QUERY_CAPABILITIES - Command.
//

typedef struct _HPMI_QUERY_CAPABILITIES {

    //
    // Set to HPMI_QUERY_CAPABILITIES_VERSION_1.
    //

    ULONG Version;

} HPMI_QUERY_CAPABILITIES, *PHPMI_QUERY_CAPABILITIES;
#define HPMI_QUERY_CAPABILITIES_VERSION_1                   
    (1)
#define HPMI_QUERY_CAPABILITIES_SIZEOF_VERSION_1         
    sizeof(HPMI_QUERY_CAPABILITIES)
//
// IOCTL_HPMI_QUERY_CAPABILITIES - Response.
//

#define HPMI_REQUEST_SERVICE_NONE                           
    (0x00000000)    // No Windows services is requested.
#define HPMI_REQUEST_SERVICE_BATTERY_UTILIZATION_HINTS      
    (0x00000001)    // Battery utilization hints requested from Windows.

#define HPMI_CAPABILITY_NOT_SUPPORTED                       
    (0x00000000)    // HPMI supports no capabilities.
#define HPMI_CAPABILITY_SDB_OEM_SIMPLE_AGE_BALANCING        
    (0x00000001)    // OEM device specific age balancing SDB support
typedef struct _HPMI_QUERY_CAPABILITIES_RESPONSE {

    //
    // Set to HPMI_QUERY_CAPABILITIES_RESPONSE_VERSION_1.
    //

    ULONG Version;

    //

Формат команд

Windows выдает этот IOCTL с HPMI_QUERY_CAPABILITIES.

Версия имеет значение HPMI_QUERY_CAPABILITIES_VERSION_1.

Формат отклика

HPMI должен возвращать код STATUS_SUCCESS.

HPMI отвечает, задав следующие значения в структуре HPMI_QUERY_CAPABILITIES_RESPONSE :

  • Версия имеет значение HPMI_QUERY_CAPABILITIES_RESPONSE_VERSION_1
  • RequestService имеет значение HPMI_REQUEST_SERVICE_BATTERY_UTILIZATION_HINTS, чтобы убедиться, что драйвер HPMI получает IOCTL_HPMI_BATTERY_UTILIZATION_HINT.
  • SdbCapabilities имеет значение HPMI_CAPABILITY_SDB_OEM_SIMPLE_AGE_BALANCING, чтобы указать поддержку балансировки возраста батареи.

Использование батареи

Проблемы с Windows IOCTL_HPMI_BATTERY_UTILIZATION_HINT в HPMI для предоставления наиболее обновленных подсказок по использованию батареи. IOCTL_HPMI_BATTERY_UTILIZATION_HINT является обязательным IOCTL.

HPMI может использовать подсказку PreserveNonHotSwappableBatteries, как описано в статье "Адаптация алгоритма SDB для использования с горячими переключениями батарей для экономии внутренних батарей".

//
// Set command sent to HPMI to provide battery utilization hints.
//
// This IOCTL may be issued multiple times if HPMI requests
// HPMI_REQUEST_SERVICE_BATTERY_UTILIZATION_HINTS service.
//

#define IOCTL_HPMI_BATTERY_UTILIZATION_HINT                 
    CTL_CODE(FILE_DEVICE_BATTERY, 0x201, 
             METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS)

//
// Boolean type value.
//

typedef enum _HPMI_HINT_BOOL {
    // No data is available.
    HpmiBoolUnavailable = 0,

    // Condition is asserted to be false.
    HpmiBoolFalse,

    // Condition is asserted to be true.
    HpmiBoolTrue,

    // Value not used.
    HpmiBoolMax

} HPMI_HINT_BOOL, *PHPMI_HINT_BOOL;
//
// IOCTL_HPMI_BATTERY_UTILIZATION_HINT - Command.
//

typedef struct _HPMI_BATTERY_UTILIZATION_HINT {

    //
    // Set to HPMI_BATTERY_UTILIZATION_HINT_VERSION_1.
    //

    ULONG Version;

    //
    // This hint indicates if the OEM Battery Manager should attempt to save as
    // much charge as possible in the non-hot swappable batteries (i.e. the
    // batteries are generally referred to as "internal batteries", these
    // batteries cannot be removed while system is operational).
    //
    // Interpretation of values:
    //  - HpmiBoolUnavailable:
    //      Battery utilization hint is unavailable at the moment.
    //  - HpmiBoolFalse:
    //      It is not necessary to preserve charge in the internal batteries
    //      at the moment.
    //  - HpmiBoolTrue:
    //      Every attempt should be made to save as much charge as possible in
    //      the internal batteries.
    //

    HPMI_HINT_BOOL PreserveNonHotSwappableBatteries;

} HPMI_BATTERY_UTILIZATION_HINT, *PHPMI_BATTERY_UTILIZATION_HINT;
#define HPMI_BATTERY_UTILIZATION_HINT_VERSION_1              
    (1)
#define HPMI_BATTERY_UTILIZATION_HINT_SIZEOF_VERSION_1       
    sizeof(HPMI_BATTERY_UTILIZATION_HINT)

Формат команд

Windows выдает этот IOCTL с HPMI_BATTERY_UTILIZATION_HINT. Версия имеет значение HPMI_BATTERY_UTILIZATION_HINT_VERSION_1.

HPMI_BATTERY_UTILIZATION_HINT

Параметр PreserveNonHotSwappableBatteries имеет одно из следующих значений:

  • HpmiBoolUnavailable: устанавливается, если не указана подсказка об использовании батареи. Как ответ, HPMI/Fimware обычно должен заниматься политиками де-факто разгрузки.
  • HpmiBoolFalse: задайте, когда Windows определяет оппортунное время для балансировки возраста батареи.
  • HpmiBoolTrue: установите, когда Windows определяет необходимость экономии энергии, хранящейся во внутренних батареях.

Формат отклика

HPMI должен возвращать код STATUS_SUCCESS.

В ответе данные не возвращаются.

Пример контракта интерфейса

Ознакомьтесь с HMPI.h для полного (примера) контракта API для определений интерфейса, описанных здесь.

Примечание.

Содержимое этого документа подлежит изменению без уведомления.