Implementation for EFI_SIMPLE_TEXT_INPUT_PROTOCOL protocol.\r
\r
(C) Copyright 2014 Hewlett-Packard Development Company, L.P.<BR>\r
-Copyright (c) 2006 - 2014, Intel Corporation. All rights reserved.<BR>\r
-This program and the accompanying materials\r
-are licensed and made available under the terms and conditions of the BSD License\r
-which accompanies this distribution. The full text of the license may be found at\r
-http://opensource.org/licenses/bsd-license.php\r
-\r
-THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
-WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+Copyright (c) 2006 - 2018, Intel Corporation. All rights reserved.<BR>\r
+Copyright (C) 2016 Silicon Graphics, Inc. All rights reserved.<BR>\r
+SPDX-License-Identifier: BSD-2-Clause-Patent\r
\r
**/\r
\r
return EFI_INVALID_PARAMETER;\r
}\r
\r
- if (!EfiKeyFiFoRemoveOneKey (TerminalDevice, &KeyData->Key)) {\r
- return EFI_NOT_READY;\r
- }\r
-\r
KeyData->KeyState.KeyShiftState = 0;\r
KeyData->KeyState.KeyToggleState = 0;\r
\r
+ if (!EfiKeyFiFoRemoveOneKey (TerminalDevice, &KeyData->Key)) {\r
+ return EFI_NOT_READY;\r
+ }\r
\r
return EFI_SUCCESS;\r
\r
TerminalDevice->RawFiFo->Head = TerminalDevice->RawFiFo->Tail;\r
TerminalDevice->UnicodeFiFo->Head = TerminalDevice->UnicodeFiFo->Tail;\r
TerminalDevice->EfiKeyFiFo->Head = TerminalDevice->EfiKeyFiFo->Tail;\r
+ TerminalDevice->EfiKeyFiFoForNotify->Head = TerminalDevice->EfiKeyFiFoForNotify->Tail;\r
\r
if (EFI_ERROR (Status)) {\r
REPORT_STATUS_CODE_WITH_DEVICE_PATH (\r
Register a notification function for a particular keystroke for the input device.\r
\r
@param This Protocol instance pointer.\r
- @param KeyData A pointer to a buffer that is filled in with the\r
- keystroke information data for the key that was\r
- pressed.\r
+ @param KeyData A pointer to a buffer that is filled in with\r
+ the keystroke information for the key that was\r
+ pressed. If KeyData.Key, KeyData.KeyState.KeyToggleState\r
+ and KeyData.KeyState.KeyShiftState are 0, then any incomplete\r
+ keystroke will trigger a notification of the KeyNotificationFunction.\r
@param KeyNotificationFunction Points to the function to be called when the key\r
- sequence is typed specified by KeyData.\r
+ sequence is typed specified by KeyData. This notification function\r
+ should be called at <=TPL_CALLBACK.\r
@param NotifyHandle Points to the unique handle assigned to the\r
registered notification.\r
\r
{\r
switch (TerminalDevice->TerminalType) {\r
\r
- case PCANSITYPE:\r
- case VT100TYPE:\r
- case VT100PLUSTYPE:\r
- case TTYTERMTYPE:\r
+ case TerminalTypePcAnsi:\r
+ case TerminalTypeVt100:\r
+ case TerminalTypeVt100Plus:\r
+ case TerminalTypeTtyTerm:\r
AnsiRawDataToUnicode (TerminalDevice);\r
UnicodeToEfiKey (TerminalDevice);\r
break;\r
\r
- case VTUTF8TYPE:\r
+ case TerminalTypeVtUtf8:\r
//\r
// Process all the raw data in the RawFIFO,\r
// put the processed key into UnicodeFIFO.\r
}\r
//\r
// Check whether serial buffer is empty.\r
+ // Skip the key transfer loop only if the SerialIo protocol instance\r
+ // successfully reports EFI_SERIAL_INPUT_BUFFER_EMPTY.\r
//\r
Status = SerialIo->GetControl (SerialIo, &Control);\r
-\r
- if ((Control & EFI_SERIAL_INPUT_BUFFER_EMPTY) == 0) {\r
+ if (EFI_ERROR (Status) || ((Control & EFI_SERIAL_INPUT_BUFFER_EMPTY) == 0)) {\r
//\r
// Fetch all the keys in the serial buffer,\r
// and insert the byte stream into RawFIFO.\r
TranslateRawDataToEfiKey (TerminalDevice);\r
}\r
\r
+/**\r
+ Process key notify.\r
+\r
+ @param Event Indicates the event that invoke this function.\r
+ @param Context Indicates the calling context.\r
+**/\r
+VOID\r
+EFIAPI\r
+KeyNotifyProcessHandler (\r
+ IN EFI_EVENT Event,\r
+ IN VOID *Context\r
+ )\r
+{\r
+ BOOLEAN HasKey;\r
+ TERMINAL_DEV *TerminalDevice;\r
+ EFI_INPUT_KEY Key;\r
+ EFI_KEY_DATA KeyData;\r
+ LIST_ENTRY *Link;\r
+ LIST_ENTRY *NotifyList;\r
+ TERMINAL_CONSOLE_IN_EX_NOTIFY *CurrentNotify;\r
+ EFI_TPL OldTpl;\r
+\r
+ TerminalDevice = (TERMINAL_DEV *) Context;\r
+\r
+ //\r
+ // Invoke notification functions.\r
+ //\r
+ NotifyList = &TerminalDevice->NotifyList;\r
+ while (TRUE) {\r
+ //\r
+ // Enter critical section\r
+ //\r
+ OldTpl = gBS->RaiseTPL (TPL_NOTIFY);\r
+ HasKey = EfiKeyFiFoForNotifyRemoveOneKey (TerminalDevice->EfiKeyFiFoForNotify, &Key);\r
+ CopyMem (&KeyData.Key, &Key, sizeof (EFI_INPUT_KEY));\r
+ KeyData.KeyState.KeyShiftState = 0;\r
+ KeyData.KeyState.KeyToggleState = 0;\r
+ //\r
+ // Leave critical section\r
+ //\r
+ gBS->RestoreTPL (OldTpl);\r
+ if (!HasKey) {\r
+ break;\r
+ }\r
+ for (Link = GetFirstNode (NotifyList); !IsNull (NotifyList, Link); Link = GetNextNode (NotifyList, Link)) {\r
+ CurrentNotify = CR (Link, TERMINAL_CONSOLE_IN_EX_NOTIFY, NotifyEntry, TERMINAL_CONSOLE_IN_EX_NOTIFY_SIGNATURE);\r
+ if (IsKeyRegistered (&CurrentNotify->KeyData, &KeyData)) {\r
+ CurrentNotify->KeyNotificationFn (&KeyData);\r
+ }\r
+ }\r
+ }\r
+}\r
+\r
/**\r
Get one key out of serial buffer.\r
\r
return FALSE;\r
}\r
\r
+/**\r
+ Insert one pre-fetched key into the FIFO buffer.\r
+\r
+ @param EfiKeyFiFo Pointer to instance of EFI_KEY_FIFO.\r
+ @param Input The key will be input.\r
+\r
+ @retval TRUE If insert successfully.\r
+ @retval FALSE If FIFO buffer is full before key insertion,\r
+ and the key is lost.\r
+\r
+**/\r
+BOOLEAN\r
+EfiKeyFiFoForNotifyInsertOneKey (\r
+ EFI_KEY_FIFO *EfiKeyFiFo,\r
+ EFI_INPUT_KEY *Input\r
+ )\r
+{\r
+ UINT8 Tail;\r
+\r
+ Tail = EfiKeyFiFo->Tail;\r
+\r
+ if (IsEfiKeyFiFoForNotifyFull (EfiKeyFiFo)) {\r
+ //\r
+ // FIFO is full\r
+ //\r
+ return FALSE;\r
+ }\r
+\r
+ CopyMem (&EfiKeyFiFo->Data[Tail], Input, sizeof (EFI_INPUT_KEY));\r
+\r
+ EfiKeyFiFo->Tail = (UINT8) ((Tail + 1) % (FIFO_MAX_NUMBER + 1));\r
+\r
+ return TRUE;\r
+}\r
+\r
+/**\r
+ Remove one pre-fetched key out of the FIFO buffer.\r
+\r
+ @param EfiKeyFiFo Pointer to instance of EFI_KEY_FIFO.\r
+ @param Output The key will be removed.\r
+\r
+ @retval TRUE If remove successfully.\r
+ @retval FALSE If FIFO buffer is empty before remove operation.\r
+\r
+**/\r
+BOOLEAN\r
+EfiKeyFiFoForNotifyRemoveOneKey (\r
+ EFI_KEY_FIFO *EfiKeyFiFo,\r
+ EFI_INPUT_KEY *Output\r
+ )\r
+{\r
+ UINT8 Head;\r
+\r
+ Head = EfiKeyFiFo->Head;\r
+ ASSERT (Head < FIFO_MAX_NUMBER + 1);\r
+\r
+ if (IsEfiKeyFiFoForNotifyEmpty (EfiKeyFiFo)) {\r
+ //\r
+ // FIFO is empty\r
+ //\r
+ Output->ScanCode = SCAN_NULL;\r
+ Output->UnicodeChar = 0;\r
+ return FALSE;\r
+ }\r
+\r
+ CopyMem (Output, &EfiKeyFiFo->Data[Head], sizeof (EFI_INPUT_KEY));\r
+\r
+ EfiKeyFiFo->Head = (UINT8) ((Head + 1) % (FIFO_MAX_NUMBER + 1));\r
+\r
+ return TRUE;\r
+}\r
+\r
+/**\r
+ Clarify whether FIFO buffer is empty.\r
+\r
+ @param EfiKeyFiFo Pointer to instance of EFI_KEY_FIFO.\r
+\r
+ @retval TRUE If FIFO buffer is empty.\r
+ @retval FALSE If FIFO buffer is not empty.\r
+\r
+**/\r
+BOOLEAN\r
+IsEfiKeyFiFoForNotifyEmpty (\r
+ EFI_KEY_FIFO *EfiKeyFiFo\r
+ )\r
+{\r
+ if (EfiKeyFiFo->Head == EfiKeyFiFo->Tail) {\r
+ return TRUE;\r
+ } else {\r
+ return FALSE;\r
+ }\r
+}\r
+\r
+/**\r
+ Clarify whether FIFO buffer is full.\r
+\r
+ @param EfiKeyFiFo Pointer to instance of EFI_KEY_FIFO.\r
+\r
+ @retval TRUE If FIFO buffer is full.\r
+ @retval FALSE If FIFO buffer is not full.\r
+\r
+**/\r
+BOOLEAN\r
+IsEfiKeyFiFoForNotifyFull (\r
+ EFI_KEY_FIFO *EfiKeyFiFo\r
+ )\r
+{\r
+ UINT8 Tail;\r
+ UINT8 Head;\r
+\r
+ Tail = EfiKeyFiFo->Tail;\r
+ Head = EfiKeyFiFo->Head;\r
+\r
+ if (((Tail + 1) % (FIFO_MAX_NUMBER + 1)) == Head) {\r
+ return TRUE;\r
+ }\r
+\r
+ return FALSE;\r
+}\r
+\r
/**\r
Insert one pre-fetched key into the FIFO buffer.\r
\r
KeyData.KeyState.KeyToggleState = 0;\r
\r
//\r
- // Invoke notification functions if exist\r
+ // Signal KeyNotify process event if this key pressed matches any key registered.\r
//\r
NotifyList = &TerminalDevice->NotifyList;\r
for (Link = GetFirstNode (NotifyList); !IsNull (NotifyList,Link); Link = GetNextNode (NotifyList,Link)) {\r
TERMINAL_CONSOLE_IN_EX_NOTIFY_SIGNATURE\r
);\r
if (IsKeyRegistered (&CurrentNotify->KeyData, &KeyData)) {\r
- CurrentNotify->KeyNotificationFn (&KeyData);\r
+ //\r
+ // The key notification function needs to run at TPL_CALLBACK\r
+ // while current TPL is TPL_NOTIFY. It will be invoked in\r
+ // KeyNotifyProcessHandler() which runs at TPL_CALLBACK.\r
+ //\r
+ EfiKeyFiFoForNotifyInsertOneKey (TerminalDevice->EfiKeyFiFoForNotify, Key);\r
+ gBS->SignalEvent (TerminalDevice->KeyNotifyProcessEvent);\r
+ break;\r
}\r
}\r
if (IsEfiKeyFiFoFull (TerminalDevice)) {\r
\r
/**\r
Remove one pre-fetched key out of the Unicode FIFO buffer.\r
- The caller should guarantee that Unicode FIFO buffer is not empty \r
+ The caller should guarantee that Unicode FIFO buffer is not empty\r
by IsUnicodeFiFoEmpty ().\r
\r
@param TerminalDevice Terminal driver private structure.\r
return FALSE;\r
}\r
\r
-/**\r
- Count Unicode FIFO buffer.\r
-\r
- @param TerminalDevice Terminal driver private structure\r
-\r
- @return The count in bytes of Unicode FIFO.\r
-\r
-**/\r
-UINT8\r
-UnicodeFiFoGetKeyCount (\r
- TERMINAL_DEV *TerminalDevice\r
- )\r
-{\r
- UINT8 Tail;\r
- UINT8 Head;\r
-\r
- Tail = TerminalDevice->UnicodeFiFo->Tail;\r
- Head = TerminalDevice->UnicodeFiFo->Head;\r
-\r
- if (Tail >= Head) {\r
- return (UINT8) (Tail - Head);\r
- } else {\r
- return (UINT8) (Tail + FIFO_MAX_NUMBER + 1 - Head);\r
- }\r
-}\r
\r
/**\r
Update the Unicode characters from a terminal input device into EFI Keys FIFO.\r
There is one special input sequence that will force the system to reset.\r
This is ESC R ESC r ESC R.\r
\r
- Note: current implementation support terminal types include: PC ANSI, VT100+/VTUTF8, VT100. \r
+ Note: current implementation support terminal types include: PC ANSI, VT100+/VTUTF8, VT100.\r
The table below is not same with UEFI Spec 2.3 Appendix B Table 201(not support ANSI X3.64 /\r
DEC VT200-500 and extra support PC ANSI, VT100)since UEFI Table 201 is just an example.\r
- \r
+\r
Symbols used in table below\r
===========================\r
ESC = 0x1B\r
continue;\r
}\r
\r
- if (UnicodeChar == 'O' && TerminalDevice->TerminalType == VT100TYPE) {\r
+ if (UnicodeChar == 'O' && (TerminalDevice->TerminalType == TerminalTypeVt100 ||\r
+ TerminalDevice->TerminalType == TerminalTypeTtyTerm)) {\r
TerminalDevice->InputState |= INPUT_STATE_O;\r
TerminalDevice->ResetState = RESET_STATE_DEFAULT;\r
continue;\r
\r
Key.ScanCode = SCAN_NULL;\r
\r
- if (TerminalDevice->TerminalType == VT100PLUSTYPE ||\r
- TerminalDevice->TerminalType == VTUTF8TYPE) {\r
+ if (TerminalDevice->TerminalType == TerminalTypeVt100Plus ||\r
+ TerminalDevice->TerminalType == TerminalTypeVtUtf8) {\r
switch (UnicodeChar) {\r
case '1':\r
Key.ScanCode = SCAN_F1;\r
\r
Key.ScanCode = SCAN_NULL;\r
\r
- if (TerminalDevice->TerminalType == VT100TYPE) {\r
+ if (TerminalDevice->TerminalType == TerminalTypeVt100) {\r
switch (UnicodeChar) {\r
case 'P':\r
Key.ScanCode = SCAN_F1;\r
default :\r
break;\r
}\r
+ } else if (TerminalDevice->TerminalType == TerminalTypeTtyTerm) {\r
+ /* Also accept VT100 escape codes for F1-F4, HOME and END for TTY term */\r
+ switch (UnicodeChar) {\r
+ case 'P':\r
+ Key.ScanCode = SCAN_F1;\r
+ break;\r
+ case 'Q':\r
+ Key.ScanCode = SCAN_F2;\r
+ break;\r
+ case 'R':\r
+ Key.ScanCode = SCAN_F3;\r
+ break;\r
+ case 'S':\r
+ Key.ScanCode = SCAN_F4;\r
+ break;\r
+ case 'H':\r
+ Key.ScanCode = SCAN_HOME;\r
+ break;\r
+ case 'F':\r
+ Key.ScanCode = SCAN_END;\r
+ break;\r
+ }\r
}\r
\r
if (Key.ScanCode != SCAN_NULL) {\r
\r
Key.ScanCode = SCAN_NULL;\r
\r
- if (TerminalDevice->TerminalType == PCANSITYPE ||\r
- TerminalDevice->TerminalType == VT100TYPE ||\r
- TerminalDevice->TerminalType == VT100PLUSTYPE ||\r
- TerminalDevice->TerminalType == VTUTF8TYPE ||\r
- TerminalDevice->TerminalType == TTYTERMTYPE) {\r
+ if (TerminalDevice->TerminalType == TerminalTypePcAnsi ||\r
+ TerminalDevice->TerminalType == TerminalTypeVt100 ||\r
+ TerminalDevice->TerminalType == TerminalTypeVt100Plus ||\r
+ TerminalDevice->TerminalType == TerminalTypeVtUtf8 ||\r
+ TerminalDevice->TerminalType == TerminalTypeTtyTerm) {\r
switch (UnicodeChar) {\r
case 'A':\r
Key.ScanCode = SCAN_UP;\r
Key.ScanCode = SCAN_LEFT;\r
break;\r
case 'H':\r
- if (TerminalDevice->TerminalType == PCANSITYPE ||\r
- TerminalDevice->TerminalType == VT100TYPE) {\r
+ if (TerminalDevice->TerminalType == TerminalTypePcAnsi ||\r
+ TerminalDevice->TerminalType == TerminalTypeVt100 ||\r
+ TerminalDevice->TerminalType == TerminalTypeTtyTerm) {\r
Key.ScanCode = SCAN_HOME;\r
}\r
break;\r
case 'F':\r
- if (TerminalDevice->TerminalType == PCANSITYPE) {\r
+ if (TerminalDevice->TerminalType == TerminalTypePcAnsi ||\r
+ TerminalDevice->TerminalType == TerminalTypeTtyTerm) {\r
Key.ScanCode = SCAN_END;\r
}\r
break;\r
case 'K':\r
- if (TerminalDevice->TerminalType == VT100TYPE) {\r
+ if (TerminalDevice->TerminalType == TerminalTypeVt100) {\r
Key.ScanCode = SCAN_END;\r
}\r
break;\r
case 'L':\r
case '@':\r
- if (TerminalDevice->TerminalType == PCANSITYPE ||\r
- TerminalDevice->TerminalType == VT100TYPE) {\r
+ if (TerminalDevice->TerminalType == TerminalTypePcAnsi ||\r
+ TerminalDevice->TerminalType == TerminalTypeVt100) {\r
Key.ScanCode = SCAN_INSERT;\r
}\r
break;\r
case 'X':\r
- if (TerminalDevice->TerminalType == PCANSITYPE) {\r
+ if (TerminalDevice->TerminalType == TerminalTypePcAnsi) {\r
Key.ScanCode = SCAN_DELETE;\r
}\r
break;\r
case 'P':\r
- if (TerminalDevice->TerminalType == VT100TYPE) {\r
+ if (TerminalDevice->TerminalType == TerminalTypeVt100) {\r
Key.ScanCode = SCAN_DELETE;\r
- } else if (TerminalDevice->TerminalType == PCANSITYPE) {\r
+ } else if (TerminalDevice->TerminalType == TerminalTypePcAnsi) {\r
Key.ScanCode = SCAN_F4;\r
}\r
break;\r
case 'I':\r
- if (TerminalDevice->TerminalType == PCANSITYPE) {\r
+ if (TerminalDevice->TerminalType == TerminalTypePcAnsi) {\r
Key.ScanCode = SCAN_PAGE_UP;\r
}\r
break;\r
case 'V':\r
- if (TerminalDevice->TerminalType == PCANSITYPE) {\r
+ if (TerminalDevice->TerminalType == TerminalTypePcAnsi) {\r
Key.ScanCode = SCAN_F10;\r
}\r
break;\r
case '?':\r
- if (TerminalDevice->TerminalType == VT100TYPE) {\r
+ if (TerminalDevice->TerminalType == TerminalTypeVt100) {\r
Key.ScanCode = SCAN_PAGE_UP;\r
}\r
break;\r
case 'G':\r
- if (TerminalDevice->TerminalType == PCANSITYPE) {\r
+ if (TerminalDevice->TerminalType == TerminalTypePcAnsi) {\r
Key.ScanCode = SCAN_PAGE_DOWN;\r
}\r
break;\r
case 'U':\r
- if (TerminalDevice->TerminalType == PCANSITYPE) {\r
+ if (TerminalDevice->TerminalType == TerminalTypePcAnsi) {\r
Key.ScanCode = SCAN_F9;\r
}\r
break;\r
case '/':\r
- if (TerminalDevice->TerminalType == VT100TYPE) {\r
+ if (TerminalDevice->TerminalType == TerminalTypeVt100) {\r
Key.ScanCode = SCAN_PAGE_DOWN;\r
}\r
break;\r
case 'M':\r
- if (TerminalDevice->TerminalType == PCANSITYPE) {\r
+ if (TerminalDevice->TerminalType == TerminalTypePcAnsi) {\r
Key.ScanCode = SCAN_F1;\r
}\r
break;\r
case 'N':\r
- if (TerminalDevice->TerminalType == PCANSITYPE) {\r
+ if (TerminalDevice->TerminalType == TerminalTypePcAnsi) {\r
Key.ScanCode = SCAN_F2;\r
}\r
break;\r
case 'O':\r
- if (TerminalDevice->TerminalType == PCANSITYPE) {\r
+ if (TerminalDevice->TerminalType == TerminalTypePcAnsi) {\r
Key.ScanCode = SCAN_F3;\r
}\r
break;\r
case 'Q':\r
- if (TerminalDevice->TerminalType == PCANSITYPE) {\r
+ if (TerminalDevice->TerminalType == TerminalTypePcAnsi) {\r
Key.ScanCode = SCAN_F5;\r
}\r
break;\r
case 'R':\r
- if (TerminalDevice->TerminalType == PCANSITYPE) {\r
+ if (TerminalDevice->TerminalType == TerminalTypePcAnsi) {\r
Key.ScanCode = SCAN_F6;\r
}\r
break;\r
case 'S':\r
- if (TerminalDevice->TerminalType == PCANSITYPE) {\r
+ if (TerminalDevice->TerminalType == TerminalTypePcAnsi) {\r
Key.ScanCode = SCAN_F7;\r
}\r
break;\r
case 'T':\r
- if (TerminalDevice->TerminalType == PCANSITYPE) {\r
+ if (TerminalDevice->TerminalType == TerminalTypePcAnsi) {\r
Key.ScanCode = SCAN_F8;\r
}\r
break;\r
}\r
}\r
\r
+ /*\r
+ * The VT220 escape codes that the TTY terminal accepts all have\r
+ * numeric codes, and there are no ambiguous prefixes shared with\r
+ * other terminal types.\r
+ */\r
+ if (TerminalDevice->TerminalType == TerminalTypeTtyTerm &&\r
+ Key.ScanCode == SCAN_NULL &&\r
+ UnicodeChar >= '0' &&\r
+ UnicodeChar <= '9') {\r
+ TerminalDevice->TtyEscapeStr[0] = UnicodeChar;\r
+ TerminalDevice->TtyEscapeIndex = 1;\r
+ TerminalDevice->InputState |= INPUT_STATE_LEFTOPENBRACKET_2;\r
+ continue;\r
+ }\r
+\r
if (Key.ScanCode != SCAN_NULL) {\r
Key.UnicodeChar = 0;\r
EfiKeyFiFoInsertOneKey (TerminalDevice, &Key);\r
break;\r
\r
\r
+ case INPUT_STATE_ESC | INPUT_STATE_LEFTOPENBRACKET | INPUT_STATE_LEFTOPENBRACKET_2:\r
+ /*\r
+ * Here we handle the VT220 escape codes that we accept. This\r
+ * state is only used by the TTY terminal type.\r
+ */\r
+ Key.ScanCode = SCAN_NULL;\r
+ if (TerminalDevice->TerminalType == TerminalTypeTtyTerm) {\r
+\r
+ if (UnicodeChar == '~' && TerminalDevice->TtyEscapeIndex <= 2) {\r
+ UINT16 EscCode;\r
+ TerminalDevice->TtyEscapeStr[TerminalDevice->TtyEscapeIndex] = 0; /* Terminate string */\r
+ EscCode = (UINT16) StrDecimalToUintn(TerminalDevice->TtyEscapeStr);\r
+ switch (EscCode) {\r
+ case 2:\r
+ Key.ScanCode = SCAN_INSERT;\r
+ break;\r
+ case 3:\r
+ Key.ScanCode = SCAN_DELETE;\r
+ break;\r
+ case 5:\r
+ Key.ScanCode = SCAN_PAGE_UP;\r
+ break;\r
+ case 6:\r
+ Key.ScanCode = SCAN_PAGE_DOWN;\r
+ break;\r
+ case 11:\r
+ case 12:\r
+ case 13:\r
+ case 14:\r
+ case 15:\r
+ Key.ScanCode = SCAN_F1 + EscCode - 11;\r
+ break;\r
+ case 17:\r
+ case 18:\r
+ case 19:\r
+ case 20:\r
+ case 21:\r
+ Key.ScanCode = SCAN_F6 + EscCode - 17;\r
+ break;\r
+ case 23:\r
+ case 24:\r
+ Key.ScanCode = SCAN_F11 + EscCode - 23;\r
+ break;\r
+ default:\r
+ break;\r
+ }\r
+ } else if (TerminalDevice->TtyEscapeIndex == 1){\r
+ /* 2 character escape code */\r
+ TerminalDevice->TtyEscapeStr[TerminalDevice->TtyEscapeIndex++] = UnicodeChar;\r
+ continue;\r
+ }\r
+ else {\r
+ DEBUG ((EFI_D_ERROR, "Unexpected state in escape2\n"));\r
+ }\r
+ }\r
+ TerminalDevice->ResetState = RESET_STATE_DEFAULT;\r
+\r
+ if (Key.ScanCode != SCAN_NULL) {\r
+ Key.UnicodeChar = 0;\r
+ EfiKeyFiFoInsertOneKey (TerminalDevice, &Key);\r
+ TerminalDevice->InputState = INPUT_STATE_DEFAULT;\r
+ UnicodeToEfiKeyFlushState (TerminalDevice);\r
+ continue;\r
+ }\r
+\r
+ UnicodeToEfiKeyFlushState (TerminalDevice);\r
+ break;\r
+\r
default:\r
//\r
// Invalid state. This should never happen.\r
}\r
\r
if (UnicodeChar == DEL) {\r
- if (TerminalDevice->TerminalType == TTYTERMTYPE) {\r
+ if (TerminalDevice->TerminalType == TerminalTypeTtyTerm) {\r
Key.ScanCode = SCAN_NULL;\r
Key.UnicodeChar = CHAR_BACKSPACE;\r
}\r