vgaclass.c
来自「EFI BIOS是Intel提出的下一代的BIOS标准。这里上传的Edk源代码是」· C语言 代码 · 共 1,318 行 · 第 1/2 页
C
1,318 行
VgaClassOutputString (
IN EFI_SIMPLE_TEXT_OUT_PROTOCOL *This,
IN CHAR16 *WString
)
/*++
Routine Description:
GC_TODO: Add function description
Arguments:
This - GC_TODO: add argument description
WString - GC_TODO: add argument description
Returns:
EFI_SUCCESS - GC_TODO: Add description for return value
--*/
{
EFI_STATUS Status;
VGA_CLASS_DEV *VgaClassDev;
EFI_SIMPLE_TEXT_OUTPUT_MODE *Mode;
UINTN MaxColumn;
UINTN MaxRow;
CHAR16 *SavedWString;
UINT32 VideoChar;
CHAR8 GraphicChar;
VgaClassDev = VGA_CLASS_DEV_FROM_THIS (This);
Mode = This->Mode;
Status = This->QueryMode (
This,
Mode->Mode,
&MaxColumn,
&MaxRow
);
if (EFI_ERROR (Status)) {
return Status;
}
SavedWString = WString;
for (; *WString != CHAR_NULL; WString++) {
switch (*WString) {
case CHAR_BACKSPACE:
if (Mode->CursorColumn > 0) {
Mode->CursorColumn--;
}
break;
case CHAR_LINEFEED:
if (Mode->CursorRow == (INT32) (MaxRow - 1)) {
//
// Scroll the screen by copying the contents
// of the VGA display up one line
//
VgaClassDev->PciIo->CopyMem (
VgaClassDev->PciIo,
EfiPciIoWidthUint32,
VgaClassDev->VgaMiniPort->VgaMemoryBar,
VgaClassDev->VgaMiniPort->VgaMemoryOffset,
VgaClassDev->VgaMiniPort->VgaMemoryBar,
VgaClassDev->VgaMiniPort->VgaMemoryOffset + MaxColumn * 2,
((MaxRow - 1) * MaxColumn) >> 1
);
//
// Print Blank Line of spaces with the current color attributes
//
VideoChar = (Mode->Attribute << 8) | ' ';
VideoChar = (VideoChar << 16) | VideoChar;
VgaClassDev->PciIo->Mem.Write (
VgaClassDev->PciIo,
EfiPciIoWidthFillUint32,
VgaClassDev->VgaMiniPort->VgaMemoryBar,
VgaClassDev->VgaMiniPort->VgaMemoryOffset + (MaxRow - 1) * MaxColumn * 2,
MaxColumn >> 1,
&VideoChar
);
}
if (Mode->CursorRow < (INT32) (MaxRow - 1)) {
Mode->CursorRow++;
}
break;
case CHAR_CARRIAGE_RETURN:
Mode->CursorColumn = 0;
break;
default:
if (!LibIsValidTextGraphics (*WString, &GraphicChar, NULL)) {
//
// Just convert to ASCII
//
GraphicChar = (CHAR8) *WString;
if (!IsValidAscii (GraphicChar)) {
//
// Keep the API from supporting PCANSI Graphics chars
//
GraphicChar = '?';
}
}
VideoChar = (Mode->Attribute << 8) | GraphicChar;
VgaClassDev->PciIo->Mem.Write (
VgaClassDev->PciIo,
EfiPciIoWidthUint16,
VgaClassDev->VgaMiniPort->VgaMemoryBar,
VgaClassDev->VgaMiniPort->VgaMemoryOffset + ((Mode->CursorRow * MaxColumn + Mode->CursorColumn) * 2),
1,
&VideoChar
);
if (Mode->CursorColumn >= (INT32) (MaxColumn - 1)) {
This->OutputString (This, CrLfString);
} else {
Mode->CursorColumn++;
}
break;
}
}
SetVideoCursorPosition (
VgaClassDev,
(UINTN) Mode->CursorColumn,
(UINTN) Mode->CursorRow,
MaxColumn
);
return EFI_SUCCESS;
}
EFI_STATUS
EFIAPI
VgaClassTestString (
IN EFI_SIMPLE_TEXT_OUT_PROTOCOL *This,
IN CHAR16 *WString
)
/*++
Routine Description:
GC_TODO: Add function description
Arguments:
This - GC_TODO: add argument description
WString - GC_TODO: add argument description
Returns:
EFI_UNSUPPORTED - GC_TODO: Add description for return value
EFI_SUCCESS - GC_TODO: Add description for return value
--*/
{
while (*WString != 0x0000) {
if (!(IsValidAscii (*WString) || IsValidEfiCntlChar (*WString) || LibIsValidTextGraphics (*WString, NULL, NULL))) {
return EFI_UNSUPPORTED;
}
WString++;
}
return EFI_SUCCESS;
}
EFI_STATUS
EFIAPI
VgaClassClearScreen (
IN EFI_SIMPLE_TEXT_OUT_PROTOCOL *This
)
/*++
Routine Description:
GC_TODO: Add function description
Arguments:
This - GC_TODO: add argument description
Returns:
EFI_SUCCESS - GC_TODO: Add description for return value
--*/
{
EFI_STATUS Status;
VGA_CLASS_DEV *VgaClassDev;
UINTN MaxRow;
UINTN MaxColumn;
UINT32 VideoChar;
VgaClassDev = VGA_CLASS_DEV_FROM_THIS (This);
Status = This->QueryMode (
This,
This->Mode->Mode,
&MaxColumn,
&MaxRow
);
if (EFI_ERROR (Status)) {
return Status;
}
VideoChar = (This->Mode->Attribute << 8) | ' ';
VideoChar = (VideoChar << 16) | VideoChar;
VgaClassDev->PciIo->Mem.Write (
VgaClassDev->PciIo,
EfiPciIoWidthFillUint32,
VgaClassDev->VgaMiniPort->VgaMemoryBar,
VgaClassDev->VgaMiniPort->VgaMemoryOffset,
(MaxRow * MaxColumn) >> 1,
&VideoChar
);
This->SetCursorPosition (This, 0, 0);
return EFI_SUCCESS;
}
EFI_STATUS
EFIAPI
VgaClassSetAttribute (
IN EFI_SIMPLE_TEXT_OUT_PROTOCOL *This,
IN UINTN Attribute
)
/*++
Routine Description:
GC_TODO: Add function description
Arguments:
This - GC_TODO: add argument description
Attribute - GC_TODO: add argument description
Returns:
EFI_SUCCESS - GC_TODO: Add description for return value
EFI_UNSUPPORTED - GC_TODO: Add description for return value
--*/
{
if (Attribute >= 0 && Attribute <= EFI_MAX_ATTRIBUTE) {
This->Mode->Attribute = (INT32) Attribute;
return EFI_SUCCESS;
}
return EFI_UNSUPPORTED;
}
EFI_STATUS
EFIAPI
VgaClassSetCursorPosition (
IN EFI_SIMPLE_TEXT_OUT_PROTOCOL *This,
IN UINTN Column,
IN UINTN Row
)
/*++
Routine Description:
GC_TODO: Add function description
Arguments:
This - GC_TODO: add argument description
Column - GC_TODO: add argument description
Row - GC_TODO: add argument description
Returns:
EFI_UNSUPPORTED - GC_TODO: Add description for return value
EFI_SUCCESS - GC_TODO: Add description for return value
--*/
{
EFI_STATUS Status;
VGA_CLASS_DEV *VgaClassDev;
UINTN MaxColumn;
UINTN MaxRow;
VgaClassDev = VGA_CLASS_DEV_FROM_THIS (This);
Status = This->QueryMode (
This,
This->Mode->Mode,
&MaxColumn,
&MaxRow
);
if (EFI_ERROR (Status)) {
return Status;
}
if (Column >= MaxColumn || Row >= MaxRow) {
return EFI_UNSUPPORTED;
}
SetVideoCursorPosition (VgaClassDev, Column, Row, MaxColumn);
This->Mode->CursorColumn = (INT32) Column;
This->Mode->CursorRow = (INT32) Row;
return EFI_SUCCESS;
}
EFI_STATUS
EFIAPI
VgaClassEnableCursor (
IN EFI_SIMPLE_TEXT_OUT_PROTOCOL *This,
IN BOOLEAN Visible
)
/*++
Routine Description:
GC_TODO: Add function description
Arguments:
This - GC_TODO: add argument description
Visible - GC_TODO: add argument description
Returns:
EFI_SUCCESS - GC_TODO: Add description for return value
--*/
{
VGA_CLASS_DEV *VgaClassDev;
VgaClassDev = VGA_CLASS_DEV_FROM_THIS (This);
if (Visible) {
switch (This->Mode->Mode) {
case 1:
WriteCrtc (VgaClassDev, CRTC_CURSOR_START, 0x06);
WriteCrtc (VgaClassDev, CRTC_CURSOR_END, 0x07);
break;
default:
WriteCrtc (VgaClassDev, CRTC_CURSOR_START, 0x0e);
WriteCrtc (VgaClassDev, CRTC_CURSOR_END, 0x0f);
break;
}
} else {
WriteCrtc (VgaClassDev, CRTC_CURSOR_START, 0x20);
}
This->Mode->CursorVisible = Visible;
return EFI_SUCCESS;
}
EFI_STATUS
EFIAPI
VgaClassQueryMode (
IN EFI_SIMPLE_TEXT_OUT_PROTOCOL *This,
IN UINTN ModeNumber,
OUT UINTN *Columns,
OUT UINTN *Rows
)
/*++
Routine Description:
GC_TODO: Add function description
Arguments:
This - GC_TODO: add argument description
ModeNumber - GC_TODO: add argument description
Columns - GC_TODO: add argument description
Rows - GC_TODO: add argument description
Returns:
EFI_UNSUPPORTED - GC_TODO: Add description for return value
EFI_UNSUPPORTED - GC_TODO: Add description for return value
EFI_SUCCESS - GC_TODO: Add description for return value
--*/
{
VGA_CLASS_DEV *VgaClassDev;
VgaClassDev = VGA_CLASS_DEV_FROM_THIS (This);
if ((INT32) ModeNumber >= This->Mode->MaxMode) {
*Columns = 0;
*Rows = 0;
return EFI_UNSUPPORTED;
}
switch (ModeNumber) {
case 0:
*Columns = 80;
*Rows = 25;
break;
case 1:
*Columns = 80;
*Rows = 50;
break;
default:
*Columns = 0;
*Rows = 0;
return EFI_UNSUPPORTED;
}
return EFI_SUCCESS;
}
EFI_STATUS
EFIAPI
VgaClassSetMode (
IN EFI_SIMPLE_TEXT_OUT_PROTOCOL *This,
IN UINTN ModeNumber
)
/*++
Routine Description:
GC_TODO: Add function description
Arguments:
This - GC_TODO: add argument description
ModeNumber - GC_TODO: add argument description
Returns:
EFI_UNSUPPORTED - GC_TODO: Add description for return value
--*/
{
EFI_STATUS Status;
VGA_CLASS_DEV *VgaClassDev;
VgaClassDev = VGA_CLASS_DEV_FROM_THIS (This);
if ((INT32) ModeNumber >= This->Mode->MaxMode) {
return EFI_UNSUPPORTED;
}
This->ClearScreen (This);
This->Mode->Mode = (INT32) ModeNumber;
Status = VgaClassDev->VgaMiniPort->SetMode (VgaClassDev->VgaMiniPort, ModeNumber);
return Status;
}
//
// Private Worker Functions
//
STATIC
VOID
SetVideoCursorPosition (
IN VGA_CLASS_DEV *VgaClassDev,
IN UINTN Column,
IN UINTN Row,
IN UINTN MaxColumn
)
/*++
Routine Description:
GC_TODO: Add function description
Arguments:
VgaClassDev - GC_TODO: add argument description
Column - GC_TODO: add argument description
Row - GC_TODO: add argument description
MaxColumn - GC_TODO: add argument description
Returns:
GC_TODO: add return values
--*/
{
Column = Column & 0xff;
Row = Row & 0xff;
MaxColumn = MaxColumn & 0xff;
WriteCrtc (
VgaClassDev,
CRTC_CURSOR_LOCATION_HIGH,
(UINT8) ((Row * MaxColumn + Column) >> 8)
);
WriteCrtc (
VgaClassDev,
CRTC_CURSOR_LOCATION_LOW,
(UINT8) ((Row * MaxColumn + Column) & 0xff)
);
}
STATIC
VOID
WriteCrtc (
IN VGA_CLASS_DEV *VgaClassDev,
IN UINT16 Address,
IN UINT8 Data
)
/*++
Routine Description:
GC_TODO: Add function description
Arguments:
VgaClassDev - GC_TODO: add argument description
Address - GC_TODO: add argument description
Data - GC_TODO: add argument description
Returns:
GC_TODO: add return values
--*/
{
VgaClassDev->PciIo->Io.Write (
VgaClassDev->PciIo,
EfiPciIoWidthUint8,
VgaClassDev->VgaMiniPort->CrtcAddressRegisterBar,
VgaClassDev->VgaMiniPort->CrtcAddressRegisterOffset,
1,
&Address
);
VgaClassDev->PciIo->Io.Write (
VgaClassDev->PciIo,
EfiPciIoWidthUint8,
VgaClassDev->VgaMiniPort->CrtcDataRegisterBar,
VgaClassDev->VgaMiniPort->CrtcDataRegisterOffset,
1,
&Data
);
}
STATIC
BOOLEAN
LibIsValidTextGraphics (
IN CHAR16 Graphic,
OUT CHAR8 *PcAnsi, OPTIONAL
OUT CHAR8 *Ascii OPTIONAL
)
/*++
Routine Description:
Detects if a Unicode char is for Box Drawing text graphics.
Arguments:
Grphic - Unicode char to test.
PcAnsi - Optional pointer to return PCANSI equivalent of Graphic.
Asci - Optional pointer to return Ascii equivalent of Graphic.
Returns:
TRUE if Gpaphic is a supported Unicode Box Drawing character.
--*/
// GC_TODO: Graphic - add argument and description to function comment
{
UNICODE_TO_CHAR *Table;
if ((((Graphic & 0xff00) != 0x2500) && ((Graphic & 0xff00) != 0x2100))) {
//
// Unicode drawing code charts are all in the 0x25xx range,
// arrows are 0x21xx
//
return FALSE;
}
for (Table = UnicodeToPcAnsiOrAscii; Table->Unicode != 0x0000; Table++) {
if (Graphic == Table->Unicode) {
if (PcAnsi) {
*PcAnsi = Table->PcAnsi;
}
if (Ascii) {
*Ascii = Table->Ascii;
}
return TRUE;
}
}
return FALSE;
}
STATIC
BOOLEAN
IsValidAscii (
IN CHAR16 Ascii
)
/*++
Routine Description:
GC_TODO: Add function description
Arguments:
Ascii - GC_TODO: add argument description
Returns:
GC_TODO: add return values
--*/
{
if ((Ascii >= 0x20) && (Ascii <= 0x7f)) {
return TRUE;
}
return FALSE;
}
STATIC
BOOLEAN
IsValidEfiCntlChar (
IN CHAR16 c
)
/*++
Routine Description:
GC_TODO: Add function description
Arguments:
c - GC_TODO: add argument description
Returns:
GC_TODO: add return values
--*/
{
if (c == CHAR_NULL || c == CHAR_BACKSPACE || c == CHAR_LINEFEED || c == CHAR_CARRIAGE_RETURN) {
return TRUE;
}
return FALSE;
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?