summaryrefslogtreecommitdiffstats
path: root/MdeModulePkg/Universal/Console/TerminalDxe/TerminalConIn.c
diff options
context:
space:
mode:
Diffstat (limited to 'MdeModulePkg/Universal/Console/TerminalDxe/TerminalConIn.c')
-rw-r--r--MdeModulePkg/Universal/Console/TerminalDxe/TerminalConIn.c1543
1 files changed, 786 insertions, 757 deletions
diff --git a/MdeModulePkg/Universal/Console/TerminalDxe/TerminalConIn.c b/MdeModulePkg/Universal/Console/TerminalDxe/TerminalConIn.c
index 4d6ede4c9f..2286264b29 100644
--- a/MdeModulePkg/Universal/Console/TerminalDxe/TerminalConIn.c
+++ b/MdeModulePkg/Universal/Console/TerminalDxe/TerminalConIn.c
@@ -10,7 +10,6 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
#include "Terminal.h"
-
/**
Reads the next keystroke from the input device. The WaitForKey Event can
be used to test for existence of a keystroke via WaitForEvent () call.
@@ -27,8 +26,8 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
**/
EFI_STATUS
ReadKeyStrokeWorker (
- IN TERMINAL_DEV *TerminalDevice,
- OUT EFI_KEY_DATA *KeyData
+ IN TERMINAL_DEV *TerminalDevice,
+ OUT EFI_KEY_DATA *KeyData
)
{
if (KeyData == NULL) {
@@ -43,7 +42,6 @@ ReadKeyStrokeWorker (
}
return EFI_SUCCESS;
-
}
/**
@@ -84,9 +82,9 @@ TerminalConInReset (
//
// Make all the internal buffer empty for keys
//
- TerminalDevice->RawFiFo->Head = TerminalDevice->RawFiFo->Tail;
- TerminalDevice->UnicodeFiFo->Head = TerminalDevice->UnicodeFiFo->Tail;
- TerminalDevice->EfiKeyFiFo->Head = TerminalDevice->EfiKeyFiFo->Tail;
+ TerminalDevice->RawFiFo->Head = TerminalDevice->RawFiFo->Tail;
+ TerminalDevice->UnicodeFiFo->Head = TerminalDevice->UnicodeFiFo->Tail;
+ TerminalDevice->EfiKeyFiFo->Head = TerminalDevice->EfiKeyFiFo->Tail;
TerminalDevice->EfiKeyFiFoForNotify->Head = TerminalDevice->EfiKeyFiFoForNotify->Tail;
if (EFI_ERROR (Status)) {
@@ -127,7 +125,7 @@ TerminalConInReadKeyStroke (
//
// get TERMINAL_DEV from "This" parameter.
//
- TerminalDevice = TERMINAL_CON_IN_DEV_FROM_THIS (This);
+ TerminalDevice = TERMINAL_CON_IN_DEV_FROM_THIS (This);
Status = ReadKeyStrokeWorker (TerminalDevice, &KeyData);
if (EFI_ERROR (Status)) {
@@ -137,7 +135,6 @@ TerminalConInReadKeyStroke (
CopyMem (Key, &KeyData.Key, sizeof (EFI_INPUT_KEY));
return EFI_SUCCESS;
-
}
/**
@@ -165,15 +162,14 @@ IsKeyRegistered (
ASSERT (RegsiteredData != NULL && InputData != NULL);
if ((RegsiteredData->Key.ScanCode != InputData->Key.ScanCode) ||
- (RegsiteredData->Key.UnicodeChar != InputData->Key.UnicodeChar)) {
+ (RegsiteredData->Key.UnicodeChar != InputData->Key.UnicodeChar))
+ {
return FALSE;
}
return TRUE;
}
-
-
/**
Event notification function for EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL.WaitForKeyEx event
Signal the event if there is key available
@@ -185,8 +181,8 @@ IsKeyRegistered (
VOID
EFIAPI
TerminalConInWaitForKeyEx (
- IN EFI_EVENT Event,
- IN VOID *Context
+ IN EFI_EVENT Event,
+ IN VOID *Context
)
{
TerminalConInWaitForKey (Event, Context);
@@ -214,8 +210,8 @@ TerminalConInResetEx (
IN BOOLEAN ExtendedVerification
)
{
- EFI_STATUS Status;
- TERMINAL_DEV *TerminalDevice;
+ EFI_STATUS Status;
+ TERMINAL_DEV *TerminalDevice;
TerminalDevice = TERMINAL_CON_IN_EX_DEV_FROM_THIS (This);
@@ -225,10 +221,8 @@ TerminalConInResetEx (
}
return EFI_SUCCESS;
-
}
-
/**
Reads the next keystroke from the input device. The WaitForKey Event can
be used to test for existence of a keystroke via WaitForEvent () call.
@@ -248,11 +242,11 @@ TerminalConInResetEx (
EFI_STATUS
EFIAPI
TerminalConInReadKeyStrokeEx (
- IN EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL *This,
- OUT EFI_KEY_DATA *KeyData
+ IN EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL *This,
+ OUT EFI_KEY_DATA *KeyData
)
{
- TERMINAL_DEV *TerminalDevice;
+ TERMINAL_DEV *TerminalDevice;
if (KeyData == NULL) {
return EFI_INVALID_PARAMETER;
@@ -261,10 +255,8 @@ TerminalConInReadKeyStrokeEx (
TerminalDevice = TERMINAL_CON_IN_EX_DEV_FROM_THIS (This);
return ReadKeyStrokeWorker (TerminalDevice, KeyData);
-
}
-
/**
Set certain state for the input device.
@@ -298,7 +290,6 @@ TerminalConInSetState (
return EFI_SUCCESS;
}
-
/**
Register a notification function for a particular keystroke for the input device.
@@ -330,13 +321,13 @@ TerminalConInRegisterKeyNotify (
OUT VOID **NotifyHandle
)
{
- TERMINAL_DEV *TerminalDevice;
- TERMINAL_CONSOLE_IN_EX_NOTIFY *NewNotify;
- LIST_ENTRY *Link;
- LIST_ENTRY *NotifyList;
- TERMINAL_CONSOLE_IN_EX_NOTIFY *CurrentNotify;
+ TERMINAL_DEV *TerminalDevice;
+ TERMINAL_CONSOLE_IN_EX_NOTIFY *NewNotify;
+ LIST_ENTRY *Link;
+ LIST_ENTRY *NotifyList;
+ TERMINAL_CONSOLE_IN_EX_NOTIFY *CurrentNotify;
- if (KeyData == NULL || NotifyHandle == NULL || KeyNotificationFunction == NULL) {
+ if ((KeyData == NULL) || (NotifyHandle == NULL) || (KeyNotificationFunction == NULL)) {
return EFI_INVALID_PARAMETER;
}
@@ -346,7 +337,7 @@ TerminalConInRegisterKeyNotify (
// Return EFI_SUCCESS if the (KeyData, NotificationFunction) is already registered.
//
NotifyList = &TerminalDevice->NotifyList;
- for (Link = GetFirstNode (NotifyList); !IsNull (NotifyList,Link); Link = GetNextNode (NotifyList,Link)) {
+ for (Link = GetFirstNode (NotifyList); !IsNull (NotifyList, Link); Link = GetNextNode (NotifyList, Link)) {
CurrentNotify = CR (
Link,
TERMINAL_CONSOLE_IN_EX_NOTIFY,
@@ -364,7 +355,7 @@ TerminalConInRegisterKeyNotify (
//
// Allocate resource to save the notification function
//
- NewNotify = (TERMINAL_CONSOLE_IN_EX_NOTIFY *) AllocateZeroPool (sizeof (TERMINAL_CONSOLE_IN_EX_NOTIFY));
+ NewNotify = (TERMINAL_CONSOLE_IN_EX_NOTIFY *)AllocateZeroPool (sizeof (TERMINAL_CONSOLE_IN_EX_NOTIFY));
if (NewNotify == NULL) {
return EFI_OUT_OF_RESOURCES;
}
@@ -374,12 +365,11 @@ TerminalConInRegisterKeyNotify (
CopyMem (&NewNotify->KeyData, KeyData, sizeof (EFI_KEY_DATA));
InsertTailList (&TerminalDevice->NotifyList, &NewNotify->NotifyEntry);
- *NotifyHandle = NewNotify;
+ *NotifyHandle = NewNotify;
return EFI_SUCCESS;
}
-
/**
Remove a registered notification function from a particular keystroke.
@@ -399,10 +389,10 @@ TerminalConInUnregisterKeyNotify (
IN VOID *NotificationHandle
)
{
- TERMINAL_DEV *TerminalDevice;
- LIST_ENTRY *Link;
- TERMINAL_CONSOLE_IN_EX_NOTIFY *CurrentNotify;
- LIST_ENTRY *NotifyList;
+ TERMINAL_DEV *TerminalDevice;
+ LIST_ENTRY *Link;
+ TERMINAL_CONSOLE_IN_EX_NOTIFY *CurrentNotify;
+ LIST_ENTRY *NotifyList;
if (NotificationHandle == NULL) {
return EFI_INVALID_PARAMETER;
@@ -411,7 +401,7 @@ TerminalConInUnregisterKeyNotify (
TerminalDevice = TERMINAL_CON_IN_EX_DEV_FROM_THIS (This);
NotifyList = &TerminalDevice->NotifyList;
- for (Link = GetFirstNode (NotifyList); !IsNull (NotifyList,Link); Link = GetNextNode (NotifyList,Link)) {
+ for (Link = GetFirstNode (NotifyList); !IsNull (NotifyList, Link); Link = GetNextNode (NotifyList, Link)) {
CurrentNotify = CR (
Link,
TERMINAL_CONSOLE_IN_EX_NOTIFY,
@@ -444,37 +434,36 @@ TerminalConInUnregisterKeyNotify (
**/
VOID
TranslateRawDataToEfiKey (
- IN TERMINAL_DEV *TerminalDevice
+ IN TERMINAL_DEV *TerminalDevice
)
{
switch (TerminalDevice->TerminalType) {
+ case TerminalTypePcAnsi:
+ case TerminalTypeVt100:
+ case TerminalTypeVt100Plus:
+ case TerminalTypeTtyTerm:
+ case TerminalTypeLinux:
+ case TerminalTypeXtermR6:
+ case TerminalTypeVt400:
+ case TerminalTypeSCO:
+ AnsiRawDataToUnicode (TerminalDevice);
+ UnicodeToEfiKey (TerminalDevice);
+ break;
- case TerminalTypePcAnsi:
- case TerminalTypeVt100:
- case TerminalTypeVt100Plus:
- case TerminalTypeTtyTerm:
- case TerminalTypeLinux:
- case TerminalTypeXtermR6:
- case TerminalTypeVt400:
- case TerminalTypeSCO:
- AnsiRawDataToUnicode (TerminalDevice);
- UnicodeToEfiKey (TerminalDevice);
- break;
-
- case TerminalTypeVtUtf8:
- //
- // Process all the raw data in the RawFIFO,
- // put the processed key into UnicodeFIFO.
- //
- VTUTF8RawDataToUnicode (TerminalDevice);
+ case TerminalTypeVtUtf8:
+ //
+ // Process all the raw data in the RawFIFO,
+ // put the processed key into UnicodeFIFO.
+ //
+ VTUTF8RawDataToUnicode (TerminalDevice);
- //
- // Translate all the Unicode data in the UnicodeFIFO to Efi key,
- // then put into EfiKeyFIFO.
- //
- UnicodeToEfiKey (TerminalDevice);
+ //
+ // Translate all the Unicode data in the UnicodeFIFO to Efi key,
+ // then put into EfiKeyFIFO.
+ //
+ UnicodeToEfiKey (TerminalDevice);
- break;
+ break;
}
}
@@ -489,16 +478,15 @@ TranslateRawDataToEfiKey (
VOID
EFIAPI
TerminalConInWaitForKey (
- IN EFI_EVENT Event,
- IN VOID *Context
+ IN EFI_EVENT Event,
+ IN VOID *Context
)
{
//
// Someone is waiting on the keystroke event, if there's
// a key pending, signal the event
//
- if (!IsEfiKeyFiFoEmpty ((TERMINAL_DEV *) Context)) {
-
+ if (!IsEfiKeyFiFoEmpty ((TERMINAL_DEV *)Context)) {
gBS->SignalEvent (Event);
}
}
@@ -512,8 +500,8 @@ TerminalConInWaitForKey (
VOID
EFIAPI
TerminalConInTimerHandler (
- IN EFI_EVENT Event,
- IN VOID *Context
+ IN EFI_EVENT Event,
+ IN VOID *Context
)
{
EFI_STATUS Status;
@@ -524,12 +512,13 @@ TerminalConInTimerHandler (
EFI_SERIAL_IO_PROTOCOL *SerialIo;
UINTN SerialInTimeOut;
- TerminalDevice = (TERMINAL_DEV *) Context;
+ TerminalDevice = (TERMINAL_DEV *)Context;
- SerialIo = TerminalDevice->SerialIo;
+ SerialIo = TerminalDevice->SerialIo;
if (SerialIo == NULL) {
- return ;
+ return;
}
+
//
// if current timeout value for serial device is not identical with
// the value saved in TERMINAL_DEV structure, then recalculate the
@@ -537,24 +526,23 @@ TerminalConInTimerHandler (
//
Mode = SerialIo->Mode;
if (Mode->Timeout != TerminalDevice->SerialInTimeOut) {
-
SerialInTimeOut = 0;
if (Mode->BaudRate != 0) {
//
// According to BAUD rate to calculate the timeout value.
//
- SerialInTimeOut = (1 + Mode->DataBits + Mode->StopBits) * 2 * 1000000 / (UINTN) Mode->BaudRate;
+ SerialInTimeOut = (1 + Mode->DataBits + Mode->StopBits) * 2 * 1000000 / (UINTN)Mode->BaudRate;
}
Status = SerialIo->SetAttributes (
- SerialIo,
- Mode->BaudRate,
- Mode->ReceiveFifoDepth,
- (UINT32) SerialInTimeOut,
- (EFI_PARITY_TYPE) (Mode->Parity),
- (UINT8) Mode->DataBits,
- (EFI_STOP_BITS_TYPE) (Mode->StopBits)
- );
+ SerialIo,
+ Mode->BaudRate,
+ Mode->ReceiveFifoDepth,
+ (UINT32)SerialInTimeOut,
+ (EFI_PARITY_TYPE)(Mode->Parity),
+ (UINT8)Mode->DataBits,
+ (EFI_STOP_BITS_TYPE)(Mode->StopBits)
+ );
if (EFI_ERROR (Status)) {
TerminalDevice->SerialInTimeOut = 0;
@@ -562,6 +550,7 @@ TerminalConInTimerHandler (
TerminalDevice->SerialInTimeOut = SerialInTimeOut;
}
}
+
//
// Check whether serial buffer is empty.
// Skip the key transfer loop only if the SerialIo protocol instance
@@ -574,7 +563,6 @@ TerminalConInTimerHandler (
// and insert the byte stream into RawFIFO.
//
while (!IsRawFiFoFull (TerminalDevice)) {
-
Status = GetOneKeyFromSerial (TerminalDevice->SerialIo, &Input);
if (EFI_ERROR (Status)) {
@@ -585,6 +573,7 @@ TerminalConInTimerHandler (
TerminalDevice->DevicePath
);
}
+
break;
}
@@ -608,20 +597,20 @@ TerminalConInTimerHandler (
VOID
EFIAPI
KeyNotifyProcessHandler (
- IN EFI_EVENT Event,
- IN VOID *Context
+ IN EFI_EVENT Event,
+ IN VOID *Context
)
{
- BOOLEAN HasKey;
- TERMINAL_DEV *TerminalDevice;
- EFI_INPUT_KEY Key;
- EFI_KEY_DATA KeyData;
- LIST_ENTRY *Link;
- LIST_ENTRY *NotifyList;
- TERMINAL_CONSOLE_IN_EX_NOTIFY *CurrentNotify;
- EFI_TPL OldTpl;
+ BOOLEAN HasKey;
+ TERMINAL_DEV *TerminalDevice;
+ EFI_INPUT_KEY Key;
+ EFI_KEY_DATA KeyData;
+ LIST_ENTRY *Link;
+ LIST_ENTRY *NotifyList;
+ TERMINAL_CONSOLE_IN_EX_NOTIFY *CurrentNotify;
+ EFI_TPL OldTpl;
- TerminalDevice = (TERMINAL_DEV *) Context;
+ TerminalDevice = (TERMINAL_DEV *)Context;
//
// Invoke notification functions.
@@ -643,6 +632,7 @@ KeyNotifyProcessHandler (
if (!HasKey) {
break;
}
+
for (Link = GetFirstNode (NotifyList); !IsNull (NotifyList, Link); Link = GetNextNode (NotifyList, Link)) {
CurrentNotify = CR (Link, TERMINAL_CONSOLE_IN_EX_NOTIFY, NotifyEntry, TERMINAL_CONSOLE_IN_EX_NOTIFY_SIGNATURE);
if (IsKeyRegistered (&CurrentNotify->KeyData, &KeyData)) {
@@ -679,16 +669,14 @@ GetOneKeyFromSerial (
//
// Read one key from serial I/O device.
//
- Status = SerialIo->Read (SerialIo, &Size, Output);
+ Status = SerialIo->Read (SerialIo, &Size, Output);
if (EFI_ERROR (Status)) {
-
if (Status == EFI_TIMEOUT) {
return EFI_NOT_READY;
}
return EFI_DEVICE_ERROR;
-
}
if (*Output == 0) {
@@ -711,11 +699,11 @@ GetOneKeyFromSerial (
**/
BOOLEAN
RawFiFoInsertOneKey (
- TERMINAL_DEV *TerminalDevice,
- UINT8 Input
+ TERMINAL_DEV *TerminalDevice,
+ UINT8 Input
)
{
- UINT8 Tail;
+ UINT8 Tail;
Tail = TerminalDevice->RawFiFo->Tail;
@@ -726,9 +714,9 @@ RawFiFoInsertOneKey (
return FALSE;
}
- TerminalDevice->RawFiFo->Data[Tail] = Input;
+ TerminalDevice->RawFiFo->Data[Tail] = Input;
- TerminalDevice->RawFiFo->Tail = (UINT8) ((Tail + 1) % (RAW_FIFO_MAX_NUMBER + 1));
+ TerminalDevice->RawFiFo->Tail = (UINT8)((Tail + 1) % (RAW_FIFO_MAX_NUMBER + 1));
return TRUE;
}
@@ -749,7 +737,7 @@ RawFiFoRemoveOneKey (
UINT8 *Output
)
{
- UINT8 Head;
+ UINT8 Head;
Head = TerminalDevice->RawFiFo->Head;
@@ -761,9 +749,9 @@ RawFiFoRemoveOneKey (
return FALSE;
}
- *Output = TerminalDevice->RawFiFo->Data[Head];
+ *Output = TerminalDevice->RawFiFo->Data[Head];
- TerminalDevice->RawFiFo->Head = (UINT8) ((Head + 1) % (RAW_FIFO_MAX_NUMBER + 1));
+ TerminalDevice->RawFiFo->Head = (UINT8)((Head + 1) % (RAW_FIFO_MAX_NUMBER + 1));
return TRUE;
}
@@ -803,14 +791,13 @@ IsRawFiFoFull (
TERMINAL_DEV *TerminalDevice
)
{
- UINT8 Tail;
- UINT8 Head;
+ UINT8 Tail;
+ UINT8 Head;
- Tail = TerminalDevice->RawFiFo->Tail;
- Head = TerminalDevice->RawFiFo->Head;
+ Tail = TerminalDevice->RawFiFo->Tail;
+ Head = TerminalDevice->RawFiFo->Head;
if (((Tail + 1) % (RAW_FIFO_MAX_NUMBER + 1)) == Head) {
-
return TRUE;
}
@@ -830,11 +817,11 @@ IsRawFiFoFull (
**/
BOOLEAN
EfiKeyFiFoForNotifyInsertOneKey (
- EFI_KEY_FIFO *EfiKeyFiFo,
- EFI_INPUT_KEY *Input
+ EFI_KEY_FIFO *EfiKeyFiFo,
+ EFI_INPUT_KEY *Input
)
{
- UINT8 Tail;
+ UINT8 Tail;
Tail = EfiKeyFiFo->Tail;
@@ -847,7 +834,7 @@ EfiKeyFiFoForNotifyInsertOneKey (
CopyMem (&EfiKeyFiFo->Data[Tail], Input, sizeof (EFI_INPUT_KEY));
- EfiKeyFiFo->Tail = (UINT8) ((Tail + 1) % (FIFO_MAX_NUMBER + 1));
+ EfiKeyFiFo->Tail = (UINT8)((Tail + 1) % (FIFO_MAX_NUMBER + 1));
return TRUE;
}
@@ -864,11 +851,11 @@ EfiKeyFiFoForNotifyInsertOneKey (
**/
BOOLEAN
EfiKeyFiFoForNotifyRemoveOneKey (
- EFI_KEY_FIFO *EfiKeyFiFo,
- EFI_INPUT_KEY *Output
+ EFI_KEY_FIFO *EfiKeyFiFo,
+ EFI_INPUT_KEY *Output
)
{
- UINT8 Head;
+ UINT8 Head;
Head = EfiKeyFiFo->Head;
ASSERT (Head < FIFO_MAX_NUMBER + 1);
@@ -884,7 +871,7 @@ EfiKeyFiFoForNotifyRemoveOneKey (
CopyMem (Output, &EfiKeyFiFo->Data[Head], sizeof (EFI_INPUT_KEY));
- EfiKeyFiFo->Head = (UINT8) ((Head + 1) % (FIFO_MAX_NUMBER + 1));
+ EfiKeyFiFo->Head = (UINT8)((Head + 1) % (FIFO_MAX_NUMBER + 1));
return TRUE;
}
@@ -900,7 +887,7 @@ EfiKeyFiFoForNotifyRemoveOneKey (
**/
BOOLEAN
IsEfiKeyFiFoForNotifyEmpty (
- EFI_KEY_FIFO *EfiKeyFiFo
+ EFI_KEY_FIFO *EfiKeyFiFo
)
{
if (EfiKeyFiFo->Head == EfiKeyFiFo->Tail) {
@@ -921,11 +908,11 @@ IsEfiKeyFiFoForNotifyEmpty (
**/
BOOLEAN
IsEfiKeyFiFoForNotifyFull (
- EFI_KEY_FIFO *EfiKeyFiFo
+ EFI_KEY_FIFO *EfiKeyFiFo
)
{
- UINT8 Tail;
- UINT8 Head;
+ UINT8 Tail;
+ UINT8 Head;
Tail = EfiKeyFiFo->Tail;
Head = EfiKeyFiFo->Head;
@@ -950,15 +937,15 @@ IsEfiKeyFiFoForNotifyFull (
**/
BOOLEAN
EfiKeyFiFoInsertOneKey (
- TERMINAL_DEV *TerminalDevice,
- EFI_INPUT_KEY *Key
+ TERMINAL_DEV *TerminalDevice,
+ EFI_INPUT_KEY *Key
)
{
- UINT8 Tail;
- LIST_ENTRY *Link;
- LIST_ENTRY *NotifyList;
- TERMINAL_CONSOLE_IN_EX_NOTIFY *CurrentNotify;
- EFI_KEY_DATA KeyData;
+ UINT8 Tail;
+ LIST_ENTRY *Link;
+ LIST_ENTRY *NotifyList;
+ TERMINAL_CONSOLE_IN_EX_NOTIFY *CurrentNotify;
+ EFI_KEY_DATA KeyData;
Tail = TerminalDevice->EfiKeyFiFo->Tail;
@@ -970,7 +957,7 @@ EfiKeyFiFoInsertOneKey (
// Signal KeyNotify process event if this key pressed matches any key registered.
//
NotifyList = &TerminalDevice->NotifyList;
- for (Link = GetFirstNode (NotifyList); !IsNull (NotifyList,Link); Link = GetNextNode (NotifyList,Link)) {
+ for (Link = GetFirstNode (NotifyList); !IsNull (NotifyList, Link); Link = GetNextNode (NotifyList, Link)) {
CurrentNotify = CR (
Link,
TERMINAL_CONSOLE_IN_EX_NOTIFY,
@@ -988,6 +975,7 @@ EfiKeyFiFoInsertOneKey (
break;
}
}
+
if (IsEfiKeyFiFoFull (TerminalDevice)) {
//
// Efi Key FIFO is full
@@ -997,7 +985,7 @@ EfiKeyFiFoInsertOneKey (
CopyMem (&TerminalDevice->EfiKeyFiFo->Data[Tail], Key, sizeof (EFI_INPUT_KEY));
- TerminalDevice->EfiKeyFiFo->Tail = (UINT8) ((Tail + 1) % (FIFO_MAX_NUMBER + 1));
+ TerminalDevice->EfiKeyFiFo->Tail = (UINT8)((Tail + 1) % (FIFO_MAX_NUMBER + 1));
return TRUE;
}
@@ -1014,11 +1002,11 @@ EfiKeyFiFoInsertOneKey (
**/
BOOLEAN
EfiKeyFiFoRemoveOneKey (
- TERMINAL_DEV *TerminalDevice,
- EFI_INPUT_KEY *Output
+ TERMINAL_DEV *TerminalDevice,
+ EFI_INPUT_KEY *Output
)
{
- UINT8 Head;
+ UINT8 Head;
Head = TerminalDevice->EfiKeyFiFo->Head;
ASSERT (Head < FIFO_MAX_NUMBER + 1);
@@ -1034,7 +1022,7 @@ EfiKeyFiFoRemoveOneKey (
CopyMem (Output, &TerminalDevice->EfiKeyFiFo->Data[Head], sizeof (EFI_INPUT_KEY));
- TerminalDevice->EfiKeyFiFo->Head = (UINT8) ((Head + 1) % (FIFO_MAX_NUMBER + 1));
+ TerminalDevice->EfiKeyFiFo->Head = (UINT8)((Head + 1) % (FIFO_MAX_NUMBER + 1));
return TRUE;
}
@@ -1074,14 +1062,13 @@ IsEfiKeyFiFoFull (
TERMINAL_DEV *TerminalDevice
)
{
- UINT8 Tail;
- UINT8 Head;
+ UINT8 Tail;
+ UINT8 Head;
- Tail = TerminalDevice->EfiKeyFiFo->Tail;
- Head = TerminalDevice->EfiKeyFiFo->Head;
+ Tail = TerminalDevice->EfiKeyFiFo->Tail;
+ Head = TerminalDevice->EfiKeyFiFo->Head;
if (((Tail + 1) % (FIFO_MAX_NUMBER + 1)) == Head) {
-
return TRUE;
}
@@ -1101,16 +1088,15 @@ IsEfiKeyFiFoFull (
**/
BOOLEAN
UnicodeFiFoInsertOneKey (
- TERMINAL_DEV *TerminalDevice,
- UINT16 Input
+ TERMINAL_DEV *TerminalDevice,
+ UINT16 Input
)
{
- UINT8 Tail;
+ UINT8 Tail;
Tail = TerminalDevice->UnicodeFiFo->Tail;
ASSERT (Tail < FIFO_MAX_NUMBER + 1);
-
if (IsUnicodeFiFoFull (TerminalDevice)) {
//
// Unicode FIFO is full
@@ -1118,9 +1104,9 @@ UnicodeFiFoInsertOneKey (
return FALSE;
}
- TerminalDevice->UnicodeFiFo->Data[Tail] = Input;
+ TerminalDevice->UnicodeFiFo->Data[Tail] = Input;
- TerminalDevice->UnicodeFiFo->Tail = (UINT8) ((Tail + 1) % (FIFO_MAX_NUMBER + 1));
+ TerminalDevice->UnicodeFiFo->Tail = (UINT8)((Tail + 1) % (FIFO_MAX_NUMBER + 1));
return TRUE;
}
@@ -1140,14 +1126,14 @@ UnicodeFiFoRemoveOneKey (
UINT16 *Output
)
{
- UINT8 Head;
+ UINT8 Head;
Head = TerminalDevice->UnicodeFiFo->Head;
ASSERT (Head < FIFO_MAX_NUMBER + 1);
*Output = TerminalDevice->UnicodeFiFo->Data[Head];
- TerminalDevice->UnicodeFiFo->Head = (UINT8) ((Head + 1) % (FIFO_MAX_NUMBER + 1));
+ TerminalDevice->UnicodeFiFo->Head = (UINT8)((Head + 1) % (FIFO_MAX_NUMBER + 1));
}
/**
@@ -1185,21 +1171,19 @@ IsUnicodeFiFoFull (
TERMINAL_DEV *TerminalDevice
)
{
- UINT8 Tail;
- UINT8 Head;
+ UINT8 Tail;
+ UINT8 Head;
- Tail = TerminalDevice->UnicodeFiFo->Tail;
- Head = TerminalDevice->UnicodeFiFo->Head;
+ Tail = TerminalDevice->UnicodeFiFo->Tail;
+ Head = TerminalDevice->UnicodeFiFo->Head;
if (((Tail + 1) % (FIFO_MAX_NUMBER + 1)) == Head) {
-
return TRUE;
}
return FALSE;
}
-
/**
Update the Unicode characters from a terminal input device into EFI Keys FIFO.
@@ -1208,11 +1192,11 @@ IsUnicodeFiFoFull (
**/
VOID
UnicodeToEfiKeyFlushState (
- IN TERMINAL_DEV *TerminalDevice
+ IN TERMINAL_DEV *TerminalDevice
)
{
- EFI_INPUT_KEY Key;
- UINT32 InputState;
+ EFI_INPUT_KEY Key;
+ UINT32 InputState;
InputState = TerminalDevice->InputState;
@@ -1254,15 +1238,14 @@ UnicodeToEfiKeyFlushState (
// Cancel the timer.
//
gBS->SetTimer (
- TerminalDevice->TwoSecondTimeOut,
- TimerCancel,
- 0
- );
+ TerminalDevice->TwoSecondTimeOut,
+ TimerCancel,
+ 0
+ );
TerminalDevice->InputState = INPUT_STATE_DEFAULT;
}
-
/**
Converts a stream of Unicode characters from a terminal input device into EFI Keys that
can be read through the Simple Input Protocol.
@@ -1353,14 +1336,14 @@ Putty function key map:
**/
VOID
UnicodeToEfiKey (
- IN TERMINAL_DEV *TerminalDevice
+ IN TERMINAL_DEV *TerminalDevice
)
{
- EFI_STATUS Status;
- EFI_STATUS TimerStatus;
- UINT16 UnicodeChar;
- EFI_INPUT_KEY Key;
- BOOLEAN SetDefaultResetState;
+ EFI_STATUS Status;
+ EFI_STATUS TimerStatus;
+ UINT16 UnicodeChar;
+ EFI_INPUT_KEY Key;
+ BOOLEAN SetDefaultResetState;
TimerStatus = gBS->CheckEvent (TerminalDevice->TwoSecondTimeOut);
@@ -1370,7 +1353,6 @@ UnicodeToEfiKey (
}
while (!IsUnicodeFiFoEmpty (TerminalDevice) && !IsEfiKeyFiFoFull (TerminalDevice)) {
-
if (TerminalDevice->InputState != INPUT_STATE_DEFAULT) {
//
// Check to see if the 2 seconds timer has expired
@@ -1390,666 +1372,714 @@ UnicodeToEfiKey (
SetDefaultResetState = TRUE;
switch (TerminalDevice->InputState) {
- case INPUT_STATE_DEFAULT:
+ case INPUT_STATE_DEFAULT:
- break;
+ break;
- case INPUT_STATE_ESC:
+ case INPUT_STATE_ESC:
- if (UnicodeChar == LEFTOPENBRACKET) {
- TerminalDevice->InputState |= INPUT_STATE_LEFTOPENBRACKET;
- TerminalDevice->ResetState = RESET_STATE_DEFAULT;
- continue;
- }
+ if (UnicodeChar == LEFTOPENBRACKET) {
+ TerminalDevice->InputState |= INPUT_STATE_LEFTOPENBRACKET;
+ TerminalDevice->ResetState = RESET_STATE_DEFAULT;
+ continue;
+ }
- if (UnicodeChar == 'O' && (TerminalDevice->TerminalType == TerminalTypeVt100 ||
- TerminalDevice->TerminalType == TerminalTypeTtyTerm ||
- TerminalDevice->TerminalType == TerminalTypeXtermR6 ||
- TerminalDevice->TerminalType == TerminalTypeVt100Plus)) {
- TerminalDevice->InputState |= INPUT_STATE_O;
- TerminalDevice->ResetState = RESET_STATE_DEFAULT;
- continue;
- }
+ if ((UnicodeChar == 'O') && ((TerminalDevice->TerminalType == TerminalTypeVt100) ||
+ (TerminalDevice->TerminalType == TerminalTypeTtyTerm) ||
+ (TerminalDevice->TerminalType == TerminalTypeXtermR6) ||
+ (TerminalDevice->TerminalType == TerminalTypeVt100Plus)))
+ {
+ TerminalDevice->InputState |= INPUT_STATE_O;
+ TerminalDevice->ResetState = RESET_STATE_DEFAULT;
+ continue;
+ }
- Key.ScanCode = SCAN_NULL;
+ Key.ScanCode = SCAN_NULL;
+
+ if ((TerminalDevice->TerminalType == TerminalTypeVt100Plus) ||
+ (TerminalDevice->TerminalType == TerminalTypeVtUtf8))
+ {
+ switch (UnicodeChar) {
+ case '1':
+ Key.ScanCode = SCAN_F1;
+ break;
+ case '2':
+ Key.ScanCode = SCAN_F2;
+ break;
+ case '3':
+ Key.ScanCode = SCAN_F3;
+ break;
+ case '4':
+ Key.ScanCode = SCAN_F4;
+ break;
+ case '5':
+ Key.ScanCode = SCAN_F5;
+ break;
+ case '6':
+ Key.ScanCode = SCAN_F6;
+ break;
+ case '7':
+ Key.ScanCode = SCAN_F7;
+ break;
+ case '8':
+ Key.ScanCode = SCAN_F8;
+ break;
+ case '9':
+ Key.ScanCode = SCAN_F9;
+ break;
+ case '0':
+ Key.ScanCode = SCAN_F10;
+ break;
+ case '!':
+ Key.ScanCode = SCAN_F11;
+ break;
+ case '@':
+ Key.ScanCode = SCAN_F12;
+ break;
+ case 'h':
+ Key.ScanCode = SCAN_HOME;
+ break;
+ case 'k':
+ Key.ScanCode = SCAN_END;
+ break;
+ case '+':
+ Key.ScanCode = SCAN_INSERT;
+ break;
+ case '-':
+ Key.ScanCode = SCAN_DELETE;
+ break;
+ case '/':
+ Key.ScanCode = SCAN_PAGE_DOWN;
+ break;
+ case '?':
+ Key.ScanCode = SCAN_PAGE_UP;
+ break;
+ default:
+ break;
+ }
+ }
- if (TerminalDevice->TerminalType == TerminalTypeVt100Plus ||
- TerminalDevice->TerminalType == TerminalTypeVtUtf8) {
switch (UnicodeChar) {
- case '1':
- Key.ScanCode = SCAN_F1;
- break;
- case '2':
- Key.ScanCode = SCAN_F2;
- break;
- case '3':
- Key.ScanCode = SCAN_F3;
- break;
- case '4':
- Key.ScanCode = SCAN_F4;
- break;
- case '5':
- Key.ScanCode = SCAN_F5;
- break;
- case '6':
- Key.ScanCode = SCAN_F6;
- break;
- case '7':
- Key.ScanCode = SCAN_F7;
- break;
- case '8':
- Key.ScanCode = SCAN_F8;
- break;
- case '9':
- Key.ScanCode = SCAN_F9;
- break;
- case '0':
- Key.ScanCode = SCAN_F10;
- break;
- case '!':
- Key.ScanCode = SCAN_F11;
- break;
- case '@':
- Key.ScanCode = SCAN_F12;
- break;
- case 'h':
- Key.ScanCode = SCAN_HOME;
- break;
- case 'k':
- Key.ScanCode = SCAN_END;
- break;
- case '+':
- Key.ScanCode = SCAN_INSERT;
- break;
- case '-':
- Key.ScanCode = SCAN_DELETE;
- break;
- case '/':
- Key.ScanCode = SCAN_PAGE_DOWN;
- break;
- case '?':
- Key.ScanCode = SCAN_PAGE_UP;
- break;
- default :
- break;
+ case 'R':
+ if (TerminalDevice->ResetState == RESET_STATE_DEFAULT) {
+ TerminalDevice->ResetState = RESET_STATE_ESC_R;
+ SetDefaultResetState = FALSE;
+ } else if (TerminalDevice->ResetState == RESET_STATE_ESC_R_ESC_R) {
+ gRT->ResetSystem (EfiResetWarm, EFI_SUCCESS, 0, NULL);
+ }
+
+ Key.ScanCode = SCAN_NULL;
+ break;
+ case 'r':
+ if (TerminalDevice->ResetState == RESET_STATE_ESC_R) {
+ TerminalDevice->ResetState = RESET_STATE_ESC_R_ESC_R;
+ SetDefaultResetState = FALSE;
+ }
+
+ Key.ScanCode = SCAN_NULL;
+ break;
+ default:
+ break;
}
- }
- switch (UnicodeChar) {
- case 'R':
- if (TerminalDevice->ResetState == RESET_STATE_DEFAULT) {
- TerminalDevice->ResetState = RESET_STATE_ESC_R;
- SetDefaultResetState = FALSE;
- } else if (TerminalDevice->ResetState == RESET_STATE_ESC_R_ESC_R) {
- gRT->ResetSystem (EfiResetWarm, EFI_SUCCESS, 0, NULL);
+ if (SetDefaultResetState) {
+ TerminalDevice->ResetState = RESET_STATE_DEFAULT;
}
- Key.ScanCode = SCAN_NULL;
- break;
- case 'r':
- if (TerminalDevice->ResetState == RESET_STATE_ESC_R) {
- TerminalDevice->ResetState = RESET_STATE_ESC_R_ESC_R;
- SetDefaultResetState = FALSE;
+
+ if (Key.ScanCode != SCAN_NULL) {
+ Key.UnicodeChar = 0;
+ EfiKeyFiFoInsertOneKey (TerminalDevice, &Key);
+ TerminalDevice->InputState = INPUT_STATE_DEFAULT;
+ UnicodeToEfiKeyFlushState (TerminalDevice);
+ continue;
}
- Key.ScanCode = SCAN_NULL;
- break;
- default :
+
+ UnicodeToEfiKeyFlushState (TerminalDevice);
+
break;
- }
- if (SetDefaultResetState) {
+ case INPUT_STATE_ESC | INPUT_STATE_O:
+
TerminalDevice->ResetState = RESET_STATE_DEFAULT;
- }
- if (Key.ScanCode != SCAN_NULL) {
- Key.UnicodeChar = 0;
- EfiKeyFiFoInsertOneKey (TerminalDevice, &Key);
- TerminalDevice->InputState = INPUT_STATE_DEFAULT;
- UnicodeToEfiKeyFlushState (TerminalDevice);
- continue;
- }
+ Key.ScanCode = SCAN_NULL;
- UnicodeToEfiKeyFlushState (TerminalDevice);
+ if (TerminalDevice->TerminalType == TerminalTypeVt100) {
+ switch (UnicodeChar) {
+ case 'P':
+ Key.ScanCode = SCAN_F1;
+ break;
+ case 'Q':
+ Key.ScanCode = SCAN_F2;
+ break;
+ case 'w':
+ Key.ScanCode = SCAN_F3;
+ break;
+ case 'x':
+ Key.ScanCode = SCAN_F4;
+ break;
+ case 't':
+ Key.ScanCode = SCAN_F5;
+ break;
+ case 'u':
+ Key.ScanCode = SCAN_F6;
+ break;
+ case 'q':
+ Key.ScanCode = SCAN_F7;
+ break;
+ case 'r':
+ Key.ScanCode = SCAN_F8;
+ break;
+ case 'p':
+ Key.ScanCode = SCAN_F9;
+ break;
+ case 'M':
+ Key.ScanCode = SCAN_F10;
+ break;
+ default:
+ break;
+ }
+ } else if (TerminalDevice->TerminalType == TerminalTypeTtyTerm) {
+ /* Also accept VT100 escape codes for F1-F4, HOME and END for TTY term */
+ switch (UnicodeChar) {
+ case 'P':
+ Key.ScanCode = SCAN_F1;
+ break;
+ case 'Q':
+ Key.ScanCode = SCAN_F2;
+ break;
+ case 'R':
+ Key.ScanCode = SCAN_F3;
+ break;
+ case 'S':
+ Key.ScanCode = SCAN_F4;
+ break;
+ case 'H':
+ Key.ScanCode = SCAN_HOME;
+ break;
+ case 'F':
+ Key.ScanCode = SCAN_END;
+ break;
+ }
+ } else if (TerminalDevice->TerminalType == TerminalTypeVt100Plus) {
+ switch (UnicodeChar) {
+ case 'P':
+ Key.ScanCode = SCAN_F1;
+ break;
+ case 'Q':
+ Key.ScanCode = SCAN_F2;
+ break;
+ case 'R':
+ Key.ScanCode = SCAN_F3;
+ break;
+ case 'S':
+ Key.ScanCode = SCAN_F4;
+ break;
+ case 'T':
+ Key.ScanCode = SCAN_F5;
+ break;
+ case 'U':
+ Key.ScanCode = SCAN_F6;
+ break;
+ case 'V':
+ Key.ScanCode = SCAN_F7;
+ break;
+ case 'W':
+ Key.ScanCode = SCAN_F8;
+ break;
+ case 'X':
+ Key.ScanCode = SCAN_F9;
+ break;
+ case 'Y':
+ Key.ScanCode = SCAN_F10;
+ break;
+ case 'Z':
+ Key.ScanCode = SCAN_F11;
+ break;
+ case '[':
+ Key.ScanCode = SCAN_F12;
+ break;
+ }
+ } else if (TerminalDevice->TerminalType == TerminalTypeXtermR6) {
+ switch (UnicodeChar) {
+ case 'P':
+ Key.ScanCode = SCAN_F1;
+ break;
+ case 'Q':
+ Key.ScanCode = SCAN_F2;
+ break;
+ case 'R':
+ Key.ScanCode = SCAN_F3;
+ break;
+ case 'S':
+ Key.ScanCode = SCAN_F4;
+ break;
+ }
+ }
- break;
+ if (Key.ScanCode != SCAN_NULL) {
+ Key.UnicodeChar = 0;
+ EfiKeyFiFoInsertOneKey (TerminalDevice, &Key);
+ TerminalDevice->InputState = INPUT_STATE_DEFAULT;
+ UnicodeToEfiKeyFlushState (TerminalDevice);
+ continue;
+ }
- case INPUT_STATE_ESC | INPUT_STATE_O:
+ UnicodeToEfiKeyFlushState (TerminalDevice);
- TerminalDevice->ResetState = RESET_STATE_DEFAULT;
+ break;
- Key.ScanCode = SCAN_NULL;
+ case INPUT_STATE_ESC | INPUT_STATE_LEFTOPENBRACKET:
- if (TerminalDevice->TerminalType == TerminalTypeVt100) {
- switch (UnicodeChar) {
- case 'P':
- Key.ScanCode = SCAN_F1;
- break;
- case 'Q':
- Key.ScanCode = SCAN_F2;
- break;
- case 'w':
- Key.ScanCode = SCAN_F3;
- break;
- case 'x':
- Key.ScanCode = SCAN_F4;
- break;
- case 't':
- Key.ScanCode = SCAN_F5;
- break;
- case 'u':
- Key.ScanCode = SCAN_F6;
- break;
- case 'q':
- Key.ScanCode = SCAN_F7;
- break;
- case 'r':
- Key.ScanCode = SCAN_F8;
- break;
- case 'p':
- Key.ScanCode = SCAN_F9;
- break;
- case 'M':
- Key.ScanCode = SCAN_F10;
- break;
- default :
- break;
- }
- } else if (TerminalDevice->TerminalType == TerminalTypeTtyTerm) {
- /* Also accept VT100 escape codes for F1-F4, HOME and END for TTY term */
- switch (UnicodeChar) {
- case 'P':
- Key.ScanCode = SCAN_F1;
- break;
- case 'Q':
- Key.ScanCode = SCAN_F2;
- break;
- case 'R':
- Key.ScanCode = SCAN_F3;
- break;
- case 'S':
- Key.ScanCode = SCAN_F4;
- break;
- case 'H':
- Key.ScanCode = SCAN_HOME;
- break;
- case 'F':
- Key.ScanCode = SCAN_END;
- break;
+ if ((UnicodeChar == '1') && ((TerminalDevice->TerminalType == TerminalTypeXtermR6) ||
+ (TerminalDevice->TerminalType == TerminalTypeVt400) ||
+ (TerminalDevice->TerminalType == TerminalTypeLinux)))
+ {
+ TerminalDevice->InputState |= INPUT_STATE_1;
+ continue;
}
- } else if (TerminalDevice->TerminalType == TerminalTypeVt100Plus) {
- switch (UnicodeChar) {
- case 'P':
- Key.ScanCode = SCAN_F1;
- break;
- case 'Q':
- Key.ScanCode = SCAN_F2;
- break;
- case 'R':
- Key.ScanCode = SCAN_F3;
- break;
- case 'S':
- Key.ScanCode = SCAN_F4;
- break;
- case 'T':
- Key.ScanCode = SCAN_F5;
- break;
- case 'U':
- Key.ScanCode = SCAN_F6;
- break;
- case 'V':
- Key.ScanCode = SCAN_F7;
- break;
- case 'W':
- Key.ScanCode = SCAN_F8;
- break;
- case 'X':
- Key.ScanCode = SCAN_F9;
- break;
- case 'Y':
- Key.ScanCode = SCAN_F10;
- break;
- case 'Z':
- Key.ScanCode = SCAN_F11;
- break;
- case '[':
- Key.ScanCode = SCAN_F12;
- break;
+
+ if ((UnicodeChar == '2') && ((TerminalDevice->TerminalType == TerminalTypeXtermR6) ||
+ (TerminalDevice->TerminalType == TerminalTypeVt400) ||
+ (TerminalDevice->TerminalType == TerminalTypeLinux)))
+ {
+ TerminalDevice->InputState |= INPUT_STATE_2;
+ continue;
}
- } else if (TerminalDevice->TerminalType == TerminalTypeXtermR6) {
- switch (UnicodeChar) {
- case 'P':
- Key.ScanCode = SCAN_F1;
- break;
- case 'Q':
- Key.ScanCode = SCAN_F2;
- break;
- case 'R':
- Key.ScanCode = SCAN_F3;
- break;
- case 'S':
- Key.ScanCode = SCAN_F4;
- break;
+
+ if ((UnicodeChar == LEFTOPENBRACKET) && (TerminalDevice->TerminalType == TerminalTypeLinux)) {
+ TerminalDevice->InputState |= INPUT_STATE_LEFTOPENBRACKET_2ND;
+ continue;
}
- }
- if (Key.ScanCode != SCAN_NULL) {
- Key.UnicodeChar = 0;
- EfiKeyFiFoInsertOneKey (TerminalDevice, &Key);
- TerminalDevice->InputState = INPUT_STATE_DEFAULT;
- UnicodeToEfiKeyFlushState (TerminalDevice);
- continue;
- }
+ TerminalDevice->ResetState = RESET_STATE_DEFAULT;
- UnicodeToEfiKeyFlushState (TerminalDevice);
+ Key.ScanCode = SCAN_NULL;
- break;
+ if ((TerminalDevice->TerminalType == TerminalTypePcAnsi) ||
+ (TerminalDevice->TerminalType == TerminalTypeVt100) ||
+ (TerminalDevice->TerminalType == TerminalTypeVt100Plus) ||
+ (TerminalDevice->TerminalType == TerminalTypeVtUtf8) ||
+ (TerminalDevice->TerminalType == TerminalTypeTtyTerm) ||
+ (TerminalDevice->TerminalType == TerminalTypeLinux) ||
+ (TerminalDevice->TerminalType == TerminalTypeXtermR6) ||
+ (TerminalDevice->TerminalType == TerminalTypeVt400) ||
+ (TerminalDevice->TerminalType == TerminalTypeSCO))
+ {
+ switch (UnicodeChar) {
+ case 'A':
+ Key.ScanCode = SCAN_UP;
+ break;
+ case 'B':
+ Key.ScanCode = SCAN_DOWN;
+ break;
+ case 'C':
+ Key.ScanCode = SCAN_RIGHT;
+ break;
+ case 'D':
+ Key.ScanCode = SCAN_LEFT;
+ break;
+ case 'H':
+ if ((TerminalDevice->TerminalType == TerminalTypePcAnsi) ||
+ (TerminalDevice->TerminalType == TerminalTypeVt100) ||
+ (TerminalDevice->TerminalType == TerminalTypeTtyTerm))
+ {
+ Key.ScanCode = SCAN_HOME;
+ }
- case INPUT_STATE_ESC | INPUT_STATE_LEFTOPENBRACKET:
+ break;
+ case 'F':
+ if ((TerminalDevice->TerminalType == TerminalTypePcAnsi) ||
+ (TerminalDevice->TerminalType == TerminalTypeTtyTerm))
+ {
+ Key.ScanCode = SCAN_END;
+ }
- if (UnicodeChar == '1' && (TerminalDevice->TerminalType == TerminalTypeXtermR6 ||
- TerminalDevice->TerminalType == TerminalTypeVt400 ||
- TerminalDevice->TerminalType == TerminalTypeLinux)) {
- TerminalDevice->InputState |= INPUT_STATE_1;
- continue;
- }
+ break;
+ case 'K':
+ if (TerminalDevice->TerminalType == TerminalTypeVt100) {
+ Key.ScanCode = SCAN_END;
+ }
- if (UnicodeChar == '2' && (TerminalDevice->TerminalType == TerminalTypeXtermR6 ||
- TerminalDevice->TerminalType == TerminalTypeVt400 ||
- TerminalDevice->TerminalType == TerminalTypeLinux)) {
- TerminalDevice->InputState |= INPUT_STATE_2;
- continue;
- }
+ break;
+ case 'L':
+ case '@':
+ if ((TerminalDevice->TerminalType == TerminalTypePcAnsi) ||
+ (TerminalDevice->TerminalType == TerminalTypeVt100))
+ {
+ Key.ScanCode = SCAN_INSERT;
+ }
- if (UnicodeChar == LEFTOPENBRACKET && TerminalDevice->TerminalType == TerminalTypeLinux) {
- TerminalDevice->InputState |= INPUT_STATE_LEFTOPENBRACKET_2ND;
- continue;
- }
+ break;
+ case 'X':
+ if (TerminalDevice->TerminalType == TerminalTypePcAnsi) {
+ Key.ScanCode = SCAN_DELETE;
+ } else if (TerminalDevice->TerminalType == TerminalTypeSCO) {
+ Key.ScanCode = SCAN_F12;
+ }
- TerminalDevice->ResetState = RESET_STATE_DEFAULT;
+ break;
+ case 'P':
+ if (TerminalDevice->TerminalType == TerminalTypeVt100) {
+ Key.ScanCode = SCAN_DELETE;
+ } else if ((TerminalDevice->TerminalType == TerminalTypePcAnsi) ||
+ (TerminalDevice->TerminalType == TerminalTypeSCO))
+ {
+ Key.ScanCode = SCAN_F4;
+ }
- Key.ScanCode = SCAN_NULL;
-
- if (TerminalDevice->TerminalType == TerminalTypePcAnsi ||
- TerminalDevice->TerminalType == TerminalTypeVt100 ||
- TerminalDevice->TerminalType == TerminalTypeVt100Plus ||
- TerminalDevice->TerminalType == TerminalTypeVtUtf8 ||
- TerminalDevice->TerminalType == TerminalTypeTtyTerm ||
- TerminalDevice->TerminalType == TerminalTypeLinux ||
- TerminalDevice->TerminalType == TerminalTypeXtermR6 ||
- TerminalDevice->TerminalType == TerminalTypeVt400 ||
- TerminalDevice->TerminalType == TerminalTypeSCO) {
- switch (UnicodeChar) {
- case 'A':
- Key.ScanCode = SCAN_UP;
- break;
- case 'B':
- Key.ScanCode = SCAN_DOWN;
- break;
- case 'C':
- Key.ScanCode = SCAN_RIGHT;
- break;
- case 'D':
- Key.ScanCode = SCAN_LEFT;
- break;
- case 'H':
- if (TerminalDevice->TerminalType == TerminalTypePcAnsi ||
- TerminalDevice->TerminalType == TerminalTypeVt100 ||
- TerminalDevice->TerminalType == TerminalTypeTtyTerm) {
- Key.ScanCode = SCAN_HOME;
- }
- break;
- case 'F':
- if (TerminalDevice->TerminalType == TerminalTypePcAnsi ||
- TerminalDevice->TerminalType == TerminalTypeTtyTerm) {
- Key.ScanCode = SCAN_END;
- }
- break;
- case 'K':
- if (TerminalDevice->TerminalType == TerminalTypeVt100) {
- Key.ScanCode = SCAN_END;
- }
- break;
- case 'L':
- case '@':
- if (TerminalDevice->TerminalType == TerminalTypePcAnsi ||
- TerminalDevice->TerminalType == TerminalTypeVt100) {
- Key.ScanCode = SCAN_INSERT;
- }
- break;
- case 'X':
- if (TerminalDevice->TerminalType == TerminalTypePcAnsi) {
- Key.ScanCode = SCAN_DELETE;
- } else if (TerminalDevice->TerminalType == TerminalTypeSCO) {
- Key.ScanCode = SCAN_F12;
- }
- break;
- case 'P':
- if (TerminalDevice->TerminalType == TerminalTypeVt100) {
- Key.ScanCode = SCAN_DELETE;
- } else if (TerminalDevice->TerminalType == TerminalTypePcAnsi ||
- TerminalDevice->TerminalType == TerminalTypeSCO) {
- Key.ScanCode = SCAN_F4;
- }
- break;
- case 'I':
- if (TerminalDevice->TerminalType == TerminalTypePcAnsi) {
- Key.ScanCode = SCAN_PAGE_UP;
- }
- break;
- case 'V':
- if (TerminalDevice->TerminalType == TerminalTypePcAnsi ||
- TerminalDevice->TerminalType == TerminalTypeSCO) {
- Key.ScanCode = SCAN_F10;
- }
- break;
- case '?':
- if (TerminalDevice->TerminalType == TerminalTypeVt100) {
- Key.ScanCode = SCAN_PAGE_UP;
- }
- break;
- case 'G':
- if (TerminalDevice->TerminalType == TerminalTypePcAnsi) {
- Key.ScanCode = SCAN_PAGE_DOWN;
- }
- break;
- case 'U':
- if (TerminalDevice->TerminalType == TerminalTypePcAnsi ||
- TerminalDevice->TerminalType == TerminalTypeSCO) {
- Key.ScanCode = SCAN_F9;
- }
- break;
- case '/':
- if (TerminalDevice->TerminalType == TerminalTypeVt100) {
- Key.ScanCode = SCAN_PAGE_DOWN;
- }
- break;
- case 'M':
- if (TerminalDevice->TerminalType == TerminalTypePcAnsi ||
- TerminalDevice->TerminalType == TerminalTypeSCO) {
- Key.ScanCode = SCAN_F1;
- }
- break;
- case 'N':
- if (TerminalDevice->TerminalType == TerminalTypePcAnsi ||
- TerminalDevice->TerminalType == TerminalTypeSCO) {
- Key.ScanCode = SCAN_F2;
- }
- break;
- case 'O':
- if (TerminalDevice->TerminalType == TerminalTypePcAnsi ||
- TerminalDevice->TerminalType == TerminalTypeSCO) {
- Key.ScanCode = SCAN_F3;
- }
- break;
- case 'Q':
- if (TerminalDevice->TerminalType == TerminalTypePcAnsi ||
- TerminalDevice->TerminalType == TerminalTypeSCO) {
- Key.ScanCode = SCAN_F5;
- }
- break;
- case 'R':
- if (TerminalDevice->TerminalType == TerminalTypePcAnsi ||
- TerminalDevice->TerminalType == TerminalTypeSCO) {
- Key.ScanCode = SCAN_F6;
- }
- break;
- case 'S':
- if (TerminalDevice->TerminalType == TerminalTypePcAnsi ||
- TerminalDevice->TerminalType == TerminalTypeSCO) {
- Key.ScanCode = SCAN_F7;
- }
- break;
- case 'T':
- if (TerminalDevice->TerminalType == TerminalTypePcAnsi ||
- TerminalDevice->TerminalType == TerminalTypeSCO) {
- Key.ScanCode = SCAN_F8;
- }
- break;
- case 'W':
- if (TerminalDevice->TerminalType == TerminalTypeSCO) {
- Key.ScanCode = SCAN_F11;
- }
- break;
- default :
- break;
- }
- }
+ break;
+ case 'I':
+ if (TerminalDevice->TerminalType == TerminalTypePcAnsi) {
+ Key.ScanCode = SCAN_PAGE_UP;
+ }
- /*
- * The VT220 escape codes that the TTY terminal accepts all have
- * numeric codes, and there are no ambiguous prefixes shared with
- * other terminal types.
- */
- if (TerminalDevice->TerminalType == TerminalTypeTtyTerm &&
- Key.ScanCode == SCAN_NULL &&
- UnicodeChar >= '0' &&
- UnicodeChar <= '9') {
- TerminalDevice->TtyEscapeStr[0] = UnicodeChar;
- TerminalDevice->TtyEscapeIndex = 1;
- TerminalDevice->InputState |= INPUT_STATE_LEFTOPENBRACKET_TTY;
- continue;
- }
+ break;
+ case 'V':
+ if ((TerminalDevice->TerminalType == TerminalTypePcAnsi) ||
+ (TerminalDevice->TerminalType == TerminalTypeSCO))
+ {
+ Key.ScanCode = SCAN_F10;
+ }
- if (Key.ScanCode != SCAN_NULL) {
- Key.UnicodeChar = 0;
- EfiKeyFiFoInsertOneKey (TerminalDevice, &Key);
- TerminalDevice->InputState = INPUT_STATE_DEFAULT;
- UnicodeToEfiKeyFlushState (TerminalDevice);
- continue;
- }
+ break;
+ case '?':
+ if (TerminalDevice->TerminalType == TerminalTypeVt100) {
+ Key.ScanCode = SCAN_PAGE_UP;
+ }
- UnicodeToEfiKeyFlushState (TerminalDevice);
+ break;
+ case 'G':
+ if (TerminalDevice->TerminalType == TerminalTypePcAnsi) {
+ Key.ScanCode = SCAN_PAGE_DOWN;
+ }
- break;
+ break;
+ case 'U':
+ if ((TerminalDevice->TerminalType == TerminalTypePcAnsi) ||
+ (TerminalDevice->TerminalType == TerminalTypeSCO))
+ {
+ Key.ScanCode = SCAN_F9;
+ }
- case INPUT_STATE_ESC | INPUT_STATE_LEFTOPENBRACKET | INPUT_STATE_1:
+ break;
+ case '/':
+ if (TerminalDevice->TerminalType == TerminalTypeVt100) {
+ Key.ScanCode = SCAN_PAGE_DOWN;
+ }
- TerminalDevice->ResetState = RESET_STATE_DEFAULT;
+ break;
+ case 'M':
+ if ((TerminalDevice->TerminalType == TerminalTypePcAnsi) ||
+ (TerminalDevice->TerminalType == TerminalTypeSCO))
+ {
+ Key.ScanCode = SCAN_F1;
+ }
- Key.ScanCode = SCAN_NULL;
+ break;
+ case 'N':
+ if ((TerminalDevice->TerminalType == TerminalTypePcAnsi) ||
+ (TerminalDevice->TerminalType == TerminalTypeSCO))
+ {
+ Key.ScanCode = SCAN_F2;
+ }
- if (TerminalDevice->TerminalType == TerminalTypeXtermR6 ||
- TerminalDevice->TerminalType == TerminalTypeVt400 ||
- TerminalDevice->TerminalType == TerminalTypeLinux) {
- switch (UnicodeChar) {
- case '1':
- if (TerminalDevice->TerminalType == TerminalTypeVt400) {
- Key.ScanCode = SCAN_F1;
- }
- break;
- case '2':
- if (TerminalDevice->TerminalType == TerminalTypeVt400) {
- Key.ScanCode = SCAN_F2;
- }
- break;
- case '3':
- if (TerminalDevice->TerminalType == TerminalTypeVt400) {
- Key.ScanCode = SCAN_F3;
- }
- break;
- case '4':
- if (TerminalDevice->TerminalType == TerminalTypeVt400) {
- Key.ScanCode = SCAN_F4;
- }
- break;
- case '5':
- if (TerminalDevice->TerminalType == TerminalTypeXtermR6 ||
- TerminalDevice->TerminalType == TerminalTypeVt400) {
- Key.ScanCode = SCAN_F5;
+ break;
+ case 'O':
+ if ((TerminalDevice->TerminalType == TerminalTypePcAnsi) ||
+ (TerminalDevice->TerminalType == TerminalTypeSCO))
+ {
+ Key.ScanCode = SCAN_F3;
+ }
+
+ break;
+ case 'Q':
+ if ((TerminalDevice->TerminalType == TerminalTypePcAnsi) ||
+ (TerminalDevice->TerminalType == TerminalTypeSCO))
+ {
+ Key.ScanCode = SCAN_F5;
+ }
+
+ break;
+ case 'R':
+ if ((TerminalDevice->TerminalType == TerminalTypePcAnsi) ||
+ (TerminalDevice->TerminalType == TerminalTypeSCO))
+ {
+ Key.ScanCode = SCAN_F6;
+ }
+
+ break;
+ case 'S':
+ if ((TerminalDevice->TerminalType == TerminalTypePcAnsi) ||
+ (TerminalDevice->TerminalType == TerminalTypeSCO))
+ {
+ Key.ScanCode = SCAN_F7;
+ }
+
+ break;
+ case 'T':
+ if ((TerminalDevice->TerminalType == TerminalTypePcAnsi) ||
+ (TerminalDevice->TerminalType == TerminalTypeSCO))
+ {
+ Key.ScanCode = SCAN_F8;
+ }
+
+ break;
+ case 'W':
+ if (TerminalDevice->TerminalType == TerminalTypeSCO) {
+ Key.ScanCode = SCAN_F11;
+ }
+
+ break;
+ default:
+ break;
}
- break;
- case '7':
- Key.ScanCode = SCAN_F6;
- break;
- case '8':
- Key.ScanCode = SCAN_F7;
- break;
- case '9':
- Key.ScanCode = SCAN_F8;
- break;
}
- }
- if (Key.ScanCode != SCAN_NULL) {
- Key.UnicodeChar = 0;
- EfiKeyFiFoInsertOneKey (TerminalDevice, &Key);
- TerminalDevice->InputState = INPUT_STATE_DEFAULT;
+ /*
+ * The VT220 escape codes that the TTY terminal accepts all have
+ * numeric codes, and there are no ambiguous prefixes shared with
+ * other terminal types.
+ */
+ if ((TerminalDevice->TerminalType == TerminalTypeTtyTerm) &&
+ (Key.ScanCode == SCAN_NULL) &&
+ (UnicodeChar >= '0') &&
+ (UnicodeChar <= '9'))
+ {
+ TerminalDevice->TtyEscapeStr[0] = UnicodeChar;
+ TerminalDevice->TtyEscapeIndex = 1;
+ TerminalDevice->InputState |= INPUT_STATE_LEFTOPENBRACKET_TTY;
+ continue;
+ }
+
+ if (Key.ScanCode != SCAN_NULL) {
+ Key.UnicodeChar = 0;
+ EfiKeyFiFoInsertOneKey (TerminalDevice, &Key);
+ TerminalDevice->InputState = INPUT_STATE_DEFAULT;
+ UnicodeToEfiKeyFlushState (TerminalDevice);
+ continue;
+ }
+
UnicodeToEfiKeyFlushState (TerminalDevice);
- continue;
- }
- UnicodeToEfiKeyFlushState (TerminalDevice);
+ break;
- break;
+ case INPUT_STATE_ESC | INPUT_STATE_LEFTOPENBRACKET | INPUT_STATE_1:
- case INPUT_STATE_ESC | INPUT_STATE_LEFTOPENBRACKET | INPUT_STATE_2:
+ TerminalDevice->ResetState = RESET_STATE_DEFAULT;
- TerminalDevice->InputState = INPUT_STATE_DEFAULT;
- Key.ScanCode = SCAN_NULL;
- if (TerminalDevice->TerminalType == TerminalTypeXtermR6 ||
- TerminalDevice->TerminalType == TerminalTypeVt400 ||
- TerminalDevice->TerminalType == TerminalTypeLinux) {
- switch (UnicodeChar) {
- case '0':
- Key.ScanCode = SCAN_F9;
- break;
- case '1':
- Key.ScanCode = SCAN_F10;
- break;
- case '3':
- Key.ScanCode = SCAN_F11;
- break;
- case '4':
- Key.ScanCode = SCAN_F12;
- break;
- }
- }
+ Key.ScanCode = SCAN_NULL;
- if (Key.ScanCode != SCAN_NULL) {
- Key.UnicodeChar = 0;
- EfiKeyFiFoInsertOneKey (TerminalDevice, &Key);
- TerminalDevice->InputState = INPUT_STATE_DEFAULT;
- UnicodeToEfiKeyFlushState (TerminalDevice);
- continue;
- }
+ if ((TerminalDevice->TerminalType == TerminalTypeXtermR6) ||
+ (TerminalDevice->TerminalType == TerminalTypeVt400) ||
+ (TerminalDevice->TerminalType == TerminalTypeLinux))
+ {
+ switch (UnicodeChar) {
+ case '1':
+ if (TerminalDevice->TerminalType == TerminalTypeVt400) {
+ Key.ScanCode = SCAN_F1;
+ }
- UnicodeToEfiKeyFlushState (TerminalDevice);
+ break;
+ case '2':
+ if (TerminalDevice->TerminalType == TerminalTypeVt400) {
+ Key.ScanCode = SCAN_F2;
+ }
- break;
+ break;
+ case '3':
+ if (TerminalDevice->TerminalType == TerminalTypeVt400) {
+ Key.ScanCode = SCAN_F3;
+ }
- case INPUT_STATE_ESC | INPUT_STATE_LEFTOPENBRACKET | INPUT_STATE_LEFTOPENBRACKET_2ND:
+ break;
+ case '4':
+ if (TerminalDevice->TerminalType == TerminalTypeVt400) {
+ Key.ScanCode = SCAN_F4;
+ }
- TerminalDevice->InputState = INPUT_STATE_DEFAULT;
- Key.ScanCode = SCAN_NULL;
+ break;
+ case '5':
+ if ((TerminalDevice->TerminalType == TerminalTypeXtermR6) ||
+ (TerminalDevice->TerminalType == TerminalTypeVt400))
+ {
+ Key.ScanCode = SCAN_F5;
+ }
- if (TerminalDevice->TerminalType == TerminalTypeLinux) {
- switch (UnicodeChar) {
- case 'A':
- Key.ScanCode = SCAN_F1;
- break;
- case 'B':
- Key.ScanCode = SCAN_F2;
- break;
- case 'C':
- Key.ScanCode = SCAN_F3;
- break;
- case 'D':
- Key.ScanCode = SCAN_F4;
- break;
- case 'E':
- Key.ScanCode = SCAN_F5;
- break;
+ break;
+ case '7':
+ Key.ScanCode = SCAN_F6;
+ break;
+ case '8':
+ Key.ScanCode = SCAN_F7;
+ break;
+ case '9':
+ Key.ScanCode = SCAN_F8;
+ break;
+ }
}
- }
- if (Key.ScanCode != SCAN_NULL) {
- Key.UnicodeChar = 0;
- EfiKeyFiFoInsertOneKey (TerminalDevice, &Key);
+ if (Key.ScanCode != SCAN_NULL) {
+ Key.UnicodeChar = 0;
+ EfiKeyFiFoInsertOneKey (TerminalDevice, &Key);
+ TerminalDevice->InputState = INPUT_STATE_DEFAULT;
+ UnicodeToEfiKeyFlushState (TerminalDevice);
+ continue;
+ }
+
+ UnicodeToEfiKeyFlushState (TerminalDevice);
+
+ break;
+
+ case INPUT_STATE_ESC | INPUT_STATE_LEFTOPENBRACKET | INPUT_STATE_2:
+
TerminalDevice->InputState = INPUT_STATE_DEFAULT;
+ Key.ScanCode = SCAN_NULL;
+ if ((TerminalDevice->TerminalType == TerminalTypeXtermR6) ||
+ (TerminalDevice->TerminalType == TerminalTypeVt400) ||
+ (TerminalDevice->TerminalType == TerminalTypeLinux))
+ {
+ switch (UnicodeChar) {
+ case '0':
+ Key.ScanCode = SCAN_F9;
+ break;
+ case '1':
+ Key.ScanCode = SCAN_F10;
+ break;
+ case '3':
+ Key.ScanCode = SCAN_F11;
+ break;
+ case '4':
+ Key.ScanCode = SCAN_F12;
+ break;
+ }
+ }
+
+ if (Key.ScanCode != SCAN_NULL) {
+ Key.UnicodeChar = 0;
+ EfiKeyFiFoInsertOneKey (TerminalDevice, &Key);
+ TerminalDevice->InputState = INPUT_STATE_DEFAULT;
+ UnicodeToEfiKeyFlushState (TerminalDevice);
+ continue;
+ }
+
UnicodeToEfiKeyFlushState (TerminalDevice);
- continue;
- }
- UnicodeToEfiKeyFlushState (TerminalDevice);
+ break;
- break;
+ case INPUT_STATE_ESC | INPUT_STATE_LEFTOPENBRACKET | INPUT_STATE_LEFTOPENBRACKET_2ND:
- case INPUT_STATE_ESC | INPUT_STATE_LEFTOPENBRACKET | INPUT_STATE_LEFTOPENBRACKET_TTY:
- /*
- * Here we handle the VT220 escape codes that we accept. This
- * state is only used by the TTY terminal type.
- */
- Key.ScanCode = SCAN_NULL;
- if (TerminalDevice->TerminalType == TerminalTypeTtyTerm) {
+ TerminalDevice->InputState = INPUT_STATE_DEFAULT;
+ Key.ScanCode = SCAN_NULL;
- if (UnicodeChar == '~' && TerminalDevice->TtyEscapeIndex <= 2) {
- UINT16 EscCode;
- TerminalDevice->TtyEscapeStr[TerminalDevice->TtyEscapeIndex] = 0; /* Terminate string */
- EscCode = (UINT16) StrDecimalToUintn(TerminalDevice->TtyEscapeStr);
- switch (EscCode) {
- case 2:
- Key.ScanCode = SCAN_INSERT;
+ if (TerminalDevice->TerminalType == TerminalTypeLinux) {
+ switch (UnicodeChar) {
+ case 'A':
+ Key.ScanCode = SCAN_F1;
break;
- case 3:
- Key.ScanCode = SCAN_DELETE;
+ case 'B':
+ Key.ScanCode = SCAN_F2;
break;
- case 5:
- Key.ScanCode = SCAN_PAGE_UP;
+ case 'C':
+ Key.ScanCode = SCAN_F3;
break;
- case 6:
- Key.ScanCode = SCAN_PAGE_DOWN;
+ case 'D':
+ Key.ScanCode = SCAN_F4;
+ break;
+ case 'E':
+ Key.ScanCode = SCAN_F5;
break;
- case 11:
- case 12:
- case 13:
- case 14:
- case 15:
- Key.ScanCode = SCAN_F1 + EscCode - 11;
- break;
- case 17:
- case 18:
- case 19:
- case 20:
- case 21:
- Key.ScanCode = SCAN_F6 + EscCode - 17;
- break;
- case 23:
- case 24:
- Key.ScanCode = SCAN_F11 + EscCode - 23;
- break;
- default:
- break;
}
- } else if (TerminalDevice->TtyEscapeIndex == 1){
- /* 2 character escape code */
- TerminalDevice->TtyEscapeStr[TerminalDevice->TtyEscapeIndex++] = UnicodeChar;
- continue;
}
- else {
- DEBUG ((DEBUG_ERROR, "Unexpected state in escape2\n"));
+
+ if (Key.ScanCode != SCAN_NULL) {
+ Key.UnicodeChar = 0;
+ EfiKeyFiFoInsertOneKey (TerminalDevice, &Key);
+ TerminalDevice->InputState = INPUT_STATE_DEFAULT;
+ UnicodeToEfiKeyFlushState (TerminalDevice);
+ continue;
}
- }
- TerminalDevice->ResetState = RESET_STATE_DEFAULT;
- if (Key.ScanCode != SCAN_NULL) {
- Key.UnicodeChar = 0;
- EfiKeyFiFoInsertOneKey (TerminalDevice, &Key);
- TerminalDevice->InputState = INPUT_STATE_DEFAULT;
UnicodeToEfiKeyFlushState (TerminalDevice);
- continue;
- }
- UnicodeToEfiKeyFlushState (TerminalDevice);
- break;
+ break;
- default:
- //
- // Invalid state. This should never happen.
- //
- ASSERT (FALSE);
+ case INPUT_STATE_ESC | INPUT_STATE_LEFTOPENBRACKET | INPUT_STATE_LEFTOPENBRACKET_TTY:
+ /*
+ * Here we handle the VT220 escape codes that we accept. This
+ * state is only used by the TTY terminal type.
+ */
+ Key.ScanCode = SCAN_NULL;
+ if (TerminalDevice->TerminalType == TerminalTypeTtyTerm) {
+ if ((UnicodeChar == '~') && (TerminalDevice->TtyEscapeIndex <= 2)) {
+ UINT16 EscCode;
+ TerminalDevice->TtyEscapeStr[TerminalDevice->TtyEscapeIndex] = 0; /* Terminate string */
+ EscCode = (UINT16)StrDecimalToUintn (TerminalDevice->TtyEscapeStr);
+ switch (EscCode) {
+ case 2:
+ Key.ScanCode = SCAN_INSERT;
+ break;
+ case 3:
+ Key.ScanCode = SCAN_DELETE;
+ break;
+ case 5:
+ Key.ScanCode = SCAN_PAGE_UP;
+ break;
+ case 6:
+ Key.ScanCode = SCAN_PAGE_DOWN;
+ break;
+ case 11:
+ case 12:
+ case 13:
+ case 14:
+ case 15:
+ Key.ScanCode = SCAN_F1 + EscCode - 11;
+ break;
+ case 17:
+ case 18:
+ case 19:
+ case 20:
+ case 21:
+ Key.ScanCode = SCAN_F6 + EscCode - 17;
+ break;
+ case 23:
+ case 24:
+ Key.ScanCode = SCAN_F11 + EscCode - 23;
+ break;
+ default:
+ break;
+ }
+ } else if (TerminalDevice->TtyEscapeIndex == 1) {
+ /* 2 character escape code */
+ TerminalDevice->TtyEscapeStr[TerminalDevice->TtyEscapeIndex++] = UnicodeChar;
+ continue;
+ } else {
+ DEBUG ((DEBUG_ERROR, "Unexpected state in escape2\n"));
+ }
+ }
- UnicodeToEfiKeyFlushState (TerminalDevice);
+ TerminalDevice->ResetState = RESET_STATE_DEFAULT;
- break;
+ if (Key.ScanCode != SCAN_NULL) {
+ Key.UnicodeChar = 0;
+ EfiKeyFiFoInsertOneKey (TerminalDevice, &Key);
+ TerminalDevice->InputState = INPUT_STATE_DEFAULT;
+ UnicodeToEfiKeyFlushState (TerminalDevice);
+ continue;
+ }
+
+ UnicodeToEfiKeyFlushState (TerminalDevice);
+ break;
+
+ default:
+ //
+ // Invalid state. This should never happen.
+ //
+ ASSERT (FALSE);
+
+ UnicodeToEfiKeyFlushState (TerminalDevice);
+
+ break;
}
if (UnicodeChar == ESC) {
@@ -2061,7 +2091,7 @@ UnicodeToEfiKey (
}
if (TerminalDevice->InputState != INPUT_STATE_DEFAULT) {
- Status = gBS->SetTimer(
+ Status = gBS->SetTimer (
TerminalDevice->TwoSecondTimeOut,
TimerRelative,
(UINT64)20000000
@@ -2078,8 +2108,7 @@ UnicodeToEfiKey (
if (TerminalDevice->TerminalType == TerminalTypeTtyTerm) {
Key.ScanCode = SCAN_NULL;
Key.UnicodeChar = CHAR_BACKSPACE;
- }
- else {
+ } else {
Key.ScanCode = SCAN_DELETE;
Key.UnicodeChar = 0;
}