3 Copyright (c) 2011-2018, 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/LcdHwLib.h>
18 #include <Library/LcdPlatformLib.h>
19 #include <Library/MemoryAllocationLib.h>
20 #include <Library/PcdLib.h>
24 /** This file contains all the bits of the Lcd that are
35 case LCD_BITS_PER_PIXEL_24
:
38 case LCD_BITS_PER_PIXEL_16_565
:
39 case LCD_BITS_PER_PIXEL_16_555
:
40 case LCD_BITS_PER_PIXEL_12_444
:
43 case LCD_BITS_PER_PIXEL_8
:
44 case LCD_BITS_PER_PIXEL_4
:
45 case LCD_BITS_PER_PIXEL_2
:
46 case LCD_BITS_PER_PIXEL_1
:
56 IN EFI_PHYSICAL_ADDRESS VramBaseAddress
59 // Disable the controller
60 MmioWrite32 (HDLCD_REG_COMMAND
, HDLCD_DISABLE
);
62 // Disable all interrupts
63 MmioWrite32 (HDLCD_REG_INT_MASK
, 0);
65 // Define start of the VRAM. This never changes for any graphics mode
66 MmioWrite32 (HDLCD_REG_FB_BASE
, (UINT32
)VramBaseAddress
);
68 // Setup various registers that never change
69 MmioWrite32 (HDLCD_REG_BUS_OPTIONS
, (4 << 8) | HDLCD_BURST_8
);
71 MmioWrite32 (HDLCD_REG_POLARITIES
, HDLCD_DEFAULT_POLARITIES
);
74 HDLCD_REG_PIXEL_FORMAT
,
75 HDLCD_LITTLE_ENDIAN
| HDLCD_4BYTES_PER_PIXEL
78 MmioWrite32 (HDLCD_REG_RED_SELECT
, (0 << 16 | 8 << 8 | 0));
79 MmioWrite32 (HDLCD_REG_GREEN_SELECT
, (0 << 16 | 8 << 8 | 8));
80 MmioWrite32 (HDLCD_REG_BLUE_SELECT
, (0 << 16 | 8 << 8 | 16));
102 // Set the video mode timings and other relevant information
103 Status
= LcdPlatformGetTimings (
114 ASSERT_EFI_ERROR (Status
);
115 if (EFI_ERROR (Status
)) {
116 return EFI_DEVICE_ERROR
;
119 Status
= LcdPlatformGetBpp (ModeNumber
, &LcdBpp
);
120 ASSERT_EFI_ERROR (Status
);
121 if (EFI_ERROR (Status
)) {
122 return EFI_DEVICE_ERROR
;
125 BytesPerPixel
= GetBytesPerPixel (LcdBpp
);
127 // Disable the controller
128 MmioWrite32 (HDLCD_REG_COMMAND
, HDLCD_DISABLE
);
130 // Update the frame buffer information with the new settings
131 MmioWrite32 (HDLCD_REG_FB_LINE_LENGTH
, HRes
* BytesPerPixel
);
132 MmioWrite32 (HDLCD_REG_FB_LINE_PITCH
, HRes
* BytesPerPixel
);
133 MmioWrite32 (HDLCD_REG_FB_LINE_COUNT
, VRes
- 1);
135 // Set the vertical timing information
136 MmioWrite32 (HDLCD_REG_V_SYNC
, VSync
);
137 MmioWrite32 (HDLCD_REG_V_BACK_PORCH
, VBackPorch
);
138 MmioWrite32 (HDLCD_REG_V_DATA
, VRes
- 1);
139 MmioWrite32 (HDLCD_REG_V_FRONT_PORCH
, VFrontPorch
);
141 // Set the horizontal timing information
142 MmioWrite32 (HDLCD_REG_H_SYNC
, HSync
);
143 MmioWrite32 (HDLCD_REG_H_BACK_PORCH
, HBackPorch
);
144 MmioWrite32 (HDLCD_REG_H_DATA
, HRes
- 1);
145 MmioWrite32 (HDLCD_REG_H_FRONT_PORCH
, HFrontPorch
);
147 // Enable the controller
148 MmioWrite32 (HDLCD_REG_COMMAND
, HDLCD_ENABLE
);
158 // Disable the controller
159 MmioWrite32 (HDLCD_REG_COMMAND
, HDLCD_DISABLE
);