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 Mestre de Controle do Veículo (VMCU). Para se comunicarem com a 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 pela 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 sistema em um chip (SoC) .
Pacote de Apoio ao Conselho (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 embarcado funcione em um determinado ambiente de hardware (uma placa-mãe), integrado ao sistema operacional embarcado.
CarPowerManager (CPM)
Expõe uma API para aplicativos se registrarem para 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 do hardware.
hibernar
Também conhecido como Suspender 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)
Veja sistema em um chip (SoC) .
circuito integrado de gerenciamento de energia (PMIC)
Chip usado para gerenciar os requisitos de energia do sistema host.
sistema em um 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 Tier 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 de veículo (VIP)
Consulte Veículo MCU.
Unidade Mestre de Controle do Veículo (VMCU)
O microcontrolador que fornece a interface entre a rede do veículo e o SoC. O SoC se comunica com o 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 normalmente ocorrem as transições de estado.

Máquina de estado de potência do carro

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

Máquina de estado de potência do carro

Figura 1. Máquina de estado de potência do carro.

As transições mais comuns estã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 SoC.
  • Aguarde VHAL. Quando o motorista interage com o veículo, por exemplo, abrindo uma porta, o VMCU aplica energia ao SoC. AAOS retoma 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. Neste 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 entra em Aguardar VHAL Finish.
  • Aguarde o término do VHAL. Neste ponto, a AAOS informa ao VHAL que está pronto para desligar. Espera-se que a VMCU coloque o SoC em suspensão profunda e remova a energia do processador do aplicativo. O AAOS está então no estado Suspenso para 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 de política de energia nativa.
Veículo HAL Interface com o VMCU.
Núcleo Suspender para implementação de RAM ou disco.

O recurso de suspensão/hibernação profunda (suspendendo o Android para RAM/disco) é implementado no kernel. Este recurso é exposto ao espaço do usuário como um arquivo especial localizado em /sys/power/state . AAOS é suspenso gravando 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 estados descrita acima e envia notificações a todos os observadores quando ocorre uma transição de estado de energia. Este serviço também utiliza o VHAL para enviar mensagens ao hardware.

O CPPD gere a política energética até que o CPMS assuma o controlo. Ele também envia notificações de alteração de política de energia aos ouvintes nativos.

Algumas propriedades são definidas no VHAL. Para se comunicar com o VMCU, o CPMS lê e grava essas propriedades. os aplicativos podem usar a interface definida no CPM para monitorar alterações no estado de energia. Essa interface também permite que os aplicativos registrem ouvintes de políticas 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 de componentes de potência

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

Entre no sono profundo

Somente o VMCU pode iniciar o sono profundo. Uma vez iniciado o sono profundo, o VMCU envia uma notificação ao CPMS através 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 aplicativos/serviços é invocado de forma síncrona no método onStateChanged() do CPM. A maioria dos aplicativos e serviços precisam concluir a preparação antes de retornar desta chamada. Os serviços privilegiados podem continuar seus preparativos de forma assíncrona após retornarem 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íram os preparativos de desligamento, o CPMS envia AP_POWER_STATE_REPORT para o VHAL, que então notifica o VMCU 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. Esta API permite que o software do sistema:

  • Monitore as alterações do 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.

Crie 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 argumento para criar um objeto CPM.

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

CarPowerStateListener e registro

Os aplicativos e serviços do sistema podem receber notificações de alteração do estado de energia implementando CarPowerManager.CarPowerStateListener . Esta 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 esse objeto ouvinte a monitorar uma transição de estado de energia, crie um novo encadeamento de execução e registre o ouvinte e esse 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
ESTADO_ON Entre no estado ligado. O sistema está totalmente operacional.
ESTADO_SHUTDOWN_CANCELLED O desligamento é cancelado e o estado de energia retorna ao estado normal.
ESTADO_SHUTDOWN_ENTER espera-se que os aplicativos sejam limpos e estejam prontos para serem encerrados.
STATE_POST_SHUTDOWN_ENTER Os preparativos para o encerramento foram concluídos e o VMCU está pronto para o encerramento. Entre no estado de desligamento.
ESTADO_PRE_SHUTDOWN_PREPARE O processo de desligamento é solicitado, mas o CPMS ainda não inicia o processo. A tela e o áudio ainda estão ativados
ESTADO_SHUTDOWN_PREPARE O Modo Garagem pode funcionar durante o período.
ESTADO_SUSPEND_ENTER espera-se que os aplicativos sejam limpos e estejam prontos para suspensão na RAM.
STATE_POST_SUSPEND_ENTER Os preparativos para suspensão para RAM foram concluídos e o VMCU está pronto para suspensão para RAM. Entre no estado de suspensão.
ESTADO_SUSPEND_EXIT Acorde da suspensão ou retome de uma suspensão cancelada.
ESTADO_HIBERNATION_ENTER espera-se que os aplicativos sejam limpos e estejam prontos para a hibernação.
STATE_POST_HIBERNATION_ENTER Os preparativos para a hibernação foram concluídos e o VMCU está pronto para a hibernação. Entre no estado de hibernação.
ESTADO_HIBERNATION_EXIT Acorde da hibernação ou retome de uma hibernação cancelada.
ESTADO_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 de CarPowerStateListener

Para cancelar o registro de todos os objetos listener 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:
    • Propague 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 Linux.
  • Certifique-se de que todos os wakesources estejam desabilitados quando o dispositivo estiver suspenso.
  • 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 ligue (ou desligue) 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 suspensão na RAM ou disk para suspensão no 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 ao VMCU para notificar o VMCU de que o dispositivo foi completamente desligado. O integrador também é responsável por remover quaisquer condições de corrida entre o VHAL enviando a mensagem final para o VMCU e o sistema entrando no 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 Linux.

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

O VHAL deve suportar as seguintes propriedades, que controlam o gerenciamento de energia através do VHAL:

Nome Descrição
AP_POWER_STATE_REPORT O Android relata transições de estado para o VMCU com essa propriedade, usando valores enum 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 enum VehicleApPowerStateReq.

AP_POWER_STATE_REPORT

Use esta propriedade para relatar o estado atual de gerenciamento de energia do Android. Esta propriedade contém dois inteiros:

  • int32Values[0] : enum VehicleApPowerStateReport do estado atual.
  • int32Values[1] : Tempo em milissegundos para adiar, suspender ou desligar. O significado deste 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
ESPERE_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 novamente o AP 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 novamente o AP 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
DESLIGAR_PREPARE O Android está se preparando para desligar. Deve ser definido
DESLIGAR_START O AP está pronto para desligar. A VMCU deve ligar novamente o AP após o tempo especificado no segundo valor. (O VMCU não é necessário para oferecer suporte ao recurso de ativação cronometrada.) Deve ser definido
DESLIGAMENTO_CANCELADO O Android está parando de se preparar para desligar e prosseguirá para WAIT_FOR_VHAL.
SOBRE O Android está funcionando normalmente.

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

AP_POWER_STATE_REQ

Esta propriedade é enviada pelo 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 enum VehicleApPowerStateShutdownParam . Este 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 no qual o Android transitará. A semântica é definida em VehicleApPowerStateReq.aidl e fornecida abaixo:

Nome do valor Descrição
SOBRE O AP deverá iniciar operação plena.
DESLIGAR_PREPARE O AP deve se preparar para desligar. O segundo valor indica se o AP tem permissão para adiar o desligamento e se o AP deve esperar desligar ou entrar em suspensão profunda.
CANCEL_SHUTDOWN O AP deve parar de se preparar para desligar e se preparar para ligar.
FINALIZADO O AP agora será encerrado ou suspenso.

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

Nome do valor Descrição
PODE DORMIR O AP pode entrar em suspensão profunda em vez de desligar completamente. Adiar é permitido.
CAN_HIBERNATE O AP pode entrar em hibernação em vez de desligar completamente. Adiar é permitido.
DESLIGAR_SOMENTE O AP deve desligar. Adiar é permitido. O sono profundo não é permitido.
DORMIR_IMMEDIATAMENTE O AP pode entrar em sono profundo, mas deve dormir ou desligar imediatamente. Adiar não é permitido.
HIBERNATE_IMMEDIATELY O AP pode entrar em suspensão para disco, mas deve hibernar ou desligar imediatamente. Adiar não é permitido.
DESLIGAR_IMMEDIATAMENTE O AP deve desligar imediatamente. Adiar não é permitido. O sono profundo não é permitido.

Fontes de despertar

O integrador deve desabilitar as fontes de ativação apropriadas quando o dispositivo estiver no modo de suspensão. As fontes de ativação comuns incluem batimentos cardíacos, 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 possa escutar o modem em busca de eventos de ativação remota (como partida remota do mecanismo). Se esta funcionalidade for enviada ao AP, outra fonte de ativação para atender o modem deverá ser adicionada.

Aplicativos

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

Apêndice

Diretórios na árvore do 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 tratam do 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/
Aplicativo de exemplo 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 classes de potência

Figura 4. Diagrama de classes de potência.

Relacionamento de objeto

A Figura 5 ilustra quais objetos possuem 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 de objeto

Figura 5. Diagrama de referência de objetos.