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 Mestre do Veículo (VMCU). Para se comunicar com o VMCU, os integradores devem 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 desabilitar fontes de ativação e garantir que os desligamentos não sejam adiados indefinidamente.

Terminologia

Estes termos são usados ​​ao longo deste documento:

Processador de aplicativos (AP)
Parte do System-on-a-Chip (SoC) .
Pacote de suporte de placa (BSP)
A camada de software que contém firmware de inicialização específico de hardware e drivers de dispositivo que permitem que um sistema operacional integrado funcione em um determinado ambiente de hardware (uma placa-mãe), integrado ao sistema operacional integrado.
CarPowerManager (CPM)
Expõe uma API para aplicativos registrarem alterações de estado de energia.
CarPowerManagementService (CPMS)
Implementa a máquina de estado de energia do carro, faz interface com VHAL e executa as chamadas finais para suspend() e shutdown() .
CarPowerPolicyDaemon (CPPD)
Expõe as interfaces AIDL para processos nativos para registrar o ouvinte de política 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 a qual todos os outros módulos de nível superior devem interagir para acessar a funcionalidade de hardware.
hibernar
Também conhecido como Suspend-to-Disk (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)
Veja System-on-a-Chip (SoC) abaixo.
Circuito integrado de gerenciamento de energia (PMIC)
Chip usado para gerenciar requisitos de energia para o sistema host.
System-on-a-Chip (SoC)
Processador principal que executa AAOS, normalmente fornecido por fabricantes como Intel, MediaTek, Nvidia, Qualcomm, Renesas e Texas Instruments.
Suspender
Também conhecido como Suspender para RAM (S2R ou STR). O SoC é colocado no modo de energia S3 e a CPU é desligada enquanto a RAM permanece ligada.
Veículo HAL (VHAL)
A API do Android usada para fazer interface com a rede do veículo. O parceiro de Nível 1 ou OEM é responsável por escrever este módulo. A rede do veículo pode usar qualquer camada física (como CAN, LIN, MOST e Ethernet). O VHAL abstrai esta rede de veículos para permitir que o AAOS interaja com o veículo.
Processador de interface do veículo (VIP)
Consulte Veículo MCU.
Unidade de controle mestre 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 meio de sinais USB, UART, SPI e GPIO.

Projeto de sistema

Esta seção descreve como o AAOS representa o estado de energia do processador do aplicativo e quais módulos implementam o sistema de gerenciamento de energia. Este material 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

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 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 VHAL. Quando o motorista interage com o veículo, por exemplo, abrindo uma porta, a VMCU alimenta o SoC. AAOS recomeça de Suspend-to-RAM e entra em Wait for VHAL, onde aguarda a coordenação com o VHAL.
  • Sobre. O VHAL diz ao AAOS para entrar no estado On. Nesse estado, o AAOS está totalmente em execução e interagindo com o driver.
  • Preparação para desligamento. Quando o motorista termina de dirigir, o VHAL diz ao AAOS para entrar no Shutdown Prepare. Nesse estado, a tela e o áudio estão desligados e o AAOS não está interagindo com o driver. O sistema Android ainda está em execução e é gratuito para atualizar aplicativos e o sistema Android. Quando as atualizações, se houver, forem concluídas, o sistema Android entrará em Wait for VHAL Finish.
  • Aguarde o término do VHAL. Neste ponto, o AAOS informa ao VHAL que está pronto para desligar. Espera-se que a VMCU coloque o SoC em hibernação profunda e remova a energia do processador de aplicativos. O AAOS está então no estado Suspend-to-RAM, embora nenhum código esteja sendo executado.

Módulos de gerenciamento de energia

O sistema de gerenciamento de energia é composto por estes módulos:

Nome do módulo Descrição
CarPowerManager API Java ou C++.
CarPowerManagementService Coordena as transições de estado de energia.
CarPowerPolicyDaemon Comunica-se com os clientes da política de energia nativa.
Veículo HAL Interface com a VMCU.
Núcleo Suspender a implementação de RAM ou disco.

O recurso de suspensão/hibernação profunda (suspendendo o 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 ao gravar mem ou disk neste arquivo.

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

O CPPD gerencia a política de energia até que o CPMS assuma o controle. Ele também envia notificações de alteração de política de energia para os ouvintes nativos.

Algumas propriedades são definidas no VHAL. Para se comunicar com a VMCU, o CPMS lê e grava essas propriedades. os aplicativos podem usar a interface definida no CPM para monitorar mudanças no estado de energia. Essa interface também permite que os aplicativos registrem ouvintes de política de energia . Essa API pode ser chamada de Java e é anotada com @hide / @System API, o que significa que está disponível apenas para aplicativos privilegiados. A relação entre esses módulos, aplicativos e serviços é ilustrada abaixo:

Diagrama de referência dos componentes de energia

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

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 de entrar em suspensão profunda e sair da suspensão profunda para explicar como os módulos e aplicativos se comunicam:

Entre no sono profundo

Somente a VMCU pode iniciar o sono profundo. Depois que o sono profundo é iniciado, o VMCU envia uma notificação ao CPMS por meio do VHAL. O CPMS altera o estado para SHUTDOWN PREPARE e transmite essa transição de estado para todos os observadores (os aplicativos 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 aplicativos/serviços e o CPMS. O método onStateChanged() para os aplicativos/serviços é chamado de forma síncrona no método onStateChanged() do CPM. A maioria dos aplicativos e serviços é necessária para concluir sua preparação antes de retornar desta chamada. Os serviços privilegiados podem continuar suas preparações de forma assíncrona após o retorno para PRE_SHUTDOWN_PREPARE , SUSPEND_ENTER , POST_SUSPEND_ENTER . Nesse caso, o serviço privilegiado deve chamar complete() no objeto CompletablePowerStateChangeFuture fornecido quando terminar sua preparação. Observe que a preparação assíncrona não é permitida para SHUTDOWN_PREPARE . Antes de DEEP_SLEEP_ENTRY ser enviado ao VHAL, o CPMS envia periodicamente solicitações de adiamento de desligamento ao VHAL.

Quando todos os objetos CPM concluírem as preparações de desligamento, o CPMS envia AP_POWER_STATE_REPORT para o VHAL, que então notifica o VMCU de que o AP está pronto para suspender. O CPMS também chama seu método suspend, que suspende o kernel.

A sequência descrita acima é ilustrada abaixo:

Entre no sono profundo

Figura 3. Entre no sono profundo

Interfaces de programação fornecidas pelo CPM

Esta seção descreve a API Java fornecida pelo CPM para aplicativos 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.

Use estas etapas para chamar as APIs fornecidas pelo CPM:

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

Criando um objeto CarPowerManager

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

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

CarPowerStateListener e registro

Aplicativos e serviços do sistema podem receber notificações de alteração de estado de energia implementando CarPowerManager.CarPowerStateListener . Essa interface define um método onStateChanged() , que é uma função de retorno de chamada invocada quando o estado de energia do CPMS é alterado. 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 este objeto ouvinte a monitorar uma transição de estado de energia, crie um novo encadeamento de execução e registre o ouvinte e este encadeamento no objeto CPM:

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

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

Nome Descrição
STATE_ON Digite o estado ligado. O sistema está totalmente operacional.
STATE_SHUTDOWN_CANCELLED O desligamento é cancelado e o estado de energia retorna ao estado normal.
STATE_SHUTDOWN_ENTER espera-se que os aplicativos sejam limpos e estejam prontos para serem desligados.
STATE_POST_SHUTDOWN_ENTER As preparações para desligar foram concluídas e a VMCU está pronta para desligar. Entre no estado de desligamento.
STATE_PRE_SHUTDOWN_PREPARE O processo de desligamento é solicitado, mas o CPMS ainda não inicia o processo. A exibição e o áudio ainda estão ativados
STATE_SHUTDOWN_PREPARE O Modo Garagem pode funcionar durante o período.
STATE_SUSPEND_ENTER espera-se que os aplicativos sejam limpos e estejam prontos para suspender para RAM.
STATE_POST_SUSPEND_ENTER As preparações para suspender para RAM foram concluídas e a VMCU está pronta para suspender para RAM. Entre no estado de suspensão.
STATE_SUSPEND_EXIT Acorde da suspensão ou retome de uma suspensão cancelada.
STATE_HIBERNATION_ENTER espera-se que os aplicativos sejam limpos e estejam prontos para a hibernação.
STATE_POST_HIBERNATION_ENTER As preparações para hibernação foram concluídas e a VMCU está pronta para hibernação Entre no estado de hibernação.
STATE_HIBERNATION_EXIT Acorde da hibernação ou retome de uma hibernação cancelada.
STATE_WAIT_FOR_VHAL O sistema está inicializando, mas aguardando estabelecer comunicação com o VHAL antes de passar para o estado ON.

Cancelamento de registro do CarPowerStateListener

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

powerManager.clearListener();

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

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

  • Implementando a interface do kernel para suspender o Android.
  • Implementando as funções VHAL para:
    • Propagar o início da suspensão ou desligamento do carro para o Android.
    • Envie a mensagem de desligamento pronto do Android para o carro.
    • Inicie o desligamento ou suspensão do Android por meio da interface do kernel do Linux.
  • Certifique-se de que todas as fontes de ativação estejam desativadas quando o dispositivo estiver em suspensão.
  • Certifique-se de que os aplicativos sejam encerrados com rapidez suficiente para não adiar indefinidamente o processo de desligamento.
  • Certifique-se de que o BSP liga (ou desliga) 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

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

responsabilidade VHAL

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

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

Quando o CPMS informa ao VHAL que está pronto para desligar, o VHAL envia a mensagem de desligamento pronto para o VMCU. Normalmente, os 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 de fazer isso, o VHAL ou BSP pode alternar um GPIO para instruir a VMCU de que é seguro remover a energia do dispositivo.

O VHAL deve suportar as seguintes propriedades, que controlam o gerenciamento de energia por meio do VHAL:

Nome Descrição
AP_POWER_STATE_REPORT O Android relata 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 esta propriedade para relatar o estado atual do gerenciamento de energia do Android. Esta propriedade contém dois números inteiros:

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

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

Nome do valor Descrição segundo valor
WAIT_FOR_VHAL O AP está iniciando e precisa estabelecer comunicação com o VHAL.
DEEP_SLEEP_ENTRY O AP está entrando no estado de hibernação profunda. A VMCU deve ligar o AP novamente após o tempo especificado no segundo valor. Deve ser definido
DEEP_SLEEP_EXIT O AP está saindo do estado de hibernação profunda.
HIBERNATION_ENTRY O AP está entrando no estado de hibernação. A VMCU deve ligar o AP novamente após o tempo especificado no segundo valor. Deve ser definido
HIBERNATION_EXIT O AP está saindo do estado de hibernação.
SHUTDOWN_POSTPONE O Android não está pronto para desligar. A VMCU deve aguardar o tempo especificado no segundo valor antes de desligar o AP. O Android pode solicitar adiamento adicional emitindo relatórios SHUTDOWN_POSTPONE adicionais. Deve ser definido
SHUTDOWN_PREPARE Android está se preparando para desligar. Deve ser definido
SHUTDOWN_START O AP está pronto para desligar. A VMCU deve ligar o AP novamente após o tempo especificado no segundo valor. (A VMCU não é necessária para oferecer suporte ao recurso de ativação programada.) Deve ser definido
SHUTDOWN_CANCELLED O Android está parando de se preparar para desligar e prosseguirá para WAIT_FOR_VHAL.
SOBRE O Android está rodando normalmente.

O estado pode ser definido de forma autônoma ou em resposta a uma solicitação via 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 enum VehicleApPowerStateReq , que representa o novo estado para o qual fazer a transição.
  • int32Values[1] : Valor de enum VehicleApPowerStateShutdownParam . Este valor é enviado apenas para uma mensagem SHUTDOWN_PREPARE e transmite ao Android as opções que contém.

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

Nome do valor Descrição
SOBRE AP deve começar a operação completa.
SHUTDOWN_PREPARE O AP deve se preparar para desligar. O segundo valor indica se o AP pode adiar o desligamento e se o AP deve esperar desligar ou entrar em hibernação profunda.
CANCEL_SHUTDOWN O AP deve parar de se preparar para desligar e se preparar para ON.
FINALIZADO O AP agora será desligado ou suspenso.

VehicleApPowerStateShutdownParam é definido em VehicleApPowerStateShutdownParam.aidl . Este enum tem estes elementos:

Nome do valor Descrição
PODE DORMIR O AP pode entrar em suspensão profunda em vez de desligar completamente. O adiamento é permitido.
CAN_HIBERNATE O AP pode entrar em hibernação em vez de desligar completamente. O adiamento é permitido.
SHUTDOWN_ONLY AP deve desligar. O adiamento é permitido. O sono profundo não é permitido.
SLEEP_IMMEDIATELY O AP pode entrar em hibernação profunda, mas deve dormir ou desligar imediatamente. Não é permitido adiar.
HIBERNATE_IMMEDIATELY O AP pode entrar em suspensão no disco, mas deve hibernar ou desligar imediatamente. Não é permitido adiar.
SHUTDOWN_IMMEDIATELY O AP deve desligar imediatamente. Não é permitido adiar. O sono profundo não é permitido.

Fontes de ativação

O integrador deve desabilitar as fontes de ativação apropriadas quando o dispositivo estiver no modo de suspensão. Fontes de ativação comuns incluem pulsações, modem, Wi-Fi e Bluetooth. A única fonte de ativação válida deve 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, outra fonte de ativação para atender o modem deverá ser adicionada.

aplicativos

Os OEMs devem ter o cuidado de escrever aplicativos para que possam ser encerrados rapidamente e não adiar o processo indefinidamente.

Apêndice

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

Contente 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 o VHAL, como VehicleHal e HAlClient . packages/services/Car/service/src/com/android/car/hal
Interface VHAL e definições de propriedade. hardware/interfaces/automotive/vehicle/aidl/android/hardware/automotive/vehicle/
Aplicativo de amostra para fornecer uma ideia sobre o CarPowerManager packages/services/Car/tests/EmbeddedKitchenSinkApp/src/com/google/android/car/kitchensink

diagrama de classes

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

Diagrama de classe de potência

Figura 5. Diagrama de classe de potência

relacionamento de objeto

O gráfico a seguir ilustra quais objetos têm referências a outros objetos. Uma aresta significa que o objeto de origem contém uma referência ao objeto de destino. Por exemplo, VehicleHAL tem uma referência a um objeto PropertyHalService.

Diagrama de referência do objeto

Figura 6. Diagrama de referência do objeto