Initial support for EFI framebuffer

This commit is contained in:
Rafal Kupiec 2023-01-19 16:23:39 +01:00
parent fb60724710
commit 9cbe2d458c
Signed by: belliash
GPG Key ID: 4E829243E0CFE6B4
6 changed files with 151 additions and 0 deletions

View File

@ -15,6 +15,10 @@
/* HAL library routines forward references */
XTAPI
VOID
HlClearScreen(VOID);
XTCDECL
XTSTATUS
HlComPortGetByte(IN PCPPORT Port,
@ -32,6 +36,12 @@ UCHAR
HlComPortReadLsr(IN PCPPORT Port,
IN UCHAR Byte);
XTAPI
VOID
HlDrawPixel(IN ULONG PosX,
IN ULONG PosY,
IN ULONG Color);
XTCDECL
XTSTATUS
HlInitializeComPort(IN OUT PCPPORT Port,
@ -39,4 +49,8 @@ HlInitializeComPort(IN OUT PCPPORT Port,
IN PUCHAR PortAddress,
IN ULONG BaudRate);
XTAPI
XTSTATUS
HlInitializeDisplay(VOID);
#endif /* __XTDK_HLFUNCS_H */

View File

@ -98,4 +98,16 @@ typedef struct _CPPORT
USHORT Flags;
} CPPORT, *PCPPORT;
typedef struct _HAL_FRAMEBUFFER_DATA
{
BOOLEAN Initialized;
PULONG Address;
ULONG_PTR BufferSize;
UINT Width;
UINT Height;
UINT PixelsPerScanLine;
UINT BitsPerPixel;
UINT Pitch;
} HAL_FRAMEBUFFER_DATA, *PHAL_FRAMEBUFFER_DATA;
#endif /* __XTDK_HLTYPES_H */

View File

@ -9,6 +9,7 @@ include_directories(
# Specify list of source code files
list(APPEND XTOSKRNL_SOURCE
${XTOSKRNL_SOURCE_DIR}/hl/cport.c
${XTOSKRNL_SOURCE_DIR}/hl/efifb.c
${XTOSKRNL_SOURCE_DIR}/hl/${ARCH}/cpufunc.c
${XTOSKRNL_SOURCE_DIR}/ke/globals.c
${XTOSKRNL_SOURCE_DIR}/ke/krnlinit.c

118
xtoskrnl/hl/efifb.c Normal file
View File

@ -0,0 +1,118 @@
/**
* PROJECT: ExectOS
* COPYRIGHT: See COPYING.md in the top level directory
* FILE: xtoskrnl/hl/efifb.c
* DESCRIPTION: EFI framebuffer support
* DEVELOPERS: Rafal Kupiec <belliash@codingworkshop.eu.org>
*/
#include <xtos.h>
/**
* Clears the screen by drawing a filled black box.
*
* @return This routine does not return any value.
*
* @since XT 1.0
*/
XTAPI
VOID
HlClearScreen(VOID)
{
SIZE_T PositionX, PositionY;
/* Fill the screen with a black box */
for(PositionX = 0; PositionX < HlpFrameBufferData.Width; PositionX++)
{
for(PositionY = 0; PositionY < HlpFrameBufferData.Height; PositionY++)
{
HlDrawPixel(PositionX, PositionY, 0x00000000);
}
}
}
/**
* Draw a pixel on the screen at the given position and color.
*
* @param PositionX
* Supplies the X coordinate of the pixel.
*
* @param PositionY
* Supplies the Y coordinate of the pixel.
*
* @param Color
* Specifies the color of the pixel.
*
* @return This routine does not return any value.
*
* @since XT 1.0
*/
XTAPI
VOID
HlDrawPixel(IN ULONG PositionX,
IN ULONG PositionY,
IN ULONG Color)
{
/* Make sure frame buffer is already initialized */
if(HlpFrameBufferData.Initialized == FALSE)
{
/* Unable to operate on non-initialized frame buffer */
return;
}
/* Make sure point is not offscreen */
if(PositionX >= HlpFrameBufferData.Width || PositionY >= HlpFrameBufferData.Height || Color > 0xFFFFFFFF)
{
/* Invalid pixel position or color given */
return;
}
/* Calculate the index of the pixel in the frame buffer memory using the provided x and y coordinates */
SIZE_T FrameBufferIndex = PositionY * HlpFrameBufferData.PixelsPerScanLine + PositionX;
/* Set the color of the pixel by writing to the corresponding memory location */
HlpFrameBufferData.Address[FrameBufferIndex] = Color;
}
/**
* Initializes frame buffer display.
*
* @return This routine returns a status code.
*
* @since XT 1.0
*/
XTAPI
XTSTATUS
HlInitializeDisplay(VOID)
{
/* Check if display already initialized */
if(HlpFrameBufferData.Initialized)
{
/* Nothing to do */
return STATUS_SUCCESS;
}
/* Check if framebuffer initialized by bootloader */
if(!KeInitializationBlock->LoaderInformation.FrameBuffer.Initialized ||
!KeInitializationBlock->LoaderInformation.FrameBuffer.Address)
{
/* Display not initialized */
return STATUS_DEVICE_NOT_READY;
}
/* Save framebuffer information and mark display as initialized */
HlpFrameBufferData.Address = (PULONG)KeInitializationBlock->LoaderInformation.FrameBuffer.Address;
HlpFrameBufferData.Width = KeInitializationBlock->LoaderInformation.FrameBuffer.Width;
HlpFrameBufferData.Height = KeInitializationBlock->LoaderInformation.FrameBuffer.Height;
HlpFrameBufferData.BitsPerPixel = KeInitializationBlock->LoaderInformation.FrameBuffer.BitsPerPixel;
HlpFrameBufferData.PixelsPerScanLine = KeInitializationBlock->LoaderInformation.FrameBuffer.PixelsPerScanLine;
HlpFrameBufferData.Pitch = KeInitializationBlock->LoaderInformation.FrameBuffer.Pitch;
HlpFrameBufferData.Initialized = TRUE;
/* Clear screen */
HlClearScreen();
/* Return success */
return STATUS_SUCCESS;
}

View File

@ -12,6 +12,9 @@
#include <xtos.h>
/* FrameBuffer information */
EXTERN HAL_FRAMEBUFFER_DATA HlpFrameBufferData;
/* Kernel initialization block passed by boot loader */
EXTERN PKERNEL_INITIALIZATION_BLOCK KeInitializationBlock;

View File

@ -9,6 +9,9 @@
#include <xtos.h>
/* FrameBuffer information */
HAL_FRAMEBUFFER_DATA HlpFrameBufferData;
/* Kernel initialization block passed by boot loader */
PKERNEL_INITIALIZATION_BLOCK KeInitializationBlock;