alder_lake_bios/Lcfc/LfcPkg/I2cTPGetVidDxe/I2cTPGetVidDxe.c

924 lines
28 KiB
C

//*****************************************************************************
//
// Copyright (c) 2012 - 2017, Hefei LCFC Information Technology Co.Ltd.
// And/or its affiliates. All rights reserved.
// Hefei LCFC Information Technology Co.Ltd. PROPRIETARY/CONFIDENTIAL.
// Use is subject to license terms.
//
//******************************************************************************
// Project Dxe Common code here
#include <Uefi.h>
#include <Guid/EventGroup.h>
#include <Guid/LfcVariableGuid.h>
#include <Guid/EfiSystemResourceTable.h>
#include <Library/UefiLib.h>
#include <Library/IoLib.h>
#include <Library/PcdLib.h>
#include <Library/LfcLib.h>
#include <Library/DebugLib.h>
#include <Library/VariableLib.h>
#include <Library/BaseMemoryLib.h>
#include <Library/DevicePathLib.h>
#include <Library/HidDescriptorLib.h>
#include <Library/MemoryAllocationLib.h>
#include <Library/UefiBootServicesTableLib.h>
#include <Library/UefiRuntimeServicesTableLib.h>
#include <Protocol/I2cIo.h>
#include <Protocol/LfcNvsArea.h>
#include <Protocol/SimplePointer.h>
#include <Protocol/AdapterInformation.h>
#include <Protocol/EndOfBdsBootSelection.h>
#include <I2cHidDeviceInfo.h>
#include <Bus/I2c/I2cDxe/I2cDxe.h>
#include <Bus/I2c/I2cDxe/I2cEnum.h>
#include <I2cTPGetVidDxe.h>
//[-start-210920-Ching000003-add]//
//[-start-210930-YUNLEI0141-modify]//
//[-start-211015-Ching000014-modify]//
//[-start-220127-Dennis0013-modify]//
//[-start-220209-OWENWU0037-modify]//
#if defined(S77014_SUPPORT) || defined(C770_SUPPORT) || defined(C970_SUPPORT) || defined(S77013_SUPPORT) || defined(S370_SUPPORT) || defined(S570_SUPPORT) || defined(S77014IAH_SUPPORT)
#include <Protocol/LfcProjectTouchPadTypeProtocol.h>
#endif
//[-end-220209-OWENWU0037-modify]//
//[-end-220127-Dennis0013-modify]//
//[-end-211015-Ching000014-modify]//
//[-end-210930-YUNLEI0141-modify]//
//[-end-210920-Ching000003-add]//
#define ESRT_LAST_ATTEMPT_VERSION L"EsrtLastAttemptVersion"
#define ESRT_LAST_ATTEMPT_STATUS L"EsrtLastAttemptStatus"
#define LFC_MOUSE_CLASS 0x0102
#define LFC_TOUCH_PANEL_CLASS 0x0d00
//[-start-210920-Ching000003-add]//
#if defined(S77014_SUPPORT) || defined(S77014IAH_SUPPORT)
#define ELAN 1
#define SYNA 2
EFI_HANDLE mTouchPadHandle = NULL;
/*
This function is to set Touch Pad Type variable data for ELAN firmware issue
*/
EFI_STATUS
SetTouchPadTypeProtocol(
IN UINT8 TouchPadType
)
{
EFI_STATUS Status;
UINT16 TouchPadPID;
LFC_NVS_AREA_PROTOCOL *LfcNvsAreaProtocol;
TouchPadPID = 0;
Status = gBS->LocateProtocol (&gLfcNvsAreaProtocolGuid, NULL, (VOID **)&LfcNvsAreaProtocol);
if (!EFI_ERROR(Status)) {
TouchPadPID = LfcNvsAreaProtocol->Area->TouchPadPID;
}
TouchPadPID &= 0XFF ;
switch(TouchPadType)
{
case ELAN:
//
// A workaround: Here we install a dummy ELAN handle
//
Status = gBS->InstallProtocolInterface (
&mTouchPadHandle,
&gLfcProjectTouchPadElanProtocolGuid,
EFI_NATIVE_INTERFACE,
NULL
);
break;
case SYNA:
//
// A workaround: Here we install a dummy SYNA handle
//
Status = gBS->InstallProtocolInterface (
&mTouchPadHandle,
&gLfcProjectTouchPadSynaProtocolGuid,
EFI_NATIVE_INTERFACE,
NULL
);
break;
default:
// Do Nothing
break;
}
return Status;
}
//[-start-210930-YUNLEI0141-modify]//
#elif defined(C770_SUPPORT)
#define ELAN 1
#define SYNA 2
EFI_HANDLE mTouchPadHandle = NULL;
/*
This function is to set Touch Pad Type variable data for ELAN firmware issue
*/
EFI_STATUS
SetTouchPadTypeProtocol(
IN UINT8 TouchPadType
)
{
EFI_STATUS Status;
UINT16 TouchPadPID;
LFC_NVS_AREA_PROTOCOL *LfcNvsAreaProtocol;
TouchPadPID = 0;
Status = gBS->LocateProtocol (&gLfcNvsAreaProtocolGuid, NULL, (VOID **)&LfcNvsAreaProtocol);
if (!EFI_ERROR(Status)) {
TouchPadPID = LfcNvsAreaProtocol->Area->TouchPadPID;
}
TouchPadPID &= 0XFF ;
switch(TouchPadType)
{
case ELAN:
//
// A workaround: Here we install a dummy ELAN handle
//
if(TouchPadPID == 0x7C) {
Status = gBS->InstallProtocolInterface (
&mTouchPadHandle,
&gLfcProjectTouchPadElanProtocolGuid,
EFI_NATIVE_INTERFACE,
NULL
);
}
else{
Status = gBS->InstallProtocolInterface (
&mTouchPadHandle,
&gLfcProjectTouchPadElan1ProtocolGuid,
EFI_NATIVE_INTERFACE,
NULL
);
}
break;
case SYNA:
//
// A workaround: Here we install a dummy SYNA handle
//
if(TouchPadPID == 0x44) {
Status = gBS->InstallProtocolInterface (
&mTouchPadHandle,
&gLfcProjectTouchPadSynaProtocolGuid,
EFI_NATIVE_INTERFACE,
NULL
);
}
else{
Status = gBS->InstallProtocolInterface (
&mTouchPadHandle,
&gLfcProjectTouchPadSyna1ProtocolGuid,
EFI_NATIVE_INTERFACE,
NULL
);
}
break;
default:
// Do Nothing
break;
}
return Status;
}
#elif defined(C970_SUPPORT)
#define ELAN 1
#define SYNA 2
EFI_HANDLE mTouchPadHandle = NULL;
/*
This function is to set Touch Pad Type variable data for ELAN firmware issue
*/
EFI_STATUS
SetTouchPadTypeProtocol(
IN UINT8 TouchPadType
)
{
EFI_STATUS Status;
UINT16 TouchPadPID;
LFC_NVS_AREA_PROTOCOL *LfcNvsAreaProtocol;
TouchPadPID = 0;
Status = gBS->LocateProtocol (&gLfcNvsAreaProtocolGuid, NULL, (VOID **)&LfcNvsAreaProtocol);
if (!EFI_ERROR(Status)) {
TouchPadPID = LfcNvsAreaProtocol->Area->TouchPadPID;
}
TouchPadPID &= 0XFF ;
switch(TouchPadType)
{
case ELAN:
//
// A workaround: Here we install a dummy ELAN handle
//
Status = gBS->InstallProtocolInterface (
&mTouchPadHandle,
&gLfcProjectTouchPadElan1ProtocolGuid,
EFI_NATIVE_INTERFACE,
NULL
);
break;
case SYNA:
//
// A workaround: Here we install a dummy SYNA handle
//
Status = gBS->InstallProtocolInterface (
&mTouchPadHandle,
&gLfcProjectTouchPadSyna1ProtocolGuid,
EFI_NATIVE_INTERFACE,
NULL
);
break;
default:
// Do Nothing
break;
}
return Status;
}
//[-end-210930-YUNLEI0141-modify]//
//[-start-211015-Ching000014-modify]//
#elif defined(S77013_SUPPORT)
#define ELAN 1
#define SYNA 2
EFI_HANDLE mTouchPadHandle = NULL;
/*
This function is to set Touch Pad Type variable data for ELAN firmware issue
*/
EFI_STATUS
SetTouchPadTypeProtocol(
IN UINT8 TouchPadType
)
{
EFI_STATUS Status;
UINT16 TouchPadPID;
LFC_NVS_AREA_PROTOCOL *LfcNvsAreaProtocol;
TouchPadPID = 0;
Status = gBS->LocateProtocol (&gLfcNvsAreaProtocolGuid, NULL, (VOID **)&LfcNvsAreaProtocol);
if (!EFI_ERROR(Status)) {
TouchPadPID = LfcNvsAreaProtocol->Area->TouchPadPID;
}
TouchPadPID &= 0XFF ;
switch(TouchPadType)
{
case ELAN:
//
// A workaround: Here we install a dummy ELAN handle
//
Status = gBS->InstallProtocolInterface (
&mTouchPadHandle,
&gLfcProjectTouchPadElan2ProtocolGuid,
EFI_NATIVE_INTERFACE,
NULL
);
break;
case SYNA:
//
// A workaround: Here we install a dummy SYNA handle
//
Status = gBS->InstallProtocolInterface (
&mTouchPadHandle,
&gLfcProjectTouchPadSyna2ProtocolGuid,
EFI_NATIVE_INTERFACE,
NULL
);
break;
default:
// Do Nothing
break;
}
return Status;
}
//[-start-220127-Dennis0013-modify]//
#elif defined(S370_SUPPORT)
#define ELAN 1
#define SYNA 2
#define CIRQUE 4
#define FOCAL 5
EFI_HANDLE mTouchPadHandle = NULL;
/*
This function is to set Touch Pad Type variable data for ELAN firmware issue
*/
EFI_STATUS
SetTouchPadTypeProtocol(
IN UINT8 TouchPadType
)
{
EFI_STATUS Status;
UINT16 TouchPadPID;
LFC_NVS_AREA_PROTOCOL *LfcNvsAreaProtocol;
TouchPadPID = 0;
Status = gBS->LocateProtocol (&gLfcNvsAreaProtocolGuid, NULL, (VOID **)&LfcNvsAreaProtocol);
if (!EFI_ERROR(Status)) {
TouchPadPID = LfcNvsAreaProtocol->Area->TouchPadPID;
}
TouchPadPID &= 0XFF ;
switch(TouchPadType)
{
case ELAN:
//
// A workaround: Here we install a dummy ELAN handle
//
if(TouchPadPID == 0xB8) {
Status = gBS->InstallProtocolInterface (
&mTouchPadHandle,
&gLfcProjectTouchPadElan3ProtocolGuid,
EFI_NATIVE_INTERFACE,
NULL
);
}
//[-start-220224-Dennis0015-modify]//
else if(TouchPadPID == 0xBE){
Status = gBS->InstallProtocolInterface (
&mTouchPadHandle,
&gLfcProjectTouchPadElan4ProtocolGuid,
EFI_NATIVE_INTERFACE,
NULL
);
}
else if(TouchPadPID == 0x48){
Status = gBS->InstallProtocolInterface (
&mTouchPadHandle,
&gLfcProjectTouchPadElan5ProtocolGuid,
EFI_NATIVE_INTERFACE,
NULL
);
}
else { //PID:0x3247
Status = gBS->InstallProtocolInterface (
&mTouchPadHandle,
&gLfcProjectTouchPadElan6ProtocolGuid,
EFI_NATIVE_INTERFACE,
NULL
);
}
break;
//[-end-220224-Dennis0015-modify]//
case SYNA:
//
// A workaround: Here we install a dummy SYNA handle
//
if(TouchPadPID == 0x2C) {
Status = gBS->InstallProtocolInterface (
&mTouchPadHandle,
&gLfcProjectTouchPadSyna3ProtocolGuid,
EFI_NATIVE_INTERFACE,
NULL
);
}
else{
Status = gBS->InstallProtocolInterface (
&mTouchPadHandle,
&gLfcProjectTouchPadSyna4ProtocolGuid,
EFI_NATIVE_INTERFACE,
NULL
);
}
break;
case CIRQUE:
//
// A workaround: Here we install a dummy CIRQUE handle
//
Status = gBS->InstallProtocolInterface (
&mTouchPadHandle,
&gLfcProjectTouchPadCirqueProtocolGuid,
EFI_NATIVE_INTERFACE,
NULL
);
break;
case FOCAL:
//
// A workaround: Here we install a dummy FOCAL handle
//
Status = gBS->InstallProtocolInterface (
&mTouchPadHandle,
&gLfcProjectTouchPadFocalProtocolGuid,
EFI_NATIVE_INTERFACE,
NULL
);
break;
default:
// Do Nothing
break;
}
return Status;
}
//[-end-220127-Dennis0013-modify]//
//[-start-220209-OWENWU0037-modify]//
#elif defined(S570_SUPPORT)
#define ELAN 1
#define SYNA 2
#define CIRQUE 4
#define FOCAL 5
EFI_HANDLE mTouchPadHandle = NULL;
/*
This function is to set Touch Pad Type variable data for ELAN firmware issue
*/
EFI_STATUS
SetTouchPadTypeProtocol(
IN UINT8 TouchPadType
)
{
EFI_STATUS Status;
UINT16 TouchPadPID;
LFC_NVS_AREA_PROTOCOL *LfcNvsAreaProtocol;
TouchPadPID = 0;
Status = gBS->LocateProtocol (&gLfcNvsAreaProtocolGuid, NULL, (VOID **)&LfcNvsAreaProtocol);
if (!EFI_ERROR(Status)) {
TouchPadPID = LfcNvsAreaProtocol->Area->TouchPadPID;
}
TouchPadPID &= 0XFF ;
switch(TouchPadType)
{
case ELAN:
//
// A workaround: Here we install a dummy ELAN handle
//
Status = gBS->InstallProtocolInterface (
&mTouchPadHandle,
&gLfcProjectTouchPadElan4ProtocolGuid,
EFI_NATIVE_INTERFACE,
NULL
);
break;
case SYNA:
//
// A workaround: Here we install a dummy SYNA handle
//
Status = gBS->InstallProtocolInterface (
&mTouchPadHandle,
&gLfcProjectTouchPadSyna4ProtocolGuid,
EFI_NATIVE_INTERFACE,
NULL
);
break;
case CIRQUE:
//
// A workaround: Here we install a dummy CIRQUE handle
//
Status = gBS->InstallProtocolInterface (
&mTouchPadHandle,
&gLfcProjectTouchPadCirqueProtocolGuid,
EFI_NATIVE_INTERFACE,
NULL
);
break;
case FOCAL:
//
// A workaround: Here we install a dummy FOCAL handle
//
Status = gBS->InstallProtocolInterface (
&mTouchPadHandle,
&gLfcProjectTouchPadFocalProtocolGuid,
EFI_NATIVE_INTERFACE,
NULL
);
break;
default:
// Do Nothing
break;
}
return Status;
}
//[-end-220209-OWENWU0037-modify]//
//[-end-211015-Ching000014-modify]//
#endif
//[-end-210920-Ching000003-add]//
EFI_STATUS
EFIAPI
LfcI2cTPCreateEsrtEntry (
IN UINT8 I2cTouchPadIndex,
IN UINT16 I2cTouchPadVersionID
)
{
EFI_STATUS Status;
EFI_SYSTEM_RESOURCE_TABLE *Esrt;
UINTN Size;
UINT32 TPFwVersion;
UINT32 LastAttemptTPVersion;
ESRT_STATUS LastAttemptTPStatus;
//[-start-210920-Ching000003-add]//
//[-start-210930-YUNLEI0141-modify]//
//[-start-211015-Ching000014-modify]//
//[-start-220127-Dennis0013-modify]//
//[-start-220209-OWENWU0037-modify]//
#if defined(S77014_SUPPORT) || defined(C770_SUPPORT) || defined(C970_SUPPORT) || defined(S77013_SUPPORT) || defined(S370_SUPPORT) || defined(S570_SUPPORT) || defined(S77014IAH_SUPPORT)
UINT16 TouchPadPID;
LFC_NVS_AREA_PROTOCOL *LfcNvsAreaProtocol;
#endif
//[-end-220209-OWENWU0037-modify]//
//[-end-220127-Dennis0013-modify]//
//[-end-211015-Ching000014-modify]//
//[-end-210930-YUNLEI0141-modify]//
//[-end-210920-Ching000003-add]//
EFI_GUID LcfcI2cTouchPadGuidTable[] = {
ZERO_TP_FIRMWARE_GUID, // Non I2c TouchPad Guid
ZERO_TP_FIRMWARE_GUID // I2c TouchPad Guid
};
//
// Local Variable Initialize
//
Status = EFI_SUCCESS;
Esrt = NULL;
Size = 0x00;
TPFwVersion = 0x00;
LastAttemptTPVersion = 0x00;
LastAttemptTPStatus = 0x00;
//[-start-210920-Ching000003-add]//
//[-start-210930-YUNLEI0141-modify]//
//[-start-211015-Ching000014-modify]//
//[-start-220127-Dennis0013-modify]//
//[-start-220209-OWENWU0037-modify]//
#if defined(S77014_SUPPORT) || defined(C770_SUPPORT) || defined(C970_SUPPORT) || defined(S77013_SUPPORT) || defined(S370_SUPPORT) || defined(S570_SUPPORT) || defined(S77014IAH_SUPPORT)
TouchPadPID = 0;
SetTouchPadTypeProtocol(I2cTouchPadIndex);
Status = gBS->LocateProtocol (&gLfcNvsAreaProtocolGuid, NULL, (VOID **)&LfcNvsAreaProtocol);
if (!EFI_ERROR(Status)) {
TouchPadPID = LfcNvsAreaProtocol->Area->TouchPadPID;
}
TouchPadPID &= 0XFF;
#endif
//[-end-220209-OWENWU0037-modify]//
//[-end-220127-Dennis0013-modify]//
//[-end-211015-Ching000014-modify]//
//[-end-210930-YUNLEI0141-modify]//
//[-end-210920-Ching000003-add]//
//[-start-210930-YUNLEI0141-modify]//
#if defined(C770_SUPPORT)
switch (I2cTouchPadIndex) {
case 1: // ELAN
if(TouchPadPID == 0x7C) {
CopyGuid(&LcfcI2cTouchPadGuidTable[1], &gWindowsELANTPFirmwareCapsuleGuid);
}
else{
CopyGuid(&LcfcI2cTouchPadGuidTable[1], &gWindowsELAN1TPFirmwareCapsuleGuid);
}
break;
case 2: // SYNA
if(TouchPadPID == 0x44) {
CopyGuid(&LcfcI2cTouchPadGuidTable[1], &gWindowsSYNATPFirmwareCapsuleGuid);
}else{
CopyGuid(&LcfcI2cTouchPadGuidTable[1], &gWindowsSYNA1TPFirmwareCapsuleGuid);
}
break;
case 3: // ALPS
CopyGuid(&LcfcI2cTouchPadGuidTable[1], &gWindowsALPSTPFirmwareCapsuleGuid);
break;
default:
// Do Nothing
break;
}
#elif defined(C970_SUPPORT)
switch (I2cTouchPadIndex) {
case 1: // ELAN
CopyGuid(&LcfcI2cTouchPadGuidTable[1], &gWindowsELAN1TPFirmwareCapsuleGuid);
break;
case 2: // SYNA
CopyGuid(&LcfcI2cTouchPadGuidTable[1], &gWindowsSYNA1TPFirmwareCapsuleGuid);
break;
case 3: // ALPS
CopyGuid(&LcfcI2cTouchPadGuidTable[1], &gWindowsALPSTPFirmwareCapsuleGuid);
break;
default:
// Do Nothing
break;
}
//[-start-211015-Ching000014-modify]//
#elif defined(S77013_SUPPORT)
switch (I2cTouchPadIndex) {
case 1: // ELAN
CopyGuid(&LcfcI2cTouchPadGuidTable[1], &gWindowsELAN2TPFirmwareCapsuleGuid);
break;
case 2: // SYNA
CopyGuid(&LcfcI2cTouchPadGuidTable[1], &gWindowsSYNA2TPFirmwareCapsuleGuid);
break;
case 3: // ALPS
CopyGuid(&LcfcI2cTouchPadGuidTable[1], &gWindowsALPSTPFirmwareCapsuleGuid);
break;
default:
// Do Nothing
break;
}
//[-end-211015-Ching000014-modify]//
//[-start-220127-Dennis0013-modify]//
#elif defined(S370_SUPPORT)
switch (I2cTouchPadIndex) {
case 1: // ELAN
if(TouchPadPID == 0xB8) {
CopyGuid(&LcfcI2cTouchPadGuidTable[1], &gWindowsELAN3TPFirmwareCapsuleGuid);
}
//[-start-220224-Dennis0015-modify]//
else if(TouchPadPID == 0xBE){
CopyGuid(&LcfcI2cTouchPadGuidTable[1], &gWindowsELAN4TPFirmwareCapsuleGuid);
}
else if(TouchPadPID == 0x48){
CopyGuid(&LcfcI2cTouchPadGuidTable[1], &gWindowsELAN5TPFirmwareCapsuleGuid);
}
else {
CopyGuid(&LcfcI2cTouchPadGuidTable[1], &gWindowsELAN6TPFirmwareCapsuleGuid);
}
break;
//[-end-220224-Dennis0015-modify]//
case 2: // SYNA
if(TouchPadPID == 0x2C) {
CopyGuid(&LcfcI2cTouchPadGuidTable[1], &gWindowsSYNA3TPFirmwareCapsuleGuid);
}else{
CopyGuid(&LcfcI2cTouchPadGuidTable[1], &gWindowsSYNA4TPFirmwareCapsuleGuid);
}
break;
case 4: // CIRQUE
CopyGuid(&LcfcI2cTouchPadGuidTable[1], &gWindowsCIRQUETPFirmwareCapsuleGuid);
break;
case 5: // FOCAL
CopyGuid(&LcfcI2cTouchPadGuidTable[1], &gWindowsFOCALTPFirmwareCapsuleGuid);
break;
default:
// Do Nothing
break;
}
//[-end-220127-Dennis0013-modify]//
//[-start-220209-OWENWU0037-modify]//
#elif defined(S570_SUPPORT)
switch (I2cTouchPadIndex) {
case 1: // ELAN
CopyGuid(&LcfcI2cTouchPadGuidTable[1], &gWindowsELAN4TPFirmwareCapsuleGuid);
break;
case 2: // SYNA
CopyGuid(&LcfcI2cTouchPadGuidTable[1], &gWindowsSYNA4TPFirmwareCapsuleGuid);
break;
case 4: // CIRQUE
CopyGuid(&LcfcI2cTouchPadGuidTable[1], &gWindowsCIRQUETPFirmwareCapsuleGuid);
break;
case 5: // FOCAL
CopyGuid(&LcfcI2cTouchPadGuidTable[1], &gWindowsFOCALTPFirmwareCapsuleGuid);
break;
default:
// Do Nothing
break;
}
//[-end-220209-OWENWU0037-modify]//
#else
switch (I2cTouchPadIndex) {
case 1: // ELAN
CopyGuid(&LcfcI2cTouchPadGuidTable[1], &gWindowsELANTPFirmwareCapsuleGuid);
break;
case 2: // SYNA
CopyGuid(&LcfcI2cTouchPadGuidTable[1], &gWindowsSYNATPFirmwareCapsuleGuid);
break;
case 3: // ALPS
CopyGuid(&LcfcI2cTouchPadGuidTable[1], &gWindowsALPSTPFirmwareCapsuleGuid);
break;
default:
// Do Nothing
break;
}
#endif
//[-end-210930-YUNLEI0141-modify]//
if(CompareGuid(&LcfcI2cTouchPadGuidTable[0], &LcfcI2cTouchPadGuidTable[1])) {
return EFI_UNSUPPORTED;
}
EfiGetSystemConfigurationTable (&gEfiSystemResourceTableGuid, (VOID **)&Esrt);
if (Esrt == NULL) {
return EFI_UNSUPPORTED;
}
Size = sizeof(UINT32);
Status = CommonGetVariable (
ESRT_LAST_ATTEMPT_VERSION,
&Esrt->FirmwareResources[Esrt->FirmwareResourceCount].FirmwareClass,
&Size,
&LastAttemptTPVersion
);
Size = sizeof(ESRT_STATUS);
Status = CommonGetVariable (
ESRT_LAST_ATTEMPT_STATUS,
&Esrt->FirmwareResources[Esrt->FirmwareResourceCount].FirmwareClass,
&Size,
&LastAttemptTPStatus
);
Esrt->FirmwareResources[Esrt->FirmwareResourceCount].FirmwareClass = LcfcI2cTouchPadGuidTable[1];
Esrt->FirmwareResources[Esrt->FirmwareResourceCount].FirmwareType = DEVICE_FIRMWARE_TYPE;
Esrt->FirmwareResources[Esrt->FirmwareResourceCount].FirmwareVersion = I2cTouchPadVersionID;
Esrt->FirmwareResources[Esrt->FirmwareResourceCount].LowestSupportedFirmwareVersion = TPFwVersion;
Esrt->FirmwareResources[Esrt->FirmwareResourceCount].CapsuleFlags = 0x8010;
Esrt->FirmwareResources[Esrt->FirmwareResourceCount].LastAttemptVersion = LastAttemptTPVersion;
Esrt->FirmwareResources[Esrt->FirmwareResourceCount].LastAttemptStatus = LastAttemptTPStatus;
Esrt->FirmwareResourceCount = Esrt->FirmwareResourceCount + 1;
//
// Add an ESRT into configuration table
//
Status = gBS->InstallConfigurationTable (&gEfiSystemResourceTableGuid, Esrt);
return EFI_SUCCESS;
}
VOID
EFIAPI
I2cTPGetVidDxeCallback (
IN EFI_EVENT Event,
IN VOID *Context
)
{
EFI_STATUS Status = EFI_SUCCESS;
UINTN Index;
UINTN HandleCount;
EFI_HANDLE *HandleBuffer;
EFI_I2C_IO_PROTOCOL *I2cIo;
I2C_DEVICE_CONTEXT *I2cDeviceContext;
H2O_I2C_DEVICE_CONTEXT *I2cDev;
UINT16 VendorID;
LFC_NVS_AREA_PROTOCOL *LfcNvsAreaProtocol;
UINT8 I2cTouchPadIndex;
UINT16 I2cTouchPadVersionID;
I2cTouchPadIndex = 0;
I2cTouchPadVersionID = 0;
HandleCount = 0;
VendorID = 0;
HandleBuffer = NULL;
I2cIo = NULL;
I2cDeviceContext = NULL;
I2cDev = NULL;
gBS->CloseEvent (Event);
Status = gBS->LocateProtocol (&gLfcNvsAreaProtocolGuid, NULL, (VOID **)&LfcNvsAreaProtocol);
if (EFI_ERROR(Status)) {
return;
}
Status = gBS->LocateHandleBuffer (
ByProtocol,
&gEfiI2cIoProtocolGuid,
NULL,
&HandleCount,
&HandleBuffer
);
if (EFI_ERROR(Status)) {
return;
}
for (Index = 0; Index < HandleCount; Index++) {
Status = gBS->HandleProtocol (
HandleBuffer[Index],
&gEfiI2cIoProtocolGuid,
(VOID **) &I2cIo
);
if (EFI_ERROR (Status)) {
Status = EFI_UNSUPPORTED;
continue;
}
I2cDeviceContext = I2C_DEVICE_CONTEXT_FROM_PROTOCOL (I2cIo);
I2cDev = H2O_I2C_DEVICE_CONTEXT_FROM_I2C_DEVICE (I2cDeviceContext->I2cDevice);
if ((I2cDev->I2cHidDevice.ClassType != LFC_MOUSE_CLASS) &&
(I2cDev->I2cHidDevice.ClassType != LFC_TOUCH_PANEL_CLASS)) {
continue;
}
if (!I2cDev->I2cHidDevice.VendorID) {
continue;
}
switch (I2cDev->I2cHidDevice.ClassType) {
case LFC_MOUSE_CLASS:
VendorID = (UINT8) (I2cDev->I2cHidDevice.VendorID & 0xFF);
LfcNvsAreaProtocol->Area->TouchPadPID = I2cDev->I2cHidDevice.ProductID;
switch (VendorID) {
case 0xF3: // 1: ELAN
LfcNvsAreaProtocol->Area->TouchPadType = 0x01;
break;
case 0xCB: // 2: SYNA
LfcNvsAreaProtocol->Area->TouchPadType = 0x02;
break;
case 0x4E: // 3: ALPS
LfcNvsAreaProtocol->Area->TouchPadType = 0x03;
break;
//[-start-210916-xinwei0002-add]//
//[-start-210919-QINGLIN0074-modify]//
#if defined(S370_SUPPORT) || defined(S570_SUPPORT)
case 0x88: // 4: Cirque
LfcNvsAreaProtocol->Area->TouchPadType = 0x04;
break;
case 0x08: // 5: Focal
LfcNvsAreaProtocol->Area->TouchPadType = 0x05;
break;
#endif
//[-end-210919-QINGLIN0074-modify]//
//[-end-210916-xinwei0002-add]//
default:
LfcNvsAreaProtocol->Area->TouchPadType = 0x00;
LfcNvsAreaProtocol->Area->TouchPadPID = 0x00;
break;
}
I2cTouchPadIndex = (UINT8) LfcNvsAreaProtocol->Area->TouchPadType;
I2cTouchPadVersionID = I2cDev->I2cHidDevice.VersionID;
break;
case LFC_TOUCH_PANEL_CLASS:
VendorID = (UINT8)(I2cDev->I2cHidDevice.VendorID & 0xFF);
LfcNvsAreaProtocol->Area->TouchPnLPID = I2cDev->I2cHidDevice.ProductID;
switch (VendorID) {
case 0x6A: // WACOM
LfcNvsAreaProtocol->Area->TouchPnLType = 0xA1;
break;
//[-start-210916-xinwei0002-add]//
//[-start-210919-QINGLIN0074-modify]//
//[-start-210922-GEORGE0005-A-modify]//
//[-start-210922-QINGLIN0078-modify]//
//[-start-211110-GEORGE0020-modify]//
#if defined(S370_SUPPORT) || defined(S77014_SUPPORT) || defined(S570_SUPPORT) || defined(S77013_SUPPORT) || defined(S77014IAH_SUPPORT)
//[-end-211110-GEORGE0020-modify]//
//[-end-210922-QINGLIN0078-modify]//
//[-end-210922-GEORGE0005-A-modify]//
case 0x94: // BOE
LfcNvsAreaProtocol->Area->TouchPnLType = 0xA2;
break;
case 0xF3: // IVO/AUO/INX
LfcNvsAreaProtocol->Area->TouchPnLType = 0xA3;
break;
#endif
//[-end-210919-QINGLIN0074-modify]//
//[-end-210916-xinwei0002-add]//
default:
LfcNvsAreaProtocol->Area->TouchPnLType = 0x00;
LfcNvsAreaProtocol->Area->TouchPnLPID = 0x00;
break;
}
break;
}
}
if (HandleBuffer) {
gBS->FreePool (HandleBuffer);
HandleBuffer = NULL;
}
if (PcdGetBool (PcdI2cPtpWufuSupport)) {
Status = LfcI2cTPCreateEsrtEntry(I2cTouchPadIndex, I2cTouchPadVersionID);
}
}
EFI_STATUS
EFIAPI
I2cTPGetVidDxeEntryPoint (
IN EFI_HANDLE ImageHandle,
IN EFI_SYSTEM_TABLE *SystemTable
)
{
EFI_STATUS Status;
EFI_EVENT I2cTPGetVidEvent;
VOID *I2cTPGetVidReg;
Status = EFI_SUCCESS;
I2cTPGetVidEvent = NULL;
I2cTPGetVidReg = NULL;
Status = gBS->CreateEvent (
EVT_NOTIFY_SIGNAL,
TPL_CALLBACK,
I2cTPGetVidDxeCallback,
NULL,
&I2cTPGetVidEvent
);
if (!EFI_ERROR (Status)) {
Status = gBS->RegisterProtocolNotify (
&gEndOfBdsBootSelectionProtocolGuid,
I2cTPGetVidEvent,
&I2cTPGetVidReg
);
}
return Status;
}