3 Copyright (c) 2011-2012, ARM Ltd. All rights reserved.<BR>
5 This program and the accompanying materials
6 are licensed and made available under the terms and conditions of the BSD License
7 which accompanies this distribution. The full text of the license may be found at
8 http://opensource.org/licenses/bsd-license.php
10 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
11 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
15 #include <Library/DebugLib.h>
16 #include <Library/IoLib.h>
17 #include <Library/LcdPlatformLib.h>
18 #include <Library/MemoryAllocationLib.h>
19 #include <Library/PcdLib.h>
21 #include <Drivers/HdLcd.h>
23 #include "LcdGraphicsOutputDxe.h"
25 /**********************************************************************
27 * This file contains all the bits of the Lcd that are
28 * platform independent.
30 **********************************************************************/
34 IN EFI_PHYSICAL_ADDRESS VramBaseAddress
37 // Disable the controller
38 MmioWrite32(HDLCD_REG_COMMAND
, HDLCD_DISABLE
);
40 // Disable all interrupts
41 MmioWrite32(HDLCD_REG_INT_MASK
, 0);
43 // Define start of the VRAM. This never changes for any graphics mode
44 MmioWrite32(HDLCD_REG_FB_BASE
, (UINT32
) VramBaseAddress
);
46 // Setup various registers that never change
47 MmioWrite32(HDLCD_REG_BUS_OPTIONS
, (4 << 8) | HDLCD_BURST_8
);
48 MmioWrite32(HDLCD_REG_POLARITIES
, HDLCD_PXCLK_LOW
| HDLCD_DATA_HIGH
| HDLCD_DATEN_HIGH
| HDLCD_HSYNC_LOW
| HDLCD_VSYNC_HIGH
);
49 MmioWrite32(HDLCD_REG_PIXEL_FORMAT
, HDLCD_LITTLE_ENDIAN
| HDLCD_4BYTES_PER_PIXEL
);
50 MmioWrite32(HDLCD_REG_RED_SELECT
, (0 << 16 | 8 << 8 | 0));
51 MmioWrite32(HDLCD_REG_GREEN_SELECT
, (0 << 16 | 8 << 8 | 8));
52 MmioWrite32(HDLCD_REG_BLUE_SELECT
, (0 << 16 | 8 << 8 | 16));
75 // Set the video mode timings and other relevant information
76 Status
= LcdPlatformGetTimings (ModeNumber
,
77 &HRes
,&HSync
,&HBackPorch
,&HFrontPorch
,
78 &VRes
,&VSync
,&VBackPorch
,&VFrontPorch
);
79 ASSERT_EFI_ERROR (Status
);
80 if (EFI_ERROR( Status
)) {
81 return EFI_DEVICE_ERROR
;
84 Status
= LcdPlatformGetBpp (ModeNumber
,&LcdBpp
);
85 ASSERT_EFI_ERROR (Status
);
86 if (EFI_ERROR( Status
)) {
87 return EFI_DEVICE_ERROR
;
90 BytesPerPixel
= GetBytesPerPixel(LcdBpp
);
92 // Disable the controller
93 MmioWrite32(HDLCD_REG_COMMAND
, HDLCD_DISABLE
);
95 // Update the frame buffer information with the new settings
96 MmioWrite32(HDLCD_REG_FB_LINE_LENGTH
, HRes
* BytesPerPixel
);
97 MmioWrite32(HDLCD_REG_FB_LINE_PITCH
, HRes
* BytesPerPixel
);
98 MmioWrite32(HDLCD_REG_FB_LINE_COUNT
, VRes
- 1);
100 // Set the vertical timing information
101 MmioWrite32(HDLCD_REG_V_SYNC
, VSync
);
102 MmioWrite32(HDLCD_REG_V_BACK_PORCH
, VBackPorch
);
103 MmioWrite32(HDLCD_REG_V_DATA
, VRes
- 1);
104 MmioWrite32(HDLCD_REG_V_FRONT_PORCH
, VFrontPorch
);
106 // Set the horizontal timing information
107 MmioWrite32(HDLCD_REG_H_SYNC
, HSync
);
108 MmioWrite32(HDLCD_REG_H_BACK_PORCH
, HBackPorch
);
109 MmioWrite32(HDLCD_REG_H_DATA
, HRes
- 1);
110 MmioWrite32(HDLCD_REG_H_FRONT_PORCH
, HFrontPorch
);
112 // Enable the controller
113 MmioWrite32(HDLCD_REG_COMMAND
, HDLCD_ENABLE
);
123 // Nothing to do in terms of hardware.
124 // We could switch off the monitor display if required