/** @file Lcd.c | |
Copyright (c) 2011-2012, ARM Ltd. All rights reserved.<BR> | |
This program and the accompanying materials | |
are licensed and made available under the terms and conditions of the BSD License | |
which accompanies this distribution. The full text of the license may be found at | |
http://opensource.org/licenses/bsd-license.php | |
THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, | |
WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. | |
**/ | |
#include <Library/DebugLib.h> | |
#include <Library/IoLib.h> | |
#include <Library/LcdPlatformLib.h> | |
#include <Library/MemoryAllocationLib.h> | |
#include <Library/PcdLib.h> | |
#include <Drivers/HdLcd.h> | |
#include "LcdGraphicsOutputDxe.h" | |
/********************************************************************** | |
* | |
* This file contains all the bits of the Lcd that are | |
* platform independent. | |
* | |
**********************************************************************/ | |
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_PXCLK_LOW | HDLCD_DATA_HIGH | HDLCD_DATEN_HIGH | HDLCD_HSYNC_LOW | HDLCD_VSYNC_HIGH); | |
MmioWrite32(HDLCD_REG_PIXEL_FORMAT, HDLCD_LITTLE_ENDIAN | HDLCD_4BYTES_PER_PIXEL); | |
MmioWrite32(HDLCD_REG_RED_SELECT, (0 << 16 | 8 << 8 | 0)); | |
MmioWrite32(HDLCD_REG_GREEN_SELECT, (0 << 16 | 8 << 8 | 8)); | |
MmioWrite32(HDLCD_REG_BLUE_SELECT, (0 << 16 | 8 << 8 | 16)); | |
return EFI_SUCCESS; | |
} | |
EFI_STATUS | |
LcdSetMode ( | |
IN UINT32 ModeNumber | |
) | |
{ | |
EFI_STATUS Status; | |
UINT32 HRes; | |
UINT32 HSync; | |
UINT32 HBackPorch; | |
UINT32 HFrontPorch; | |
UINT32 VRes; | |
UINT32 VSync; | |
UINT32 VBackPorch; | |
UINT32 VFrontPorch; | |
UINT32 BytesPerPixel; | |
LCD_BPP LcdBpp; | |
// Set the video mode timings and other relevant information | |
Status = LcdPlatformGetTimings (ModeNumber, | |
&HRes,&HSync,&HBackPorch,&HFrontPorch, | |
&VRes,&VSync,&VBackPorch,&VFrontPorch); | |
ASSERT_EFI_ERROR (Status); | |
if (EFI_ERROR( Status )) { | |
return EFI_DEVICE_ERROR; | |
} | |
Status = LcdPlatformGetBpp (ModeNumber,&LcdBpp); | |
ASSERT_EFI_ERROR (Status); | |
if (EFI_ERROR( Status )) { | |
return EFI_DEVICE_ERROR; | |
} | |
BytesPerPixel = GetBytesPerPixel(LcdBpp); | |
// Disable the controller | |
MmioWrite32(HDLCD_REG_COMMAND, HDLCD_DISABLE); | |
// Update the frame buffer information with the new settings | |
MmioWrite32(HDLCD_REG_FB_LINE_LENGTH, HRes * BytesPerPixel); | |
MmioWrite32(HDLCD_REG_FB_LINE_PITCH, HRes * BytesPerPixel); | |
MmioWrite32(HDLCD_REG_FB_LINE_COUNT, VRes - 1); | |
// Set the vertical timing information | |
MmioWrite32(HDLCD_REG_V_SYNC, VSync); | |
MmioWrite32(HDLCD_REG_V_BACK_PORCH, VBackPorch); | |
MmioWrite32(HDLCD_REG_V_DATA, VRes - 1); | |
MmioWrite32(HDLCD_REG_V_FRONT_PORCH, VFrontPorch); | |
// Set the horizontal timing information | |
MmioWrite32(HDLCD_REG_H_SYNC, HSync); | |
MmioWrite32(HDLCD_REG_H_BACK_PORCH, HBackPorch); | |
MmioWrite32(HDLCD_REG_H_DATA, HRes - 1); | |
MmioWrite32(HDLCD_REG_H_FRONT_PORCH, HFrontPorch); | |
// Enable the controller | |
MmioWrite32(HDLCD_REG_COMMAND, HDLCD_ENABLE); | |
return EFI_SUCCESS; | |
} | |
VOID | |
LcdShutdown ( | |
VOID | |
) | |
{ | |
// Disable the controller | |
MmioWrite32 (HDLCD_REG_COMMAND, HDLCD_DISABLE); | |
} | |
EFI_STATUS | |
LcdIdentify ( | |
VOID | |
) | |
{ | |
return EFI_SUCCESS; | |
} |