GOP.C
代码如下:
typedef unsigned long long UINT64;
typedef long long INT64;
typedef unsigned int UINT32;
typedef unsigned short UINT16;
typedef unsigned short CHAR16;
typedef unsigned char UINT8;
typedef UINT64 UINTN;
typedef INT64 INTN;
typedef void VOID;
typedef UINT32 EFI_STATUS;
typedef VOID* EFI_HANDLE;
#define NULL ((void *)0)
typedef struct {
UINT32 Data1;
UINT16 Data2;
UINT16 Data3;
UINT8 Data4[8];
} EFI_GUID;
typedef struct {
UINT64 Signature;
UINT32 Revision;
UINT32 HeaderSize;
UINT32 CRC32;
UINT32 Reserved;
} EFI_TABLE_HEADER;
typedef struct {
UINT8 Blue;
UINT8 Green;
UINT8 Red;
UINT8 Reserved;
} EFI_GRAPHICS_OUTPUT_BLT_PIXEL;
typedef enum {
EfiBltVideoFill,
EfiBltVideoToBltBuffer,
EfiBltBufferToVideo,
EfiBltVideoToVideo,
EfiGraphicsOutputBltOperationMax
} EFI_GRAPHICS_OUTPUT_BLT_OPERATION;
typedef enum {
PixelRedGreenBlueReserved8BitPerColor,
PixelBlueGreenRedReserved8BitPerColor,
PixelBitMask,
PixelBltOnly,
PixelFormatMax
} EFI_GRAPHICS_PIXEL_FORMAT;
typedef struct {
UINT32 RedMask;
UINT32 GreenMask;
UINT32 BlueMask;
UINT32 ReservedMask;
} EFI_PIXEL_BITMASK;
typedef struct {
UINT32 Version;
UINT32 HorizontalResolution;
UINT32 VerticalResolution;
EFI_GRAPHICS_PIXEL_FORMAT PixelFormat;
EFI_PIXEL_BITMASK PixelInformation;
UINT32 PixelsPerScanLine;
} EFI_GRAPHICS_OUTPUT_MODE_INFORMATION;
typedef EFI_STATUS
(*EFI_GRAPHICS_OUTPUT_PROTOCOL_QUERY_MODE) (
UINT32 *This,
UINT32 ModeNumber,
UINTN *SizeOfInfo,
EFI_GRAPHICS_OUTPUT_MODE_INFORMATION **Info
);
typedef EFI_STATUS
(*EFI_GRAPHICS_OUTPUT_PROTOCOL_SET_MODE) (
UINT32 *This,
UINT32 ModeNumber
);
typedef EFI_STATUS
(*EFI_GRAPHICS_OUTPUT_PROTOCOL_BLT) (
UINT32 *This,
EFI_GRAPHICS_OUTPUT_BLT_PIXEL *BltBuffer,
EFI_GRAPHICS_OUTPUT_BLT_OPERATION BltOperation,
UINTN SourceX,
UINTN SourceY,
UINTN DestinationX,
UINTN DestinationY,
UINTN Width,
UINTN Height,
UINTN Delta
);
typedef struct {
UINT32 MaxMode;
UINT32 Mode;
EFI_GRAPHICS_OUTPUT_MODE_INFORMATION *Info;
UINTN SizeOfInfo;
UINT64 FrameBufferBase;
UINTN FrameBufferSize;
} EFI_GRAPHICS_OUTPUT_PROTOCOL_MODE;
typedef struct EFI_GRAPHICS_OUTPUT_PROTOCOL {
EFI_GRAPHICS_OUTPUT_PROTOCOL_QUERY_MODE QueryMode;
EFI_GRAPHICS_OUTPUT_PROTOCOL_SET_MODE SetMode;
EFI_GRAPHICS_OUTPUT_PROTOCOL_BLT Blt;
EFI_GRAPHICS_OUTPUT_PROTOCOL_MODE *Mode;
} EFI_GRAPHICS_OUTPUT_PROTOCOL;
typedef
EFI_STATUS
(*EFI_SET_WATCHDOG_TIMER) (
UINTN Timeout,
UINT64 WatchdogCode,
UINTN DataSize,
CHAR16 *WatchdogData
);
typedef
EFI_STATUS
(*EFI_LOCATE_PROTOCOL) (
EFI_GUID *Protocol,
VOID *Registration,
VOID **Interface
);
typedef struct {
EFI_TABLE_HEADER Hdr;
UINT64 _bufA[29];
EFI_SET_WATCHDOG_TIMER SetWatchdogTimer;
UINT64 _bufB[7];
EFI_LOCATE_PROTOCOL LocateProtocol;
UINT64 _bufC[5];
} EFI_BOOT_SERVICES;
typedef struct {
EFI_TABLE_HEADER Hdr;
CHAR16 *FirmwareVendor;
UINT32 FirmwareRevision;
EFI_HANDLE ConsoleInHandle;
UINT32 *ConIn;
EFI_HANDLE ConsoleOutHandle;
UINT32 *ConOut;
EFI_HANDLE StandardErrorHandle;
UINT32 *StdErr;
UINT32 *RuntimeServices;
EFI_BOOT_SERVICES *BootServices;
UINTN NumberOfTableEntries;
UINT32 *ConfigurationTable;
} EFI_SYSTEM_TABLE;
EFI_STATUS *EFI_Main (EFI_HANDLE ImageHandle,EFI_SYSTEM_TABLE *SystemTable)
{
//在main函数中可以直接定义一个gop的guid数据结构
EFI_GUID gop_guid = {0x9042a9de, 0x23dc, 0x4a38, {0x96, 0xfb, 0x7a, 0xde, 0xd0, 0x80, 0x51, 0x6a}};
//调用系统表、启动表,找GOP句柄
EFI_GRAPHICS_OUTPUT_PROTOCOL *GOP = NULL;
EFI_STATUS Status;
SystemTable->BootServices->SetWatchdogTimer(0, 0, 0, NULL);
Status = SystemTable->BootServices->LocateProtocol(
&gop_guid,
NULL,
(void**)&GOP
);
if (Status != 0 || GOP == NULL) {
return Status; //GOP协议不可用直接返回
}
//获取GOP句柄后画画
unsigned int width = GOP->Mode->Info->HorizontalResolution;
unsigned int height = GOP->Mode->Info->VerticalResolution;
unsigned long long fb_base = GOP->Mode->FrameBufferBase;
unsigned int *fb_ptr = (unsigned int*)(unsigned long)fb_base;
unsigned int red_pixel;
if (GOP->Mode->Info->PixelFormat == 1) {
red_pixel = 0x00FF0000; // RGBA格式红色
} else {
red_pixel = 0x000000FF; // BGRA格式红色
}
//填充整个区域为红色
unsigned int total_pixels = width * height;
for (unsigned int i = 0; i < total_pixels; i++) {
fb_ptr[i] = red_pixel;
}
return 0;
}