reactos/boot/environ/lib/io/display/textcons.c
Pierre Schweitzer 321bcc056d Create the AHCI branch for Aman's work
svn path=/branches/GSoC_2016/AHCI/; revision=71203
2016-04-24 20:17:09 +00:00

270 lines
No EOL
6 KiB
C

/*
* COPYRIGHT: See COPYING.ARM in the top level directory
* PROJECT: ReactOS UEFI Boot Library
* FILE: boot/environ/lib/io/display/textcons.c
* PURPOSE: Boot Library Text Console Routines
* PROGRAMMER: Alex Ionescu (alex.ionescu@reactos.org)
*/
/* INCLUDES ******************************************************************/
#include "bl.h"
/* DATA VARIABLES ************************************************************/
BL_TEXT_CONSOLE_VTABLE ConsoleTextLocalVtbl =
{
ConsoleTextLocalDestruct,
ConsoleTextLocalReinitialize,
ConsoleTextBaseGetTextState,
ConsoleTextLocalSetTextState,
ConsoleTextBaseGetTextResolution,
ConsoleTextLocalSetTextResolution,
ConsoleTextLocalClearText,
ConsoleTextLocalWriteText
};
/* FUNCTIONS *****************************************************************/
VOID
ConsoleTextLocalDestruct (
_In_ struct _BL_TEXT_CONSOLE* Console
)
{
}
NTSTATUS
ConsoleTextLocalReinitialize (
_In_ struct _BL_TEXT_CONSOLE* Console
)
{
EfiPrintf(L"Not active yet!\r\n");
return STATUS_NOT_IMPLEMENTED;
}
NTSTATUS
ConsoleTextBaseGetTextState (
_In_ struct _BL_TEXT_CONSOLE* Console,
_Out_ PBL_DISPLAY_STATE TextState
)
{
return STATUS_NOT_IMPLEMENTED;
}
NTSTATUS
ConsoleTextLocalSetTextState (
_In_ struct _BL_TEXT_CONSOLE* Console,
_In_ ULONG Mask,
_In_ PBL_DISPLAY_STATE TextState
)
{
return ConsoleFirmwareTextSetState(Console, Mask, TextState);
}
NTSTATUS
ConsoleTextBaseGetTextResolution (
_In_ struct _BL_TEXT_CONSOLE* Console,
_Out_ PULONG TextResolution
)
{
return STATUS_NOT_IMPLEMENTED;
}
NTSTATUS
ConsoleTextLocalSetTextResolution (
_In_ struct _BL_TEXT_CONSOLE* Console,
_In_ ULONG NewTextResolution,
_Out_ PULONG OldTextResolution
)
{
return STATUS_NOT_IMPLEMENTED;
}
NTSTATUS
ConsoleTextLocalClearText (
_In_ struct _BL_TEXT_CONSOLE* Console,
_In_ BOOLEAN LineOnly
)
{
return ConsoleFirmwareTextClear(Console, LineOnly);
}
NTSTATUS
ConsoleTextLocalWriteText (
_In_ struct _BL_TEXT_CONSOLE* Console,
_In_ PCHAR Text,
_In_ ULONG Attribute
)
{
return STATUS_NOT_IMPLEMENTED;
}
NTSTATUS
ConsoleTextLocalConstruct (
_In_ PBL_TEXT_CONSOLE TextConsole,
_In_ BOOLEAN Activate
)
{
NTSTATUS Status;
BL_DISPLAY_STATE TextState;
/* Set our callbacks */
TextConsole->Callbacks = &ConsoleTextLocalVtbl;
/* Are we activating this console? */
if (Activate)
{
/* Call firmware to activate it */
Status = ConsoleFirmwareTextOpen(TextConsole);
if (!NT_SUCCESS(Status))
{
EfiPrintf(L"Failed to activate console: %lx\r\n", Status);
return Status;
}
}
/* Set default text state */
TextState.BgColor = 0;
TextState.XPos = 0;
TextState.YPos = 0;
TextState.CursorVisible = FALSE;
TextState.FgColor = White;
/* Are we activating? */
if (Activate)
{
/* Call firmware to set it */
Status = ConsoleFirmwareTextSetState(TextConsole, 0xF, &TextState);
if (!NT_SUCCESS(Status))
{
/* We failed, back down */
EfiPrintf(L"Failed to set console state: %lx\r\n", Status);
ConsoleFirmwareTextClose(TextConsole);
return Status;
}
}
else
{
/* Just save the state for now, someone else can activate later */
TextConsole->State = TextState;
}
/* Remember if we activated it */
TextConsole->Active = Activate;
return STATUS_SUCCESS;
}
BOOLEAN
ConsolepFindResolution (
_In_ PBL_DISPLAY_MODE Mode,
_In_ PBL_DISPLAY_MODE List,
_In_ ULONG MaxIndex
)
{
PBL_DISPLAY_MODE ListEnd;
/* Loop until we hit the maximum supported list index */
ListEnd = &List[MaxIndex];
while (List != ListEnd)
{
/* Does this resolution match? */
if ((Mode->HRes == List->HRes) && (Mode->VRes == List->VRes))
{
/* Yep -- we got a match */
return TRUE;
}
/* Try another one*/
List++;
}
/* No matches were found */
return FALSE;
}
BL_INPUT_CONSOLE_VTABLE ConsoleInputLocalVtbl =
{
(PCONSOLE_DESTRUCT)ConsoleInputLocalDestruct,
(PCONSOLE_REINITIALIZE)ConsoleInputBaseReinitialize,
};
VOID
ConsoleInputLocalDestruct (
_In_ PBL_INPUT_CONSOLE Console
)
{
/* Erase the current input buffer, and tear down the console */
ConsoleInputLocalEraseBuffer(Console, NULL);
BlMmFreeHeap(Console->Buffer);
}
NTSTATUS
ConsoleInputBaseConstruct (
_In_ PBL_INPUT_CONSOLE Console
)
{
PULONG Buffer;
/* Allocate a new 512 byte buffer */
Buffer = BlMmAllocateHeap(512);
Console->Buffer = Buffer;
if (!Buffer)
{
return STATUS_INSUFFICIENT_RESOURCES;
}
/* Set the current buffer pointers to it */
Console->DataStart = Buffer;
Console->DataEnd = Buffer;
/* Set the end 128 data entries into the buffer */
Console->EndBuffer = Buffer + 128;
return STATUS_SUCCESS;
}
NTSTATUS
ConsoleInputBaseReinitialize (
_In_ PBL_INPUT_CONSOLE Console
)
{
PULONG Buffer;
/* Reset all the buffer pointers to the current buffer */
Buffer = Console->Buffer;
Console->DataStart = Buffer;
Console->DataEnd = Buffer;
Console->EndBuffer = Buffer + 128;
return STATUS_SUCCESS;
}
NTSTATUS
ConsoleCreateLocalInputConsole (
VOID
)
{
PBL_INPUT_CONSOLE InputConsole;
NTSTATUS Status;
/* Allocate the input console */
InputConsole = BlMmAllocateHeap(sizeof(*InputConsole));
if (!InputConsole)
{
return STATUS_INSUFFICIENT_RESOURCES;
}
/* Construct it */
Status = ConsoleInputBaseConstruct(InputConsole);
if (!NT_SUCCESS(Status));
{
/* Tear down on failure */
BlMmFreeHeap(InputConsole);
return Status;
}
/* Set the callback table, and set us as the local input console */
InputConsole->Callbacks = &ConsoleInputLocalVtbl;
DspLocalInputConsole = InputConsole;
return STATUS_SUCCESS;
}