]> git.sur5r.net Git - freertos/blob - FreeRTOS/Demo/CORTEX_AT91SAM3U256_IAR/AT91Lib/components/hx8347/hx8347.c
6c99d52c061f6612fa9523b3d4c756bfa8f1c556
[freertos] / FreeRTOS / Demo / CORTEX_AT91SAM3U256_IAR / AT91Lib / components / hx8347 / hx8347.c
1 /* ----------------------------------------------------------------------------\r
2  *         ATMEL Microcontroller Software Support\r
3  * ----------------------------------------------------------------------------\r
4  * Copyright (c) 2008, Atmel Corporation\r
5  *\r
6  * All rights reserved.\r
7  *\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
10  *\r
11  * - Redistributions of source code must retain the above copyright notice,\r
12  * this list of conditions and the disclaimer below.\r
13  *\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
16  *\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
28  */\r
29 \r
30 //------------------------------------------------------------------------------\r
31 /// \unit\r
32 ///\r
33 /// !Purpose\r
34 ///\r
35 /// HX8347 driver\r
36 ///\r
37 /// !Usage\r
38 ///\r
39 /// Explanation on the usage of the code made available through the header file.\r
40 //------------------------------------------------------------------------------\r
41 \r
42 //------------------------------------------------------------------------------\r
43 //         Headers\r
44 //------------------------------------------------------------------------------\r
45 #include <board.h>\r
46 #include <stdio.h>\r
47 \r
48 #ifdef BOARD_LCD_HX8347\r
49 \r
50 #include "hx8347.h"\r
51 \r
52 //------------------------------------------------------------------------------\r
53 //         Types\r
54 //------------------------------------------------------------------------------\r
55 typedef volatile unsigned short REG16;\r
56 \r
57 //------------------------------------------------------------------------------\r
58 //         Definitions\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
66 \r
67 /// HX8347 ID code\r
68 #define HX8347_HIMAXID_CODE    0x47\r
69 \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
154 \r
155 //------------------------------------------------------------------------------\r
156 //         External functions\r
157 //------------------------------------------------------------------------------\r
158 // External delay 1 ms function\r
159 #include "FreeRTOS.h"\r
160 #include "task.h"\r
161 #define Delay(ms) vTaskDelay(ms/portTICK_RATE_MS)\r
162 \r
163 //------------------------------------------------------------------------------\r
164 //         Global functions\r
165 //------------------------------------------------------------------------------\r
166 \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
174 {\r
175     LCD_IR(pLcdBase) = reg;\r
176     LCD_D(pLcdBase)  = data;\r
177 }\r
178 \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
186 {\r
187     LCD_IR(pLcdBase) = reg;\r
188     return LCD_D(pLcdBase);\r
189 }\r
190 \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
198 {\r
199     return LCD_SR(pLcdBase);\r
200 }\r
201 \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
207 {\r
208     LCD_IR(pLcdBase) = HX8347_R22H;\r
209 }\r
210 \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
217 {\r
218     // Write 16-bit GRAM Reg\r
219     LCD_D(pLcdBase) = color;\r
220 }\r
221 \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
228 {\r
229     // Read 16-bit GRAM Reg\r
230     return LCD_D(pLcdBase);\r
231 }\r
232 \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
240 {\r
241     unsigned short tmp;\r
242     unsigned char addr;\r
243 \r
244     for (addr = startAddr; addr <= endAddr; addr++) {\r
245 \r
246         tmp = LCD_ReadReg(pLcdBase, addr);\r
247         printf("LCD.r 0x%x = 0x%x\n\r", addr, tmp);\r
248     }\r
249 }\r
250 \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
256 {\r
257     unsigned short chipid;\r
258 \r
259     // Check HX8347 chipid\r
260     chipid = LCD_ReadReg(pLcdBase, HX8347_R67H);\r
261     if(chipid != HX8347_HIMAXID_CODE) {\r
262 \r
263         printf("Read HX8347 chip ID error, skip initialization.\r\n");\r
264         return ;\r
265     }\r
266 \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
270 \r
271     // Power on flow\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
278 \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
281     Delay(50);\r
282 \r
283     LCD_WriteReg(pLcdBase, HX8347_R43H, 0x80); // Set VCOMG=1\r
284     Delay(50);\r
285 \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
299 \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
309 \r
310     // Display Setting\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
329 }\r
330 \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
336 {\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
340     Delay(100);\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
343     Delay(100);\r
344     LCD_WriteReg(pLcdBase, HX8347_R26H, 0x3C); // GON=1, DTE=1, D=11\r
345 }\r
346 \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
352 {\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
355 }\r
356 \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
364 {\r
365     unsigned char x1, x2, y1, y2;\r
366 \r
367     x1 = x & 0xff;\r
368     x2 = (x & 0xff00) >>8;\r
369     y1 = y & 0xff;\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
375 }\r
376 #endif //#ifdef BOARD_LCD_HX8347\r