Enhance Shell 2.0 to not depend on keyboard driver implementation to fix the "CTRL+s" pause malfunction issue.

Signed-off-by: Ruiyu Ni <ruiyu.ni@intel.com>
Reviewed-by: Carsey Jaben <jaben.carsey@intel.com>

git-svn-id: https://svn.code.sf.net/p/edk2/code/trunk/edk2@15052 6f19259b-4bc3-4df7-8a09-765794883524
This commit is contained in:
Ruiyu Ni 2014-01-07 02:23:10 +00:00 committed by niruiyu
parent de4ebdcfcd
commit 31c2a2c7c0
2 changed files with 30 additions and 18 deletions

View File

@ -2,7 +2,7 @@
Provides interface to shell console logger. Provides interface to shell console logger.
Copyright (c) 2013 Hewlett-Packard Development Company, L.P. Copyright (c) 2013 Hewlett-Packard Development Company, L.P.
Copyright (c) 2009 - 2011, Intel Corporation. All rights reserved.<BR> Copyright (c) 2009 - 2013, Intel Corporation. All rights reserved.<BR>
This program and the accompanying materials This program and the accompanying materials
are licensed and made available under the terms and conditions of the BSD License are licensed and made available under the terms and conditions of the BSD License
which accompanies this distribution. The full text of the license may be found at which accompanies this distribution. The full text of the license may be found at
@ -819,22 +819,41 @@ ConsoleLoggerOutputString (
IN CHAR16 *WString IN CHAR16 *WString
) )
{ {
EFI_INPUT_KEY Key; EFI_STATUS Status;
UINTN EventIndex; EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL *TxtInEx;
CONSOLE_LOGGER_PRIVATE_DATA *ConsoleInfo; EFI_KEY_DATA KeyData;
UINTN EventIndex;
CONSOLE_LOGGER_PRIVATE_DATA *ConsoleInfo;
ConsoleInfo = CONSOLE_LOGGER_PRIVATE_DATA_FROM_THIS(This); ConsoleInfo = CONSOLE_LOGGER_PRIVATE_DATA_FROM_THIS(This);
if (ShellInfoObject.ShellInitSettings.BitUnion.Bits.NoConsoleOut) { if (ShellInfoObject.ShellInitSettings.BitUnion.Bits.NoConsoleOut) {
return (EFI_UNSUPPORTED); return (EFI_UNSUPPORTED);
} }
ASSERT(ShellInfoObject.ConsoleInfo == ConsoleInfo); ASSERT(ShellInfoObject.ConsoleInfo == ConsoleInfo);
if (ShellInfoObject.HaltOutput) {
// Status = gBS->HandleProtocol (gST->ConsoleInHandle, &gEfiSimpleTextInputExProtocolGuid, (VOID **) &TxtInEx);
// just get some key if (!EFI_ERROR (Status)) {
// while (ShellInfoObject.HaltOutput) {
gBS->WaitForEvent (1, &gST->ConIn->WaitForKey, &EventIndex);
gST->ConIn->ReadKeyStroke (gST->ConIn, &Key); ShellInfoObject.HaltOutput = FALSE;
ShellInfoObject.HaltOutput = FALSE; //
// just get some key
//
Status = gBS->WaitForEvent (1, &TxtInEx->WaitForKeyEx, &EventIndex);
ASSERT_EFI_ERROR (Status);
Status = TxtInEx->ReadKeyStrokeEx (TxtInEx, &KeyData);
ASSERT_EFI_ERROR (Status);
if ((KeyData.Key.UnicodeChar == L's') && (KeyData.Key.ScanCode == SCAN_NULL) &&
((KeyData.KeyState.KeyShiftState == (EFI_SHIFT_STATE_VALID | EFI_LEFT_CONTROL_PRESSED)) ||
(KeyData.KeyState.KeyShiftState == (EFI_SHIFT_STATE_VALID | EFI_RIGHT_CONTROL_PRESSED))
)
) {
ShellInfoObject.HaltOutput = TRUE;
}
}
} }
if (!ShellInfoObject.ConsoleInfo->Enabled) { if (!ShellInfoObject.ConsoleInfo->Enabled) {
return (EFI_DEVICE_ERROR); return (EFI_DEVICE_ERROR);
} else if (ShellInfoObject.PageBreakEnabled) { } else if (ShellInfoObject.PageBreakEnabled) {

View File

@ -3297,7 +3297,6 @@ NotificationFunction(
IN EFI_KEY_DATA *KeyData IN EFI_KEY_DATA *KeyData
) )
{ {
EFI_INPUT_KEY Key;
if ( ((KeyData->Key.UnicodeChar == L'c') && if ( ((KeyData->Key.UnicodeChar == L'c') &&
(KeyData->KeyState.KeyShiftState == (EFI_SHIFT_STATE_VALID|EFI_LEFT_CONTROL_PRESSED) || KeyData->KeyState.KeyShiftState == (EFI_SHIFT_STATE_VALID|EFI_RIGHT_CONTROL_PRESSED))) || (KeyData->KeyState.KeyShiftState == (EFI_SHIFT_STATE_VALID|EFI_LEFT_CONTROL_PRESSED) || KeyData->KeyState.KeyShiftState == (EFI_SHIFT_STATE_VALID|EFI_RIGHT_CONTROL_PRESSED))) ||
(KeyData->Key.UnicodeChar == 3) (KeyData->Key.UnicodeChar == 3)
@ -3310,12 +3309,6 @@ NotificationFunction(
(KeyData->KeyState.KeyShiftState == (EFI_SHIFT_STATE_VALID|EFI_LEFT_CONTROL_PRESSED) || KeyData->KeyState.KeyShiftState == (EFI_SHIFT_STATE_VALID|EFI_RIGHT_CONTROL_PRESSED)) (KeyData->KeyState.KeyShiftState == (EFI_SHIFT_STATE_VALID|EFI_LEFT_CONTROL_PRESSED) || KeyData->KeyState.KeyShiftState == (EFI_SHIFT_STATE_VALID|EFI_RIGHT_CONTROL_PRESSED))
){ ){
ShellInfoObject.HaltOutput = TRUE; ShellInfoObject.HaltOutput = TRUE;
//
// Make sure that there are no pending keystrokes to pervent the pause.
//
gST->ConIn->Reset(gST->ConIn, FALSE);
while (gST->ConIn->ReadKeyStroke (gST->ConIn, &Key)==EFI_SUCCESS);
} }
return (EFI_SUCCESS); return (EFI_SUCCESS);
} }