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