Partilhar via


Arquitetura do aplicativo de carregamento de bateria UEFI fornecido pela Microsoft

Este tópico fornece informações sobre o design do aplicativo de carregamento de bateria UEFI fornecido pela Microsoft para dispositivos que executam Windows 10 Mobile. Os OEMs podem usar o aplicativo de carregamento de bateria da Microsoft ou podem implementar seu próprio aplicativo de carregamento. Os OEMs que implementam seu próprio aplicativo de carregamento de bateria UEFI podem usar as informações neste tópico como uma diretriz para seu design.

O aplicativo de carregamento de bateria UEFI é um dos primeiros aplicativos de propriedade da Microsoft executados durante o processo de inicialização. O aplicativo de carregamento de bateria UEFI tem as seguintes responsabilidades principais:

O aplicativo de carregamento de bateria UEFI usa os principais protocolos UEFI e reage a vários estados retornados pelos drivers relacionados.

O termo aplicativo de carregamento de bateria UEFI neste tópico refere-se à biblioteca de carregamento de bateria UEFI carregada por mobilestartup.efi. Para obter mais informações sobre mobilestartup.efi, consulte Inicialização e UEFI.

Protocolos UEFI usados pelo aplicativo de carregamento de bateria UEFI

O aplicativo de carregamento de bateria UEFI (de propriedade da Microsoft) usa os protocolos (implementados por OEMs) discutidos nas seções a seguir.

Protocolo de carregamento de bateria UEFI (EFI_BATTERY_CHARGING_PROTOCOL)

As etapas a seguir descrevem os principais aspectos de como o aplicativo de carregamento de bateria UEFI usa o protocolo de carregamento de bateria UEFI:

  1. O aplicativo de carregamento de bateria UEFI sonda o status em tempo real do hardware da bateria usando EFI_BATTERY_CHARGING_PROTOCOL. GetBatteryInformation (em dispositivos que dão suporte à versão 0x00010002 do EFI_BATTERY_CHARGING_PROTOCOL) ou EFI_BATTERY_CHARGING_PROTOCOL. GetBatteryStatus (em dispositivos que dão suporte à versão 0x00010001 do EFI_BATTERY_CHARGING_PROTOCOL). É importante que essas funções retornem um valor de SOC (estado de cobrança) preciso sempre que possível. SOC é um mapeamento definido pelo OEM da quantidade de carga na bateria com base em seu estado (incluindo capacidade, tensão e temperatura) para um valor de 0 a 100.

  2. Os OEMs definem o limite inicial para o sistema operacional principal (um valor de 0 a 100). Esse valor pode ser diferente para modelos de dispositivo diferentes. Para obter mais informações sobre o limite de inicialização para o sistema operacional principal e outros valores de limite, consulte Carregamento de bateria no ambiente de inicialização.

  3. O aplicativo de carregamento de bateria usa o SOC do driver e o compara com o valor de limite inicialização para o sistema operacional principal para determinar se ele precisa bloquear o processo de inicialização para carregar na UEFI ou continuar com a inicialização. Ele não recebe nenhuma outra informação sobre o estado de cobrança.

  4. O aplicativo de carregamento de bateria UEFI chama EFI_BATTERY_CHARGING_PROTOCOL. ChargeBattery para carregar o dispositivo e aguarda um CompletionEvent com um EFI_BATTERY_CHARGING_STATUS correspondente ser retornado.

Para obter mais informações sobre esse protocolo, consulte Protocolo de carregamento de bateria UEFI.

Protocolo de estado de energia de exibição UEFI (EFI_DISPLAY_POWER_PROTOCOL)

Durante o processo de carregamento da bateria UEFI, o aplicativo de carregamento de bateria UEFI exibe uma interface do usuário alternada de baixa potência. Após 10 segundos sem que o botão de energia seja pressionado, o aplicativo chama EFI_DISPLAY_POWER_PROTOCOL. DefinaDisplayPowerState para desativar a tela e a luz de fundo. Isso ajuda o dispositivo a consumir menos energia durante o carregamento da bateria UEFI, o que ajuda o dispositivo a carregar e prosseguir para o sistema operacional principal mais rapidamente. Se o usuário pressionar o botão de energia enquanto a exibição estiver desativada, o aplicativo chamará EFI_DISPLAY_POWER_PROTOCOL. SetDisplayPowerState novamente para ativar a exibição novamente. Para obter mais detalhes, consulte Experiência do usuário mais adiante neste tópico.

Para obter mais informações sobre esse protocolo, consulte UEFI display power state protocol.

Protocolo de função USB UEFI (EFI_USBFN_IO_PROTOCOL)

O aplicativo de carregamento de bateria UEFI depende exclusivamente de EFI_USBFN_IO_PROTOCOL. DetectPort para determinar o tipo de porta que está conectada. Com base no tipo de porta, o aplicativo chama EFI_BATTERY_CHARGING_PROTOCOL. ChargeBattery com 1500 mA ou 500 mA.

Para obter mais informações sobre esse protocolo, consulte Protocolo de função USB UEFI.

Lógica do aplicativo

O diagrama a seguir descreve o procedimento lógico do aplicativo de carregamento de bateria UEFI.

lógica de carregamento de bateria uefi.

As seguintes notas se expandem em algumas seções principais da lógica:

  • Antes de chamar EFI_BATTERY_CHARGING_PROTOCOL. ChargeBattery, o aplicativo chama EFI_USBFN_IO_PROTOCOL. DetectPort para determinar a corrente máxima que o carregador USB pode fornecer:

    • Se houver uma porta presente, o aplicativo usará 1500 mA para carregador de parede dedicado ou 500 mA para outras portas.

    • Se não houver nenhuma porta presente, o aplicativo usará 500 mA. Espera-se que um carregador sem fio ignore esse valor.

    • Se não houver carregador presente, o aplicativo usará 500 mA. No entanto, o aplicativo espera EFI_BATTERY_CHARGING_PROTOCOL. ChargeBattery para retornar um EFI_BATTERY_CHARGING_COMPLETION_TOKEN com um status de EfiBatteryChargingSourceNotDetected.

  • Em todos os casos, o OEM deve garantir que o dispositivo e o carregador permaneçam dentro de regiões operacionais seguras.

  • Se não houver bateria no dispositivo, mas houver uma fonte de energia conectada, quando o aplicativo chamar EFI_BATTERY_CHARGING_PROTOCOL. ChargeBattery para carregar a bateria, o driver de carregamento de bateria UEFI deve retornar EfiBatteryChargingStatusBatteryNotDetected. O aplicativo lida com esse erro exibindo uma interface do usuário de erro e desligando o dispositivo.

  • Os valores EFI_BATTERY_CHARGING_STATUS são interpretados da mesma forma nos modos de carregamento de limite e de desligar, exceto para EfiBatteryChargingStatusSuccess. Para obter mais informações sobre esses modos de carregamento, consulte Carregamento de bateria no ambiente de inicialização.

  • Quando o dispositivo estiver em um modo de carregamento, a desconexão da fonte de alimentação deverá resultar no firmware sinalizando o aplicativo com EfiBatteryChargingSourceNotDetected, o que resultará no desligamento do dispositivo pelo aplicativo.

  • Se o firmware sinalizar o aplicativo com um status de EfiBatteryChargingStatusOverheat ou EfiBatteryChargingStatusTimeout, o dispositivo pausa o carregamento por 5 minutos (mas o aplicativo ainda chama EFI_BATTERY_CHARGING_PROTOCOL. GetBatteryInformation ou EFI_BATTERY_CHARGING_PROTOCOL. GetBatteryStatus em intervalos de aproximadamente 1 segundo). Após 5 minutos, o dispositivo retoma o carregamento chamando EFI_BATTERY_CHARGING_PROTOCOL. ChargeBattery. Durante esses 5 minutos, espera-se que o firmware sinalize o evento fornecido pelo aplicativo com o valor de EFI_BATTERY_CHARGING_STATUS apropriado (por exemplo, uma desconexão de origem deve sinalizar EfiBatteryChargingSourceNotDetected).

  • Em ambos os modos de carregamento, uma interface do usuário animada relevante será mostrada durante a caixa rotulada Permanecer no aplicativo no diagrama anterior.

  • No modo de carregamento de desligar, se o firmware tiver sinalizado um evento e fornecer um status de EfiBatteryChargingStatusSuccess, o aplicativo de carregamento de bateria UEFI não será inicializado no sistema operacional principal até que o usuário mantenha o botão de energia por 3 segundos. No entanto, se o aplicativo detectar que o cabo USB foi desconectado no momento, ele desligará o dispositivo. O aplicativo de carregamento de bateria UEFI espera que o driver mantenha a bateria cheia no modo de carregamento de desligar.

  • No modo de carregamento de desligar, desde que o firmware não tenha sinalizado um erro ou um evento de êxito, o aplicativo de carregamento de bateria UEFI não desligará o dispositivo.

Tratamento de erros

Toda vez que EFI_BATTERY_CHARGING_PROTOCOL. ChargeBattery é chamado, um EFI_BATTERY_CHARGING_COMPLETION_TOKEN é especificado. Se o driver apresentar um erro, o evento no token será sinalizado com um EFI_BATTERY_CHARGING_STATUS. A tabela a seguir ilustra como o aplicativo de carregamento de bateria UEFI reage aos diferentes valores de status em situações diferentes.

Status Modo de carregamento de limite Modo de carregamento de desligar (antes e depois que o estado de cobrança atinge o limite)
EfiBatteryChargingStatusNoneNone Não esperado/inválido Não esperado/inválido
EfiBatteryChargingStatusSuccess Inicializar para o sistema operacional Antes que o estado da cobrança atinja o limite: Continue no modo de carregamento de desligar. Depois que o estado de cobrança atingir o limite: Mantenha-se no modo de carregamento de desligar até que o USB seja desconectado.
EfiBatteryChargingStatusOverheat Pausar o carregamento por 5 minutos e, em seguida, retomar o carregamento Pausar o carregamento por 5 minutos e, em seguida, retomar o carregamento
EfiBatteryChargingStatusVoltageOutOfRange Inicializar para o sistema operacional Inicializar para o sistema operacional
EfiBatteryChargingStatusCurrentOutOfRange Inicializar para o sistema operacional Inicializar para o sistema operacional
EfiBatteryChargingStatusTimeout Pausar o carregamento por 5 minutos e, em seguida, retomar o carregamento Pausar o carregamento por 5 minutos e, em seguida, retomar o carregamento
EfiBatteryChargingStatusAborted Exibir a interface do usuário do erro por 10 segundos e desligar Exibir a interface do usuário do erro por 10 segundos e desligar
EfiBatteryChargingStatusDeviceError Exibir a interface do usuário do erro por 10 segundos e desligar Exibir a interface do usuário do erro por 10 segundos e desligar
EfiBatteryChargingStatusExtremeCold Exibir a interface do usuário do erro por 10 segundos e desligar Exibir a interface do usuário do erro por 10 segundos e desligar
EfiBatteryChargingStatusBatteryChargingNotSupported Exibir a interface do usuário do erro por 10 segundos e desligar Exibir a interface do usuário do erro por 10 segundos e desligar
EfiBatteryChargingStatusBatteryNotDetected Exibir a interface do usuário do erro por 10 segundos e desligar Exibir a interface do usuário do erro por 10 segundos e desligar
EfiBatteryChargingSourceNotDetected Desligar Desligar
EfiBatteryChargingSourceVoltageInvalid Exibir a interface do usuário do erro por 10 segundos e desligar Exibir a interface do usuário do erro por 10 segundos e desligar
EfiBatteryChargingSourceCurrentInvalid Exibir a interface do usuário do erro por 10 segundos e desligar Exibir a interface do usuário do erro por 10 segundos e desligar
EfiBatteryChargingErrorRequestShutdown Desligar Desligar
EfiBatteryChargingErrorRequestReboot Reboot Reboot

A tabela a seguir ilustra como o aplicativo de carregamento de bateria UEFI reage aos valores de status recebidos de EFI_BATTERY_CHARGING_PROTOCOL. GetBatteryInformation ou EFI_BATTERY_CHARGING_PROTOCOL. GetBatteryStatus.

Status Modo de carregamento de limite Modo de carregamento de desligar (antes e depois que o estado de cobrança atinge o limite)
EFI_SUCCESS.
Esse valor é retornado quando nenhum erro foi detectado.
Não aplicável Não aplicável
EFI_INVALID_PARAMETER.
Esse valor é retornado quando um parâmetro de entrada está incorreto. Teoricamente, isso não deve ser possível no ambiente de produção.
Exibir a interface do usuário do erro por 10 segundos e desligar Exibir a interface do usuário do erro por 10 segundos e desligar
EFI_DEVICE_ERROR ou EFI_NOT_READY.
Essas condições de erro são tratadas da mesma maneira. Esses valores devem ser retornados por EFI_BATTERY_CHARGING_PROTOCOL. GetBatteryInformation ou EFI_BATTERY_CHARGING_PROTOCOL. GetBatteryStatus nos casos em que o dispositivo pode não ser capaz de inicializar para o sistema operacional principal devido a algum erro de dispositivo. Especialmente:

EfiBatteryChargingStatusAborted
EfiBatteryChargingStatusDeviceError
EfiBatteryChargingStatusExtremeCold
EfiBatteryChargingStatusBatteryChargingNotSupported
EfiBatteryChargingStatusBatteryNotDetected
EfiBatteryChargingSourceVoltageInvalid
EfiBatteryChargingSourceCurrentInvalid
EfiBatteryChargingErrorRequestShutdown
EfiBatteryChargingErrorRequestReboot.

Gerar EFI_DEVICE_ERROR ou EFI_NOT_READY seguido por um token de conclusão de um dos erros listados acima fará com que o dispositivo seja desligado eventualmente.
Retomar e chamar EFI_BATTERY_CHARGING_PROTOCOL. ChargeBattery Retomar e chamar EFI_BATTERY_CHARGING_PROTOCOL. ChargeBattery

Experiência do usuário

O diagrama a seguir mostra como o aplicativo de carregamento de bateria UEFI desenha a interface do usuário para a tela se não houver carga suficiente na bateria ou se o dispositivo estiver no modo de carregamento de desligar.

experiência do usuário de carregamento de bateria.

As etapas a seguir descrevem como o aplicativo desenha a interface do usuário para a tela:

  • O aplicativo limpa a tela gravando a cor de preenchimento da tela de fundo em cada pixel no quadro.

  • O aplicativo desenha os bitmaps alternados de bateria baixa da interface do usuário copiando pixels dos buffers de bitmap diretamente para a tela. Se 10 segundos passarem sem que o botão de energia seja pressionado, o aplicativo chamará EFI_DISPLAY_POWER_PROTOCOL. DefinaDisplayPowerState para desativar a tela e a luz de fundo. Se o usuário pressionar o botão de energia, EFI_DISPLAY_POWER_PROTOCOL. SetDisplayPowerState é chamado para ativar novamente a exibição.

  • Quando o aplicativo recebe erros do driver, o aplicativo limpa a tela gravando a cor de preenchimento da tela de fundo em cada pixel no buffer de quadros e, em seguida, o aplicativo desenha a tela de erro da bateria copiando pixels do buffer de bitmap apropriado diretamente para a exibição.