Bateria definida por software
Observação
Algumas informações estão relacionadas ao produto de pré-lançamento, que poderá ser substancialmente modificado antes do lançamento comercial. A Microsoft não oferece nenhuma garantia, explícita ou implícita, quanto às informações fornecidas aqui.
Introdução
O objetivo deste tópico é apresentar as Baterias Definidas por Software (SDB), descrever a arquitetura SDB do Windows e detalhar os contratos de API e DDI do Windows para esse recurso.
O tópico começa introduzindo o algoritmo SDB de balanceamento de idade simples para um sistema de duas baterias hipotético. Depois, vem o layout da arquitetura e o contrato de API necessários para implementar o algoritmo SDB.
Nomenclatura
BattC: driver de classe de bateria
CAD: o Charge Arbitration Driver (CAD) é um driver da Microsoft que arbitra energia entre USB Legacy, USB Type-C e fontes de carregamento sem fio
Baterias trocadas a frio: baterias que não podem ser removidas do sistema sem risco de apagões ou falta total de energia
Contagem de ciclos: o número de ciclos completos de carga-descarga sofridos pela bateria, conforme descrito na especificação ACPI
Baterias trocadas a quente: baterias que podem ser removidas com segurança enquanto o sistema está em operação, sem qualquer risco de apagões
HPMI: interface do gerenciador de energia de hardware
Baterias sem troca a quente: uma ou mais baterias trocadas a frio e sem troca instaladas no sistema
Baterias sem troca: baterias que não foram projetadas nem devem ser removidas pelo usuário final
Visão geral do SDB
O documento de pesquisa da MSR sobre Baterias Definidas por Software pode ser encontrado aqui: https://www.microsoft.com/research/wp-content/uploads/2016/02/multibattery_sosp2015.pdf.
Este tópico reproduz algumas ideias descritas neste artigo e as apresenta com o objetivo de produzir o recurso de balanceamento de idade da bateria baseado em software em laptops e outros dispositivos móveis.
Imagine um sistema de duas baterias. Onde uma bateria é não removível, situada ao lado do SOC. Vamos chamá-la de bateria interna. A outra bateria é de troca a quente, situada ao lado de um teclado removível. Vamos chamá-la de bateria externa.
Um sistema com várias baterias
Como o teclado é acoplado ao longo de um período, ele força as duas baterias a envelhecer de formas diferentes. Isso cria um escopo para o balanceamento de idade das baterias e prolonga o período de usabilidade do sistema, empregando o algoritmo de balanceamento de idade simples SDB.
Algoritmo SDB de Balanceamento de Idade Simples
O algoritmo é chamado de balanceamento de idade simples porque tenta equilibrar a idade da bateria. O algoritmo de balanceamento de idade simples faz com que o sistema prefira descarregar a bateria que envelheceu menos. Uma bateria que acumulou contagens de ciclo menores não só tem maior capacidade de reter energia, mas também geralmente é mais eficiente na entrega de energia. Prolongando assim o tempo que o sistema pode se sustentar com baterias.
Algoritmo SDB de Balanceamento de Idade Simples
A ideia central por trás do algoritmo de balanceamento de idade simples é usar a bateria que acumulou menos contagens de ciclo de bateria, conforme descrito pela caixa de decisão (2) no fluxograma acima. O sistema hipotético, neste exemplo, permite o uso exclusivo de baterias internas ou externas. No entanto, isso pode não ser verdadeiro para todos os sistemas. Outros sistemas podem não ser tão flexíveis ou podem ter restrições elétricas ao uso de baterias. Nesses casos, o algoritmo espera uma melhor tentativa de balanceamento de idade. Por exemplo, considere o seguinte.
Um sistema que não consegue sustentar energia exclusivamente na bateria externa (pode ser porque a bateria externa foi projetada para ser apenas uma fonte de energia suplementar). Esse sistema pode implementar o algoritmo de balanceamento de idade simples descarregando simultaneamente as baterias internas e externas no bloco de processo (A) no fluxograma acima.
Um sistema que requer que a bateria externa seja usada sempre que ela estiver presente (pode ser devido ao consumo de energia adicional associado à manutenção do teclado removível ligado): esse sistema pode implementar o algoritmo de balanceamento de idade simples, descarregando simultaneamente as baterias internas e externas no bloco de processo (B) no fluxograma acima.
O algoritmo de balanceamento de idade simples pode ser usado apenas quando há carga suficiente presente nas baterias internas e externas para executar o sistema. A caixa de decisão (1) mostra essa condição de verificação no fluxograma acima. Por exemplo (voltando novamente ao sistema hipotético), se a bateria externa não tiver carga, não haverá espaço para balanceamento de idade das baterias, e a caixa de decisão (1) resultaria na ramificação "NÃO".
O OEM é livre para escolher as restrições e condições quando o algoritmo de balanceamento de idade simples não é colocado em prática, além de quando as baterias internas ou externas estão sem energia. Por exemplo, o OEM pode optar por não realizar nenhum balanceamento de idade quando:
- O SOC/processador está sendo executado no modo de alto desempenho
- O sistema é termicamente instável
Quando o algoritmo de balanceamento de idade simples não é colocado em uso (devido a uma ou mais condições descritas acima), a lógica será revertida para a política de uso de bateria proprietária do OEM, conforme descrito pela caixa de processo (3) no fluxograma acima. A caixa de processo (3) é a lógica que o OEM teria colocado em prática se o SDB não fosse compatível.
Adaptar o algoritmo SDB para uso com baterias trocadas a quente
O algoritmo SDB de balanceamento de idade simples tenta usar a bateria mais íntegra. Embora essa estratégia funcione bem para melhorar a vida útil da bateria em longo prazo, isso pode afetar severamente a usabilidade de curto prazo do sistema, conforme descrito no cenário a seguir.
No sistema de duas baterias descrito acima, considere a seguinte situação:
Espera-se que o usuário use o sistema por tempo suficiente até que a carga nas baterias internas e externas se esgote.
A bateria externa envelheceu mais em comparação com a bateria interna.
Quando o algoritmo de balanceamento de idade simples é exercido neste sistema, ele tentará esgotar a carga armazenada na bateria interna primeiro (com base nas condições 1 e 2 listadas acima). Quando o usuário decide desconectar a bateria externa depois de um tempo, isso resultaria em uma experiência ruim para o usuário, porque a capacidade da bateria disponibilizada para uso diminuiria drasticamente quando a bateria externa fosse desconectada, pois a bateria interna seria consumida.
Em um sistema não SDB, esse problema geralmente não ocorre, porque na maioria dos casos a bateria externa é esgotada antes que a bateria interna seja colocada em uso.
Portanto, convém desativar seletivamente o algoritmo de balanceamento de idade simples quando for provável que o cenário acima aconteça.
Para resumir, sempre que se espera que o usuário use o sistema por muito tempo com a bateria externa removida, é ideal desativar o algoritmo SDB e voltar a usar a política de utilização da bateria OEM (que geralmente favorece o uso da bateria externa primeiro).
O Windows calcula a disponibilidade da bateria e produz uma dica "Preservar baterias sem troca a quente". Quando essa dica é consumida pelo algoritmo SDB, conforme descrito pela caixa de decisão (X) no diagrama de fluxo a seguir.
Algoritmo SDB de balanceamento de idade simples adaptado para baterias trocadas a quente
Implementar o algoritmo SDB no firmware
Esta seção descreve a lógica de controle de descarga completa da bateria implementada no firmware do sistema. Isso se baseia na lógica de balanceamento da idade da bateria descrita acima para demonstrar como uma lógica de descarga de várias baterias existente (marcada no bloco (Y)) seria incorporada a ela.
Esta não é uma prescrição de como o algoritmo SDB deve ser implementado pelos OEMs, mas sim um exemplo abrangente do dispositivo simplista, hipotético e multibateria descrito nesta seção que é usado para ilustrar o comportamento SDB.
Implementação completa de firmware do Algoritmo SDB de Balanceamento de Idade Simples
Arquitetura de pilha de energia
Esta seção descreve o layout de todos os componentes que participam da pilha de energia e sua relação relativa entre si.
Miniporta da bateria
As interfaces de miniporta da bateria permanecem as mesmas.
As interfaces SDB não afetam nem influenciam o desejo do OEM de confiar no mecanismo ACPI/CmBatt ou de desenvolver sua miniporta própria.
O Windows encaminha todos os comandos IOCTL_BATTERY_SET_INFORMATION para todos os dispositivos de bateria enumerados no sistema.
HPMI
A HPMI (interface do gerenciador de energia de hardware) é um novo componente introduzido na pilha de energia.
HPMI é um driver desenvolvido e de propriedade do fabricante do OEM/dispositivo.
A HPMI tem conhecimento íntimo da configuração e do estado do hardware subjacente e tem acesso ao firmware do sistema.
Para implementar o recurso SDB, o driver HPMI irá:
- Registrar-se no Windows.
- Anunciar o suporte SDB.
- Consumir parâmetros de controle SDB fornecidos pelo Windows.
Os sistemas de várias baterias compatíveis com SDB são necessários para implementar a interface HPMI de agora em diante. O protocolo da API da HPMI é um novo padrão para implementar vários sistemas de bateria.
Há planos para que, no futuro, a HPMI seja atualizada para dar suporte a outras funções de carga, descarga e gerenciamento de carga.
Características do driver
Somente uma instância do driver da HPMI deve estar presente em um sistema. A HPMI pode ser implementada como um modo de usuário ou um driver de modo kernel.
Instalação
A HPMI pode ser manifestada como um dispositivo ACPI ou ser enumerada por raiz por um dos outros serviços/drivers OEM a critério do OEM.
Implementação do algoritmo SDB
O diagrama a seguir ilustra dois exemplos de como o algoritmo SDB pode ser implementado quando o componente de firmware já hospeda a maior parte da lógica de controle da bateria.
A HPMI implementa o algoritmo SDB
A HPMI pode optar por implementar o algoritmo SDB. Isso exigirá que a HPMI encaminhe dicas de carga/descarga para o firmware.
O firmware implementa o algoritmo SDB
Como alternativa, o HPMI pode atuar como um encaminhador e encaminhar as dicas de utilização da bateria do Windows para o firmware onde o algoritmo SDB é implementado, conforme descrito na figura acima. O uso desse modelo é recomendado pelos seguintes motivos:
As informações necessárias para implementar o algoritmo SDB estão prontamente disponíveis; não há necessidade de passar essas informações para a HPMI
O algoritmo SDB é uma extensão da lógica de descarga já implementada nos sistemas com várias baterias
Um modelo de fluxograma completo descrevendo como o algoritmo SDB é implementado e mostrado em Implementar algoritmo SDB no firmware.
Definições de interface
Um novo GUID de classe de interface para um dispositivo HPMI é introduzido. O dispositivo HPMI deve identificar-se como implementando as classes de interface de dispositivo. Para obter mais informações, consulte Usar interfaces de dispositivo no WDK.
O Windows usa a notificação de chegada do dispositivo para consultar e configurar o dispositivo 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);
O HPMI deve ser capaz de atender várias chamadas IOCTL simultâneas.
O índice do dispositivo deve ser definido como zero.
Descoberta de recursos
IOCTL_HPMI_QUERY_CAPABILITIES é usado para descobrir recursos compatíveis com o HPMI. IOCTL_HPMI_QUERY_CAPABILITIES é um IOCTL obrigatório.
O Windows emitirá essa IOCL para a HPMI uma vez depois que uma nova instância de driver da HPMI for descoberta.
//
// 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;
//
Formato do comando
O Windows emite essa IOCTL com HPMI_QUERY_CAPABILITIES.
A versão é definida como HPMI_QUERY_CAPABILITIES_VERSION_1.
Formato da resposta
HPMI deve retornar o código STATUS_SUCCESS.
A HPMI responde definindo os seguintes valores na estrutura HPMI_QUERY_CAPABILITIES_RESPONSE:
- A versão é definida como HPMI_QUERY_CAPABILITIES_RESPONSE_VERSION_1
- RequestService está definido como HPMI_REQUEST_SERVICE_BATTERY_UTILIZATION_HINTS para garantir que o driver da HPMI receba IOCTL_HPMI_BATTERY_UTILIZATION_HINT.
- SdbCapabilities está definido como HPMI_CAPABILITY_SDB_OEM_SIMPLE_AGE_BALANCING para indicar o suporte ao balanceamento de idade da bateria.
Utilização da bateria
O Windows emite IOCTL_HPMI_BATTERY_UTILIZATION_HINT para a HPMI para fornecer dicas de utilização da bateria mais atualizadas IOCTL_HPMI_BATTERY_UTILIZATION_HINT é uma IOCTL obrigatória.
A HPMI pode utilizar a dica PreserveNonHotSwappableBatteries conforme descrito em Adaptar o algoritmo SDB para uso com baterias trocadas a quente para conservar as baterias internas.
//
// 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)
Formato do comando
O Windows emite essa IOCTL com HPMI_BATTERY_UTILIZATION_HINT. A versão é definida como HPMI_BATTERY_UTILIZATION_HINT_VERSION_1.
PreserveNonHotSwappableBatteries é definido como um dos seguintes valores:
- HpmiBoolUnavailable: defina quando nenhuma dica de utilização da bateria pode ser fornecida. Como resposta, a HPMI/o fimware geralmente deve envolver as políticas de quitação de fato.
- HpmiBoolFalse: definido quando o Windows determina um momento oportuno para que o balanceamento da idade da bateria ocorra.
- HpmiBoolTrue: definido quando o Windows determina a necessidade de conservar a energia armazenada nas baterias internas.
Formato da resposta
HPMI deve retornar o código STATUS_SUCCESS.
Nenhum dado é retornado na resposta.
Exemplo de contrato de interface
Consulte HMPI.h para obter um contrato de API completo (exemplo) para obter as definições de interface descritas aqui.
Observação
O conteúdo deste documento está sujeito a alterações sem aviso prévio.