Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Замечание
Некоторые сведения относятся к предварительно выпущенным продуктам, которые могут быть существенно изменены до его коммерческого выпуска. Корпорация Майкрософт не предоставляет никаких гарантий, явных или подразумеваемых в отношении информации, предоставленной здесь.
Введение
Цель этой статьи — представить программно определяемые батареи (SDB), описать архитектуру Windows SDB и представить подробности о контрактах Windows API и DDI для этой функции.
Тема начинается с представления алгоритма SDB простой балансировки срока службы для гипотетической системы из двух аккумуляторов. За этим следует макет архитектуры и контракт API, необходимый для реализации алгоритма SDB.
Номенклатура
BattC — драйвер класса батареи
CAD - Драйвер арбитража заряда (CAD) — это драйвер Майкрософт, который арбитражирует питание между устаревшими USB, USB-Type-C и беспроводными источниками зарядки
Холодные переключаемые батареи — батареи, которые не могут быть удалены из системы без риска браунаутов или полного сбоя питания
Число циклов — количество полных циклов заряда, прошедших батареей, как описано в спецификации ACPI.
Горячая замена батарей — это батареи, которые можно безопасно извлечь во время работы системы, без какого-либо риска перебоев в электропитании.
HPMI — аппаратный интерфейс управления питанием
Батареи без горячей замены — одна или несколько батарей с холодной заменой и неподдающиеся замене батареи, установленные в системе.
Несъемные батареи — батареи, которые не предназначены для снятия конечным пользователем
Обзор SDB
Здесь можно найти научно-исследовательский документ MSR по программно-определяемым батареям: https://www.microsoft.com/research/wp-content/uploads/2016/02/multibattery_sosp2015.pdf
В этой теме повторно рассматриваются избранные идеи, описанные в этом документе, и они представлены с целью коммерциализации функции балансировки возраста батареи на программной основе для использования в ноутбуках и других мобильных устройствах.
Представьте себе две батареи. Где одна батарея является несъемной батареей, расположенной рядом с SOC , давайте называем эту внутреннюю батарею. Другая батарея является горячей заменяемой батареей, расположенной рядом с съемной клавиатурой — назовем эту внешнюю батарею.
Система с несколькими батареями
Так как клавиатура подключается и отсоединяется в течение определенного периода времени, она заставляет две батареи стареть по-разному. Это создает возможность для балансировки возраста батарей и продления срока службы системы с использованием простого алгоритма балансировки возраста SDB.
Простой алгоритм балансировки возраста SDB
Алгоритм называется простой балансировкой возраста , так как пытается сбалансировать возраст батареи. Упрощенный алгоритм балансировки по возрасту заставляет систему предпочитать разряжать наименее изношенную батарею. Батарея, которая начислила меньшее количество циклов, не только имеет более высокую емкость для удержания энергии, но и, как правило, более эффективной в доставке энергии. Тем самым продлевая время, которое система может поддерживать на батареях.
Простой алгоритм балансировки возраста SDB
Основная идея, лежащая в основе простого алгоритма балансировки возраста, заключается в том, чтобы просто использовать батарею, которая начислила наименьшие числа циклов батареи, как показано в поле принятия решений (2) в блок-схеме выше. Гипотетическая система в этом примере позволяет использовать либо внутренние, либо внешние батареи. Однако это может быть не так для всех систем. Другие системы могут не быть как гибкими или могут иметь электрические ограничения на использование батареи. В таких случаях алгоритм ожидает наилучшей попытки балансировки возраста. Например, рассмотрим следующее.
Система, которая не может поддерживать питание исключительно на внешней батарее (может быть потому, что внешний аккумулятор предназначен только для дополнительного источника питания). Эта система может реализовать простой алгоритм балансировки возраста, одновременно разряжая внутренние и внешние батареи в блоке (A) обработки на приведенной выше блок-схеме.
Система, которая требует использования внешней батареи всякий раз, когда она доступна (это может быть связано с дополнительной нагрузкой на питание для поддержания съемной клавиатуры в рабочем состоянии), может реализовать простой алгоритм балансировки возраста, разряжая как внутренние, так и внешние батареи одновременно, как показано в блоке обработки (B) на приведенной выше блок-схеме.
Простой алгоритм балансировки возраста может использоваться только в том случае, если в внутренней и внешней батареях достаточно заряда для запуска системы, поле принятия решений (1) показывает это условие в приведенной выше блок-схеме. Например, (снова вернемся к гипотетической системе), если внешний аккумулятор разряжен, невозможно уравновесить срок службы батарей, и решение в блоке (1) приведет к ветвлению "НЕТ".
Изготовитель оборудования может выбрать ограничения и условия, когда простой алгоритм балансировки возраста не ввелся в силу, помимо того, когда внутренние или внешние батареи выходят из питания. Например, изготовитель оборудования может не выполнять балансировку возраста, если:
- SoC/Processor работает в режиме высокой производительности
- Система является теплово нестабильной
Если простой алгоритм балансировки возраста не используется (из-за одного или нескольких описанных выше условий), логика вернется к частной политике использования батареи OEM, как показано в поле обработки (3) в приведенной выше блок-схеме. Процессорный блок (3) — это логика, которую изготовитель оборудования использовал бы, если бы SDB не поддерживалась.
Адаптация алгоритма SDB для использования с горячесменяемыми батареями
Простой алгоритм балансировки времени SDB пытается использовать батарею, которая является наиболее работоспособной, хотя эта стратегия хорошо работает для улучшения долгосрочной жизни батареи, это может серьезно повлиять на краткосрочную удобство использования системы, как описано в следующем сценарии.
В двух системах батареи, описанных выше, рассмотрим следующую ситуацию:
Ожидается, что пользователь будет использовать систему достаточно долго, пока плата не будет исчерпана как во внутренних, так и во внешних батареях.
Внешний аккумулятор состарился сильнее по сравнению с внутренним аккумулятором.
Когда в этой системе выполняется простой алгоритм балансировки возраста, он в первую очередь попытается истощить заряд, хранящийся во внутренней батарее (на основе условий #1 и #2, перечисленных выше). Когда пользователь решает отключить внешнюю батарею через некоторое время, это приведет к плохому опыту пользователя, так как емкость батареи, доступная для использования, резко уменьшается после отключения внешней батареи, так как внутренняя батарея будет использована.
В системе, отличной от SDB, эта проблема обычно не возникает, так как в большинстве случаев внешний аккумулятор истощается до использования внутренней батареи.
Поэтому необходимо выборочно отключить простой алгоритм балансировки возраста, если выше сценарий, скорее всего, произойдет.
Вкратце, каждый раз, когда пользователю приходится пользоваться системой без внешней батареи в течение длительного времени, целесообразно отключить алгоритм SDB и вернуться к политике использования батареи OEM (которая обычно предполагает сначала использование внешней батареи).
Windows вычисляет доступность батареи и создает подсказку "Сохранить негорячесменяемые батареи". Если это указание используется алгоритмом SDB, как показано в поле принятия решений (X) на следующей схеме потока.
Простой алгоритм балансировки старения SDB, адаптированный для горячей замены батарей
Реализация алгоритма SDB в встроенном ПО
В этом разделе показана полная логика управления разрядом батареи, реализованная в системном встроенном ПО. Это опирается на логику балансировки возраста батареи, описанную выше, чтобы продемонстрировать, как может быть интегрирована существующая логика разрядки нескольких батарей (помеченная в блоке Y).
Обратите внимание, что это не рецепт того, как алгоритм SDB должен быть реализован изготовителями оборудования, а комплексным примером простого, гипотетического, многозарядного устройства, описанного в этом разделе, который используется для иллюстрации поведения SDB.
Полная реализация встроенного ПО простого алгоритма балансировки возраста SDB
Архитектура Power Stack
В этом разделе описывается макет компонента для всех компонентов, участвующих в стеке питания, и их относительные отношения друг с другом.
Минипорт батареи
Интерфейсы мини-порта батареи остаются неизменными.
Интерфейсы SDB не влияют на желание изготовителя оборудования полагаться на механизм ACPI/CmBatt или разрабатывать собственный минипорт.
Windows перенаправит все команды IOCTL_BATTERY_SET_INFORMATION на все устройства батареи, перечисленные в системе.
HPMI
Аппаратный интерфейс Power Manager (HPMI) — это новый компонент, представленный в стеке питания.
HPMI — это драйвер, разработанный изготовителем оборудования или устройства.
HPMI имеет глубокие знания о базовой конфигурации оборудования и состоянии и имеет доступ к системному встроенному ПО.
Чтобы реализовать функцию SDB, драйвер HPMI будет выполнять следующие действия:
- Зарегистрируйтесь в Windows.
- Объявление поддержки SDB.
- Потребление параметров управления SDB, предоставляемых Windows.
Для многобатарейных систем, поддерживающих SDB, в будущем потребуется реализация интерфейса HPMI. Протокол API HPMI — это новый стандарт для реализации нескольких систем батареи.
Существуют планы, чтобы в будущем HPMI будет обновлен для поддержки других функций зарядки, выгрузки и управления зарядами.
Характеристики драйвера
В системе должно присутствовать не более одного экземпляра драйвера HPMI. HPMI может быть реализован как пользовательский режим или драйвер режима ядра.
Установка
HPMI может быть манифестирован как устройство ACPI или быть корневым перечислением одной из других служб или драйверов OEM по усмотрению ИЗГОТОВИТЕЛЯ.
Реализация алгоритма SDB
На следующей схеме показаны два примера реализации алгоритма SDB, если компонент встроенного ПО уже размещает большую часть логики управления батареей.
HPMI реализует алгоритм SDB
HPMI может выбрать реализацию алгоритма SDB; для этого HPMI потребуется направлять инструкции по заряду и разрядке встроенному ПО.
Встроенное ПО реализует алгоритм SDB
Кроме того, HPMI может выступать в качестве средства пересылки и просто пересылать указания по использованию батареи Windows в встроенное ПО, где реализован алгоритм SDB, как показано на приведенном выше рисунке. Использование этой модели рекомендуется по следующим причинам:
Сведения, необходимые для реализации алгоритма SDB, легко доступны. Эта информация не требуется передавать в HPMI.
Алгоритм SDB является расширением для логики разряда, уже реализованной в многобатарейных системах.
Полная модель блок-схемы, показывающая, как реализуется алгоритм SDB, представлена в Implementing SDB Algorithm in Firmware.
Определения интерфейса
Представлен новый 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.
Параметр PreserveNonHotSwappableBatteries имеет одно из следующих значений:
- HpmiBoolUnavailable: устанавливается, если нет возможности предоставить подсказку использования батареи. Как ответ, HPMI/Fimware обычно должен заниматься политиками де-факто разгрузки.
- HpmiBoolFalse: Устанавливается в случае, если Windows определяет подходящее время для балансировки износа батареи.
- HpmiBoolTrue: Устанавливается, когда Windows определяет необходимость экономии энергии, хранящейся во внутренних батареях.
Формат отклика
HPMI должен возвращать код STATUS_SUCCESS.
В ответе данные не возвращаются.
Пример контракта интерфейса
Ознакомьтесь с HMPI.h для полного (примера) контракта API для определений интерфейса, описанных здесь.
Замечание
Содержимое этого документа подлежит изменению без уведомления.