1 /* ----------------------------------------------------------------------------
\r
2 * ATMEL Microcontroller Software Support
\r
3 * ----------------------------------------------------------------------------
\r
4 * Copyright (c) 2008, Atmel Corporation
\r
6 * All rights reserved.
\r
8 * Redistribution and use in source and binary forms, with or without
\r
9 * modification, are permitted provided that the following conditions are met:
\r
11 * - Redistributions of source code must retain the above copyright notice,
\r
12 * this list of conditions and the disclaimer below.
\r
14 * Atmel's name may not be used to endorse or promote products derived from
\r
15 * this software without specific prior written permission.
\r
17 * DISCLAIMER: THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR
\r
18 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
\r
19 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE
\r
20 * DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR ANY DIRECT, INDIRECT,
\r
21 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
\r
22 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
\r
23 * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
\r
24 * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
\r
25 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
\r
26 * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
\r
27 * ----------------------------------------------------------------------------
\r
30 //------------------------------------------------------------------------------
\r
39 /// Explanation on the usage of the code made available through the header file.
\r
40 //------------------------------------------------------------------------------
\r
42 //------------------------------------------------------------------------------
\r
44 //------------------------------------------------------------------------------
\r
48 #ifdef BOARD_LCD_HX8347
\r
52 //------------------------------------------------------------------------------
\r
54 //------------------------------------------------------------------------------
\r
55 typedef volatile unsigned short REG16;
\r
57 //------------------------------------------------------------------------------
\r
59 //------------------------------------------------------------------------------
\r
60 /// LCD index register address
\r
61 #define LCD_IR(baseAddr) (*((REG16 *)(baseAddr)))
\r
62 /// LCD status register address
\r
63 #define LCD_SR(baseAddr) (*((REG16 *)(baseAddr)))
\r
64 /// LCD data address
\r
65 #define LCD_D(baseAddr) (*((REG16 *)((unsigned int)(baseAddr) + BOARD_LCD_RS)))
\r
68 #define HX8347_HIMAXID_CODE 0x47
\r
70 /// HX8347 LCD Registers
\r
71 #define HX8347_R00H 0x00
\r
72 #define HX8347_R01H 0x01
\r
73 #define HX8347_R02H 0x02
\r
74 #define HX8347_R03H 0x03
\r
75 #define HX8347_R04H 0x04
\r
76 #define HX8347_R05H 0x05
\r
77 #define HX8347_R06H 0x06
\r
78 #define HX8347_R07H 0x07
\r
79 #define HX8347_R08H 0x08
\r
80 #define HX8347_R09H 0x09
\r
81 #define HX8347_R0AH 0x0A
\r
82 #define HX8347_R0CH 0x0C
\r
83 #define HX8347_R0DH 0x0D
\r
84 #define HX8347_R0EH 0x0E
\r
85 #define HX8347_R0FH 0x0F
\r
86 #define HX8347_R10H 0x10
\r
87 #define HX8347_R11H 0x11
\r
88 #define HX8347_R12H 0x12
\r
89 #define HX8347_R13H 0x13
\r
90 #define HX8347_R14H 0x14
\r
91 #define HX8347_R15H 0x15
\r
92 #define HX8347_R16H 0x16
\r
93 #define HX8347_R18H 0x18
\r
94 #define HX8347_R19H 0x19
\r
95 #define HX8347_R1AH 0x1A
\r
96 #define HX8347_R1BH 0x1B
\r
97 #define HX8347_R1CH 0x1C
\r
98 #define HX8347_R1DH 0x1D
\r
99 #define HX8347_R1EH 0x1E
\r
100 #define HX8347_R1FH 0x1F
\r
101 #define HX8347_R20H 0x20
\r
102 #define HX8347_R21H 0x21
\r
103 #define HX8347_R22H 0x22
\r
104 #define HX8347_R23H 0x23
\r
105 #define HX8347_R24H 0x24
\r
106 #define HX8347_R25H 0x25
\r
107 #define HX8347_R26H 0x26
\r
108 #define HX8347_R27H 0x27
\r
109 #define HX8347_R28H 0x28
\r
110 #define HX8347_R29H 0x29
\r
111 #define HX8347_R2AH 0x2A
\r
112 #define HX8347_R2BH 0x2B
\r
113 #define HX8347_R2CH 0x2C
\r
114 #define HX8347_R2DH 0x2D
\r
115 #define HX8347_R35H 0x35
\r
116 #define HX8347_R36H 0x36
\r
117 #define HX8347_R37H 0x37
\r
118 #define HX8347_R38H 0x38
\r
119 #define HX8347_R39H 0x39
\r
120 #define HX8347_R3AH 0x3A
\r
121 #define HX8347_R3BH 0x3B
\r
122 #define HX8347_R3CH 0x3C
\r
123 #define HX8347_R3DH 0x3D
\r
124 #define HX8347_R3EH 0x3E
\r
125 #define HX8347_R40H 0x40
\r
126 #define HX8347_R41H 0x41
\r
127 #define HX8347_R42H 0x42
\r
128 #define HX8347_R43H 0x43
\r
129 #define HX8347_R44H 0x44
\r
130 #define HX8347_R45H 0x45
\r
131 #define HX8347_R46H 0x46
\r
132 #define HX8347_R47H 0x47
\r
133 #define HX8347_R48H 0x48
\r
134 #define HX8347_R49H 0x49
\r
135 #define HX8347_R4AH 0x4A
\r
136 #define HX8347_R4BH 0x4B
\r
137 #define HX8347_R4CH 0x4C
\r
138 #define HX8347_R4DH 0x4D
\r
139 #define HX8347_R4EH 0x4E
\r
140 #define HX8347_R4FH 0x4F
\r
141 #define HX8347_R50H 0x50
\r
142 #define HX8347_R51H 0x51
\r
143 #define HX8347_R64H 0x64
\r
144 #define HX8347_R65H 0x65
\r
145 #define HX8347_R66H 0x66
\r
146 #define HX8347_R67H 0x67
\r
147 #define HX8347_R70H 0x70
\r
148 #define HX8347_R72H 0x72
\r
149 #define HX8347_R90H 0x90
\r
150 #define HX8347_R91H 0x91
\r
151 #define HX8347_R93H 0x93
\r
152 #define HX8347_R94H 0x94
\r
153 #define HX8347_R95H 0x95
\r
155 //------------------------------------------------------------------------------
\r
156 // External functions
\r
157 //------------------------------------------------------------------------------
\r
158 // External delay 1 ms function
\r
159 #include "FreeRTOS.h"
\r
161 #define Delay(ms) vTaskDelay(ms/portTICK_RATE_MS)
\r
163 //------------------------------------------------------------------------------
\r
164 // Global functions
\r
165 //------------------------------------------------------------------------------
\r
167 //------------------------------------------------------------------------------
\r
168 /// Write data to LCD Register.
\r
169 /// \param pLcdBase LCD base address.
\r
170 /// \param reg Register address.
\r
171 /// \param data Data to be written.
\r
172 //------------------------------------------------------------------------------
\r
173 void LCD_WriteReg(void *pLcdBase, unsigned char reg, unsigned short data)
\r
175 LCD_IR(pLcdBase) = reg;
\r
176 LCD_D(pLcdBase) = data;
\r
179 //------------------------------------------------------------------------------
\r
180 /// Read data from LCD Register.
\r
181 /// \param pLcdBase LCD base address.
\r
182 /// \param reg Register address.
\r
183 /// \return data Data to be read.
\r
184 //------------------------------------------------------------------------------
\r
185 unsigned short LCD_ReadReg(void *pLcdBase, unsigned char reg)
\r
187 LCD_IR(pLcdBase) = reg;
\r
188 return LCD_D(pLcdBase);
\r
191 //------------------------------------------------------------------------------
\r
192 /// Read LCD status Register.
\r
193 /// \param pLcdBase LCD base address.
\r
194 /// \param reg Register address.
\r
195 /// \return data Status Data.
\r
196 //------------------------------------------------------------------------------
\r
197 unsigned short LCD_ReadStatus(void *pLcdBase)
\r
199 return LCD_SR(pLcdBase);
\r
202 //------------------------------------------------------------------------------
\r
203 /// Prepare to write GRAM data.
\r
204 /// \param pLcdBase LCD base address.
\r
205 //------------------------------------------------------------------------------
\r
206 void LCD_WriteRAM_Prepare(void *pLcdBase)
\r
208 LCD_IR(pLcdBase) = HX8347_R22H;
\r
211 //------------------------------------------------------------------------------
\r
212 /// Write data to LCD GRAM.
\r
213 /// \param pLcdBase LCD base address.
\r
214 /// \param color 16-bits RGB color.
\r
215 //------------------------------------------------------------------------------
\r
216 void LCD_WriteRAM(void *pLcdBase, unsigned short color)
\r
218 // Write 16-bit GRAM Reg
\r
219 LCD_D(pLcdBase) = color;
\r
222 //------------------------------------------------------------------------------
\r
223 /// Read GRAM data.
\r
224 /// \param pLcdBase LCD base address.
\r
225 /// \return 16-bits RGB color.
\r
226 //------------------------------------------------------------------------------
\r
227 unsigned short LCD_ReadRAM(void *pLcdBase)
\r
229 // Read 16-bit GRAM Reg
\r
230 return LCD_D(pLcdBase);
\r
233 //------------------------------------------------------------------------------
\r
234 /// Dump register data.
\r
235 /// \param pLcdBase LCD base address.
\r
236 /// \param startAddr Register start address.
\r
237 /// \param endAddr Register end address.
\r
238 //------------------------------------------------------------------------------
\r
239 void LCD_DumpReg(void *pLcdBase, unsigned char startAddr, unsigned char endAddr)
\r
241 unsigned short tmp;
\r
242 unsigned char addr;
\r
244 for (addr = startAddr; addr <= endAddr; addr++) {
\r
246 tmp = LCD_ReadReg(pLcdBase, addr);
\r
247 printf("LCD.r 0x%x = 0x%x\n\r", addr, tmp);
\r
251 //------------------------------------------------------------------------------
\r
252 /// Initialize the LCD controller.
\r
253 /// \param pLcdBase LCD base address.
\r
254 //------------------------------------------------------------------------------
\r
255 void LCD_Initialize(void *pLcdBase)
\r
257 unsigned short chipid;
\r
259 // Check HX8347 chipid
\r
260 chipid = LCD_ReadReg(pLcdBase, HX8347_R67H);
\r
261 if(chipid != HX8347_HIMAXID_CODE) {
\r
263 printf("Read HX8347 chip ID error, skip initialization.\r\n");
\r
267 // Start internal OSC
\r
268 LCD_WriteReg(pLcdBase, HX8347_R19H, 0x49); // OSCADJ=10 0000, OSD_EN=1 //60Hz
\r
269 LCD_WriteReg(pLcdBase, HX8347_R93H, 0x0C); // RADJ=1100
\r
272 LCD_WriteReg(pLcdBase, HX8347_R44H, 0x4D); // VCM=100 1101
\r
273 LCD_WriteReg(pLcdBase, HX8347_R45H, 0x11); // VDV=1 0001
\r
274 LCD_WriteReg(pLcdBase, HX8347_R20H, 0x40); // BT=0100
\r
275 LCD_WriteReg(pLcdBase, HX8347_R1DH, 0x07); // VC1=111
\r
276 LCD_WriteReg(pLcdBase, HX8347_R1EH, 0x00); // VC3=000
\r
277 LCD_WriteReg(pLcdBase, HX8347_R1FH, 0x04); // VRH=0100
\r
279 LCD_WriteReg(pLcdBase, HX8347_R1CH, 0x04); // AP=100
\r
280 LCD_WriteReg(pLcdBase, HX8347_R1BH, 0x10); // GASENB=0, PON=1, DK=0, XDK=0, DDVDH_TRI=0, STB=0
\r
283 LCD_WriteReg(pLcdBase, HX8347_R43H, 0x80); // Set VCOMG=1
\r
286 // Gamma for CMO 2.8
\r
287 LCD_WriteReg(pLcdBase, HX8347_R46H, 0x95);
\r
288 LCD_WriteReg(pLcdBase, HX8347_R47H, 0x51);
\r
289 LCD_WriteReg(pLcdBase, HX8347_R48H, 0x00);
\r
290 LCD_WriteReg(pLcdBase, HX8347_R49H, 0x36);
\r
291 LCD_WriteReg(pLcdBase, HX8347_R4AH, 0x11);
\r
292 LCD_WriteReg(pLcdBase, HX8347_R4BH, 0x66);
\r
293 LCD_WriteReg(pLcdBase, HX8347_R4CH, 0x14);
\r
294 LCD_WriteReg(pLcdBase, HX8347_R4DH, 0x77);
\r
295 LCD_WriteReg(pLcdBase, HX8347_R4EH, 0x13);
\r
296 LCD_WriteReg(pLcdBase, HX8347_R4FH, 0x4C);
\r
297 LCD_WriteReg(pLcdBase, HX8347_R50H, 0x46);
\r
298 LCD_WriteReg(pLcdBase, HX8347_R51H, 0x46);
\r
300 //240x320 window setting
\r
301 LCD_WriteReg(pLcdBase, HX8347_R02H, 0x00); // Column address start2
\r
302 LCD_WriteReg(pLcdBase, HX8347_R03H, 0x00); // Column address start1
\r
303 LCD_WriteReg(pLcdBase, HX8347_R04H, 0x00); // Column address end2
\r
304 LCD_WriteReg(pLcdBase, HX8347_R05H, 0xEF); // Column address end1
\r
305 LCD_WriteReg(pLcdBase, HX8347_R06H, 0x00); // Row address start2
\r
306 LCD_WriteReg(pLcdBase, HX8347_R07H, 0x00); // Row address start1
\r
307 LCD_WriteReg(pLcdBase, HX8347_R08H, 0x01); // Row address end2
\r
308 LCD_WriteReg(pLcdBase, HX8347_R09H, 0x3F); // Row address end1
\r
311 LCD_WriteReg(pLcdBase, HX8347_R01H, 0x06); // IDMON=0, INVON=1, NORON=1, PTLON=0
\r
312 LCD_WriteReg(pLcdBase, HX8347_R16H, 0xC8); // MY=1, MX=1, MV=0, BGR=1
\r
313 LCD_WriteReg(pLcdBase, HX8347_R23H, 0x95); // N_DC=1001 0101
\r
314 LCD_WriteReg(pLcdBase, HX8347_R24H, 0x95); // P_DC=1001 0101
\r
315 LCD_WriteReg(pLcdBase, HX8347_R25H, 0xFF); // I_DC=1111 1111
\r
316 LCD_WriteReg(pLcdBase, HX8347_R27H, 0x06); // N_BP=0000 0110
\r
317 LCD_WriteReg(pLcdBase, HX8347_R28H, 0x06); // N_FP=0000 0110
\r
318 LCD_WriteReg(pLcdBase, HX8347_R29H, 0x06); // P_BP=0000 0110
\r
319 LCD_WriteReg(pLcdBase, HX8347_R2AH, 0x06); // P_FP=0000 0110
\r
320 LCD_WriteReg(pLcdBase, HX8347_R2CH, 0x06); // I_BP=0000 0110
\r
321 LCD_WriteReg(pLcdBase, HX8347_R2DH, 0x06); // I_FP=0000 0110
\r
322 LCD_WriteReg(pLcdBase, HX8347_R3AH, 0x01); // N_RTN=0000, N_NW=001
\r
323 LCD_WriteReg(pLcdBase, HX8347_R3BH, 0x01); // P_RTN=0000, P_NW=001
\r
324 LCD_WriteReg(pLcdBase, HX8347_R3CH, 0xF0); // I_RTN=1111, I_NW=000
\r
325 LCD_WriteReg(pLcdBase, HX8347_R3DH, 0x00); // DIV=00
\r
326 LCD_WriteReg(pLcdBase, HX8347_R3EH, 0x38); // SON=38h
\r
327 LCD_WriteReg(pLcdBase, HX8347_R40H, 0x0F); // GDON=0Fh
\r
328 LCD_WriteReg(pLcdBase, HX8347_R41H, 0xF0); // GDOF=F0h
\r
331 //------------------------------------------------------------------------------
\r
332 /// Turn on the LCD.
\r
333 /// \param pLcdBase LCD base address.
\r
334 //------------------------------------------------------------------------------
\r
335 void LCD_On(void *pLcdBase)
\r
337 // Display ON Setting
\r
338 LCD_WriteReg(pLcdBase, HX8347_R90H, 0x7F); // SAP=0111 1111
\r
339 LCD_WriteReg(pLcdBase, HX8347_R26H, 0x04); // GON=0, DTE=0, D=01
\r
341 LCD_WriteReg(pLcdBase, HX8347_R26H, 0x24); // GON=1, DTE=0, D=01
\r
342 LCD_WriteReg(pLcdBase, HX8347_R26H, 0x2C); // GON=1, DTE=0, D=11
\r
344 LCD_WriteReg(pLcdBase, HX8347_R26H, 0x3C); // GON=1, DTE=1, D=11
\r
347 //------------------------------------------------------------------------------
\r
348 /// Turn off the LCD.
\r
349 /// \param pLcdBase LCD base address.
\r
350 //------------------------------------------------------------------------------
\r
351 void LCD_Off(void *pLcdBase)
\r
353 LCD_WriteReg(pLcdBase, HX8347_R90H, 0x00); // SAP=0000 0000
\r
354 LCD_WriteReg(pLcdBase, HX8347_R26H, 0x00); // GON=0, DTE=0, D=00
\r
357 //------------------------------------------------------------------------------
\r
358 /// Set cursor of LCD srceen.
\r
359 /// \param pLcdBase LCD base address.
\r
360 /// \param x X-coordinate of upper-left corner on LCD.
\r
361 /// \param y Y-coordinate of upper-left corner on LCD.
\r
362 //------------------------------------------------------------------------------
\r
363 void LCD_SetCursor(void *pLcdBase, unsigned short x, unsigned short y)
\r
365 unsigned char x1, x2, y1, y2;
\r
368 x2 = (x & 0xff00) >>8;
\r
370 y2 = (y & 0xff00) >>8;
\r
371 LCD_WriteReg(pLcdBase, HX8347_R02H, x2); // column high
\r
372 LCD_WriteReg(pLcdBase, HX8347_R03H, x1); // column low
\r
373 LCD_WriteReg(pLcdBase, HX8347_R06H, y2); // row high
\r
374 LCD_WriteReg(pLcdBase, HX8347_R07H, y1); // row low
\r
376 #endif //#ifdef BOARD_LCD_HX8347
\r