tizen 2.4 release
[kernel/u-boot-tm1.git] / drivers / video / lcd_ili9486.c
1 /* drivers/video/sc8810/lcd_ili9486.c
2  *
3  * Support for ili9486 LCD device
4  *
5  * Copyright (C) 2010 Spreadtrum
6  *
7  * This software is licensed under the terms of the GNU General Public
8  * License version 2, as published by the Free Software Foundation, and
9  * may be copied, distributed, and modified under those terms.
10  *
11  * This program is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14  * GNU General Public License for more details.
15  */
16
17 #include <common.h>
18
19 #include <asm/arch/sc8810_lcd.h>
20 #define mdelay(a) udelay(a * 1000)
21 #define printk printf
22
23 #define  LCD_DEBUG
24 #ifdef LCD_DEBUG
25 #define LCD_PRINT printk
26 #else
27 #define LCD_PRINT(...)
28 #endif
29
30 static int32_t ili9486_init(struct lcd_spec *self)
31 {
32         Send_data send_cmd = self->info.mcu->ops->send_cmd;
33         Send_data send_data = self->info.mcu->ops->send_data;
34
35         LCD_PRINT("ili9486_init\n");
36
37         // Hidden register setting
38         send_cmd(0xF9); 
39         send_data(0x00);
40         send_data(0x08);        
41
42         send_cmd(0xF2); 
43         send_data(0x18);
44         send_data(0xA3);        
45         send_data(0x02);
46         send_data(0x02);        
47         send_data(0xB2);
48         send_data(0x12);        
49         send_data(0xFF);
50         send_data(0x10);        
51         send_data(0x00);        
52         
53         send_cmd(0xF1); 
54         send_data(0x36);
55         send_data(0x04);        
56         send_data(0x00);
57         send_data(0x3C);        
58         send_data(0x0F);
59         send_data(0x8F);        
60
61         //Power setting sequence
62         send_cmd(0xC0);
63         send_data(0x07);
64         send_data(0x07);        
65
66         send_cmd(0xC1);
67         send_data(0x45);
68
69         send_cmd(0xC2);
70         send_data(0x22);
71
72         mdelay(160); // 150ms
73         
74         //Display parameter setting
75         send_cmd(0x2A); 
76         send_data(0x00);
77         send_data(0x00);        
78         send_data(0x01);
79         send_data(0x3F);
80
81         send_cmd(0x2B);
82         send_data(0x00);
83         send_data(0x00);        
84         send_data(0x01);
85         send_data(0xDF);
86
87         send_cmd(0xB1); 
88         send_data(0xB0);
89         send_data(0x11);//11: 67hz, 12:63.5hz
90
91         send_cmd(0xB4); 
92         send_data(0x02);
93
94         send_cmd(0xB5); 
95         send_data(0x0F);
96         send_data(0x0F);        
97         send_data(0x10);
98         send_data(0x0A);
99         
100         send_cmd(0xB6); 
101         send_data(0x02);
102         send_data(0x22);//0x42
103         send_data(0x3B);
104
105         send_cmd(0xB7);
106         send_data(0xC6);
107
108         send_cmd(0x20);
109
110         send_cmd(0x13); 
111         
112         send_cmd(0x35);
113         
114         send_cmd(0x3A);
115         send_data(0x05);
116
117         send_cmd(0x36); 
118         send_data(0xD8);//0xC8
119         
120         //Gamma setting
121
122         send_cmd(0xF8);
123         send_data(0x21);
124         send_data(0x07);
125
126         send_cmd(0xE0); 
127         send_data(0x01);
128         send_data(0x19);          
129         send_data(0x15);
130         send_data(0x0B);          
131         send_data(0x0D);
132         send_data(0x06);
133         send_data(0x44);          
134         send_data(0x88);
135         send_data(0x35);          
136         send_data(0x09);
137         send_data(0x10);
138         send_data(0x01);          
139         send_data(0x06);
140         send_data(0x03);          
141         send_data(0x08);
142
143         send_cmd(0xE1); 
144         send_data(0x0F);
145         send_data(0x37);          
146         send_data(0x32);
147         send_data(0x0D);
148         send_data(0x0B);
149         send_data(0x04);
150         send_data(0x46);          
151         send_data(0x42);
152         send_data(0x32);          
153         send_data(0x03);
154         send_data(0x0E);
155         send_data(0x05);          
156         send_data(0x22);
157         send_data(0x22);          
158         send_data(0x09);
159
160         send_cmd(0xE2); 
161         send_data(0x19);
162         send_data(0x19);          
163         send_data(0x19);
164         send_data(0x19);          
165         send_data(0x19);
166         send_data(0x19);
167         send_data(0x1A);          
168         send_data(0x1A);
169         send_data(0x1A);          
170         send_data(0x1A);
171         send_data(0x1A);
172         send_data(0x1A);          
173         send_data(0x19);
174         send_data(0x19);          
175         send_data(0x09);
176         send_data(0x09);
177
178         send_cmd(0xE3); 
179         send_data(0x04);
180         send_data(0x04);          
181         send_data(0x04);
182         send_data(0x04);          
183         send_data(0x04);
184         send_data(0x04);
185         send_data(0x04);          
186         send_data(0x04);
187         send_data(0x04);          
188         send_data(0x04);
189         send_data(0x24);
190         send_data(0x24);          
191         send_data(0x24);
192         send_data(0x24);          
193         send_data(0x24);
194         send_data(0x24);
195         send_data(0x24);          
196         send_data(0x24);
197         send_data(0x24);          
198         send_data(0x24);
199         send_data(0x24);
200         send_data(0x24);          
201         send_data(0x24);
202         send_data(0x25);          
203         send_data(0x3D);
204         send_data(0x4D);
205         send_data(0x4D);          
206         send_data(0x4D);
207         send_data(0x4C);          
208         send_data(0x7C);
209         send_data(0x6D);
210         send_data(0x6D);          
211         send_data(0x7D);
212         send_data(0x6D);          
213         send_data(0x6E);
214         send_data(0x6D);
215         send_data(0x6D);          
216         send_data(0x6D);
217         send_data(0x6D);          
218         send_data(0x6D);
219         send_data(0x5C);
220         send_data(0x5C);          
221         send_data(0x5C);
222         send_data(0x6B);          
223         send_data(0x6B);
224         send_data(0x6A);
225         send_data(0x5B);          
226         send_data(0x5B);
227         send_data(0x53);          
228         send_data(0x53);
229         send_data(0x53);
230         send_data(0x53);          
231         send_data(0x53);
232         send_data(0x53);          
233         send_data(0x43);
234         send_data(0x33);
235         send_data(0xB4);          
236         send_data(0x94);
237         send_data(0x74);          
238         send_data(0x64);
239         send_data(0x64);          
240         send_data(0x43);
241         send_data(0x13);          
242         send_data(0x24);
243
244        //Display on
245
246         send_cmd(0x11); // (SLPOUT)
247
248         mdelay(120); // 100ms
249
250         send_cmd(0x29); // (DISPON)
251
252         mdelay(100); // 100ms
253         
254 #if 0   
255         if (1) { //  for test the lcd
256                 int i;
257                 send_cmd(0x2C); //Write data
258                 for (i = 0; i < 480*320/3; i++)
259                         send_data(0xff);
260                 for (i = 0; i < 480*320/3; i++)
261                         send_data(0xff00);
262                 for (i = 0; i < 480*320/3; i++)
263                         send_data(0xff0000);
264         }
265         send_cmd(0x29); //Display On 
266         mdelay(120); //120ms
267         send_cmd(0x2C); //Write data
268         mdelay(1200); //120ms
269 #endif  
270         LCD_PRINT("ili9486_init: end\n");
271
272         return 0;
273 }
274
275 static int32_t ili9486_set_window(struct lcd_spec *self,
276                 uint16_t left, uint16_t top, uint16_t right, uint16_t bottom)
277 {
278         Send_data send_cmd = self->info.mcu->ops->send_cmd;
279         Send_data send_data = self->info.mcu->ops->send_data;
280
281         LCD_PRINT("ili9486_set_window\n");
282
283         send_cmd(0x2A); // col
284         send_data((left >> 8));
285         send_data((left & 0xFF));
286         send_data((right >> 8));
287         send_data((right & 0xFF));
288
289         send_cmd(0x2B); // row
290         send_data((top >> 8));
291         send_data((top & 0xFF));
292         send_data((bottom >> 8));
293         send_data((bottom & 0xFF));
294
295         send_cmd(0x2C);
296
297         return 0;
298 }
299
300
301 static int32_t ili9486_invalidate(struct lcd_spec *self)
302 {
303         LCD_PRINT("ili9486_invalidate\n");
304
305         return self->ops->lcd_set_window(self, 0, 0, 
306                         self->width-1, self->height-1);
307         
308 }
309
310 static int32_t ili9486_invalidate_rect(struct lcd_spec *self,
311                                 uint16_t left, uint16_t top,
312                                 uint16_t right, uint16_t bottom)
313 {
314
315         LCD_PRINT("ili9486_invalidate_rect : (%d, %d, %d, %d)\n",left, top, right, bottom);
316
317
318         return self->ops->lcd_set_window(self, left, top, 
319                         right, bottom);
320 }
321
322 static int32_t ili9486_set_direction(struct lcd_spec *self, uint16_t direction)
323 {
324
325         LCD_PRINT("ili9486_set_direction\n");
326         return 0;
327 }
328
329 static int32_t ili9486_enter_sleep(struct lcd_spec *self, uint8_t is_sleep)
330 {
331         Send_data send_cmd = self->info.mcu->ops->send_cmd;
332
333         if(is_sleep) {
334                 //send_cmd(0x10);
335                 mdelay(120); 
336         }
337         else {
338                 //send_cmd(0x11);
339                 mdelay(120); 
340         }
341         return 0;
342 }
343
344 static uint32_t ili9486_read_id(struct lcd_spec *self)
345 {
346         uint32_t read_value = 0;
347         Send_data send_cmd = self->info.mcu->ops->send_cmd;
348         Read_data read_data = self->info.mcu->ops->read_data;
349         
350         send_cmd(0x04);
351
352         read_data(); 
353         read_value += read_data()<< 16;
354         read_value += read_data()<< 8;
355         read_value += read_data();
356   
357         LCD_PRINT("ili9486_read_id=%x\n",read_value);
358
359         return read_value; 
360 }
361
362 static struct lcd_operations lcd_ili9486_operations = {
363         .lcd_init            = ili9486_init,
364         .lcd_set_window      = ili9486_set_window,
365         .lcd_invalidate      = ili9486_invalidate,
366         //.lcd_invalidate_rect = ili9486_invalidate_rect,
367         .lcd_set_direction   = ili9486_set_direction,
368         .lcd_enter_sleep     = ili9486_enter_sleep,
369         .lcd_readid          = ili9486_read_id,
370 };
371
372 static struct timing_mcu lcd_ili9486_timing[] = {
373         [LCD_REGISTER_TIMING] = {         
374                 .rcss = 25,  
375                 .rlpw = 45,
376                 .rhpw = 90,
377                 .wcss = 30,
378                 .wlpw = 15,
379                 .whpw = 15,
380         },
381         [LCD_GRAM_TIMING] = {         
382                 .rcss = 25,  
383                 .rlpw = 45,
384                 .rhpw = 90,
385                 .wcss = 30,
386                 .wlpw = 15,
387                 .whpw = 15,
388         }
389 };
390
391 static struct info_mcu lcd_ili9486_info = {
392         .bus_mode = LCD_BUS_8080,
393         .bus_width = 16,
394         .timing = &lcd_ili9486_timing,
395         .ops = NULL,
396 };
397
398 struct lcd_spec lcd_panel_ili9486 = {
399         .width = 320,
400         .height = 480,
401         .mode = LCD_MODE_MCU,
402         .direction = LCD_DIRECT_NORMAL,
403         .info = {.mcu = &lcd_ili9486_info},
404         .ops = &lcd_ili9486_operations,
405 };
406