#include #include #include #include #include #include EFI_GUID gop_guid = EFI_GRAPHICS_OUTPUT_PROTOCOL_GUID; EFI_GRAPHICS_OUTPUT_PROTOCOL *Gop = NULL; UINT64 Gop_FrameBufferBase = 0; UINT32 Gop_PixelsPerScanLine = 0; static inline void drawPixel(UINT32 x, UINT32 y, UINT32 pixel) { *((UINT32*)(Gop_FrameBufferBase + 4 * Gop_PixelsPerScanLine * y + 4 * x)) = pixel; } static inline void drawRectangle(UINT32 x, UINT32 y, UINT32 w, UINT32 h, UINT32 pixel) { for(int ix = 0; ix < w; ++ix) { for(int iy = 0; iy < w; ++iy) { drawPixel(x+ix, y+iy, pixel); } } } EFI_STATUS EFIAPI UefiEntry(IN EFI_HANDLE imgHandle, IN EFI_SYSTEM_TABLE* sysTable) { gST = sysTable; gBS = sysTable->BootServices; gImageHandle = imgHandle; gBS->SetWatchdogTimer(0, 0, 0, NULL); EFI_STATUS status = 0; /** * GOP Setup */ status = gBS->LocateProtocol(&gop_guid, NULL, (VOID **)&Gop); if (EFI_ERROR(status)) { Print(u"\r\nERROR: %x; Cannot locate GOP protocol. Return.\r\n", status); return status; } Gop_FrameBufferBase = Gop->Mode->FrameBufferBase; Gop_PixelsPerScanLine = Gop->Mode->Info->PixelsPerScanLine; UINT32 W = Gop->Mode->Info->HorizontalResolution; UINT32 H = Gop->Mode->Info->VerticalResolution; /** * Fills framebuffer */ drawRectangle(0,0,W,H,0x000000); UINT32 sq_sid = W * 50 / 1000; UINT32 sq_gap = W * 17 / 1000; /** * Computes squares coordinates */ UINT32 col0 = W/2 - 7*sq_gap/2 - 4*sq_sid; UINT32 col1 = W/2 - 5*sq_gap/2 - 3*sq_sid; UINT32 col2 = W/2 - sq_gap/2 - sq_sid; UINT32 col3 = W/2 + sq_gap/2 ; UINT32 col4 = W/2 + 5*sq_gap/2 + 2*sq_sid; UINT32 col5 = W/2 + 7*sq_gap/2 + 3*sq_sid; UINT32 row0 = H/2 - 3*sq_sid/2 - sq_gap; UINT32 row1 = H/2 - sq_sid/2 ; UINT32 row2 = H/2 + sq_sid/2 + sq_gap; /** * Loops drawing the clockface */ EFI_TIME Time; UINT16 second, minute, hour; const UINT32 accentColor = 0xFFAB3F, idleColor = 0x555555; while(1) { gRT->GetTime(&Time, NULL); second = Time.Second; minute = Time.Minute; hour = Time.Hour; second & 0b000001 ? drawRectangle(col5,row2,sq_sid,sq_sid,accentColor) : drawRectangle(col5,row2,sq_sid,sq_sid,idleColor); second & 0b000010 ? drawRectangle(col5,row1,sq_sid,sq_sid,accentColor) : drawRectangle(col5,row1,sq_sid,sq_sid,idleColor); second & 0b000100 ? drawRectangle(col5,row0,sq_sid,sq_sid,accentColor) : drawRectangle(col5,row0,sq_sid,sq_sid,idleColor); second & 0b001000 ? drawRectangle(col4,row2,sq_sid,sq_sid,accentColor) : drawRectangle(col4,row2,sq_sid,sq_sid,idleColor); second & 0b010000 ? drawRectangle(col4,row1,sq_sid,sq_sid,accentColor) : drawRectangle(col4,row1,sq_sid,sq_sid,idleColor); second & 0b100000 ? drawRectangle(col4,row0,sq_sid,sq_sid,accentColor) : drawRectangle(col4,row0,sq_sid,sq_sid,idleColor); minute & 0b000001 ? drawRectangle(col3,row2,sq_sid,sq_sid,accentColor) : drawRectangle(col3,row2,sq_sid,sq_sid,idleColor); minute & 0b000010 ? drawRectangle(col3,row1,sq_sid,sq_sid,accentColor) : drawRectangle(col3,row1,sq_sid,sq_sid,idleColor); minute & 0b000100 ? drawRectangle(col3,row0,sq_sid,sq_sid,accentColor) : drawRectangle(col3,row0,sq_sid,sq_sid,idleColor); minute & 0b001000 ? drawRectangle(col2,row2,sq_sid,sq_sid,accentColor) : drawRectangle(col2,row2,sq_sid,sq_sid,idleColor); minute & 0b010000 ? drawRectangle(col2,row1,sq_sid,sq_sid,accentColor) : drawRectangle(col2,row1,sq_sid,sq_sid,idleColor); minute & 0b100000 ? drawRectangle(col2,row0,sq_sid,sq_sid,accentColor) : drawRectangle(col2,row0,sq_sid,sq_sid,idleColor); hour & 0b00001 ? drawRectangle(col1,row2,sq_sid,sq_sid,accentColor) : drawRectangle(col1,row2,sq_sid,sq_sid,idleColor); hour & 0b00010 ? drawRectangle(col1,row1,sq_sid,sq_sid,accentColor) : drawRectangle(col1,row1,sq_sid,sq_sid,idleColor); hour & 0b00100 ? drawRectangle(col1,row0,sq_sid,sq_sid,accentColor) : drawRectangle(col1,row0,sq_sid,sq_sid,idleColor); hour & 0b01000 ? drawRectangle(col0,row2,sq_sid,sq_sid,accentColor) : drawRectangle(col0,row2,sq_sid,sq_sid,idleColor); hour & 0b10000 ? drawRectangle(col0,row1,sq_sid,sq_sid,accentColor) : drawRectangle(col0,row1,sq_sid,sq_sid,idleColor); MicroSecondDelay(1e6); } return EFI_SUCCESS; }