summaryrefslogtreecommitdiff
path: root/UnixPkg/UnixUgaDxe
diff options
context:
space:
mode:
authorandrewfish <andrewfish@6f19259b-4bc3-4df7-8a09-765794883524>2010-11-30 23:38:40 +0000
committerandrewfish <andrewfish@6f19259b-4bc3-4df7-8a09-765794883524>2010-11-30 23:38:40 +0000
commit2ff79f2eda16f8219140d3dae188d2b341f610e1 (patch)
tree693b0c0223c7f3a312f292a3a5ba9eff0def4dbe /UnixPkg/UnixUgaDxe
parente23a349aaec2ba7fd4218c6dabaf42da0aa9aa8e (diff)
downloadedk2-2ff79f2eda16f8219140d3dae188d2b341f610e1.zip
edk2-2ff79f2eda16f8219140d3dae188d2b341f610e1.tar.gz
edk2-2ff79f2eda16f8219140d3dae188d2b341f610e1.tar.bz2
Adding Simple Pointer, GOP, SimpleTextInEx, and Networking protocols to the emulator. Cleaned up POSIX include situation by centralizing it in a single file, like NT32. Fixed TPL issue with TPL High not being emulated correctly, it was possible to take a timer tick when the locks in the DXE core should have prevented this. Remove some unused files to make things easier to maintain.
git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@11105 6f19259b-4bc3-4df7-8a09-765794883524
Diffstat (limited to 'UnixPkg/UnixUgaDxe')
-rw-r--r--UnixPkg/UnixUgaDxe/UnixUga.h28
-rw-r--r--UnixPkg/UnixUgaDxe/UnixUga.inf1
-rw-r--r--UnixPkg/UnixUgaDxe/UnixUgaDriver.c4
-rw-r--r--UnixPkg/UnixUgaDxe/UnixUgaInput.c209
-rw-r--r--UnixPkg/UnixUgaDxe/UnixUgaScreen.c2
5 files changed, 239 insertions, 5 deletions
diff --git a/UnixPkg/UnixUgaDxe/UnixUga.h b/UnixPkg/UnixUgaDxe/UnixUga.h
index b6d2a30..e1e61f7 100644
--- a/UnixPkg/UnixUgaDxe/UnixUga.h
+++ b/UnixPkg/UnixUgaDxe/UnixUga.h
@@ -25,6 +25,7 @@ Abstract:
#include "PiDxe.h"
#include <Guid/EventGroup.h>
#include <Protocol/SimpleTextIn.h>
+#include <Protocol/SimplePointer.h>
#include <Protocol/UgaDraw.h>
#include "Protocol/UnixUgaIo.h"
#include <Library/DebugLib.h>
@@ -48,6 +49,7 @@ typedef struct {
EFI_HANDLE Handle;
EFI_UGA_DRAW_PROTOCOL UgaDraw;
EFI_SIMPLE_TEXT_INPUT_PROTOCOL SimpleTextIn;
+ EFI_SIMPLE_POINTER_PROTOCOL SimplePointer;
EFI_UNIX_THUNK_PROTOCOL *UnixThunk;
@@ -61,6 +63,8 @@ typedef struct {
UINT32 ColorDepth;
UINT32 RefreshRate;
+ EFI_SIMPLE_POINTER_MODE PointerMode;
+
//
// UGA Private Data knowing when to start hardware
//
@@ -78,6 +82,9 @@ typedef struct {
#define UGA_PRIVATE_DATA_FROM_TEXT_IN_THIS(a) \
CR(a, UGA_PRIVATE_DATA, SimpleTextIn, UGA_PRIVATE_DATA_SIGNATURE)
+#define UGA_PRIVATE_DATA_FROM_POINTER_THIS(a) \
+ CR(a, UGA_PRIVATE_DATA, SimplePointer, UGA_PRIVATE_DATA_SIGNATURE)
+
//
// Global Protocol Variables
//
@@ -301,4 +308,25 @@ Returns:
--*/
;
+
+EFI_STATUS
+UnixUgaInitializeSimplePointerForWindow (
+ IN UGA_PRIVATE_DATA *Private
+ )
+/*++
+
+Routine Description:
+
+ TODO: Add function description
+
+Arguments:
+
+ Private - TODO: add argument description
+
+Returns:
+
+ TODO: add return values
+
+--*/
+;
#endif
diff --git a/UnixPkg/UnixUgaDxe/UnixUga.inf b/UnixPkg/UnixUgaDxe/UnixUga.inf
index 707b64c..5cba658 100644
--- a/UnixPkg/UnixUgaDxe/UnixUga.inf
+++ b/UnixPkg/UnixUgaDxe/UnixUga.inf
@@ -66,6 +66,7 @@
[Protocols]
gEfiSimpleTextInProtocolGuid # PROTOCOL BY_START
+ gEfiSimplePointerProtocolGuid # PROTOCOL BY_START
gEfiUnixUgaIoProtocolGuid # PROTOCOL BY_START
gEfiUgaDrawProtocolGuid # PROTOCOL BY_START
gEfiUnixIoProtocolGuid # PROTOCOL TO_START
diff --git a/UnixPkg/UnixUgaDxe/UnixUgaDriver.c b/UnixPkg/UnixUgaDxe/UnixUgaDriver.c
index 4d3148b..99aa115 100644
--- a/UnixPkg/UnixUgaDxe/UnixUgaDriver.c
+++ b/UnixPkg/UnixUgaDxe/UnixUgaDriver.c
@@ -177,6 +177,8 @@ Returns:
&Private->UgaDraw,
&gEfiSimpleTextInProtocolGuid,
&Private->SimpleTextIn,
+ &gEfiSimplePointerProtocolGuid,
+ &Private->SimplePointer,
NULL
);
@@ -264,6 +266,8 @@ Returns:
&Private->UgaDraw,
&gEfiSimpleTextInProtocolGuid,
&Private->SimpleTextIn,
+ &gEfiSimplePointerProtocolGuid,
+ &Private->SimplePointer,
NULL
);
if (!EFI_ERROR (Status)) {
diff --git a/UnixPkg/UnixUgaDxe/UnixUgaInput.c b/UnixPkg/UnixUgaDxe/UnixUgaInput.c
index f37c086..4415e04 100644
--- a/UnixPkg/UnixUgaDxe/UnixUgaInput.c
+++ b/UnixPkg/UnixUgaDxe/UnixUgaInput.c
@@ -1,6 +1,7 @@
/*++
Copyright (c) 2006, Intel Corporation. All rights reserved.<BR>
+Portions copyright (c) 2010, Apple, Inc. All rights reserved.
This program and the accompanying materials
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
@@ -57,7 +58,7 @@ Returns:
--*/
{
UGA_PRIVATE_DATA *Private;
- EFI_INPUT_KEY Key;
+ EFI_KEY_DATA Key;
EFI_TPL OldTpl;
Private = UGA_PRIVATE_DATA_FROM_TEXT_IN_THIS (This);
@@ -73,7 +74,7 @@ Returns:
//
// A reset is draining the Queue
//
- while (Private->UgaIo->UgaGetKey(Private->UgaIo, &Key) == EFI_SUCCESS)
+ while (Private->UgaIo->UgaGetKey (Private->UgaIo, &Key) == EFI_SUCCESS)
;
//
@@ -87,7 +88,7 @@ EFI_STATUS
EFIAPI
UnixUgaSimpleTextInReadKeyStroke (
IN EFI_SIMPLE_TEXT_INPUT_PROTOCOL *This,
- OUT EFI_INPUT_KEY *Key
+ OUT EFI_INPUT_KEY *Key
)
/*++
@@ -109,7 +110,8 @@ Returns:
UGA_PRIVATE_DATA *Private;
EFI_STATUS Status;
EFI_TPL OldTpl;
-
+ EFI_KEY_DATA KeyData;
+
Private = UGA_PRIVATE_DATA_FROM_TEXT_IN_THIS (This);
if (Private->UgaIo == NULL) {
return EFI_NOT_READY;
@@ -120,7 +122,9 @@ Returns:
//
OldTpl = gBS->RaiseTPL (TPL_NOTIFY);
- Status = Private->UgaIo->UgaGetKey(Private->UgaIo, Key);
+ Status = Private->UgaIo->UgaGetKey(Private->UgaIo, &KeyData);
+ CopyMem (Key, &KeyData, sizeof (EFI_INPUT_KEY));
+
//
// Leave critical section and return
//
@@ -179,6 +183,156 @@ Returns:
gBS->RestoreTPL (OldTpl);
}
+//
+// Simple Pointer implementation.
+//
+
+EFI_STATUS
+EFIAPI
+UnixUgaSimplePointerReset (
+ IN EFI_SIMPLE_POINTER_PROTOCOL *This,
+ IN BOOLEAN ExtendedVerification
+ )
+/*++
+
+Routine Description:
+
+ TODO: Add function description
+
+Arguments:
+
+ This - TODO: add argument description
+ ExtendedVerification - TODO: add argument description
+
+Returns:
+
+ EFI_SUCCESS - TODO: Add description for return value
+
+--*/
+{
+ UGA_PRIVATE_DATA *Private;
+ EFI_SIMPLE_POINTER_STATE State;
+ EFI_TPL OldTpl;
+
+ Private = UGA_PRIVATE_DATA_FROM_POINTER_THIS (This);
+ if (Private->UgaIo == NULL) {
+ return EFI_SUCCESS;
+ }
+
+ //
+ // Enter critical section
+ //
+ OldTpl = gBS->RaiseTPL (TPL_NOTIFY);
+
+ //
+ // A reset is draining the Queue
+ //
+ while (Private->UgaIo->UgaGetPointerState(Private->UgaIo, &State) == EFI_SUCCESS)
+ ;
+
+ //
+ // Leave critical section and return
+ //
+ gBS->RestoreTPL (OldTpl);
+ return EFI_SUCCESS;
+}
+
+EFI_STATUS
+EFIAPI
+UnixUgaSimplePointerGetState (
+ IN EFI_SIMPLE_POINTER_PROTOCOL *This,
+ IN OUT EFI_SIMPLE_POINTER_STATE *State
+ )
+/*++
+
+Routine Description:
+
+ TODO: Add function description
+
+Arguments:
+
+ This - TODO: add argument description
+ Key - TODO: add argument description
+
+Returns:
+
+ TODO: add return values
+
+--*/
+{
+ UGA_PRIVATE_DATA *Private;
+ EFI_STATUS Status;
+ EFI_TPL OldTpl;
+
+ Private = UGA_PRIVATE_DATA_FROM_POINTER_THIS (This);
+ if (Private->UgaIo == NULL) {
+ return EFI_NOT_READY;
+ }
+
+ //
+ // Enter critical section
+ //
+ OldTpl = gBS->RaiseTPL (TPL_NOTIFY);
+
+ Status = Private->UgaIo->UgaGetPointerState(Private->UgaIo, State);
+ //
+ // Leave critical section and return
+ //
+ gBS->RestoreTPL (OldTpl);
+
+ return Status;
+}
+
+VOID
+EFIAPI
+UnixUgaSimplePointerWaitForInput (
+ IN EFI_EVENT Event,
+ IN VOID *Context
+ )
+/*++
+
+Routine Description:
+
+ TODO: Add function description
+
+Arguments:
+
+ Event - TODO: add argument description
+ Context - TODO: add argument description
+
+Returns:
+
+ TODO: add return values
+
+--*/
+{
+ UGA_PRIVATE_DATA *Private;
+ EFI_STATUS Status;
+ EFI_TPL OldTpl;
+
+ Private = (UGA_PRIVATE_DATA *) Context;
+ if (Private->UgaIo == NULL) {
+ return;
+ }
+
+ //
+ // Enter critical section
+ //
+ OldTpl = gBS->RaiseTPL (TPL_NOTIFY);
+
+ Status = Private->UgaIo->UgaCheckPointer(Private->UgaIo);
+ if (!EFI_ERROR (Status)) {
+ //
+ // If the pointer state has changed, signal our event.
+ //
+ gBS->SignalEvent (Event);
+ }
+ //
+ // Leave critical section and return
+ //
+ gBS->RestoreTPL (OldTpl);
+}
+
EFI_STATUS
UnixUgaInitializeSimpleTextInForWindow (
IN UGA_PRIVATE_DATA *Private
@@ -217,3 +371,48 @@ Returns:
return Status;
}
+
+EFI_STATUS
+UnixUgaInitializeSimplePointerForWindow (
+ IN UGA_PRIVATE_DATA *Private
+ )
+/*++
+
+Routine Description:
+
+ TODO: Add function description
+
+Arguments:
+
+ Private - TODO: add argument description
+
+Returns:
+
+ TODO: add return values
+
+--*/
+{
+ EFI_STATUS Status;
+
+ //
+ // Initialize Simple Pointer protoocol
+ //
+ Private->PointerMode.ResolutionX = 1;
+ Private->PointerMode.ResolutionY = 1;
+ Private->PointerMode.LeftButton = TRUE;
+ Private->PointerMode.RightButton = TRUE;
+
+ Private->SimplePointer.Reset = UnixUgaSimplePointerReset;
+ Private->SimplePointer.GetState = UnixUgaSimplePointerGetState;
+ Private->SimplePointer.Mode = &Private->PointerMode;
+
+ Status = gBS->CreateEvent (
+ EVT_NOTIFY_WAIT,
+ TPL_NOTIFY,
+ UnixUgaSimplePointerWaitForInput,
+ Private,
+ &Private->SimplePointer.WaitForInput
+ );
+
+ return Status;
+}
diff --git a/UnixPkg/UnixUgaDxe/UnixUgaScreen.c b/UnixPkg/UnixUgaDxe/UnixUgaScreen.c
index 45e84b0..470a788 100644
--- a/UnixPkg/UnixUgaDxe/UnixUgaScreen.c
+++ b/UnixPkg/UnixUgaDxe/UnixUgaScreen.c
@@ -394,6 +394,8 @@ Returns:
UnixUgaInitializeSimpleTextInForWindow (Private);
+ UnixUgaInitializeSimplePointerForWindow (Private);
+
return EFI_SUCCESS;
}