Single Photo displayed on LPC4088

Dependencies:   DMBasicGUI DMSupport

Committer:
jmitc91516
Date:
Fri Jul 28 14:19:12 2017 +0000
Revision:
0:9140ec6aa604
Simple application that displays a single photograph on the LPC4088 display.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
jmitc91516 0:9140ec6aa604 1 /* ************************************************************************ */
jmitc91516 0:9140ec6aa604 2 /* */
jmitc91516 0:9140ec6aa604 3 /* (C)2004-2014 IBIS Solutions ApS */
jmitc91516 0:9140ec6aa604 4 /* sales@easyGUI.com */
jmitc91516 0:9140ec6aa604 5 /* www.easyGUI.com */
jmitc91516 0:9140ec6aa604 6 /* */
jmitc91516 0:9140ec6aa604 7 /* easyGUI display driver unit */
jmitc91516 0:9140ec6aa604 8 /* v6.0.23.002 */
jmitc91516 0:9140ec6aa604 9 /* */
jmitc91516 0:9140ec6aa604 10 /* ************************************************************************ */
jmitc91516 0:9140ec6aa604 11
jmitc91516 0:9140ec6aa604 12 #include "GuiConst.h"
jmitc91516 0:9140ec6aa604 13 #include "GuiDisplay.h"
jmitc91516 0:9140ec6aa604 14 #include "GuiLib.h"
jmitc91516 0:9140ec6aa604 15 #include <stdlib.h>
jmitc91516 0:9140ec6aa604 16
jmitc91516 0:9140ec6aa604 17 #define WANT_DOUBLE_BUFFERING // Also in GuiGraph16.h, GuiLib.c - *** all three must match ***
jmitc91516 0:9140ec6aa604 18
jmitc91516 0:9140ec6aa604 19 #define USE_WAIT_MS
jmitc91516 0:9140ec6aa604 20 #ifdef USE_WAIT_MS
jmitc91516 0:9140ec6aa604 21 extern void EasyGUIWaitMs(GuiConst_INT32U msec); // in main.cpp
jmitc91516 0:9140ec6aa604 22 #endif
jmitc91516 0:9140ec6aa604 23
jmitc91516 0:9140ec6aa604 24 extern void SetupQSPIBitmapArray(int stageNumber); // In main.cpp
jmitc91516 0:9140ec6aa604 25
jmitc91516 0:9140ec6aa604 26 // Make FRAME_ADDRESS able to be set at runtime, not hardcoded
jmitc91516 0:9140ec6aa604 27 static unsigned long frameAddress = 0L;
jmitc91516 0:9140ec6aa604 28 // Global function (actually called from the main function, in main.cpp)
jmitc91516 0:9140ec6aa604 29 // to set the frame address at startup
jmitc91516 0:9140ec6aa604 30 void GuiDisplay_SetFrameAddress(void *newFrameAddress)
jmitc91516 0:9140ec6aa604 31 {
jmitc91516 0:9140ec6aa604 32 // C/C++ is not happy copying a pointer value direct to an unsigned long
jmitc91516 0:9140ec6aa604 33 union {
jmitc91516 0:9140ec6aa604 34 void *ptrValue;
jmitc91516 0:9140ec6aa604 35 unsigned long ulValue;
jmitc91516 0:9140ec6aa604 36 } frameAddressUnion;
jmitc91516 0:9140ec6aa604 37
jmitc91516 0:9140ec6aa604 38 frameAddressUnion.ptrValue = newFrameAddress;
jmitc91516 0:9140ec6aa604 39
jmitc91516 0:9140ec6aa604 40 frameAddress = frameAddressUnion.ulValue;
jmitc91516 0:9140ec6aa604 41 }
jmitc91516 0:9140ec6aa604 42
jmitc91516 0:9140ec6aa604 43 // Select LCD controller type by removing double slashes
jmitc91516 0:9140ec6aa604 44 //
jmitc91516 0:9140ec6aa604 45 // Many of the drivers listed here supports more than one display controller.
jmitc91516 0:9140ec6aa604 46 // To find your driver simply make a text search in this file. Omit eventual
jmitc91516 0:9140ec6aa604 47 // letters after the display controller type number. Example: For an NJU6450A
jmitc91516 0:9140ec6aa604 48 // display controller make a search for "NJU6450" - make sure it is a plain
jmitc91516 0:9140ec6aa604 49 // text search, not a word search.
jmitc91516 0:9140ec6aa604 50 //
jmitc91516 0:9140ec6aa604 51 // If your display controller is not found you can contact support at
jmitc91516 0:9140ec6aa604 52 // sales@ibissolutions.com. We will then quickly supply a driver for it.
jmitc91516 0:9140ec6aa604 53 //
jmitc91516 0:9140ec6aa604 54 // You only need to use the relevant display driver, all others may be deleted.
jmitc91516 0:9140ec6aa604 55 // Make a copy of this file before modifying it.
jmitc91516 0:9140ec6aa604 56 //
jmitc91516 0:9140ec6aa604 57 // -----------------------------------------------------------------------------
jmitc91516 0:9140ec6aa604 58 // #define LCD_CONTROLLER_TYPE_AT32AP7000
jmitc91516 0:9140ec6aa604 59 // #define LCD_CONTROLLER_TYPE_AT91RM9200_ST7565
jmitc91516 0:9140ec6aa604 60 // #define LCD_CONTROLLER_TYPE_AT91SAM9263
jmitc91516 0:9140ec6aa604 61 // #define LCD_CONTROLLER_TYPE_BVGP
jmitc91516 0:9140ec6aa604 62 // #define LCD_CONTROLLER_TYPE_D51E5TA7601
jmitc91516 0:9140ec6aa604 63 // #define LCD_CONTROLLER_TYPE_F5529
jmitc91516 0:9140ec6aa604 64 // #define LCD_CONTROLLER_TYPE_FLEVIPER
jmitc91516 0:9140ec6aa604 65 // #define LCD_CONTROLLER_TYPE_FSA506
jmitc91516 0:9140ec6aa604 66 // #define LCD_CONTROLLER_TYPE_H8S2378
jmitc91516 0:9140ec6aa604 67 // #define LCD_CONTROLLER_TYPE_HD61202_2H
jmitc91516 0:9140ec6aa604 68 // #define LCD_CONTROLLER_TYPE_HD61202_4H
jmitc91516 0:9140ec6aa604 69 // #define LCD_CONTROLLER_TYPE_HD61202_2H2V
jmitc91516 0:9140ec6aa604 70 // #define LCD_CONTROLLER_TYPE_HX8238_AT32AP7000
jmitc91516 0:9140ec6aa604 71 // #define LCD_CONTROLLER_TYPE_HX8238_TMP92CH21
jmitc91516 0:9140ec6aa604 72 // #define LCD_CONTROLLER_TYPE_HX8312
jmitc91516 0:9140ec6aa604 73 // #define LCD_CONTROLLER_TYPE_HX8345
jmitc91516 0:9140ec6aa604 74 // #define LCD_CONTROLLER_TYPE_HX8346
jmitc91516 0:9140ec6aa604 75 // #define LCD_CONTROLLER_TYPE_HX8347
jmitc91516 0:9140ec6aa604 76 // #define LCD_CONTROLLER_TYPE_HX8347G
jmitc91516 0:9140ec6aa604 77 // #define LCD_CONTROLLER_TYPE_HX8352A
jmitc91516 0:9140ec6aa604 78 // #define LCD_CONTROLLER_TYPE_ILI9341
jmitc91516 0:9140ec6aa604 79 // #define LCD_CONTROLLER_TYPE_K70
jmitc91516 0:9140ec6aa604 80 // #define LCD_CONTROLLER_TYPE_LC7981
jmitc91516 0:9140ec6aa604 81 // #define LCD_CONTROLLER_TYPE_LS027
jmitc91516 0:9140ec6aa604 82 // #define LCD_CONTROLLER_TYPE_LS044
jmitc91516 0:9140ec6aa604 83 // #define LCD_CONTROLLER_TYPE_LH155BA
jmitc91516 0:9140ec6aa604 84 // #define LCD_CONTROLLER_TYPE_LH75401
jmitc91516 0:9140ec6aa604 85 // #define LCD_CONTROLLER_TYPE_LH7A400
jmitc91516 0:9140ec6aa604 86 // #define LCD_CONTROLLER_TYPE_LPC1788
jmitc91516 0:9140ec6aa604 87 // #define LCD_CONTROLLER_TYPE_LPC1850
jmitc91516 0:9140ec6aa604 88 // #define LCD_CONTROLLER_TYPE_LPC2478
jmitc91516 0:9140ec6aa604 89 // #define LCD_CONTROLLER_TYPE_LPC3230
jmitc91516 0:9140ec6aa604 90 #define LCD_CONTROLLER_TYPE_LPC408X
jmitc91516 0:9140ec6aa604 91 // #define LCD_CONTROLLER_TYPE_MPC5606S
jmitc91516 0:9140ec6aa604 92 // #define LCD_CONTROLLER_TYPE_MX257
jmitc91516 0:9140ec6aa604 93 // #define LCD_CONTROLLER_TYPE_NJU6450A
jmitc91516 0:9140ec6aa604 94 // #define LCD_CONTROLLER_TYPE_NT39016D
jmitc91516 0:9140ec6aa604 95 // #define LCD_CONTROLLER_TYPE_NT75451
jmitc91516 0:9140ec6aa604 96 // #define LCD_CONTROLLER_TYPE_OTM2201A
jmitc91516 0:9140ec6aa604 97 // #define LCD_CONTROLLER_TYPE_PCF8548
jmitc91516 0:9140ec6aa604 98 // #define LCD_CONTROLLER_TYPE_PCF8813
jmitc91516 0:9140ec6aa604 99 // #define LCD_CONTROLLER_TYPE_PIC24FJ256
jmitc91516 0:9140ec6aa604 100 // #define LCD_CONTROLLER_TYPE_PXA320
jmitc91516 0:9140ec6aa604 101 // #define LCD_CONTROLLER_TYPE_R61509
jmitc91516 0:9140ec6aa604 102 // #define LCD_CONTROLLER_TYPE_R61526
jmitc91516 0:9140ec6aa604 103 // #define LCD_CONTROLLER_TYPE_R61580
jmitc91516 0:9140ec6aa604 104 // #define LCD_CONTROLLER_TYPE_RA8822
jmitc91516 0:9140ec6aa604 105 // #define LCD_CONTROLLER_TYPE_RA8875
jmitc91516 0:9140ec6aa604 106 // #define LCD_CONTROLLER_TYPE_S1D13505
jmitc91516 0:9140ec6aa604 107 // #define LCD_CONTROLLER_TYPE_S1D13506
jmitc91516 0:9140ec6aa604 108 // #define LCD_CONTROLLER_TYPE_S1D13700
jmitc91516 0:9140ec6aa604 109 // #define LCD_CONTROLLER_TYPE_S1D13705
jmitc91516 0:9140ec6aa604 110 // #define LCD_CONTROLLER_TYPE_S1D13706
jmitc91516 0:9140ec6aa604 111 // #define LCD_CONTROLLER_TYPE_S1D13715
jmitc91516 0:9140ec6aa604 112 // #define LCD_CONTROLLER_TYPE_S1D13743
jmitc91516 0:9140ec6aa604 113 // #define LCD_CONTROLLER_TYPE_S1D13748
jmitc91516 0:9140ec6aa604 114 // #define LCD_CONTROLLER_TYPE_S1D13781
jmitc91516 0:9140ec6aa604 115 // #define LCD_CONTROLLER_TYPE_S1D13781_DIRECT
jmitc91516 0:9140ec6aa604 116 // #define LCD_CONTROLLER_TYPE_S1D13A04
jmitc91516 0:9140ec6aa604 117 // #define LCD_CONTROLLER_TYPE_S1D13A05
jmitc91516 0:9140ec6aa604 118 // #define LCD_CONTROLLER_TYPE_S1D15721
jmitc91516 0:9140ec6aa604 119 // #define LCD_CONTROLLER_TYPE_S6B0741
jmitc91516 0:9140ec6aa604 120 // #define LCD_CONTROLLER_TYPE_S6B33BL
jmitc91516 0:9140ec6aa604 121 // #define LCD_CONTROLLER_TYPE_S6D0139
jmitc91516 0:9140ec6aa604 122 // #define LCD_CONTROLLER_TYPE_S6E63D6
jmitc91516 0:9140ec6aa604 123 // #define LCD_CONTROLLER_TYPE_SBN1661_2H_SBN0080
jmitc91516 0:9140ec6aa604 124 // #define LCD_CONTROLLER_TYPE_SED1335
jmitc91516 0:9140ec6aa604 125 // #define LCD_CONTROLLER_TYPE_SEPS525
jmitc91516 0:9140ec6aa604 126 // #define LCD_CONTROLLER_TYPE_SH1101A
jmitc91516 0:9140ec6aa604 127 // #define LCD_CONTROLLER_TYPE_SH1123
jmitc91516 0:9140ec6aa604 128 // #define LCD_CONTROLLER_TYPE_SPFD5408
jmitc91516 0:9140ec6aa604 129 // #define LCD_CONTROLLER_TYPE_SPLC502
jmitc91516 0:9140ec6aa604 130 // #define LCD_CONTROLLER_TYPE_SSD0323
jmitc91516 0:9140ec6aa604 131 // #define LCD_CONTROLLER_TYPE_SSD1289
jmitc91516 0:9140ec6aa604 132 // #define LCD_CONTROLLER_TYPE_SSD1305
jmitc91516 0:9140ec6aa604 133 // #define LCD_CONTROLLER_TYPE_SSD1322
jmitc91516 0:9140ec6aa604 134 // #define LCD_CONTROLLER_TYPE_SSD1339
jmitc91516 0:9140ec6aa604 135 // #define LCD_CONTROLLER_TYPE_SSD1815
jmitc91516 0:9140ec6aa604 136 // #define LCD_CONTROLLER_TYPE_SSD1815_2H
jmitc91516 0:9140ec6aa604 137 // #define LCD_CONTROLLER_TYPE_SSD1848
jmitc91516 0:9140ec6aa604 138 // #define LCD_CONTROLLER_TYPE_SSD1858
jmitc91516 0:9140ec6aa604 139 // #define LCD_CONTROLLER_TYPE_SSD1926
jmitc91516 0:9140ec6aa604 140 // #define LCD_CONTROLLER_TYPE_SSD1963
jmitc91516 0:9140ec6aa604 141 // #define LCD_CONTROLLER_TYPE_SSD2119
jmitc91516 0:9140ec6aa604 142 // #define LCD_CONTROLLER_TYPE_ST7529
jmitc91516 0:9140ec6aa604 143 // #define LCD_CONTROLLER_TYPE_ST7541
jmitc91516 0:9140ec6aa604 144 // #define LCD_CONTROLLER_TYPE_ST7561
jmitc91516 0:9140ec6aa604 145 // #define LCD_CONTROLLER_TYPE_ST7565
jmitc91516 0:9140ec6aa604 146 // #define LCD_CONTROLLER_TYPE_ST7586
jmitc91516 0:9140ec6aa604 147 // #define LCD_CONTROLLER_TYPE_ST7637
jmitc91516 0:9140ec6aa604 148 // #define LCD_CONTROLLER_TYPE_ST7715
jmitc91516 0:9140ec6aa604 149 // #define LCD_CONTROLLER_TYPE_ST7920
jmitc91516 0:9140ec6aa604 150 // #define LCD_CONTROLLER_TYPE_STM32F429
jmitc91516 0:9140ec6aa604 151 // #define LCD_CONTROLLER_TYPE_T6963
jmitc91516 0:9140ec6aa604 152 // #define LCD_CONTROLLER_TYPE_TLS8201
jmitc91516 0:9140ec6aa604 153 // #define LCD_CONTROLLER_TYPE_TMPA900
jmitc91516 0:9140ec6aa604 154 // #define LCD_CONTROLLER_TYPE_TS7390
jmitc91516 0:9140ec6aa604 155 // #define LCD_CONTROLLER_TYPE_UC1608
jmitc91516 0:9140ec6aa604 156 // #define LCD_CONTROLLER_TYPE_UC1610
jmitc91516 0:9140ec6aa604 157 // #define LCD_CONTROLLER_TYPE_UC1611
jmitc91516 0:9140ec6aa604 158 // #define LCD_CONTROLLER_TYPE_UC1617
jmitc91516 0:9140ec6aa604 159 // #define LCD_CONTROLLER_TYPE_UC1698
jmitc91516 0:9140ec6aa604 160 // #define LCD_CONTROLLER_TYPE_UPD161607
jmitc91516 0:9140ec6aa604 161 // #define LCD_CONTROLLER_TYPE_UC1701
jmitc91516 0:9140ec6aa604 162
jmitc91516 0:9140ec6aa604 163 // ============================================================================
jmitc91516 0:9140ec6aa604 164 //
jmitc91516 0:9140ec6aa604 165 // COMMON PART - NOT DEPENDENT ON DISPLAY CONTROLLER TYPE
jmitc91516 0:9140ec6aa604 166 //
jmitc91516 0:9140ec6aa604 167 // Do not delete this part of the GuiDisplay.c file.
jmitc91516 0:9140ec6aa604 168 //
jmitc91516 0:9140ec6aa604 169 // If your operating system uses pre-emptive execution, i.e. it interrupts tasks
jmitc91516 0:9140ec6aa604 170 // at random instances, and transfers control to other tasks, display writing
jmitc91516 0:9140ec6aa604 171 // must be protected from this, by writing code for the two protection
jmitc91516 0:9140ec6aa604 172 // functions:
jmitc91516 0:9140ec6aa604 173 //
jmitc91516 0:9140ec6aa604 174 // o GuiDisplay_Lock Prevent the OS from switching tasks
jmitc91516 0:9140ec6aa604 175 // o GuiDisplay_Unlock Open up normal task execution again
jmitc91516 0:9140ec6aa604 176 //
jmitc91516 0:9140ec6aa604 177 // If your operating system does not use pre-emptive execution, i.e. if you
jmitc91516 0:9140ec6aa604 178 // must specifically release control in one tasks in order for other tasks to
jmitc91516 0:9140ec6aa604 179 // be serviced, or if you don't employ an operating system at all, you can just
jmitc91516 0:9140ec6aa604 180 // leave the two protection functions empty. Failing to write proper code for
jmitc91516 0:9140ec6aa604 181 // the protection functions will result in a system with unpredictable
jmitc91516 0:9140ec6aa604 182 // behavior.
jmitc91516 0:9140ec6aa604 183 //
jmitc91516 0:9140ec6aa604 184 // ============================================================================
jmitc91516 0:9140ec6aa604 185
jmitc91516 0:9140ec6aa604 186 void GuiDisplay_Lock (void)
jmitc91516 0:9140ec6aa604 187 {
jmitc91516 0:9140ec6aa604 188 }
jmitc91516 0:9140ec6aa604 189
jmitc91516 0:9140ec6aa604 190 void GuiDisplay_Unlock (void)
jmitc91516 0:9140ec6aa604 191 {
jmitc91516 0:9140ec6aa604 192 }
jmitc91516 0:9140ec6aa604 193
jmitc91516 0:9140ec6aa604 194 // ============================================================================
jmitc91516 0:9140ec6aa604 195 //
jmitc91516 0:9140ec6aa604 196 // DISPLAY DRIVER PART
jmitc91516 0:9140ec6aa604 197 //
jmitc91516 0:9140ec6aa604 198 // You only need to use the relevant display driver, all others may be deleted.
jmitc91516 0:9140ec6aa604 199 // Modify the driver so that it fits your specific hardware.
jmitc91516 0:9140ec6aa604 200 // Make a copy of this file before modifying it.
jmitc91516 0:9140ec6aa604 201 //
jmitc91516 0:9140ec6aa604 202 // ============================================================================
jmitc91516 0:9140ec6aa604 203
jmitc91516 0:9140ec6aa604 204 #ifdef LCD_CONTROLLER_TYPE_LPC408X
jmitc91516 0:9140ec6aa604 205
jmitc91516 0:9140ec6aa604 206 // ============================================================================
jmitc91516 0:9140ec6aa604 207 //
jmitc91516 0:9140ec6aa604 208 // LPC408x MICROCONTROLLER WITH BUILT-IN DISPLAY CONTROLLER
jmitc91516 0:9140ec6aa604 209 //
jmitc91516 0:9140ec6aa604 210 // This driver uses internal LCD controller of LPC408x microcontroller.
jmitc91516 0:9140ec6aa604 211 // LCD driver of LPC408x in 24 bit RGB parallel interface for TFT type
jmitc91516 0:9140ec6aa604 212 // display or 4bit parallel interface for STN type display.
jmitc91516 0:9140ec6aa604 213 // Graphic modes up to 1024x768 pixels.
jmitc91516 0:9140ec6aa604 214 //
jmitc91516 0:9140ec6aa604 215 // Compatible display controllers:
jmitc91516 0:9140ec6aa604 216 // None
jmitc91516 0:9140ec6aa604 217 //
jmitc91516 0:9140ec6aa604 218 // easyGUI setup should be (Parameters window, Display controller tab page):
jmitc91516 0:9140ec6aa604 219 // Horizontal bytes
jmitc91516 0:9140ec6aa604 220 // Bit 0 at right
jmitc91516 0:9140ec6aa604 221 // Number of color planes: 1
jmitc91516 0:9140ec6aa604 222 // Color mode: Grayscale, palette or RGB
jmitc91516 0:9140ec6aa604 223 // Color depth: 1 bit (B/W), 8 bits, 16 bits, 24 bits
jmitc91516 0:9140ec6aa604 224 // Display orientation: Normal, Upside down, 90 degrees left, 90 degrees right
jmitc91516 0:9140ec6aa604 225 // Display words with reversed bytes: Off
jmitc91516 0:9140ec6aa604 226 // Number of display controllers, horizontally: 1
jmitc91516 0:9140ec6aa604 227 // Number of display controllers, vertically: 1
jmitc91516 0:9140ec6aa604 228 //
jmitc91516 0:9140ec6aa604 229 // Port addresses (Px.x) must be altered to correspond to your microcontroller
jmitc91516 0:9140ec6aa604 230 // hardware and compiler syntax.
jmitc91516 0:9140ec6aa604 231 //
jmitc91516 0:9140ec6aa604 232 // ============================================================================
jmitc91516 0:9140ec6aa604 233
jmitc91516 0:9140ec6aa604 234 // Hardware connection for TFT display
jmitc91516 0:9140ec6aa604 235 // LPC408x generic TFT display
jmitc91516 0:9140ec6aa604 236 // LCD_FP - VSYNC
jmitc91516 0:9140ec6aa604 237 // LCD_LP - HSYNC
jmitc91516 0:9140ec6aa604 238 // LCD_LE - Line End
jmitc91516 0:9140ec6aa604 239 // LCD_DCLK - Pixel CLK
jmitc91516 0:9140ec6aa604 240 // LCD_ENAB_M - DATA_ENABLE
jmitc91516 0:9140ec6aa604 241 // LCD_VD[0-7] - R0-R7 (for 16bit RGB mode connect R0,R1,R2 to 0)
jmitc91516 0:9140ec6aa604 242 // LCD_VD[8-15] - G0-G7 (for 16bit RGB mode connect G0,G1 to 0)
jmitc91516 0:9140ec6aa604 243 // LCD_VD[16-23] - B0-B7 (for 16bit RGB mode connect B0,B1,B2 to 0)
jmitc91516 0:9140ec6aa604 244
jmitc91516 0:9140ec6aa604 245 // Hardware connection for STN display
jmitc91516 0:9140ec6aa604 246 // LCD_PWR - DISP
jmitc91516 0:9140ec6aa604 247 // LCD_DCLK - CL2
jmitc91516 0:9140ec6aa604 248 // LCD_FP - Frame Pulse
jmitc91516 0:9140ec6aa604 249 // LCD_LP - Line Sync Pulse
jmitc91516 0:9140ec6aa604 250 // LCD_LE - Line End
jmitc91516 0:9140ec6aa604 251 // LCD_VD[3:0] - UD[3:0]
jmitc91516 0:9140ec6aa604 252
jmitc91516 0:9140ec6aa604 253 // Power Control registers
jmitc91516 0:9140ec6aa604 254 #define PCONP (*(volatile unsigned long *)0x400FC0C4)
jmitc91516 0:9140ec6aa604 255 // LCD controller power control bit
jmitc91516 0:9140ec6aa604 256 #define PCLCD 0
jmitc91516 0:9140ec6aa604 257
jmitc91516 0:9140ec6aa604 258 // Pin setup registers (IOCON)
jmitc91516 0:9140ec6aa604 259 #define IOCON_P0_4 (*(volatile unsigned long *)0x4002C010)
jmitc91516 0:9140ec6aa604 260 #define IOCON_P0_5 (*(volatile unsigned long *)0x4002C014)
jmitc91516 0:9140ec6aa604 261 #define IOCON_P0_6 (*(volatile unsigned long *)0x4002C018)
jmitc91516 0:9140ec6aa604 262 #define IOCON_P0_7 (*(volatile unsigned long *)0x4002C01C)
jmitc91516 0:9140ec6aa604 263 #define IOCON_P0_8 (*(volatile unsigned long *)0x4002C020)
jmitc91516 0:9140ec6aa604 264 #define IOCON_P0_9 (*(volatile unsigned long *)0x4002C024)
jmitc91516 0:9140ec6aa604 265 #define IOCON_P1_20 (*(volatile unsigned long *)0x4002C0D0)
jmitc91516 0:9140ec6aa604 266 #define IOCON_P1_21 (*(volatile unsigned long *)0x4002C0D4)
jmitc91516 0:9140ec6aa604 267 #define IOCON_P1_22 (*(volatile unsigned long *)0x4002C0D8)
jmitc91516 0:9140ec6aa604 268 #define IOCON_P1_23 (*(volatile unsigned long *)0x4002C0DC)
jmitc91516 0:9140ec6aa604 269 #define IOCON_P1_24 (*(volatile unsigned long *)0x4002C0E0)
jmitc91516 0:9140ec6aa604 270 #define IOCON_P1_25 (*(volatile unsigned long *)0x4002C0E4)
jmitc91516 0:9140ec6aa604 271 #define IOCON_P1_26 (*(volatile unsigned long *)0x4002C0E8)
jmitc91516 0:9140ec6aa604 272 #define IOCON_P1_27 (*(volatile unsigned long *)0x4002C0EC)
jmitc91516 0:9140ec6aa604 273 #define IOCON_P1_28 (*(volatile unsigned long *)0x4002C0F0)
jmitc91516 0:9140ec6aa604 274 #define IOCON_P1_29 (*(volatile unsigned long *)0x4002C0F4)
jmitc91516 0:9140ec6aa604 275 #define IOCON_P2_0 (*(volatile unsigned long *)0x4002C100)
jmitc91516 0:9140ec6aa604 276 #define IOCON_P2_1 (*(volatile unsigned long *)0x4002C104)
jmitc91516 0:9140ec6aa604 277 #define IOCON_P2_2 (*(volatile unsigned long *)0x4002C108)
jmitc91516 0:9140ec6aa604 278 #define IOCON_P2_3 (*(volatile unsigned long *)0x4002C10C)
jmitc91516 0:9140ec6aa604 279 #define IOCON_P2_4 (*(volatile unsigned long *)0x4002C110)
jmitc91516 0:9140ec6aa604 280 #define IOCON_P2_5 (*(volatile unsigned long *)0x4002C114)
jmitc91516 0:9140ec6aa604 281 #define IOCON_P2_6 (*(volatile unsigned long *)0x4002C118)
jmitc91516 0:9140ec6aa604 282 #define IOCON_P2_7 (*(volatile unsigned long *)0x4002C11C)
jmitc91516 0:9140ec6aa604 283 #define IOCON_P2_8 (*(volatile unsigned long *)0x4002C120)
jmitc91516 0:9140ec6aa604 284 #define IOCON_P2_9 (*(volatile unsigned long *)0x4002C124)
jmitc91516 0:9140ec6aa604 285 #define IOCON_P2_11 (*(volatile unsigned long *)0x4002C12C)
jmitc91516 0:9140ec6aa604 286 #define IOCON_P2_12 (*(volatile unsigned long *)0x4002C130)
jmitc91516 0:9140ec6aa604 287 #define IOCON_P2_13 (*(volatile unsigned long *)0x4002C134)
jmitc91516 0:9140ec6aa604 288 #define IOCON_P4_28 (*(volatile unsigned long *)0x4002C270)
jmitc91516 0:9140ec6aa604 289 #define IOCON_P4_29 (*(volatile unsigned long *)0x4002C274)
jmitc91516 0:9140ec6aa604 290
jmitc91516 0:9140ec6aa604 291 // LCD Port Enable
jmitc91516 0:9140ec6aa604 292 #define LCDPE 1
jmitc91516 0:9140ec6aa604 293
jmitc91516 0:9140ec6aa604 294 // LCD controller registers
jmitc91516 0:9140ec6aa604 295 // LCD configuration register
jmitc91516 0:9140ec6aa604 296 #define LCD_CFG (*(volatile unsigned long *)0x400FC1B8)
jmitc91516 0:9140ec6aa604 297
jmitc91516 0:9140ec6aa604 298 // LCD Controller Base Address
jmitc91516 0:9140ec6aa604 299 #define LCD_BASE 0x20088000
jmitc91516 0:9140ec6aa604 300
jmitc91516 0:9140ec6aa604 301 // Horizontal Timing Control
jmitc91516 0:9140ec6aa604 302 #define LCD_TIMH (*(volatile unsigned long *)(LCD_BASE+0x000))
jmitc91516 0:9140ec6aa604 303 // Vertical Timing Control
jmitc91516 0:9140ec6aa604 304 #define LCD_TIMV (*(volatile unsigned long *)(LCD_BASE+0x004))
jmitc91516 0:9140ec6aa604 305 // Clock and Signal Polarity Control register
jmitc91516 0:9140ec6aa604 306 #define LCD_POL (*(volatile unsigned long *)(LCD_BASE+0x008))
jmitc91516 0:9140ec6aa604 307 // Line End Control register
jmitc91516 0:9140ec6aa604 308 #define LCD_LE (*(volatile unsigned long *)(LCD_BASE+0x00C))
jmitc91516 0:9140ec6aa604 309 // Upper Panel Frame Base Address register
jmitc91516 0:9140ec6aa604 310 #define LCD_UPBASE (*(volatile unsigned long *)(LCD_BASE+0x010))
jmitc91516 0:9140ec6aa604 311 // Lower Panel Frame Base Address register
jmitc91516 0:9140ec6aa604 312 #define LCD_LPBASE (*(volatile unsigned long *)(LCD_BASE+0x014))
jmitc91516 0:9140ec6aa604 313 // LCD Control register
jmitc91516 0:9140ec6aa604 314 #define LCD_CTRL (*(volatile unsigned long *)(LCD_BASE+0x018))
jmitc91516 0:9140ec6aa604 315 // Interrupt Mask register
jmitc91516 0:9140ec6aa604 316 #define LCD_INTMSK (*(volatile unsigned long *)(LCD_BASE+0x01C))
jmitc91516 0:9140ec6aa604 317 // Raw Interrupt Status register
jmitc91516 0:9140ec6aa604 318 #define LCD_INTRAW (*(volatile unsigned long *)(LCD_BASE+0x020))
jmitc91516 0:9140ec6aa604 319 // Masked Interrupt Status register
jmitc91516 0:9140ec6aa604 320 #define LCD_INTSTAT (*(volatile unsigned long *)(LCD_BASE+0x024))
jmitc91516 0:9140ec6aa604 321 // Interrupt Clear register
jmitc91516 0:9140ec6aa604 322 #define LCD_INTCLR (*(volatile unsigned long *)(LCD_BASE+0x028))
jmitc91516 0:9140ec6aa604 323 // Upper Panel Current Address Value register
jmitc91516 0:9140ec6aa604 324 #define LCD_UPCURR (*(volatile unsigned long *)(LCD_BASE+0x02C))
jmitc91516 0:9140ec6aa604 325 // Lower Panel Current Address Value register
jmitc91516 0:9140ec6aa604 326 #define LCD_LPCURR (*(volatile unsigned long *)(LCD_BASE+0x030))
jmitc91516 0:9140ec6aa604 327 // 256x16-bit Color Palette registers
jmitc91516 0:9140ec6aa604 328 #define LCD_PAL (*(volatile unsigned long *)(LCD_BASE+0x200))
jmitc91516 0:9140ec6aa604 329 // Cursor Image registers
jmitc91516 0:9140ec6aa604 330 #define CRSR_IMG (*(volatile unsigned long *)(LCD_BASE+0x800))
jmitc91516 0:9140ec6aa604 331 // Cursor Control register
jmitc91516 0:9140ec6aa604 332 #define CRSR_CTRL (*(volatile unsigned long *)(LCD_BASE+0xC00))
jmitc91516 0:9140ec6aa604 333
jmitc91516 0:9140ec6aa604 334 // LCD controller enable bit
jmitc91516 0:9140ec6aa604 335 #define LCDEN 0
jmitc91516 0:9140ec6aa604 336 // LCD controller power bit
jmitc91516 0:9140ec6aa604 337 #define LCDPWR 11
jmitc91516 0:9140ec6aa604 338 // Bypass pixel clock divider - for TFT display must be 1
jmitc91516 0:9140ec6aa604 339 #ifdef GuiConst_COLOR_DEPTH_1
jmitc91516 0:9140ec6aa604 340 #define BCD 0
jmitc91516 0:9140ec6aa604 341 #else
jmitc91516 0:9140ec6aa604 342 #define BCD 1
jmitc91516 0:9140ec6aa604 343 #endif
jmitc91516 0:9140ec6aa604 344 // Adjust these values according your display
jmitc91516 0:9140ec6aa604 345 // PLL clock prescaler selection - only odd numbers 0,1,3,5,..255
jmitc91516 0:9140ec6aa604 346 // 0 - PLL/1, 1 - PLL/2, 3 - PLL/4
jmitc91516 0:9140ec6aa604 347 #define PLLDIV 0
jmitc91516 0:9140ec6aa604 348 // LCD panel clock prescaler selection, range 0 - 31
jmitc91516 0:9140ec6aa604 349 // LCD freq = MCU freq /(CLKDIV+1)
jmitc91516 0:9140ec6aa604 350 #define CLKDIV 7
jmitc91516 0:9140ec6aa604 351 // Horizontal back porch in pixels, range 3 - 256
jmitc91516 0:9140ec6aa604 352 #ifdef GuiConst_COLOR_DEPTH_1
jmitc91516 0:9140ec6aa604 353 #define HBP 5
jmitc91516 0:9140ec6aa604 354 #else
jmitc91516 0:9140ec6aa604 355 #define HBP 40
jmitc91516 0:9140ec6aa604 356 #endif
jmitc91516 0:9140ec6aa604 357 // Horizontal front porch in pixels, range 3 - 256
jmitc91516 0:9140ec6aa604 358 #ifdef GuiConst_COLOR_DEPTH_1
jmitc91516 0:9140ec6aa604 359 #define HFP 5
jmitc91516 0:9140ec6aa604 360 #else
jmitc91516 0:9140ec6aa604 361 #define HFP 79
jmitc91516 0:9140ec6aa604 362 #endif
jmitc91516 0:9140ec6aa604 363 // Horizontal synchronization pulse width in pixels, range 3 - 256
jmitc91516 0:9140ec6aa604 364 #ifdef GuiConst_COLOR_DEPTH_1
jmitc91516 0:9140ec6aa604 365 #define HSW 3
jmitc91516 0:9140ec6aa604 366 #else
jmitc91516 0:9140ec6aa604 367 #define HSW 48
jmitc91516 0:9140ec6aa604 368 #endif
jmitc91516 0:9140ec6aa604 369 // Pixels-per-line in pixels, must be multiple of 16
jmitc91516 0:9140ec6aa604 370 #define PPL GuiConst_DISPLAY_WIDTH_HW
jmitc91516 0:9140ec6aa604 371 // Vertical back porch in lines, range 1 - 256
jmitc91516 0:9140ec6aa604 372 #ifdef GuiConst_COLOR_DEPTH_1
jmitc91516 0:9140ec6aa604 373 #define VBP 2
jmitc91516 0:9140ec6aa604 374 #else
jmitc91516 0:9140ec6aa604 375 #define VBP 29
jmitc91516 0:9140ec6aa604 376 #endif
jmitc91516 0:9140ec6aa604 377 // Vertical front porch in lines, range 1 - 256
jmitc91516 0:9140ec6aa604 378 #ifdef GuiConst_COLOR_DEPTH_1
jmitc91516 0:9140ec6aa604 379 #define VFP 2
jmitc91516 0:9140ec6aa604 380 #else
jmitc91516 0:9140ec6aa604 381 #define VFP 40
jmitc91516 0:9140ec6aa604 382 #endif
jmitc91516 0:9140ec6aa604 383 // Vertical synchronization pulse width in lines, range 1 - 31
jmitc91516 0:9140ec6aa604 384 #ifdef GuiConst_COLOR_DEPTH_1
jmitc91516 0:9140ec6aa604 385 #define VSW 1
jmitc91516 0:9140ec6aa604 386 #else
jmitc91516 0:9140ec6aa604 387 #define VSW 3
jmitc91516 0:9140ec6aa604 388 #endif
jmitc91516 0:9140ec6aa604 389 // Lines per panel
jmitc91516 0:9140ec6aa604 390 #define LPP GuiConst_BYTE_LINES
jmitc91516 0:9140ec6aa604 391 // Clocks per line
jmitc91516 0:9140ec6aa604 392 #ifdef GuiConst_COLOR_DEPTH_1
jmitc91516 0:9140ec6aa604 393 #define CPL GuiConst_DISPLAY_WIDTH_HW/4
jmitc91516 0:9140ec6aa604 394 #else
jmitc91516 0:9140ec6aa604 395 #define CPL GuiConst_DISPLAY_WIDTH_HW
jmitc91516 0:9140ec6aa604 396 #endif
jmitc91516 0:9140ec6aa604 397 // Invert output enable
jmitc91516 0:9140ec6aa604 398 // 0 = LCDENAB output pin is active HIGH in TFT mode
jmitc91516 0:9140ec6aa604 399 // 1 = LCDENAB output pin is active LOW in TFT mode
jmitc91516 0:9140ec6aa604 400 #define IOE 0
jmitc91516 0:9140ec6aa604 401 // Invert panel clock
jmitc91516 0:9140ec6aa604 402 // 0 = Data is driven on the LCD data lines on the rising edge of LCDDCLK
jmitc91516 0:9140ec6aa604 403 // 1 = Data is driven on the LCD data lines on the falling edge of LCDDCLK
jmitc91516 0:9140ec6aa604 404 #define IPC 0
jmitc91516 0:9140ec6aa604 405 // Invert horizontal synchronization
jmitc91516 0:9140ec6aa604 406 // 0 = LCDLP pin is active HIGH and inactive LOW
jmitc91516 0:9140ec6aa604 407 // 1 = LCDLP pin is active LOW and inactive HIGH
jmitc91516 0:9140ec6aa604 408 #ifdef GuiConst_COLOR_DEPTH_1
jmitc91516 0:9140ec6aa604 409 #define IHS 0
jmitc91516 0:9140ec6aa604 410 #else
jmitc91516 0:9140ec6aa604 411 #define IHS 1
jmitc91516 0:9140ec6aa604 412 #endif
jmitc91516 0:9140ec6aa604 413 // IVS Invert vertical synchronization
jmitc91516 0:9140ec6aa604 414 // 0 = LCDFP pin is active HIGH and inactive LOW
jmitc91516 0:9140ec6aa604 415 // 1 = LCDFP pin is active LOW and inactive HIGH
jmitc91516 0:9140ec6aa604 416 #ifdef GuiConst_COLOR_DEPTH_1
jmitc91516 0:9140ec6aa604 417 #define IVS 0
jmitc91516 0:9140ec6aa604 418 #else
jmitc91516 0:9140ec6aa604 419 #define IVS 1
jmitc91516 0:9140ec6aa604 420 #endif
jmitc91516 0:9140ec6aa604 421 // Lower five bits of panel clock divisor
jmitc91516 0:9140ec6aa604 422 #define PCD_LO 2
jmitc91516 0:9140ec6aa604 423 // CLKSEL Clock Select
jmitc91516 0:9140ec6aa604 424 // 0 = the clock source for the LCD block is CCLK
jmitc91516 0:9140ec6aa604 425 // 1 = the clock source for the LCD block is LCD_DCLK
jmitc91516 0:9140ec6aa604 426 #define CLKSEL 0
jmitc91516 0:9140ec6aa604 427
jmitc91516 0:9140ec6aa604 428 /****************************************************************************/
jmitc91516 0:9140ec6aa604 429 /* IMPORTANT!!! */
jmitc91516 0:9140ec6aa604 430 /****************************************************************************/
jmitc91516 0:9140ec6aa604 431 // Set start address of frame buffer in RAM memory
jmitc91516 0:9140ec6aa604 432 // 0x4000 0000 - 0x4000 FFFF RAM (64 kB)
jmitc91516 0:9140ec6aa604 433 // 0x8000 0000 - 0x80FF FFFF Static memory bank 0 (16 MB)
jmitc91516 0:9140ec6aa604 434 // 0x8100 0000 - 0x81FF FFFF Static memory bank 1 (16 MB)
jmitc91516 0:9140ec6aa604 435 // 0xA000 0000 - 0xAFFF FFFF Dynamic memory bank 0 (256 MB)
jmitc91516 0:9140ec6aa604 436 // 0xB000 0000 - 0xBFFF FFFF Dynamic memory bank 1 (256 MB)
jmitc91516 0:9140ec6aa604 437 //#define FRAME_ADDRESS 0xA0000008
jmitc91516 0:9140ec6aa604 438 //#define FRAME_ADDRESS 0xA00017D8 // As of 26 Oct 2016
jmitc91516 0:9140ec6aa604 439 #define FRAME_ADDRESS (frameAddress) // Use the static variable set at the top of this file
jmitc91516 0:9140ec6aa604 440 /****************************************************************************/
jmitc91516 0:9140ec6aa604 441
jmitc91516 0:9140ec6aa604 442 // Address of pallete registers
jmitc91516 0:9140ec6aa604 443 #define PALETTE_RAM_ADDR LCD_PAL
jmitc91516 0:9140ec6aa604 444
jmitc91516 0:9140ec6aa604 445 // Delay routine
jmitc91516 0:9140ec6aa604 446 // This constant must be adjusted according to speed of microcontroller
jmitc91516 0:9140ec6aa604 447 #define ONE_MS 100
jmitc91516 0:9140ec6aa604 448 // Param msec is delay in miliseconds
jmitc91516 0:9140ec6aa604 449 void millisecond_delay(GuiConst_INT32U msec)
jmitc91516 0:9140ec6aa604 450 {
jmitc91516 0:9140ec6aa604 451 #ifdef USE_WAIT_MS
jmitc91516 0:9140ec6aa604 452 EasyGUIWaitMs(msec);
jmitc91516 0:9140ec6aa604 453 #else
jmitc91516 0:9140ec6aa604 454 GuiConst_INT32U j;
jmitc91516 0:9140ec6aa604 455
jmitc91516 0:9140ec6aa604 456 for (j = 0; j < (ONE_MS * msec) ; j++);
jmitc91516 0:9140ec6aa604 457 #endif
jmitc91516 0:9140ec6aa604 458 }
jmitc91516 0:9140ec6aa604 459
jmitc91516 0:9140ec6aa604 460 // Initialises the module and the display
jmitc91516 0:9140ec6aa604 461 void GuiDisplay_Init (void)
jmitc91516 0:9140ec6aa604 462 {
jmitc91516 0:9140ec6aa604 463 // return; // Test - do we need any display initialisation here? Let the BIOS do it?
jmitc91516 0:9140ec6aa604 464 // No flickering - but red and blue reversed (again)
jmitc91516 0:9140ec6aa604 465 // So - can we reinstate some of the code in this function, and get the red and blue
jmitc91516 0:9140ec6aa604 466 // the correct way round without flickering?
jmitc91516 0:9140ec6aa604 467 //#define ALLOW_LPC4088_INIT
jmitc91516 0:9140ec6aa604 468 // Now allowing initialisation of the LCD control register even with ALLOW_LPC4088_INIT not #defined.
jmitc91516 0:9140ec6aa604 469 // This appears to have eliminated the flickering while keeping the red and blue components
jmitc91516 0:9140ec6aa604 470 // the correct way round.
jmitc91516 0:9140ec6aa604 471
jmitc91516 0:9140ec6aa604 472 GuiConst_INT32U i;
jmitc91516 0:9140ec6aa604 473 #ifdef GuiConst_COLOR_DEPTH_24
jmitc91516 0:9140ec6aa604 474 GuiConst_INT32U *framePtr;
jmitc91516 0:9140ec6aa604 475 #else
jmitc91516 0:9140ec6aa604 476 #ifdef GuiConst_COLOR_DEPTH_16
jmitc91516 0:9140ec6aa604 477 GuiConst_INT16U *framePtr;
jmitc91516 0:9140ec6aa604 478 #else
jmitc91516 0:9140ec6aa604 479 GuiConst_INT32U PaletteData;
jmitc91516 0:9140ec6aa604 480 GuiConst_INT8U *framePtr;
jmitc91516 0:9140ec6aa604 481 GuiConst_INT32U * pDst;
jmitc91516 0:9140ec6aa604 482 #endif
jmitc91516 0:9140ec6aa604 483 #endif
jmitc91516 0:9140ec6aa604 484
jmitc91516 0:9140ec6aa604 485 // SetupQSPIBitmapArray(1);
jmitc91516 0:9140ec6aa604 486
jmitc91516 0:9140ec6aa604 487 /**************************************************/
jmitc91516 0:9140ec6aa604 488 /* Carefully adjust the IO pins for your system */
jmitc91516 0:9140ec6aa604 489 /* Following settings for TFT panel 16/24 bit */
jmitc91516 0:9140ec6aa604 490 /**************************************************/
jmitc91516 0:9140ec6aa604 491
jmitc91516 0:9140ec6aa604 492 /* *** DEBUG *** COMMENT OUT THIS BLOCK OF CODE - WHAT HAPPENS?
jmitc91516 0:9140ec6aa604 493 // PI SETTING RGB888 RGB565
jmitc91516 0:9140ec6aa604 494 IOCON_P1_29 |= 7; // BLUE7 BLUE4
jmitc91516 0:9140ec6aa604 495 IOCON_P1_28 |= 7; // BLUE6 BLUE3
jmitc91516 0:9140ec6aa604 496 IOCON_P1_27 |= 7; // BLUE5 BLUE2
jmitc91516 0:9140ec6aa604 497 IOCON_P1_26 |= 7; // BLUE4 BLUE1
jmitc91516 0:9140ec6aa604 498 IOCON_P2_13 |= 7; // BLUE3 BLUE0
jmitc91516 0:9140ec6aa604 499 //IOCON_P2_12 |= 7; // BLUE2 - !! Comment out for RGB565
jmitc91516 0:9140ec6aa604 500 //IOCON_P0_9 |= 7; // BLUE1 - !! Comment out for RGB565
jmitc91516 0:9140ec6aa604 501 //IOCON_P0_8 |= 7; // BLUE0 - !! Comment out for RGB565
jmitc91516 0:9140ec6aa604 502 IOCON_P1_25 |= 7; // GREEN7 GREEN5
jmitc91516 0:9140ec6aa604 503 IOCON_P1_24 |= 7; // GREEN6 GREEN4
jmitc91516 0:9140ec6aa604 504 IOCON_P1_23 |= 7; // GREEN5 GREEN3
jmitc91516 0:9140ec6aa604 505 IOCON_P1_22 |= 7; // GREEN4 GREEN2
jmitc91516 0:9140ec6aa604 506 IOCON_P1_21 |= 7; // GREEN3 GREEN1
jmitc91516 0:9140ec6aa604 507 IOCON_P1_20 |= 7; // GREEN2 GREEN0
jmitc91516 0:9140ec6aa604 508 //IOCON_P0_7 |= 7; // GREEN1 - !! Comment out for RGB565
jmitc91516 0:9140ec6aa604 509 //IOCON_P0_6 |= 7; // GREEN0 - !! Comment out for RGB565
jmitc91516 0:9140ec6aa604 510 IOCON_P2_9 |= 7; // RED7 RED4
jmitc91516 0:9140ec6aa604 511 IOCON_P2_8 |= 7; // RED6 RED3
jmitc91516 0:9140ec6aa604 512 IOCON_P2_7 |= 7; // RED5 RED2
jmitc91516 0:9140ec6aa604 513 IOCON_P2_6 |= 7; // RED4 RED1
jmitc91516 0:9140ec6aa604 514 //IOCON_P4_29 |= 7; // RED3 - !! Comment out for RGB565
jmitc91516 0:9140ec6aa604 515 IOCON_P2_12 |= 5; // - RED0 !! Comment out for RGB888 !!
jmitc91516 0:9140ec6aa604 516 //IOCON_P4_28 |= 7; // RED2 - !! Comment out for RGB565
jmitc91516 0:9140ec6aa604 517 //IOCON_P0_5 |= 7; // RED1 - !! Comment out for RGB565
jmitc91516 0:9140ec6aa604 518 //IOCON_P0_4 |= 7; // RED0 - !! Comment out for RGB565
jmitc91516 0:9140ec6aa604 519 IOCON_P2_5 |= 7; // LCD_LP LCD_LP
jmitc91516 0:9140ec6aa604 520 IOCON_P2_4 |= 7; // LCD_ENAB_M LCD_ENAB_M
jmitc91516 0:9140ec6aa604 521 IOCON_P2_3 |= 7; // LCD_FP LCD_FP
jmitc91516 0:9140ec6aa604 522 IOCON_P2_2 |= 7; // LCD_DCLK LCD_DCLK
jmitc91516 0:9140ec6aa604 523 IOCON_P2_1 |= 7; // LCD_LE LCD_LE
jmitc91516 0:9140ec6aa604 524 IOCON_P2_0 |= 7; // LCD_PWR LCD_PWR
jmitc91516 0:9140ec6aa604 525 IOCON_P2_11 |= 7; // LCD_CLKIN LCD_CLKIN
jmitc91516 0:9140ec6aa604 526 */ // DEBUG - ANSWER - *** EVERYTHING STILL APPEARS TO WORK ***
jmitc91516 0:9140ec6aa604 527
jmitc91516 0:9140ec6aa604 528 /**************************************************/
jmitc91516 0:9140ec6aa604 529
jmitc91516 0:9140ec6aa604 530 // SetupQSPIBitmapArray(2);
jmitc91516 0:9140ec6aa604 531
jmitc91516 0:9140ec6aa604 532 #ifdef ALLOW_LPC4088_INIT
jmitc91516 0:9140ec6aa604 533 // Disable power
jmitc91516 0:9140ec6aa604 534 LCD_CTRL &= ~(1 << LCDEN);
jmitc91516 0:9140ec6aa604 535 millisecond_delay(100);
jmitc91516 0:9140ec6aa604 536 LCD_CTRL &= ~(1 << LCDPWR);
jmitc91516 0:9140ec6aa604 537
jmitc91516 0:9140ec6aa604 538 // ====================================
jmitc91516 0:9140ec6aa604 539 // Initialize Clock(PLL),EMC and SDRAM!
jmitc91516 0:9140ec6aa604 540 // ====================================
jmitc91516 0:9140ec6aa604 541
jmitc91516 0:9140ec6aa604 542 // Enable LCD controller
jmitc91516 0:9140ec6aa604 543 PCONP |= 1<<PCLCD;
jmitc91516 0:9140ec6aa604 544
jmitc91516 0:9140ec6aa604 545 // LCD Configuration init pixel clock
jmitc91516 0:9140ec6aa604 546 LCD_CFG |= (CLKDIV);
jmitc91516 0:9140ec6aa604 547
jmitc91516 0:9140ec6aa604 548 // Horizontal Timing register
jmitc91516 0:9140ec6aa604 549 LCD_TIMH |= ((HBP-1) << 24)|((HFP-1) << 16)|((HSW-1) << 8)|((PPL/16-1) << 2);
jmitc91516 0:9140ec6aa604 550
jmitc91516 0:9140ec6aa604 551 // Vertical Timing register
jmitc91516 0:9140ec6aa604 552 LCD_TIMV |= (VBP << 24)|(VFP << 16)|((VSW-1) << 10)|(LPP-1);
jmitc91516 0:9140ec6aa604 553
jmitc91516 0:9140ec6aa604 554 // Clock and Signal Polarity register
jmitc91516 0:9140ec6aa604 555 LCD_POL |= (BCD << 26)|((CPL-1) << 16)|(IOE << 14)|(IPC << 13)|
jmitc91516 0:9140ec6aa604 556 (IHS << 12)|(IVS << 11)|(CLKSEL << 5)| PCD_LO;
jmitc91516 0:9140ec6aa604 557
jmitc91516 0:9140ec6aa604 558 LCD_LE = 0;
jmitc91516 0:9140ec6aa604 559 LCD_INTMSK = 0;
jmitc91516 0:9140ec6aa604 560
jmitc91516 0:9140ec6aa604 561 #endif // ALLOW_LPC4088_INIT
jmitc91516 0:9140ec6aa604 562 // If we include the initialisation of the LCD control register,
jmitc91516 0:9140ec6aa604 563 // does this get red and blue the correct way round without flickering?
jmitc91516 0:9140ec6aa604 564
jmitc91516 0:9140ec6aa604 565 // LCD Control register
jmitc91516 0:9140ec6aa604 566 #ifdef GuiConst_COLOR_DEPTH_24
jmitc91516 0:9140ec6aa604 567 // TFT single panel,24bit, normal output
jmitc91516 0:9140ec6aa604 568 LCD_CTRL = 0x0000002A;
jmitc91516 0:9140ec6aa604 569 #else
jmitc91516 0:9140ec6aa604 570 #ifdef GuiConst_COLOR_DEPTH_16
jmitc91516 0:9140ec6aa604 571 // TFT single panel,16bit, normal output (BGR)
jmitc91516 0:9140ec6aa604 572 LCD_CTRL = 0x0000102C;
jmitc91516 0:9140ec6aa604 573 #else
jmitc91516 0:9140ec6aa604 574 #ifdef GuiConst_COLOR_DEPTH_8
jmitc91516 0:9140ec6aa604 575 // TFT single panel,8bit, normal output
jmitc91516 0:9140ec6aa604 576 LCD_CTRL = 0x00000026;
jmitc91516 0:9140ec6aa604 577 #else
jmitc91516 0:9140ec6aa604 578 // STN single panel, monochrome, 4bit bus, normal output
jmitc91516 0:9140ec6aa604 579 LCD_CTRL = 0x00000010;
jmitc91516 0:9140ec6aa604 580 #endif
jmitc91516 0:9140ec6aa604 581 #endif
jmitc91516 0:9140ec6aa604 582 #endif
jmitc91516 0:9140ec6aa604 583
jmitc91516 0:9140ec6aa604 584
jmitc91516 0:9140ec6aa604 585 #ifdef GuiConst_COLOR_DEPTH_24
jmitc91516 0:9140ec6aa604 586 framePtr = (GuiConst_INT32U *)FRAME_ADDRESS;
jmitc91516 0:9140ec6aa604 587 #else
jmitc91516 0:9140ec6aa604 588 #ifdef GuiConst_COLOR_DEPTH_16
jmitc91516 0:9140ec6aa604 589 framePtr = (GuiConst_INT16U *)FRAME_ADDRESS;
jmitc91516 0:9140ec6aa604 590 #else
jmitc91516 0:9140ec6aa604 591 framePtr = (GuiConst_INT8U *)FRAME_ADDRESS;
jmitc91516 0:9140ec6aa604 592 pDst = (GuiConst_INT32U *)PALETTE_RAM_ADDR;
jmitc91516 0:9140ec6aa604 593 for (i = 0; i < 128; i++)
jmitc91516 0:9140ec6aa604 594 {
jmitc91516 0:9140ec6aa604 595 #ifdef GuiConst_COLOR_DEPTH_1
jmitc91516 0:9140ec6aa604 596 PaletteData = 0xFFFF0000;
jmitc91516 0:9140ec6aa604 597 #else
jmitc91516 0:9140ec6aa604 598 PaletteData = GuiStruct_Palette[2*i][0];
jmitc91516 0:9140ec6aa604 599 PaletteData |= (GuiConst_INT32U)GuiStruct_Palette[2*i][1]<<8;
jmitc91516 0:9140ec6aa604 600 PaletteData |= (GuiConst_INT32U)GuiStruct_Palette[2*i+1][0]<<16;
jmitc91516 0:9140ec6aa604 601 PaletteData |= (GuiConst_INT32U)GuiStruct_Palette[2*i+1][1]<<24;
jmitc91516 0:9140ec6aa604 602 #endif
jmitc91516 0:9140ec6aa604 603 *pDst++ = PaletteData;
jmitc91516 0:9140ec6aa604 604 }
jmitc91516 0:9140ec6aa604 605 #endif
jmitc91516 0:9140ec6aa604 606 #endif
jmitc91516 0:9140ec6aa604 607
jmitc91516 0:9140ec6aa604 608 // Clear frame buffer by copying the data into frame buffer
jmitc91516 0:9140ec6aa604 609 #ifdef GuiConst_COLOR_DEPTH_24
jmitc91516 0:9140ec6aa604 610 for (i = 0; i < GuiConst_DISPLAY_BYTES/3; i++)
jmitc91516 0:9140ec6aa604 611 *framePtr++ = 0x00000000; // Color
jmitc91516 0:9140ec6aa604 612 #else
jmitc91516 0:9140ec6aa604 613 #ifdef GuiConst_COLOR_DEPTH_16
jmitc91516 0:9140ec6aa604 614 for (i = 0; i < GuiConst_DISPLAY_BYTES/2; i++)
jmitc91516 0:9140ec6aa604 615 *framePtr++ = 0x0000; // Color
jmitc91516 0:9140ec6aa604 616 #else
jmitc91516 0:9140ec6aa604 617 for (i = 0; i < GuiConst_DISPLAY_BYTES; i++)
jmitc91516 0:9140ec6aa604 618 *framePtr++ = 0x00; // Color
jmitc91516 0:9140ec6aa604 619 #endif
jmitc91516 0:9140ec6aa604 620 #endif
jmitc91516 0:9140ec6aa604 621
jmitc91516 0:9140ec6aa604 622 // LCD_CFG = 0;
jmitc91516 0:9140ec6aa604 623
jmitc91516 0:9140ec6aa604 624 millisecond_delay(100);
jmitc91516 0:9140ec6aa604 625 // Power-up sequence
jmitc91516 0:9140ec6aa604 626 LCD_CTRL |= 1<<LCDEN;
jmitc91516 0:9140ec6aa604 627 // Apply contrast voltage to LCD panel
jmitc91516 0:9140ec6aa604 628 // (not controlled or supplied by the LCD controller)
jmitc91516 0:9140ec6aa604 629 millisecond_delay(100);
jmitc91516 0:9140ec6aa604 630 LCD_CTRL |= 1<<LCDPWR;
jmitc91516 0:9140ec6aa604 631
jmitc91516 0:9140ec6aa604 632 // Set start address of frame buffer in RAM memory
jmitc91516 0:9140ec6aa604 633 LCD_LPBASE = FRAME_ADDRESS;
jmitc91516 0:9140ec6aa604 634 LCD_UPBASE = FRAME_ADDRESS;
jmitc91516 0:9140ec6aa604 635 }
jmitc91516 0:9140ec6aa604 636
jmitc91516 0:9140ec6aa604 637 #ifdef WANT_DOUBLE_BUFFERING
jmitc91516 0:9140ec6aa604 638 // *** Need complete GuiDisplay_Refresh ***
jmitc91516 0:9140ec6aa604 639
jmitc91516 0:9140ec6aa604 640 // Refreshes display buffer to display
jmitc91516 0:9140ec6aa604 641 void GuiDisplay_Refresh (void)
jmitc91516 0:9140ec6aa604 642 {
jmitc91516 0:9140ec6aa604 643 GuiConst_INT32U Pixel, X, Y, LastByte;
jmitc91516 0:9140ec6aa604 644 #ifdef GuiConst_COLOR_DEPTH_24
jmitc91516 0:9140ec6aa604 645 GuiConst_INT32U *framePtr;
jmitc91516 0:9140ec6aa604 646 #else
jmitc91516 0:9140ec6aa604 647 #ifdef GuiConst_COLOR_DEPTH_16
jmitc91516 0:9140ec6aa604 648 GuiConst_INT16U *framePtr;
jmitc91516 0:9140ec6aa604 649 #else
jmitc91516 0:9140ec6aa604 650 // Valid also for monochrome STN display
jmitc91516 0:9140ec6aa604 651 GuiConst_INT8U *framePtr;
jmitc91516 0:9140ec6aa604 652 #endif
jmitc91516 0:9140ec6aa604 653 #endif
jmitc91516 0:9140ec6aa604 654
jmitc91516 0:9140ec6aa604 655 GuiDisplay_Lock ();
jmitc91516 0:9140ec6aa604 656
jmitc91516 0:9140ec6aa604 657 // Walk through all lines
jmitc91516 0:9140ec6aa604 658 for (Y = 0; Y < GuiConst_BYTE_LINES; Y++)
jmitc91516 0:9140ec6aa604 659 {
jmitc91516 0:9140ec6aa604 660 if (GuiLib_DisplayRepaint[Y].ByteEnd >= 0)
jmitc91516 0:9140ec6aa604 661 // Something to redraw in this line
jmitc91516 0:9140ec6aa604 662 {
jmitc91516 0:9140ec6aa604 663 #ifdef GuiConst_COLOR_DEPTH_24
jmitc91516 0:9140ec6aa604 664 // Set video ram base address
jmitc91516 0:9140ec6aa604 665 framePtr = (GuiConst_INT32U *)FRAME_ADDRESS;
jmitc91516 0:9140ec6aa604 666 // Pointer offset calculation
jmitc91516 0:9140ec6aa604 667 framePtr += Y * GuiConst_BYTES_PR_LINE/3 +
jmitc91516 0:9140ec6aa604 668 GuiLib_DisplayRepaint[Y].ByteBegin;
jmitc91516 0:9140ec6aa604 669 // Set amount of data to be changed
jmitc91516 0:9140ec6aa604 670 LastByte = GuiConst_BYTES_PR_LINE/3 - 1;
jmitc91516 0:9140ec6aa604 671 #else
jmitc91516 0:9140ec6aa604 672 #ifdef GuiConst_COLOR_DEPTH_16
jmitc91516 0:9140ec6aa604 673 // Set video ram base address
jmitc91516 0:9140ec6aa604 674 framePtr = (GuiConst_INT16U *)FRAME_ADDRESS;
jmitc91516 0:9140ec6aa604 675 // Pointer offset calculation
jmitc91516 0:9140ec6aa604 676 framePtr += Y * GuiConst_BYTES_PR_LINE/2 +
jmitc91516 0:9140ec6aa604 677 GuiLib_DisplayRepaint[Y].ByteBegin;
jmitc91516 0:9140ec6aa604 678 // Set amount of data to be changed
jmitc91516 0:9140ec6aa604 679 LastByte = GuiConst_BYTES_PR_LINE/2 - 1;
jmitc91516 0:9140ec6aa604 680 #else
jmitc91516 0:9140ec6aa604 681 // Valid also for monochrome STN display
jmitc91516 0:9140ec6aa604 682 // Set video ram base address
jmitc91516 0:9140ec6aa604 683 framePtr = (GuiConst_INT8U *)FRAME_ADDRESS;
jmitc91516 0:9140ec6aa604 684 // Pointer offset calculation
jmitc91516 0:9140ec6aa604 685 framePtr += Y * GuiConst_BYTES_PR_LINE +
jmitc91516 0:9140ec6aa604 686 GuiLib_DisplayRepaint[Y].ByteBegin;
jmitc91516 0:9140ec6aa604 687 // Set amount of data to be changed
jmitc91516 0:9140ec6aa604 688 LastByte = GuiConst_BYTES_PR_LINE - 1;
jmitc91516 0:9140ec6aa604 689 #endif
jmitc91516 0:9140ec6aa604 690 #endif
jmitc91516 0:9140ec6aa604 691 if (GuiLib_DisplayRepaint[Y].ByteEnd < LastByte)
jmitc91516 0:9140ec6aa604 692 LastByte = GuiLib_DisplayRepaint[Y].ByteEnd;
jmitc91516 0:9140ec6aa604 693
jmitc91516 0:9140ec6aa604 694 // Write data for one line to framebuffer from GuiLib_DisplayBuf
jmitc91516 0:9140ec6aa604 695 #ifdef GuiConst_COLOR_DEPTH_24
jmitc91516 0:9140ec6aa604 696 for (X = GuiLib_DisplayRepaint[Y].ByteBegin * 3;
jmitc91516 0:9140ec6aa604 697 X <= (LastByte * 3 + 2);
jmitc91516 0:9140ec6aa604 698 X = X + 3)
jmitc91516 0:9140ec6aa604 699 {
jmitc91516 0:9140ec6aa604 700 Pixel = GuiLib_DisplayBuf[Y][X];
jmitc91516 0:9140ec6aa604 701 Pixel |= (GuiConst_INT32U)GuiLib_DisplayBuf[Y][X+1]<<8;
jmitc91516 0:9140ec6aa604 702 Pixel |= (GuiConst_INT32U)GuiLib_DisplayBuf[Y][X+2]<<16;
jmitc91516 0:9140ec6aa604 703 *framePtr++ = Pixel;
jmitc91516 0:9140ec6aa604 704 }
jmitc91516 0:9140ec6aa604 705 #else
jmitc91516 0:9140ec6aa604 706 #ifdef GuiConst_COLOR_DEPTH_16
jmitc91516 0:9140ec6aa604 707 for (X = GuiLib_DisplayRepaint[Y].ByteBegin; X <= LastByte; X++)
jmitc91516 0:9140ec6aa604 708 {
jmitc91516 0:9140ec6aa604 709 *framePtr++ = GuiLib_DisplayBuf.Words[Y][X];
jmitc91516 0:9140ec6aa604 710 }
jmitc91516 0:9140ec6aa604 711 #else
jmitc91516 0:9140ec6aa604 712 // Valid also for monochrome STN display
jmitc91516 0:9140ec6aa604 713 for (X = GuiLib_DisplayRepaint[Y].ByteBegin; X <= LastByte; X++)
jmitc91516 0:9140ec6aa604 714 *framePtr++ = GuiLib_DisplayBuf[Y][X];
jmitc91516 0:9140ec6aa604 715 #endif
jmitc91516 0:9140ec6aa604 716 #endif
jmitc91516 0:9140ec6aa604 717 // Reset repaint parameters
jmitc91516 0:9140ec6aa604 718 GuiLib_DisplayRepaint[Y].ByteEnd = -1;
jmitc91516 0:9140ec6aa604 719 }
jmitc91516 0:9140ec6aa604 720 }
jmitc91516 0:9140ec6aa604 721 GuiDisplay_Unlock ();
jmitc91516 0:9140ec6aa604 722 }
jmitc91516 0:9140ec6aa604 723
jmitc91516 0:9140ec6aa604 724 #else // WANT_DOUBLE_BUFFERING
jmitc91516 0:9140ec6aa604 725
jmitc91516 0:9140ec6aa604 726 // We are already writing direct to the display -
jmitc91516 0:9140ec6aa604 727 // GuiDisplay_Refresh does not need to do anything
jmitc91516 0:9140ec6aa604 728 // (but other code still expects it to exist)
jmitc91516 0:9140ec6aa604 729 void GuiDisplay_Refresh (void)
jmitc91516 0:9140ec6aa604 730 {
jmitc91516 0:9140ec6aa604 731 }
jmitc91516 0:9140ec6aa604 732
jmitc91516 0:9140ec6aa604 733 #endif // WANT_DOUBLE_BUFFERING
jmitc91516 0:9140ec6aa604 734
jmitc91516 0:9140ec6aa604 735 #endif // LCD_CONTROLLER_TYPE_LPC408X
jmitc91516 0:9140ec6aa604 736
jmitc91516 0:9140ec6aa604 737 // ============================================================================
jmitc91516 0:9140ec6aa604 738 //
jmitc91516 0:9140ec6aa604 739 // DISPLAY DRIVER PART ENDS
jmitc91516 0:9140ec6aa604 740 //
jmitc91516 0:9140ec6aa604 741 // ============================================================================
jmitc91516 0:9140ec6aa604 742