Gerenciamento de energia

Para oferecer suporte ao gerenciamento de energia específico do veículo, o Android fornece um serviço CarPowerManagementService e uma interface CarPowerManager.

As transições de estado são acionadas pela unidade de controle principal do veículo (VMCU, na sigla em inglês). Para se comunicar com a VMCU, os integradores precisam implementar vários componentes. Os integradores são responsáveis pela integração com a camada de abstração de hardware do veículo (VHAL) e a implementação do kernel. Os integradores também são responsáveis por desativar as fontes de despertar e garantir que os desligamentos não sejam adiados indefinidamente.

Terminologia

Estes termos são usados em todo este documento:

processador de aplicativo (AP)
Parte do system on a chip (SoC).
Pacote de suporte da placa (BSP)
A camada de software que contém firmware de inicialização e drivers de dispositivo específicos do hardware que permitem que um sistema operacional incorporado funcione em um determinado ambiente de hardware (uma placa-mãe), integrado ao sistema operacional incorporado.
CarPowerManager (CPM)
Expõe uma API para que os apps se registrem para mudanças de estado de energia.
CarPowerManagementService (CPMS)
Coordena as transições de estado de energia, interage com a VHAL para controle de estado de energia e faz as chamadas finais para suspender e desligar.
CarPowerPolicyDaemon (CPPD)
Gerencia políticas de energia e expõe interfaces AIDL para que processos nativos registrem listeners de políticas de energia.
entrada ou saída de uso geral (GPIO)
Um pino de sinal digital para uso geral.
camada de abstração de hardware (HAL)
Uma camada de software com que todos os outros módulos de nível superior precisam interagir para acessar a funcionalidade de hardware.
hibernar
Também conhecido como suspensão para disco (S2D/S4). O SoC é colocado no modo de energia S4 (hibernação), e o conteúdo da RAM é gravado em mídia não volátil (como flash ou disco), e todo o sistema é desligado.
processador de mídia (MP)
Consulte system on a chip (SoC).
circuito integrado de gerenciamento de energia (PMIC)
Chip usado para gerenciar os requisitos de energia do sistema host.
system on a chip (SoC)
Processador principal que executa o AAOS, geralmente fornecido por fabricantes como Intel, MediaTek, Nvidia, Qualcomm, Renesas e Texas Instruments.
suspender
Também conhecido como suspensão para RAM (S2R ou STR). O SoC é colocado no modo de energia S3 e a CPU é desligada, enquanto a RAM permanece ligada.
HAL veicular (VHAL)
A API do Android usada para interagir com a rede do veículo. O parceiro ou OEM de nível 1 é responsável por escrever este módulo. A rede do veículo pode usar qualquer camada física, como CAN, LIN, MOST e Ethernet. A VHAL abstrai essa rede do veículo para permitir que o AAOS interaja com o veículo.
Processador de interface do veículo (VIP)
Consulte a MCU do veículo.
Unidade de controle principal do veículo (VMCU)
O microcontrolador que fornece a interface entre a rede do veículo e o SoC. O SoC se comunica com a VMCU por sinais USB, UART, SPI e GPIO.

Design do sistema

Esta seção descreve como o AAOS representa o estado de energia do processador de apps e quais módulos implementam o sistema de gerenciamento de energia. Ele também descreve como esses módulos funcionam juntos e como as transições de estado normalmente ocorrem.

Máquina de estado de energia do carro

O AAOS usa uma máquina de estado para representar o estado de energia do AP. A máquina de estado fornece os estados ilustrados abaixo:

Máquina de estado de energia do carro

Figura 1. Máquina de estado de energia do carro.

As transições mais comuns são destacadas em azul. Estes são os estados e as transições comuns:

  • Suspender para RAM. O veículo e o SoC estão desligados. Nenhum código está sendo executado. A energia é mantida na RAM do SoC.
  • Aguarde o VHAL. Quando o motorista interage com o veículo, por exemplo, ao abrir uma porta, a VMCU aplica energia ao SoC. O AAOS é retomado do Suspend-to-RAM e entra no modo "Aguardar VHAL", em que aguarda a coordenação com a VHAL.
  • Ativada. A VHAL informa ao AAOS para entrar no estado "Ativado". Nesse estado, o AAOS está totalmente em execução e interagindo com o motorista.
  • Preparação antes do desligamento. Quando o motorista termina de dirigir, a VHAL informa ao AAOS para entrar na fase de preparação antes do desligamento enviando SHUTDOWN_PREPARE. Nesse estado, os listeners de mudança de estado de energia recebem STATE_PRE_SHUTDOWN_PREPARE. Isso serve como um aviso antecipado de que o desligamento está começando.
  • Preparação para encerramento. Quando todos os listeners são concluídos ou o tempo limite de preparação pré-desligamento é atingido, o sistema Android entra na fase principal de preparação para desligamento, notificando os listeners com STATE_SHUTDOWN_PREPARE. A tela e o áudio estão desligados, e o AAOS não está interagindo com o motorista. O sistema Android ainda está em execução e pode realizar operações de limpeza e atualização, como executar o modo Garagem.
  • Aguarde a conclusão do VHAL. Nesse momento, o AAOS informa à VHAL que está pronto para ser desligado. Espera-se que a VMCU coloque o SoC em modo de espera e remova a energia do processador de aplicativos. O AAOS fica no estado de suspensão para RAM, embora nenhum código esteja sendo executado.

Módulos de gerenciamento de energia

O sistema de gerenciamento de energia é composto pelos seguintes módulos:

Nome do módulo Descrição
CarPowerManager API Java ou C++.
CarPowerManagementService Coordena as transições de estado de energia e delega o gerenciamento da política de energia ao CarPowerPolicyDaemon.
CarPowerPolicyDaemon Gerencia políticas de energia e se comunica com clientes nativos de políticas de energia.
HAL veicular Interface para a VMCU.
Kernel Suspenda a implementação na RAM ou no disco.

O recurso de sono profundo/hibernação (suspensão do Android para RAM/disco) é implementado no kernel. Esse recurso é exposto ao espaço do usuário como um arquivo especial localizado em /sys/power/state. O AAOS é suspenso gravando mem ou disk nesse arquivo.

O CPMS coordena o estado de energia com outros serviços e HALs. O CPMS implementa a máquina de estados descrita acima e envia notificações a todos os observadores quando ocorre uma transição de estado de energia. Esse serviço também usa a VHAL para enviar mensagens ao hardware.

O CPPD é a fonte da verdade para políticas de energia. Ele gerencia as políticas de energia durante todo o ciclo de vida do dispositivo e notifica o CPMS, a VHAL e outros listeners nativos sobre as mudanças na política de energia. O CPMS delega solicitações de mudança na política de energia ao CPPD.

O CPMS se comunica com a VMCU lendo e gravando propriedades da VHAL relacionadas ao estado de energia, como AP_POWER_STATE_REQ e AP_POWER_STATE_REPORT. Os apps podem usar a interface definida no CPM para monitorar mudanças no estado de energia. Essa interface também permite que os apps registrem listeners de política de energia. Essa API Java é anotada com @SystemApi e @hide, o que a torna disponível apenas para apps privilegiados. A relação entre esses módulos, apps e serviços é ilustrada abaixo:

Diagrama de referência dos componentes de energia

Figura 2. Diagrama de referência dos componentes de energia.

Sequência de mensagens

A seção anterior descreveu os módulos que compõem o sistema de gerenciamento de energia. Esta seção usa os exemplos entrar em sono profundo e sair do sono profundo para explicar como os módulos e apps se comunicam:

Entrar em sono profundo

Somente a VMCU pode iniciar o sono profundo. Depois que o sono profundo é iniciado, a VMCU envia uma notificação ao CPMS pela VHAL. O CPMS muda o estado para SHUTDOWN PREPARE e transmite essa transição de estado para todos os observadores (os apps e serviços que monitoram o CPMS) chamando o método onStateChanged() com um novo ID de estado fornecido pelo CPM.

O CPM faz a mediação entre os apps/serviços e os CPMS. O método onStateChanged() para apps/serviços é invocado de forma síncrona no método onStateChanged() do CPM. A maioria dos apps e serviços precisa concluir a preparação antes de retornar dessa chamada. Os serviços privilegiados podem continuar os preparativos de forma assíncrona depois de retornar para PRE_SHUTDOWN_PREPARE, SUSPEND_ENTER e POST_SUSPEND_ENTER. Nesse caso, o serviço privilegiado deve chamar complete() no objeto CompletablePowerStateChangeFuture fornecido quando terminar a preparação. A preparação assíncrona não é permitida para SHUTDOWN_PREPARE. Antes que DEEP_SLEEP_ENTRY seja enviado à VHAL, o CPMS envia periodicamente solicitações de adiamento de desligamento à VHAL.

Quando todos os objetos do CPM concluem os preparativos para desligamento, o CPMS envia AP_POWER_STATE_REPORT para a VHAL, que notifica a VMCU de que o AP está pronto para suspender. A CPMS também chama o método de suspensão, que suspende o kernel.

A sequência descrita acima está ilustrada abaixo:

Entrar em sono profundo

Figura 3. Entrar em suspensão profunda.

Interfaces de programação fornecidas pelo CPM

Esta seção descreve a API Java fornecida pelo CPM para apps e serviços do sistema. Essa API permite que o software do sistema:

  • Monitore as mudanças de estado de energia no AP.
  • Aplicar políticas de energia.

Siga estas etapas para chamar as APIs fornecidas pelo CPM:

  1. Para adquirir a instância do CPM, chame a API Car.
  2. Chame o método adequado no objeto criado na etapa 1.

Criar um objeto CarPowerManager

Para criar um objeto CPM, chame o método getCarManager() do objeto Car. Esse método é uma fachada usada para criar objetos de CPM. Especifique android.car.Car.POWER_SERVICE como um argumento para criar um objeto de CPM.

Car car = Car.createCar(this);
CarPowerManager powerManager =
  (CarPowerManager) car.getCarManager(android.car.Car.POWER_SERVICE);

CarPowerStateListener e registro

Os apps e serviços do sistema podem receber notificações de mudança de estado de energia implementando CarPowerManager.CarPowerStateListener. Essa interface define um método onStateChanged(), que é uma função de callback invocada quando o estado de energia do CPMS muda. O exemplo a seguir define uma nova classe anônima que implementa a interface:

private final CarPowerManager.CarPowerStateListener powerListener =
  new CarPowerManager.CarPowerStateListener () {
    @Override
     public void onStateChanged(int state) {
       Log.i(TAG, "onStateChanged() state = " + state);
     }
};

Para instruir esse objeto listener a monitorar uma transição de estado de energia, crie uma nova linha de execução e registre o listener e essa linha no objeto CPM:

executor = new ThreadPerTaskExecutor();
powerManager.setListener(powerListener, executor);

Quando o estado de energia é alterado, o método onStateChanged() do objeto listener é invocado com um valor para representar o novo estado de energia. A associação entre o valor real e o estado de energia é definida em CarPowerManager e mostrada na tabela a seguir:

Nome Descrição
STATE_ON Insira o estado "on". O sistema está totalmente operacional.
STATE_SHUTDOWN_CANCELLED O desligamento é cancelado e o estado de energia volta ao normal.
STATE_SHUTDOWN_ENTER Os apps precisam ser limpos e estar prontos para o desligamento.
STATE_POST_SHUTDOWN_ENTER Os preparativos para o desligamento foram concluídos, e a VMCU está pronta para ser desligada. Insira o estado de desligamento.
STATE_PRE_SHUTDOWN_PREPARE O processo de desligamento é solicitado, mas o CPMS ainda não o inicia. A tela e o áudio ainda estão ativados
STATE_SHUTDOWN_PREPARE O modo garagem pode ser executado durante esse período.
STATE_SUSPEND_ENTER Os apps precisam ser limpos e estar prontos para a suspensão para RAM.
STATE_POST_SUSPEND_ENTER As preparações para suspensão para RAM foram concluídas, e a VMCU está pronta para suspensão para RAM. Entre no estado de suspensão.
STATE_SUSPEND_EXIT Retomar da suspensão ou de uma suspensão cancelada.
STATE_HIBERNATION_ENTER Os apps precisam ser limpos e estar prontos para hibernar.
STATE_POST_HIBERNATION_ENTER Os preparativos para a hibernação foram concluídos e a VMCU está pronta para entrar no estado de hibernação.
STATE_HIBERNATION_EXIT Retomar da hibernação ou de uma hibernação cancelada.
STATE_WAIT_FOR_VHAL O sistema está sendo iniciado, mas aguardando o estabelecimento da comunicação com a VHAL antes de entrar no estado ON.

Cancelamento do registro do CarPowerStateListener

Para cancelar o registro de todos os objetos de listener registrados no CPM, chame o método clearListener:

powerManager.clearListener();

Integração de sistema na sua implementação do Android

Os integradores são responsáveis pelos seguintes itens:

  • Implementação da interface do kernel para suspender o Android.
  • Implemente as funções da VHAL para:
    • Propagar o início da suspensão ou do desligamento do carro para o Android.
    • Envie a mensagem de desligamento do Android para o carro.
    • Inicie o desligamento ou a suspensão do Android pela interface do kernel do Linux.
  • Verifique se todas as origens de ativação estão desativadas quando o dispositivo está em suspensão.
  • Verifique se os apps são desligados com rapidez suficiente para não adiar indefinidamente o processo de encerramento.
  • Verifique se o BSP ativa (ou desativa) os componentes do dispositivo de acordo com a política de energia para não bloquear a suspensão ou hibernação.

Interface do kernel: /sys/power/state

O AAOS coloca um dispositivo no modo de suspensão quando um app ou serviço grava mem para suspensão para RAM ou disk para suspensão para disco em um arquivo localizado em /sys/power/state. O integrador precisa fornecer uma função que monitore esse arquivo e coloque o Linux no estado de energia de suspensão. Essa função pode enviar um GPIO para a VMCU para notificar que o dispositivo foi desligado completamente. O integrador também é responsável por remover quaisquer condições de disputa entre a VHAL enviando a mensagem final para a VMCU e o sistema entrando em modo de suspensão ou desligamento.

Responsabilidade da VHAL

A VHAL fornece uma interface entre a rede do veículo e o Android. O VHAL:

  • Propaga o início da suspensão ou do desligamento do carro para o Android.
  • Envia a mensagem de desligamento do Android para o carro.
  • Inicia o desligamento ou a suspensão do Android pela interface do kernel do Linux.

Quando o CPMS informa à VHAL que está pronto para desligar, a VHAL envia a mensagem de desligamento pronto para a VMCU. Normalmente, periféricos no chip, como UART, SPI e USB, transmitem a mensagem. Depois que a mensagem é enviada, o CPMS chama o comando do kernel para suspender ou desligar o dispositivo. Antes disso, a VHAL ou o BSP podem alternar um GPIO para instruir a VMCU de que é seguro remover a energia do dispositivo.

A VHAL precisa oferecer suporte às seguintes propriedades, que controlam o gerenciamento de energia pela VHAL:

Nome Descrição
AP_POWER_STATE_REPORT O Android informa as transições de estado para a VMCU com essa propriedade, usando valores de enumeração VehicleApPowerStateReport.
AP_POWER_STATE_REQ A VMCU usa essa propriedade para instruir o Android a fazer a transição para diferentes estados de energia, usando valores de enumeração VehicleApPowerStateReq.

AP_POWER_STATE_REPORT

Use essa propriedade para informar o estado atual de gerenciamento de energia do Android. Essa propriedade contém dois números inteiros:

  • int32Values[0]: enumeração VehicleApPowerStateReport do estado atual.
  • int32Values[1]: tempo em milissegundos para adiar, suspender ou desligar. O significado desse valor depende do primeiro.

O primeiro valor pode ser um dos seguintes: VehicleApPowerStateReport.aidl contém descrições mais específicas, que são armazenadas no hardware/interfaces/automotive/vehicle/aidl/android/hardware/automotive/vehicle.

Nome do valor Descrição Segundo valor
WAIT_FOR_VHAL O AP está sendo iniciado e precisa estabelecer comunicação com a VHAL.
DEEP_SLEEP_ENTRY O AP está entrando no estado de suspensão profunda. A VMCU precisa reativar o AP após o tempo especificado no segundo valor. Obrigatório
DEEP_SLEEP_EXIT O PA está saindo do estado de suspensão profunda.
HIBERNATION_ENTRY O AP está entrando no estado de hibernação. A VMCU precisa reativar o AP após o tempo especificado no segundo valor. Obrigatório
HIBERNATION_EXIT O AP está saindo do estado de hibernação.
SHUTDOWN_POSTPONE O Android não está pronto para ser desligado. A VMCU precisa esperar o tempo especificado no segundo valor antes de desligar o AP. O Android pode solicitar mais adiamentos emitindo outros relatórios SHUTDOWN_POSTPONE. Obrigatório
SHUTDOWN_PREPARE O Android está se preparando para desligar. Obrigatório
SHUTDOWN_START O AP está pronto para ser desligado. A VMCU precisa ligar o AP novamente após o tempo especificado no segundo valor. A VMCU não precisa ser compatível com o recurso de ativação programada. Obrigatório
SHUTDOWN_CANCELLED O Android está deixando de se preparar para desligar e vai passar para WAIT_FOR_VHAL.
ATIVADO O Android está funcionando normalmente.

O estado pode ser definido de forma autônoma ou em resposta a uma solicitação pela VMCU.

AP_POWER_STATE_REQ

Essa propriedade é enviada pela VMCU para fazer a transição do Android para um estado de energia diferente e contém dois números inteiros:

  • int32Values[0]: valor de enumeração VehicleApPowerStateReq, que representa o novo estado para o qual fazer a transição.
  • int32Values[1]: valor de enumeração VehicleApPowerStateShutdownParam. Esse valor é enviado apenas para uma mensagem SHUTDOWN_PREPARE e transmite ao Android as opções que ela contém.

O primeiro valor inteiro representa o novo estado para o qual o Android vai transitar. A semântica é definida em VehicleApPowerStateReq.aidl e fornecida abaixo:

Nome do valor Descrição
ATIVADO A AP deve começar a operar normalmente.
SHUTDOWN_PREPARE O ponto de acesso vai se preparar para desligar. O segundo valor indica se o PA pode adiar o desligamento e se ele deve esperar desligar ou entrar em sono profundo.
CANCEL_SHUTDOWN O AP vai parar de se preparar para desligar e vai se preparar para LIGAR.
FINISHED O PA será desligado ou suspenso.

VehicleApPowerStateShutdownParam é definido em VehicleApPowerStateShutdownParam.aidl. Essa enumeração tem estes elementos:

Nome do valor Descrição
CAN_SLEEP O AP pode entrar em suspensão profunda em vez de ser desligado completamente. É permitido adiar.
CAN_HIBERNATE O AP pode entrar em hibernação em vez de ser desligado completamente. É permitido adiar.
SHUTDOWN_ONLY O AP será desligado. É permitido adiar. Não é permitido sono profundo.
SLEEP_IMMEDIATELY O PA pode entrar em suspensão profunda, mas precisa entrar em suspensão ou ser desligado imediatamente. Não é possível adiar.
HIBERNATE_IMMEDIATELY O AP pode entrar em suspensão para disco, mas precisa hibernar ou desligar imediatamente. Não é possível adiar.
SHUTDOWN_IMMEDIATELY O AP precisa ser desligado imediatamente. Não é possível adiar. Não é permitido sono profundo.

Origens de ativação

O integrador precisa desativar as fontes de ativação adequadas quando o dispositivo está no modo de suspensão. As fontes de despertar comuns incluem pulsações, modem, Wi-Fi e Bluetooth. A única origem de ativação válida precisa ser uma interrupção da VMCU para ativar o SoC. Isso pressupõe que a VMCU pode ouvir o modem para eventos de ativação remota, como partida remota do motor. Se essa funcionalidade for enviada para o AP, será necessário adicionar outra fonte de ativação para atender ao modem.

Apps

Os OEMs precisam ter cuidado ao escrever apps para que eles possam ser desligados rapidamente e não adiem o processo indefinidamente.

Apêndice

Diretórios na árvore de código-fonte

Conteúdo Diretório
Código relacionado ao CarPowerManager. packages/services/Car/car-lib/src/android/car/hardware/power
CarPowerManagementService e assim por diante. packages/services/Car/service/src/com/android/car/power
Serviços que lidam com a VHAL, como VehicleHal e HAlClient. packages/services/Car/service/src/com/android/car/hal
Interface VHAL e definições de propriedades. hardware/interfaces/automotive/vehicle/aidl/android/hardware/automotive/vehicle/
App de exemplo para dar uma ideia sobre o CarPowerManager packages/services/Car/tests/EmbeddedKitchenSinkApp/src/com/google/android/car/kitchensink

Diagrama de classes

Este diagrama de classes mostra as classes e interfaces Java no sistema de gerenciamento de energia:

Diagrama de classe de energia

Figura 4. Diagrama de classe de energia.

Relacionamento de objeto

A Figura 5 ilustra quais objetos têm referências a outros objetos. Uma aresta significa que o objeto de origem tem uma referência ao objeto de destino. Por exemplo, o VehicleHAL tem uma referência a um objeto PropertyHalService.

Diagrama de referência de objeto

Figura 5. Diagrama de referência de objeto.