mirror of
https://github.com/CloverHackyColor/CloverBootloader.git
synced 2024-12-10 14:23:31 +01:00
175 lines
4.6 KiB
C
175 lines
4.6 KiB
C
|
/** @file
|
||
|
This file contains the platform independent parts of HdLcd
|
||
|
|
||
|
Copyright (c) 2011-2018, ARM Ltd. All rights reserved.<BR>
|
||
|
|
||
|
SPDX-License-Identifier: BSD-2-Clause-Patent
|
||
|
|
||
|
**/
|
||
|
|
||
|
#include <Library/DebugLib.h>
|
||
|
#include <Library/IoLib.h>
|
||
|
#include <Library/LcdHwLib.h>
|
||
|
#include <Library/LcdPlatformLib.h>
|
||
|
#include <Library/MemoryAllocationLib.h>
|
||
|
#include <Library/PcdLib.h>
|
||
|
|
||
|
#include "HdLcd.h"
|
||
|
|
||
|
#define BYTES_PER_PIXEL 4
|
||
|
|
||
|
/** Initialize display.
|
||
|
|
||
|
@param[in] VramBaseAddress Address of the framebuffer.
|
||
|
|
||
|
@retval EFI_SUCCESS Display initialization successful.
|
||
|
**/
|
||
|
EFI_STATUS
|
||
|
LcdInitialize (
|
||
|
IN EFI_PHYSICAL_ADDRESS VramBaseAddress
|
||
|
)
|
||
|
{
|
||
|
// Disable the controller
|
||
|
MmioWrite32 (HDLCD_REG_COMMAND, HDLCD_DISABLE);
|
||
|
|
||
|
// Disable all interrupts
|
||
|
MmioWrite32 (HDLCD_REG_INT_MASK, 0);
|
||
|
|
||
|
// Define start of the VRAM. This never changes for any graphics mode
|
||
|
MmioWrite32 (HDLCD_REG_FB_BASE, (UINT32)VramBaseAddress);
|
||
|
|
||
|
// Setup various registers that never change
|
||
|
MmioWrite32 (HDLCD_REG_BUS_OPTIONS, (4 << 8) | HDLCD_BURST_8);
|
||
|
|
||
|
MmioWrite32 (HDLCD_REG_POLARITIES, HDLCD_DEFAULT_POLARITIES);
|
||
|
|
||
|
MmioWrite32 (
|
||
|
HDLCD_REG_PIXEL_FORMAT,
|
||
|
HDLCD_LITTLE_ENDIAN | HDLCD_4BYTES_PER_PIXEL
|
||
|
);
|
||
|
|
||
|
return EFI_SUCCESS;
|
||
|
}
|
||
|
|
||
|
/** Set requested mode of the display.
|
||
|
|
||
|
@param[in] ModeNumber Display mode number.
|
||
|
|
||
|
@retval EFI_SUCCESS Display mode set successfully.
|
||
|
@retval !(EFI_SUCCESS) Other errors.
|
||
|
**/
|
||
|
EFI_STATUS
|
||
|
LcdSetMode (
|
||
|
IN UINT32 ModeNumber
|
||
|
)
|
||
|
{
|
||
|
EFI_STATUS Status;
|
||
|
SCAN_TIMINGS *Horizontal;
|
||
|
SCAN_TIMINGS *Vertical;
|
||
|
|
||
|
EFI_GRAPHICS_PIXEL_FORMAT PixelFormat;
|
||
|
|
||
|
EFI_GRAPHICS_OUTPUT_MODE_INFORMATION ModeInfo;
|
||
|
|
||
|
// Set the video mode timings and other relevant information
|
||
|
Status = LcdPlatformGetTimings (
|
||
|
ModeNumber,
|
||
|
&Horizontal,
|
||
|
&Vertical
|
||
|
);
|
||
|
if (EFI_ERROR (Status)) {
|
||
|
ASSERT_EFI_ERROR (Status);
|
||
|
return Status;
|
||
|
}
|
||
|
|
||
|
ASSERT (Horizontal != NULL);
|
||
|
ASSERT (Vertical != NULL);
|
||
|
|
||
|
// Get the pixel format information.
|
||
|
Status = LcdPlatformQueryMode (ModeNumber, &ModeInfo);
|
||
|
if (EFI_ERROR (Status)) {
|
||
|
ASSERT_EFI_ERROR (Status);
|
||
|
return Status;
|
||
|
}
|
||
|
|
||
|
// By default PcdArmHdLcdSwapBlueRedSelect is set to false
|
||
|
// However on the Juno platform HW lines for BLUE and RED are swapped
|
||
|
// Therefore PcdArmHdLcdSwapBlueRedSelect is set to TRUE for the Juno platform
|
||
|
PixelFormat = FixedPcdGetBool (PcdArmHdLcdSwapBlueRedSelect)
|
||
|
? PixelRedGreenBlueReserved8BitPerColor
|
||
|
: PixelBlueGreenRedReserved8BitPerColor;
|
||
|
|
||
|
if (ModeInfo.PixelFormat == PixelFormat) {
|
||
|
MmioWrite32 (HDLCD_REG_RED_SELECT, (8 << 8) | 16);
|
||
|
MmioWrite32 (HDLCD_REG_BLUE_SELECT, (8 << 8) | 0);
|
||
|
} else {
|
||
|
MmioWrite32 (HDLCD_REG_BLUE_SELECT, (8 << 8) | 16);
|
||
|
MmioWrite32 (HDLCD_REG_RED_SELECT, (8 << 8) | 0);
|
||
|
}
|
||
|
|
||
|
MmioWrite32 (HDLCD_REG_GREEN_SELECT, (8 << 8) | 8);
|
||
|
|
||
|
// Disable the controller
|
||
|
MmioWrite32 (HDLCD_REG_COMMAND, HDLCD_DISABLE);
|
||
|
|
||
|
// Update the frame buffer information with the new settings
|
||
|
MmioWrite32 (
|
||
|
HDLCD_REG_FB_LINE_LENGTH,
|
||
|
Horizontal->Resolution * BYTES_PER_PIXEL
|
||
|
);
|
||
|
|
||
|
MmioWrite32 (
|
||
|
HDLCD_REG_FB_LINE_PITCH,
|
||
|
Horizontal->Resolution * BYTES_PER_PIXEL
|
||
|
);
|
||
|
|
||
|
MmioWrite32 (HDLCD_REG_FB_LINE_COUNT, Vertical->Resolution - 1);
|
||
|
|
||
|
// Set the vertical timing information
|
||
|
MmioWrite32 (HDLCD_REG_V_SYNC, Vertical->Sync);
|
||
|
MmioWrite32 (HDLCD_REG_V_BACK_PORCH, Vertical->BackPorch);
|
||
|
MmioWrite32 (HDLCD_REG_V_DATA, Vertical->Resolution - 1);
|
||
|
MmioWrite32 (HDLCD_REG_V_FRONT_PORCH, Vertical->FrontPorch);
|
||
|
|
||
|
// Set the horizontal timing information
|
||
|
MmioWrite32 (HDLCD_REG_H_SYNC, Horizontal->Sync);
|
||
|
MmioWrite32 (HDLCD_REG_H_BACK_PORCH, Horizontal->BackPorch);
|
||
|
MmioWrite32 (HDLCD_REG_H_DATA, Horizontal->Resolution - 1);
|
||
|
MmioWrite32 (HDLCD_REG_H_FRONT_PORCH, Horizontal->FrontPorch);
|
||
|
|
||
|
// Enable the controller
|
||
|
MmioWrite32 (HDLCD_REG_COMMAND, HDLCD_ENABLE);
|
||
|
|
||
|
return EFI_SUCCESS;
|
||
|
}
|
||
|
|
||
|
/** De-initializes the display.
|
||
|
**/
|
||
|
VOID
|
||
|
LcdShutdown (
|
||
|
VOID
|
||
|
)
|
||
|
{
|
||
|
// Disable the controller
|
||
|
MmioWrite32 (HDLCD_REG_COMMAND, HDLCD_DISABLE);
|
||
|
}
|
||
|
|
||
|
/** Check for presence of HDLCD.
|
||
|
|
||
|
@retval EFI_SUCCESS Returns success if platform implements a HDLCD
|
||
|
controller.
|
||
|
@retval EFI_NOT_FOUND HDLCD display controller not found on the
|
||
|
platform.
|
||
|
**/
|
||
|
EFI_STATUS
|
||
|
LcdIdentify (
|
||
|
VOID
|
||
|
)
|
||
|
{
|
||
|
if ((MmioRead32 (HDLCD_REG_VERSION) >> 16) == HDLCD_PRODUCT_ID) {
|
||
|
return EFI_SUCCESS;
|
||
|
}
|
||
|
|
||
|
return EFI_NOT_FOUND;
|
||
|
}
|