alder_lake_bios/Lcfc/LfcPkg/LenovoChargingLogo/LenovoChargingLogo.c

237 lines
5.7 KiB
C

/** @file
Main Funcion file.
;******************************************************************************
;* Copyright (c) 2014, Lenovo Corporation. All Rights Reserved.
;*
;* You may not reproduce, distribute, publish, display, perform, modify, adapt,
;* transmit, broadcast, present, recite, release, license or otherwise exploit
;* any part of this publication in any form, by any means, without the prior
;* written permission of Insyde Software Corporation.
;*
;******************************************************************************
*/
#include <Uefi.h>
#include <SetupConfig.h>
#include "LenovoChargingLogo.h"
#include <Library/UefiBootServicesTableLib.h>
#include <Protocol/AcpiSupport.h>
#include <Lfc.h>
#include <Library/LfcEcLib.h>
#include <Protocol/LfcNvsArea.h>
#include <Protocol/LenovoVariable.h>
#include <Protocol/StartOfBdsDiagnostics.h>
EFI_STATUS
LCL_ClearScreen(
VOID
)
{
gST->ConOut->ClearScreen (gST->ConOut);
return EFI_SUCCESS;
}
EFI_STATUS
LCL_InitializeGUILogo(
VOID
)
{
EFI_STATUS Status = EFI_SUCCESS;
Status = InitializeGUI();
if (EFI_ERROR(Status)) {
DebugL(L"InitializeGUI Error.\r\n");
return Status;
}
return EFI_SUCCESS;
}
EFI_STATUS
LCL_Draw_Battery(
UINTN Percent,
UINT8 ACStatus,
UINT8 BattStatus
)
{
EFI_STATUS Status = EFI_SUCCESS;
DrawBatteryInfo(Percent,ACStatus,BattStatus);
DrawBattery(Percent);
return Status;
}
EFI_STATUS
LfcEcPowerStateIsAcOrAnykey (
OUT BOOLEAN *IsAcStatus,
OUT BOOLEAN *IsAnykeyStatus
)
{
EFI_STATUS Status;
UINT8 AcorAnykeyStatus = TRUE;
//if (!mLcfcEcLibSupport) {
//return EFI_UNSUPPORTED;
//}
//
// Get AC State connect or press any key by EC ram register 0x05
//
Status = LfcEcLibEcRamRead (0x05, &AcorAnykeyStatus);
if (EFI_ERROR (Status)) {
return Status;
}
// Check if press any key ?
if ((AcorAnykeyStatus & 0x01) == 0) {
*IsAnykeyStatus = FALSE;
} else {
*IsAnykeyStatus = TRUE;
}
// Check if plug in AC ?
if ((AcorAnykeyStatus & 0x02) == 0) {
*IsAcStatus = FALSE;
} else {
*IsAcStatus = TRUE;
}
return Status;
}
EFI_STATUS
LenovoChargingLogoCallBack (
IN EFI_EVENT Event,
IN VOID *Context
)
{
EFI_STATUS Status = EFI_SUCCESS;
UINTN DisplayTime = 0; //seconds
UINT8 Percent = 0;
UINT8 Percent_Bak = 0xFF;
UINT8 ACStatus = 0;
UINT8 ACStatus_Bak = 0xFF;
UINT8 BattStatus = 0;
UINT8 BattStatus_Bak = 0xFF;
UINT8 IndexPort;
UINTN VarSize;
SYSTEM_CONFIGURATION SetupVariable;
VarSize = sizeof (SYSTEM_CONFIGURATION);
Status = gRT->GetVariable (
L"Setup",
&gSystemConfigurationGuid,
NULL,
&VarSize,
&SetupVariable
);
if (EFI_ERROR (Status)) {
//
// Setup menu is default setting.
//
return Status;
}
if (SetupVariable.L05ChargingLogoShow == 0) {
return Status;
}
LCL_ClearScreen();
Status = LCL_InitializeGUILogo();
if (EFI_ERROR (Status)) {
/*Reset system.*/
gRT->ResetSystem (EfiResetWarm, EFI_SUCCESS, 0, NULL);
}
IndexPort = 0x4E;
IoWrite8 (IndexPort, 0x87);
IoWrite8 (IndexPort, 0x01);
IoWrite8 (IndexPort, 0x55);
IoWrite8 (IndexPort, 0x55);
while(DisplayTime++ < DISPLAY_TIME_SECONDS)
{
gBS->Stall(1000000); //wait for 1 second.
/*get battery percent.*/
//GetBatteryPercentage(&Percent);
LfcEcLibGetBatteryPercentage(&Percent);
/*get AC Status.*/
//GetACStatus(&ACStatus);
LfcEcLibPowerStateIsAc(&ACStatus);
/*get Battery Status.*/
GetBattStatus(&BattStatus);
if((Percent_Bak != Percent) ||
(ACStatus_Bak != ACStatus) ||
(BattStatus_Bak != BattStatus) ){
Percent_Bak = Percent;
ACStatus_Bak = ACStatus;
BattStatus_Bak = BattStatus;
LCL_ClearScreen();
LCL_Draw_Battery((UINTN)Percent, ACStatus, BattStatus);
}
}
//Show charging logo for 30s, then shutdown.
gRT->ResetSystem (EfiResetShutdown, EFI_SUCCESS, 0, NULL);
return Status;
}
/**
The user Entry Point for Application. The user code starts with this function
as the real entry point for the application.
@param[in] ImageHandle The firmware allocated handle for the EFI image.
@param[in] SystemTable A pointer to the EFI System Table.
@retval EFI_SUCCESS The entry point is executed successfully.
@retval other Some error occurs when executing this entry point.
**/
EFI_STATUS
EFIAPI
LenovoChargingLogoEntry (
IN EFI_HANDLE ImageHandle,
IN EFI_SYSTEM_TABLE *SystemTable
)
{
EFI_STATUS Status;
EFI_EVENT Event;
VOID *Registration;
BOOLEAN IsAcPowerOn;
BOOLEAN IsAnykeyPowerOn;
Status = LfcEcPowerStateIsAcOrAnykey(&IsAcPowerOn, &IsAnykeyPowerOn);
if ((IsAcPowerOn == TRUE) || (IsAnykeyPowerOn == TRUE)) {
// Install notify to callback
Status = gBS->CreateEvent (
EVT_NOTIFY_SIGNAL,
TPL_CALLBACK,
LenovoChargingLogoCallBack,
NULL,
&Event
);
if (!EFI_ERROR (Status)) {
Status = gBS->RegisterProtocolNotify (
&gEfiStartOfBdsDiagnosticsProtocolGuid,
Event,
&Registration
);
}
}
return EFI_SUCCESS;
}