cirruslogic5430ugadraw.c
来自「EFI BIOS是Intel提出的下一代的BIOS标准。这里上传的Edk源代码是」· C语言 代码 · 共 1,034 行 · 第 1/2 页
C
1,034 行
);
} else {
Private->PciIo->Mem.Write (
Private->PciIo,
EfiPciIoWidthFillUint8,
0,
Offset,
Width * Height,
&Pixel
);
}
} else {
for (SrcY = SourceY, DstY = DestinationY; SrcY < (Height + SourceY); SrcY++, DstY++) {
Offset = (DstY * Private->ModeData[Private->CurrentMode].HorizontalResolution) + DestinationX;
if (((Offset & 0x03) == 0) && ((Width & 0x03) == 0)) {
Private->PciIo->Mem.Write (
Private->PciIo,
EfiPciIoWidthFillUint32,
0,
Offset,
Width >> 2,
&WidePixel
);
} else {
Private->PciIo->Mem.Write (
Private->PciIo,
EfiPciIoWidthFillUint8,
0,
Offset,
Width,
&Pixel
);
}
}
}
break;
case EfiUgaBltBufferToVideo:
for (SrcY = SourceY, DstY = DestinationY; SrcY < (Height + SourceY); SrcY++, DstY++) {
for (X = 0; X < Width; X++) {
Blt = (EFI_UGA_PIXEL *) ((UINT8 *) BltBuffer + (SrcY * Delta) + (SourceX + X) * sizeof (EFI_UGA_PIXEL));
Private->LineBuffer[X] = (UINT8) ((Blt->Red & 0xe0) | ((Blt->Green >> 3) & 0x1c) | ((Blt->Blue >> 6) & 0x03));
}
Offset = (DstY * Private->ModeData[Private->CurrentMode].HorizontalResolution) + DestinationX;
if (((Offset & 0x03) == 0) && ((Width & 0x03) == 0)) {
Private->PciIo->Mem.Write (
Private->PciIo,
EfiPciIoWidthUint32,
0,
Offset,
Width >> 2,
Private->LineBuffer
);
} else {
Private->PciIo->Mem.Write (
Private->PciIo,
EfiPciIoWidthUint8,
0,
Offset,
Width,
Private->LineBuffer
);
}
}
break;
}
gBS->RestoreTPL (OriginalTPL);
return EFI_SUCCESS;
}
//
// Construction and Destruction functions
//
EFI_STATUS
CirrusLogic5430UgaDrawConstructor (
CIRRUS_LOGIC_5430_PRIVATE_DATA *Private
)
/*++
Routine Description:
Arguments:
Returns:
None
--*/
// TODO: Private - add argument and description to function comment
// TODO: EFI_SUCCESS - add return value to function comment
{
EFI_UGA_DRAW_PROTOCOL *UgaDraw;
UINTN Index;
//
// Fill in Private->UgaDraw protocol
//
UgaDraw = &Private->UgaDraw;
UgaDraw->GetMode = CirrusLogic5430UgaDrawGetMode;
UgaDraw->SetMode = CirrusLogic5430UgaDrawSetMode;
UgaDraw->Blt = CirrusLogic5430UgaDrawBlt;
//
// Initialize the private data
//
Private->MaxMode = CIRRUS_LOGIC_5430_UGA_DRAW_MODE_COUNT;
Private->CurrentMode = 0;
for (Index = 0; Index < Private->MaxMode; Index++) {
Private->ModeData[Index].HorizontalResolution = CirrusLogic5430VideoModes[Index].Width;
Private->ModeData[Index].VerticalResolution = CirrusLogic5430VideoModes[Index].Height;
Private->ModeData[Index].ColorDepth = 32;
Private->ModeData[Index].RefreshRate = CirrusLogic5430VideoModes[Index].RefreshRate;
}
Private->HardwareNeedsStarting = TRUE;
Private->LineBuffer = NULL;
//
// Initialize the hardware
//
UgaDraw->SetMode (
UgaDraw,
Private->ModeData[Private->CurrentMode].HorizontalResolution,
Private->ModeData[Private->CurrentMode].VerticalResolution,
Private->ModeData[Private->CurrentMode].ColorDepth,
Private->ModeData[Private->CurrentMode].RefreshRate
);
DrawLogo (Private);
return EFI_SUCCESS;
}
EFI_STATUS
CirrusLogic5430UgaDrawDestructor (
CIRRUS_LOGIC_5430_PRIVATE_DATA *Private
)
/*++
Routine Description:
Arguments:
Returns:
None
--*/
// TODO: Private - add argument and description to function comment
// TODO: EFI_SUCCESS - add return value to function comment
{
return EFI_SUCCESS;
}
VOID
outb (
CIRRUS_LOGIC_5430_PRIVATE_DATA *Private,
UINTN Address,
UINT8 Data
)
/*++
Routine Description:
TODO: Add function description
Arguments:
Private - TODO: add argument description
Address - TODO: add argument description
Data - TODO: add argument description
Returns:
TODO: add return values
--*/
{
Private->PciIo->Io.Write (
Private->PciIo,
EfiPciIoWidthUint8,
EFI_PCI_IO_PASS_THROUGH_BAR,
Address,
1,
&Data
);
}
VOID
outw (
CIRRUS_LOGIC_5430_PRIVATE_DATA *Private,
UINTN Address,
UINT16 Data
)
/*++
Routine Description:
TODO: Add function description
Arguments:
Private - TODO: add argument description
Address - TODO: add argument description
Data - TODO: add argument description
Returns:
TODO: add return values
--*/
{
Private->PciIo->Io.Write (
Private->PciIo,
EfiPciIoWidthUint16,
EFI_PCI_IO_PASS_THROUGH_BAR,
Address,
1,
&Data
);
}
UINT8
inb (
CIRRUS_LOGIC_5430_PRIVATE_DATA *Private,
UINTN Address
)
/*++
Routine Description:
TODO: Add function description
Arguments:
Private - TODO: add argument description
Address - TODO: add argument description
Returns:
TODO: add return values
--*/
{
UINT8 Data;
Private->PciIo->Io.Read (
Private->PciIo,
EfiPciIoWidthUint8,
EFI_PCI_IO_PASS_THROUGH_BAR,
Address,
1,
&Data
);
return Data;
}
UINT16
inw (
CIRRUS_LOGIC_5430_PRIVATE_DATA *Private,
UINTN Address
)
/*++
Routine Description:
TODO: Add function description
Arguments:
Private - TODO: add argument description
Address - TODO: add argument description
Returns:
TODO: add return values
--*/
{
UINT16 Data;
Private->PciIo->Io.Read (
Private->PciIo,
EfiPciIoWidthUint16,
EFI_PCI_IO_PASS_THROUGH_BAR,
Address,
1,
&Data
);
return Data;
}
VOID
SetPaletteColor (
CIRRUS_LOGIC_5430_PRIVATE_DATA *Private,
UINTN Index,
UINT8 Red,
UINT8 Green,
UINT8 Blue
)
/*++
Routine Description:
TODO: Add function description
Arguments:
Private - TODO: add argument description
Index - TODO: add argument description
Red - TODO: add argument description
Green - TODO: add argument description
Blue - TODO: add argument description
Returns:
TODO: add return values
--*/
{
outb (Private, PALETTE_INDEX_REGISTER, (UINT8) Index);
outb (Private, PALETTE_DATA_REGISTER, (UINT8) (Red >> 2));
outb (Private, PALETTE_DATA_REGISTER, (UINT8) (Green >> 2));
outb (Private, PALETTE_DATA_REGISTER, (UINT8) (Blue >> 2));
}
VOID
SetDefaultPalette (
CIRRUS_LOGIC_5430_PRIVATE_DATA *Private
)
/*++
Routine Description:
TODO: Add function description
Arguments:
Private - TODO: add argument description
Returns:
TODO: add return values
--*/
{
UINTN Index;
UINTN RedIndex;
UINTN GreenIndex;
UINTN BlueIndex;
Index = 0;
for (RedIndex = 0; RedIndex < 8; RedIndex++) {
for (GreenIndex = 0; GreenIndex < 8; GreenIndex++) {
for (BlueIndex = 0; BlueIndex < 4; BlueIndex++) {
SetPaletteColor (Private, Index, (UINT8) (RedIndex << 5), (UINT8) (GreenIndex << 5), (UINT8) (BlueIndex << 6));
Index++;
}
}
}
}
STATIC
VOID
ClearScreen (
CIRRUS_LOGIC_5430_PRIVATE_DATA *Private
)
/*++
Routine Description:
TODO: Add function description
Arguments:
Private - TODO: add argument description
Returns:
TODO: add return values
--*/
{
UINT32 Color;
Color = 0;
Private->PciIo->Mem.Write (
Private->PciIo,
EfiPciIoWidthFillUint32,
0,
0,
0x100000 >> 2,
&Color
);
}
VOID
DrawLogo (
CIRRUS_LOGIC_5430_PRIVATE_DATA *Private
)
/*++
Routine Description:
TODO: Add function description
Arguments:
Private - TODO: add argument description
Returns:
TODO: add return values
--*/
{
UINTN Offset;
UINTN X;
UINTN Y;
UINTN ScreenWidth;
UINTN ScreenHeight;
UINT8 Color;
ScreenWidth = Private->ModeData[Private->CurrentMode].HorizontalResolution;
ScreenHeight = Private->ModeData[Private->CurrentMode].VerticalResolution;
Offset = 0;
for (Y = 0; Y < ScreenHeight; Y++) {
for (X = 0; X < ScreenWidth; X++) {
Color = (UINT8) (256 * (X + Y) / (ScreenWidth + ScreenHeight));
Private->LineBuffer[X] = Color;
}
Private->PciIo->Mem.Write (
Private->PciIo,
EfiPciIoWidthUint32,
0,
Offset + (Y * ScreenWidth),
ScreenWidth >> 2,
Private->LineBuffer
);
}
}
VOID
InitializeGraphicsMode (
CIRRUS_LOGIC_5430_PRIVATE_DATA *Private,
CIRRUS_LOGIC_5430_VIDEO_MODES *ModeData
)
/*++
Routine Description:
TODO: Add function description
Arguments:
Private - TODO: add argument description
ModeData - TODO: add argument description
Returns:
TODO: add return values
--*/
{
UINT8 Byte;
UINTN Index;
outw (Private, SEQ_ADDRESS_REGISTER, 0x1206);
outw (Private, SEQ_ADDRESS_REGISTER, 0x0012);
for (Index = 0; Index < 15; Index++) {
outw (Private, SEQ_ADDRESS_REGISTER, ModeData->SeqSettings[Index]);
}
outb (Private, SEQ_ADDRESS_REGISTER, 0x0f);
Byte = (UINT8) ((inb (Private, SEQ_DATA_REGISTER) & 0xc7) ^ 0x30);
outb (Private, SEQ_DATA_REGISTER, Byte);
outb (Private, MISC_OUTPUT_REGISTER, ModeData->MiscSetting);
outw (Private, GRAPH_ADDRESS_REGISTER, 0x0506);
outw (Private, SEQ_ADDRESS_REGISTER, 0x0300);
outw (Private, CRTC_ADDRESS_REGISTER, 0x2011);
for (Index = 0; Index < 28; Index++) {
outw (Private, CRTC_ADDRESS_REGISTER, (UINT16) ((ModeData->CrtcSettings[Index] << 8) | Index));
}
for (Index = 0; Index < 9; Index++) {
outw (Private, GRAPH_ADDRESS_REGISTER, (UINT16) ((GraphicsController[Index] << 8) | Index));
}
inb (Private, INPUT_STATUS_1_REGISTER);
for (Index = 0; Index < 21; Index++) {
outb (Private, ATT_ADDRESS_REGISTER, (UINT8) Index);
outb (Private, ATT_ADDRESS_REGISTER, AttributeController[Index]);
}
outb (Private, ATT_ADDRESS_REGISTER, 0x20);
outw (Private, GRAPH_ADDRESS_REGISTER, 0x0009);
outw (Private, GRAPH_ADDRESS_REGISTER, 0x000a);
outw (Private, GRAPH_ADDRESS_REGISTER, 0x000b);
outb (Private, DAC_PIXEL_MASK_REGISTER, 0xff);
SetDefaultPalette (Private);
ClearScreen (Private);
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?