mirror of
https://gitlab.com/bztsrc/posix-uefi.git
synced 2024-12-28 06:55:08 +01:00
59 lines
2.6 KiB
C
59 lines
2.6 KiB
C
#include <uefi.h>
|
|
|
|
/**
|
|
* List or set GOP video modes
|
|
*/
|
|
int main(int argc, char **argv)
|
|
{
|
|
efi_status_t status;
|
|
efi_guid_t gopGuid = EFI_GRAPHICS_OUTPUT_PROTOCOL_GUID;
|
|
efi_gop_t *gop = NULL;
|
|
efi_gop_mode_info_t *info = NULL;
|
|
uintn_t isiz = sizeof(efi_gop_mode_info_t), currentMode, i;
|
|
|
|
status = BS->LocateProtocol(&gopGuid, NULL, (void**)&gop);
|
|
if(!EFI_ERROR(status) && gop) {
|
|
/* if mode given on command line, set it */
|
|
if(argc > 1) {
|
|
status = gop->SetMode(gop, atoi(argv[1]));
|
|
/* changing the resolution might mess up ConOut and StdErr, better to reset them */
|
|
ST->ConOut->Reset(ST->ConOut, 0);
|
|
ST->StdErr->Reset(ST->StdErr, 0);
|
|
if(EFI_ERROR(status)) {
|
|
fprintf(stderr, "unable to set video mode\n");
|
|
return 0;
|
|
}
|
|
}
|
|
/* we got the interface, get current mode */
|
|
status = gop->QueryMode(gop, gop->Mode ? gop->Mode->Mode : 0, &isiz, &info);
|
|
if(status == EFI_NOT_STARTED || !gop->Mode) {
|
|
status = gop->SetMode(gop, 0);
|
|
ST->ConOut->Reset(ST->ConOut, 0);
|
|
ST->StdErr->Reset(ST->StdErr, 0);
|
|
}
|
|
if(EFI_ERROR(status)) {
|
|
fprintf(stderr, "unable to get current video mode\n");
|
|
return 0;
|
|
}
|
|
currentMode = gop->Mode->Mode;
|
|
/* iterate on modes and print info */
|
|
for(i = 0; i < gop->Mode->MaxMode; i++) {
|
|
status = gop->QueryMode(gop, i, &isiz, &info);
|
|
if(EFI_ERROR(status) || info->PixelFormat > PixelBitMask) continue;
|
|
printf(" %c%3d. %4d x%4d (pitch %4d fmt %d r:%06x g:%06x b:%06x)\n",
|
|
i == currentMode ? '*' : ' ', i,
|
|
info->HorizontalResolution, info->VerticalResolution, info->PixelsPerScanLine, info->PixelFormat,
|
|
info->PixelFormat==PixelRedGreenBlueReserved8BitPerColor?0xff:(
|
|
info->PixelFormat==PixelBlueGreenRedReserved8BitPerColor?0xff0000:(
|
|
info->PixelFormat==PixelBitMask?info->PixelInformation.RedMask:0)),
|
|
info->PixelFormat==PixelRedGreenBlueReserved8BitPerColor ||
|
|
info->PixelFormat==PixelBlueGreenRedReserved8BitPerColor?0xff00:(
|
|
info->PixelFormat==PixelBitMask?info->PixelInformation.GreenMask:0),
|
|
info->PixelFormat==PixelRedGreenBlueReserved8BitPerColor?0xff0000:(
|
|
info->PixelFormat==PixelBlueGreenRedReserved8BitPerColor?0xff:(
|
|
info->PixelFormat==PixelBitMask?info->PixelInformation.BlueMask:0)));
|
|
}
|
|
} else
|
|
fprintf(stderr, "unable to get graphics output protocol\n");
|
|
return 0;
|
|
}
|