/** @file Provide OEM to define the post key corresponding to the behavior of utility choosing (SCU or Boot Manager). ;****************************************************************************** ;* Copyright (c) 2014 - 2020, Insyde Software 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 #include #include #include //_Start_L05_NOVO_BUTTON_MENU_ #include #include #include //_End_L05_NOVO_BUTTON_MENU_ // // These must reflect order in KEY_ELEMENT // #define F1_KEY_BIT 0x01 #define F2_KEY_BIT 0x02 #define DEL_KEY_BIT 0x04 #define F10_KEY_BIT 0x08 #define F12_KEY_BIT 0x10 #define ESC_KEY_BIT 0x20 #define UP_ARROW_KEY_BIT 0x40 #define F3_KEY_BIT 0x80 #define F9_KEY_BIT 0x100 #ifdef L05_SMB_BIOS_ENABLE #define F11_KEY_BIT 0x200 //_Start_L05_INTERRUPT_MENU_ #define ENTER_KEY_BIT 0x400 //_End_L05_INTERRUPT_MENU_ #endif // // module variables // //_Start_L05_HOTKEY_ //SCAN_TO_OPERATION *mPostKeyToOperation = NULL; //UINTN mPostOperationCount = 0; //_End_L05_HOTKEY_ //_Start_L05_HOTKEY_ // // Add F2, F12 function key back. // SCAN_TO_OPERATION mPostKeyToOperation[] = { #ifndef L05_SMB_BIOS_ENABLE {F2_KEY_BIT, SCAN_NULL, L05_SETUP_HOT_KEY }, #else // // [Lenovo SMB BIOS Special Requirements V1.1] // 2.2 Hotkey Definition // Enter BIOS Setup - F1 // Enter Diagnostical - F10 // Enter Recovery - F11 // {F1_KEY_BIT, SCAN_NULL, L05_SETUP_HOT_KEY }, #ifdef L05_DIAGNOSTICS_SUPPORT {F10_KEY_BIT, SCAN_NULL, L05_DIAGNOSTICAL_HOT_KEY }, #endif {F11_KEY_BIT, SCAN_NULL, L05_RECOVERY_HOT_KEY }, //_Start_L05_INTERRUPT_MENU_ // // [Lenovo SMB BIOS Special Requirements V1.1] // 2.2 Hotkey Definition // Startup Interrupt Menu - Enter // {ENTER_KEY_BIT, SCAN_NULL, L05_STARTUP_INTERRUPT_MENU_KEY }, //_End_L05_INTERRUPT_MENU_ #endif {F12_KEY_BIT, SCAN_NULL, L05_BOOT_MANAGER_HOT_KEY }, {0, SCAN_NULL, NO_OPERATION } }; UINTN mPostOperationCount = (sizeof(mPostKeyToOperation) / sizeof(SCAN_TO_OPERATION)); //_End_L05_HOTKEY_ // // helper function prototypes // VOID InitialPostkeyTable ( VOID ); //_Start_L05_HOTKEY_ ///** // Initialize module variable mPostKeyToOperation. // // @param None // // @retval None //**/ //VOID //InitialPostkeyTable ( // VOID // ) //{ // UINTN Index; // UINTN OldPostOperationCount; // // Index = 0; // // if (mPostKeyToOperation != NULL) { // return; // } // // // // // Add the end of table. // // // OldPostOperationCount = mPostOperationCount; // mPostOperationCount++; // mPostKeyToOperation = ReallocatePool ( // OldPostOperationCount*sizeof(SCAN_TO_OPERATION), // sizeof(SCAN_TO_OPERATION)*mPostOperationCount, // mPostKeyToOperation // ); // if (mPostKeyToOperation != NULL) { // mPostKeyToOperation[Index].KeyBit = 0; // mPostKeyToOperation[Index].ScanCode = SCAN_NULL; // mPostKeyToOperation[Index].PostOperation = NO_OPERATION; // Index++; // } //} //_End_L05_HOTKEY_ /** This OemService provides OEM to define the post key corresponding to the behavior of utility choosing (SCU or Boot Manager). @param[in] KeyDetected A bit map of the monitored keys found. Bit N corresponds to KeyList[N] as provided by the GetUsbPlatformOptions () API of UsbLegacy protocol. @param[in] ScanCode The Scan Code. @param[out] *PostOperation Point to the operation flag which imply the behavior of utility choosing in post time. For example: choose the SCU or Boot Manager. @retval EFI_MEDIA_CHANGED Get post operation success. @retval EFI_SUCCESS Get post operation failed. @retval Others Base on OEM design. **/ EFI_STATUS OemSvcInstallPostKeyTable ( IN UINTN KeyDetected, IN UINT16 ScanCode, OUT UINTN *PostOperation ) { UINTN Index; UINTN PostOperationCount; SCAN_TO_OPERATION *PostKeyToOperation; //_Start_L05_HOTKEY_ // InitialPostkeyTable (); //_End_L05_HOTKEY_ //_Start_L05_NOVO_BUTTON_MENU_ { VOID *Hoblist; UINT8 *Raw; // // Search the Novo Key Info Hob // Hoblist = GetHobList (); Raw = GetNextGuidHob (&gL05NovoKeyInfoHobGuid, Hoblist); if (Raw != NULL) { return EFI_NOT_FOUND; } } //_End_L05_NOVO_BUTTON_MENU_ PostOperationCount = mPostOperationCount; PostKeyToOperation = mPostKeyToOperation; for (Index = 0; Index < PostOperationCount; Index++) { // // Search table // if ((KeyDetected & PostKeyToOperation[Index].KeyBit) == PostKeyToOperation[Index].KeyBit && ScanCode == PostKeyToOperation[Index].ScanCode){ *PostOperation = (UINTN)PostKeyToOperation[Index].PostOperation; if (PostKeyToOperation[Index].PostOperation == NO_OPERATION) { break; } return EFI_MEDIA_CHANGED; } else if (KeyDetected == 0xffff && ScanCode == PostKeyToOperation[Index].ScanCode) { // // Pure EFI enviorment, no monitor key driver // *PostOperation = (UINTN)PostKeyToOperation[Index].PostOperation; if (PostKeyToOperation[Index].PostOperation == NO_OPERATION) { break; } return EFI_MEDIA_CHANGED; } } return EFI_SUCCESS; }