diff options
author | raywu <raywu0301@gmail.com> | 2018-06-15 00:00:50 +0800 |
---|---|---|
committer | raywu <raywu0301@gmail.com> | 2018-06-15 00:00:50 +0800 |
commit | b7c51c9cf4864df6aabb99a1ae843becd577237c (patch) | |
tree | eebe9b0d0ca03062955223097e57da84dd618b9a /Core/EM/PS2CTL/hotkey.c | |
download | zprj-b7c51c9cf4864df6aabb99a1ae843becd577237c.tar.xz |
Diffstat (limited to 'Core/EM/PS2CTL/hotkey.c')
-rw-r--r-- | Core/EM/PS2CTL/hotkey.c | 420 |
1 files changed, 420 insertions, 0 deletions
diff --git a/Core/EM/PS2CTL/hotkey.c b/Core/EM/PS2CTL/hotkey.c new file mode 100644 index 0000000..21ef2b9 --- /dev/null +++ b/Core/EM/PS2CTL/hotkey.c @@ -0,0 +1,420 @@ +//********************************************************************** +//********************************************************************** +//** ** +//** (C)Copyright 1985-2009, American Megatrends, Inc. ** +//** ** +//** All Rights Reserved. ** +//** ** +//** 5555 Oakbrook Pkwy, Suite 200, Norcross, GA 30093 ** +//** ** +//** Phone: (770)-246-8600 ** +//** ** +//********************************************************************** +//********************************************************************** + +//********************************************************************** +// $Header: /Alaska/SOURCE/Core/CORE_DXE/PS2CTL/hotkey.c 9 4/27/11 4:38a Lavanyap $ +// +// $Revision: 9 $ +// +// $Date: 4/27/11 4:38a $ +//********************************************************************** +// Revision History +// ---------------- +// $Log: /Alaska/SOURCE/Core/CORE_DXE/PS2CTL/hotkey.c $ +// +// 9 4/27/11 4:38a Lavanyap +// [TAG] - EIP49407 +// [Category] - IMPROVEMENT +// [Description] - Move the Ps2 driver SDL tokens from Core Source to Core +// Bin,So that we don't need to add Core source for changing the Ps2 +// driver SDL tokens. +// [Files] - Ps2Ctl.sdl, ps2kbd.c, ps2main.c, ps2ctl.h, kbc.c, mouse.c, +// hotkey.c, CORE_DXE.sdl, Tokens.c +// +// 8 12/01/10 6:13a Anandv +// [TAG] - EIP 45947 +// [Category]- BUG FIX +// [Severity]- Minor +// [Symptom] - Build Error on disabling INIT_DEFAULT_HOTKEYS SDL Token. +// [RootCause] - KEY_ASSOCIATION structure variable not declared based on +// INIT_DEFAULT_HOTKEYS SDL Token. +// [Solution] - KEY_ASSOCIATION structure variable declared based on +// INIT_DEFAULT_HOTKEYS SDL Token +// [Files] - hotkey.c +// +// 7 8/23/10 4:31a Rameshr +// Bug Fix: EIP 40818 +// Symptoms: Pause/Break function key has no function in logo screen +// FilesModified: HotKey.c +// Details:Pause key doesn't have valid Ps2 SCAN code. ProcesshotKey +// function will get 0 as input for Pause key and it tries to execute the +// invalid function.So getting exception. +// +// 6 1/06/10 12:09a Rameshr +// Sometimes reset fail in BIOS Setup +// EIP:33327 +// Ctrl+alt+del+Shift key also should reset the system +// +// 5 7/01/09 12:32p Olegi +// Source is corrected according to the coding standard: function headers, +// copyright messages are updated. +// +// 4 4/21/08 5:48p Olegi +// Bugfix in RegisterHotKey routine for multiple hot keys. +// +// 3 4/09/08 10:19a Olegi +// Changed the key attributes (modifiers and shift state) reporting. +// +// 2 4/16/07 6:28p Pats +// Modified to conform with coding standards. No code changes. +// +// 1 2/01/05 1:11a Felixp +// +// 2 1/18/05 3:22p Felixp +// PrintDebugMessage renamed to Trace +// +// 1 10/28/04 10:19a Olegi +// +// 1 9/30/04 8:07a Olegi +//********************************************************************** + +//<AMI_FHDR_START> +//---------------------------------------------------------------------- +// +// Name: hotkeys.c +// +// Description: PS/2 keyboard hotkeys support routines +// +//---------------------------------------------------------------------- +//<AMI_FHDR_END> + +#include "ps2ctl.h" +#include "kbc.h" +#include <Protocol\HotKeys.h> + +EFI_GUID gHotKeysGuid = EFI_HOT_KEYS_PROTOCOL_GUID; + +HOT_KEYS_PROTOCOL HotKeysProtocol; +KEY_ASSOCIATION *HotKeys_Table; + +extern UINT8 MaxHotKeys; +extern BOOLEAN InitDefaultHotKeys; + + + +//<AMI_PHDR_START> +//---------------------------------------------------------------------- +// +// Procedure: CopyKey +// +// Description: HotKey helper function - Copies key codes from source to +// target buffers +// +// Parameters: +// KEY_ASSOCIATION *SrcKey - Pointer to source buffer +// KEY_ASSOCIATION *TrgKey - Pointer to target buffer +// +// Output: None +// +//---------------------------------------------------------------------- +//<AMI_PHDR_END> + +VOID CopyKey ( + IN KEY_ASSOCIATION *SrcKey, + IN KEY_ASSOCIATION *TrgKey + ) +{ + TrgKey->KeyCode = SrcKey->KeyCode; + TrgKey->KeyAttrib = SrcKey->KeyAttrib; + TrgKey->ReportKey = SrcKey->ReportKey; + TrgKey->KeyExtendedFunc = SrcKey->KeyExtendedFunc; + TrgKey->FunctionContext = SrcKey->FunctionContext; +} + + +//<AMI_PHDR_START> +//---------------------------------------------------------------------- +// +// Procedure: RegisterHotKey +// +// Description: This is HotKey protocol API implementation function. +// It registers the "extended" key function. +// +// Parameters: KEY_ASSOCIATION *HotKey - Key code to register +// BOOLEAN ReplaceExisting - a rule that tells whether or +// not we will replace the existing function; this +// parameter will not be considered in case the function +// for a given key is not assigned yet. +// +// Output : EFI_SUCCESS if function is successfully registered +// EFI_OUT_OF_RESOURCES if we already have reached +// MAX_HOTKEYS registered functions and we are not +// replacing the existing one +// EFI_ACCESS_DENIED if requested key has been already +// assigned, can be returned only when ReplaceExisting +// is FALSE +// +// Modified: HotKeys_Table +// +// Referrals: HotKeys_Table +// +//---------------------------------------------------------------------- +//<AMI_PHDR_END> + +EFI_STATUS RegisterHotKey ( + IN KEY_ASSOCIATION *HotKey, + IN BOOLEAN ReplaceExisting ) +{ + + KEY_ASSOCIATION *hk = HotKeys_Table; + UINT8 i; + UINT8 emptySpot = 0xFF; + // + // See if the key is already registered, at the same time find the empty + // spot in HotKeys_Table + // + for (i = 0; i < MaxHotKeys; i++, hk++) { + if (!hk->KeyCode) { // empty entry found + if (emptySpot == 0xff) { + emptySpot = i; + } + continue; + } + if ((hk->KeyCode == HotKey->KeyCode) && (hk->KeyAttrib == HotKey->KeyAttrib)) { + if (ReplaceExisting) { + CopyKey(HotKey, hk); + return EFI_SUCCESS; + } + else { + return EFI_ACCESS_DENIED; + } + } + } + // + // We are here if the key duplicate is not found + // + if (emptySpot == 0xFF) { + return EFI_OUT_OF_RESOURCES; // no empty space found either + } + + CopyKey(HotKey, &HotKeys_Table[emptySpot]); // fill in the new entry + return EFI_SUCCESS; +} + + +//<AMI_PHDR_START> +//---------------------------------------------------------------------- +// +// Procedure: UnregisterHotKeys +// +// Description: This is HotKey protocol API implementation function. +// It unregisters all "extended" key functions. +// +// Parameters: None +// +// Output: EFI_SUCCESS if functions are successfully unregistered +// EFI_ACCESS_DENIED if functions are not unregistered +// +// Modified: HotKeys_Table +// +// Referrals: HotKeys_Table +// +//---------------------------------------------------------------------- +//<AMI_PHDR_END> + +EFI_STATUS UnregisterHotKeys() +{ + UINT8 i; + KEY_ASSOCIATION ZeroedEntry = {0}; + + for (i = 0; i < MaxHotKeys; i++) { + CopyKey(&ZeroedEntry, &HotKeys_Table[i]); + } + return EFI_SUCCESS; +} + + +//<AMI_PHDR_START> +//---------------------------------------------------------------------- +// +// Procedure: ResetSystem +// +// Description: This routine performs a warm boot of the system +// +// Parameters: VOID *Context - Pointer to context +// +// Output: EFI_SUCCESS +// +//---------------------------------------------------------------------- +//<AMI_PHDR_END> + +EFI_STATUS ResetSystem ( + VOID *Context ) +{ + gSysTable->RuntimeServices->ResetSystem(EfiResetWarm, EFI_SUCCESS, 0, NULL); + return EFI_SUCCESS; +} + + +//<AMI_PHDR_START> +//---------------------------------------------------------------------- +// +// Procedure: InitHotKeys +// +// Description: This routine is called from StartKeyboard function, +// it initializes the PS/2 keyboard hot keys and produces +// HotKeys protocol. +// +// Parameters: EFI_HANDLE Controller - Handle for this driver +// +// Output: EFI_STATUS - Status of the operation +// +// Modified: HotKeysProtocol +// +//---------------------------------------------------------------------- +//<AMI_PHDR_END> + +EFI_STATUS InitHotKeys ( + EFI_HANDLE Controller ) +{ + EFI_STATUS Status; + KEY_ASSOCIATION hk; + // + // Publish the hot key registration interface + // + HotKeysProtocol.RegisterHotKey = RegisterHotKey; + HotKeysProtocol.UnregisterHotKeys = UnregisterHotKeys; + Status = gSysTable->BootServices->InstallProtocolInterface ( + &Controller, + &gHotKeysGuid, + EFI_NATIVE_INTERFACE, + &HotKeysProtocol + ); + // + // Initialise the hotkeys table list + // + Status = pBS->AllocatePool( + EfiBootServicesData, + MaxHotKeys * sizeof(KEY_ASSOCIATION), + &HotKeys_Table ); + pBS->SetMem( HotKeys_Table, MaxHotKeys * sizeof(KEY_ASSOCIATION), 0); + + if ( InitDefaultHotKeys ) { + // + // Register Ctl+Alt+Del combination for Soft Reset + // + hk.KeyCode = 0x53; + + hk.ReportKey = TRUE; + hk.KeyExtendedFunc = ResetSystem; + hk.FunctionContext = NULL; + + hk.KeyAttrib = LEFT_CONTROL_PRESSED | LEFT_ALT_PRESSED; + RegisterHotKey(&hk, TRUE); + hk.KeyAttrib = LEFT_CONTROL_PRESSED | RIGHT_ALT_PRESSED; + RegisterHotKey(&hk, TRUE); + hk.KeyAttrib = RIGHT_CONTROL_PRESSED | LEFT_ALT_PRESSED; + RegisterHotKey(&hk, TRUE); + hk.KeyAttrib = RIGHT_CONTROL_PRESSED | RIGHT_ALT_PRESSED; + RegisterHotKey(&hk, TRUE); + + hk.KeyAttrib = LEFT_CONTROL_PRESSED | LEFT_ALT_PRESSED | LEFT_SHIFT_PRESSED; + RegisterHotKey(&hk, TRUE); + hk.KeyAttrib = LEFT_CONTROL_PRESSED | RIGHT_ALT_PRESSED | LEFT_SHIFT_PRESSED; + RegisterHotKey(&hk, TRUE); + hk.KeyAttrib = RIGHT_CONTROL_PRESSED | LEFT_ALT_PRESSED | LEFT_SHIFT_PRESSED; + RegisterHotKey(&hk, TRUE); + hk.KeyAttrib = RIGHT_CONTROL_PRESSED | RIGHT_ALT_PRESSED | LEFT_SHIFT_PRESSED; + RegisterHotKey(&hk, TRUE); + + hk.KeyAttrib = LEFT_CONTROL_PRESSED | LEFT_ALT_PRESSED | RIGHT_SHIFT_PRESSED; + RegisterHotKey(&hk, TRUE); + hk.KeyAttrib = LEFT_CONTROL_PRESSED | RIGHT_ALT_PRESSED | RIGHT_SHIFT_PRESSED; + RegisterHotKey(&hk, TRUE); + hk.KeyAttrib = RIGHT_CONTROL_PRESSED | LEFT_ALT_PRESSED | RIGHT_SHIFT_PRESSED; + RegisterHotKey(&hk, TRUE); + hk.KeyAttrib = RIGHT_CONTROL_PRESSED | RIGHT_ALT_PRESSED | RIGHT_SHIFT_PRESSED; + RegisterHotKey(&hk, TRUE); + + } + + return Status; +} + + +//<AMI_PHDR_START> +//---------------------------------------------------------------------- +// +// Procedure: ProcessHotKey +// +// Description: This routine searches the HotKey table for the matching +// key and executes the corresponding "key extension" +// function. +// +// Parameters: UINT8 Code - key make code +// UINT16 KeyShiftState - Shift/Alt/Ctrl modifiers: +// RIGHT_SHIFT_PRESSED 0x00000001 +// LEFT_SHIFT_PRESSED 0x00000002 +// RIGHT_CONTROL_PRESSED 0x00000004 +// LEFT_CONTROL_PRESSED 0x00000008 +// RIGHT_ALT_PRESSED 0x00000010 +// LEFT_ALT_PRESSED 0x00000020 +// RIGHT_LOGO_PRESSED 0x00000040 +// LEFT_LOGO_PRESSED 0x00000080 +// +// Output: EFI_SUCCESS if 1)key is not found or 2)key is found, +// function executed and key has to be reported back +// to the caller; +// EFI_NOT_READY if key is found but is not to be reported +// back to the caller. +// Referrals: HotKeys_Table +// +//---------------------------------------------------------------------- +//<AMI_PHDR_END> + +EFI_STATUS +ProcessHotKey ( + UINT8 Code, + UINT16 KeyShiftState +) +{ + KEY_ASSOCIATION *hk = HotKeys_Table; + UINT8 i; + + // + // Validate the Input Data + // + if(Code == 0 && KeyShiftState == 0) { + return EFI_NOT_READY; + } + + // + // Find the match in the table + // + for (i = 0; i < MaxHotKeys; i++) { + if ((hk->KeyCode == Code) && (hk->KeyAttrib == (UINT8)KeyShiftState)) { + // + // Match found - execute the function + // + hk->KeyExtendedFunc(hk->FunctionContext); + return (hk->ReportKey)? EFI_SUCCESS: EFI_NOT_READY; + } + hk++; + } + return EFI_SUCCESS; +} + +//********************************************************************** +//********************************************************************** +//** ** +//** (C)Copyright 1985-2009, American Megatrends, Inc. ** +//** ** +//** All Rights Reserved. ** +//** ** +//** 5555 Oakbrook Pkwy, Suite 200, Norcross, GA 30093 ** +//** ** +//** Phone: (770)-246-8600 ** +//** ** +//********************************************************************** +//********************************************************************** |