tizen 2.4 release
[kernel/u-boot-tm1.git] / drivers / video / sprdfb / lcd / lcd_ili9341.c
1 /* drivers/video/sc8810/lcd_ili9341.c\r
2  *\r
3  * Support for ili9341 LCD device\r
4  *\r
5  */\r
6 \r
7 #include <asm/arch/sprd_lcd.h>\r
8 \r
9 #define printk printf\r
10 \r
11 #define  LCD_DEBUG\r
12 #ifdef LCD_DEBUG\r
13 #define LCD_PRINT printk\r
14 #else\r
15 #define LCD_PRINT(...)\r
16 #endif\r
17 \r
18 static int32_t ili9341_init(struct panel_spec *self)\r
19 {\r
20         send_data_t send_cmd = self->info.mcu->ops->send_cmd;\r
21         send_data_t send_data = self->info.mcu->ops->send_data;\r
22 \r
23         LCD_PRINT("ili9341_init\n");\r
24 \r
25         //Power Setting\r
26         send_cmd(0xCF);\r
27         send_data(0x00);\r
28         send_data(0xE1);\r
29         send_data(0x30);\r
30 \r
31         send_cmd(0xED);\r
32         send_data(0x64);\r
33         send_data(0x03);\r
34         send_data(0x12);\r
35         send_data(0x81);\r
36 \r
37         send_cmd(0xCB);\r
38         send_data(0x39);\r
39         send_data(0x2C);\r
40         send_data(0x00);\r
41         send_data(0x34);\r
42         send_data(0x02);\r
43 \r
44         send_cmd(0xF7);\r
45         send_data(0x20);\r
46 \r
47         send_cmd(0xEA);\r
48         send_data(0x00);\r
49         send_data(0x00);\r
50 \r
51         send_cmd(0xC5);\r
52         send_data(0x4C);\r
53         send_data(0x2B);\r
54 \r
55         send_cmd(0xC7);\r
56         send_data(0x00);\r
57 \r
58         send_cmd(0xC0);\r
59         send_data(0x22);\r
60 \r
61         send_cmd(0xC1);\r
62         send_data(0x11);\r
63 \r
64         //Initializing Sequence\r
65         send_cmd(0x35);\r
66         send_data(0x00);\r
67 \r
68         send_cmd(0x36);\r
69         send_data(0x08);\r
70 \r
71         send_cmd(0x3A);\r
72         send_data(0x05);\r
73 \r
74         send_cmd(0xF2);\r
75         send_data(0x02);\r
76 \r
77         send_cmd(0xB6);\r
78         send_data(0x01);\r
79         send_data(0xC2);\r
80 \r
81         send_cmd(0xF6);\r
82         send_data(0x01);\r
83         send_data(0x10);\r
84         send_data(0x00);\r
85 \r
86         send_cmd(0xB1);\r
87         send_data(0x00);\r
88         send_data(0x1A);\r
89 \r
90         send_cmd(0xB5);\r
91         send_data(0x02);\r
92         send_data(0x02);\r
93         send_data(0x0A);\r
94         send_data(0x14);\r
95 \r
96         send_cmd(0xE8);\r
97         send_data(0x85);\r
98         send_data(0x01);\r
99         send_data(0x78);\r
100 \r
101         //Gamma Setting\r
102         send_cmd(0xE0);\r
103         send_data(0x0F);\r
104         send_data(0x31);\r
105         send_data(0x2F);\r
106         send_data(0x0D);\r
107         send_data(0x10);\r
108         send_data(0x08);\r
109         send_data(0x5F);\r
110         send_data(0xB6);\r
111         send_data(0x50);\r
112         send_data(0x07);\r
113         send_data(0x14);\r
114         send_data(0x07);\r
115         send_data(0x2A);\r
116         send_data(0x1F);\r
117         send_data(0x08);\r
118 \r
119         send_cmd(0xE1);\r
120         send_data(0x00);\r
121         send_data(0x0E);\r
122         send_data(0x10);\r
123         send_data(0x04);\r
124         send_data(0x10);\r
125         send_data(0x04);\r
126         send_data(0x23);\r
127         send_data(0x54);\r
128         send_data(0x35);\r
129         send_data(0x03);\r
130         send_data(0x0B);\r
131         send_data(0x09);\r
132         send_data(0x20);\r
133         send_data(0x2A);\r
134         send_data(0x08);\r
135 \r
136         send_cmd(0xE2);\r
137         send_data(0x00);\r
138         send_data(0x00);\r
139         send_data(0x00);\r
140         send_data(0x00);\r
141         send_data(0x00);\r
142         send_data(0x00);\r
143         send_data(0x00);\r
144         send_data(0x00);\r
145         send_data(0x00);\r
146         send_data(0x00);\r
147         send_data(0x00);\r
148         send_data(0x00);\r
149         send_data(0x00);\r
150         send_data(0x00);\r
151         send_data(0x00);\r
152         send_data(0x00);\r
153 \r
154         send_cmd(0xE3);\r
155         send_data(0x00);\r
156         send_data(0x00);\r
157         send_data(0x00);\r
158         send_data(0x00);\r
159         send_data(0x33);\r
160         send_data(0x33);\r
161         send_data(0x33);\r
162         send_data(0x33);\r
163         send_data(0x33);\r
164         send_data(0x33);\r
165         send_data(0x22);\r
166         send_data(0x22);\r
167         send_data(0x22);\r
168         send_data(0x33);\r
169         send_data(0x33);\r
170         send_data(0x33);\r
171         send_data(0x33);\r
172         send_data(0x33);\r
173         send_data(0x33);\r
174         send_data(0x33);\r
175         send_data(0x33);\r
176         send_data(0x33);\r
177         send_data(0x33);\r
178         send_data(0x33);\r
179         send_data(0x33);\r
180         send_data(0x33);\r
181         send_data(0x33);\r
182         send_data(0x33);\r
183         send_data(0x33);\r
184         send_data(0x33);\r
185         send_data(0x33);\r
186         send_data(0x33);\r
187         send_data(0x33);\r
188         send_data(0x33);\r
189         send_data(0x33);\r
190         send_data(0x33);\r
191         send_data(0x33);\r
192         send_data(0x33);\r
193         send_data(0x33);\r
194         send_data(0x33);\r
195         send_data(0x33);\r
196         send_data(0x33);\r
197         send_data(0x33);\r
198         send_data(0x33);\r
199         send_data(0x33);\r
200         send_data(0x33);\r
201         send_data(0x33);\r
202         send_data(0x33);\r
203         send_data(0x33);\r
204         send_data(0x33);\r
205         send_data(0x03);\r
206         send_data(0x03);\r
207         send_data(0x03);\r
208         send_data(0x03);\r
209         send_data(0x03);\r
210         send_data(0x03);\r
211         send_data(0x03);\r
212         send_data(0x03);\r
213         send_data(0x03);\r
214         send_data(0x03);\r
215         send_data(0x03);\r
216         send_data(0x02);\r
217         send_data(0x01);\r
218         send_data(0x00);\r
219 \r
220 #if 1\r
221         send_cmd(0x11); // (SLPOUT)\r
222         LCD_DelayMS(10); // 100ms\r
223         send_cmd(0x29); // (DISPON)\r
224         LCD_DelayMS(10); // 100ms\r
225 #else\r
226         if (1) { //  for test the lcd\r
227                 int i;\r
228                 send_cmd(0x2C); //Write data\r
229                 for (i = 0; i < 240*320/3; i++)\r
230                         send_data(0xff);\r
231                 for (i = 0; i < 240*320/3; i++)\r
232                         send_data(0xff00);\r
233                 for (i = 0; i < 240*320/3; i++)\r
234                         send_data(0xff0000);\r
235         }\r
236         //Display on\r
237         send_cmd(0x11); // (SLPOUT)\r
238         LCD_DelayMS(120); // 100ms\r
239         send_cmd(0x29); //Display On\r
240         LCD_DelayMS(120); //120ms\r
241         send_cmd(0x2C); //Write data\r
242         LCD_DelayMS(1200); //120ms\r
243 #endif\r
244         LCD_PRINT("ili9341_init: end\n");\r
245 \r
246         return 0;\r
247 }\r
248 \r
249 static int32_t ili9341_set_window(struct panel_spec *self,\r
250                 uint16_t left, uint16_t top, uint16_t right, uint16_t bottom)\r
251 {\r
252         send_data_t send_cmd = self->info.mcu->ops->send_cmd;\r
253         send_data_t send_data = self->info.mcu->ops->send_data;\r
254 \r
255         LCD_PRINT("ili9341_set_window\n");\r
256 \r
257         send_cmd(0x2A); // col\r
258         send_data((left >> 8));\r
259         send_data((left & 0xFF));\r
260         send_data((right >> 8));\r
261         send_data((right & 0xFF));\r
262 \r
263         send_cmd(0x2B); // row\r
264         send_data((top >> 8));\r
265         send_data((top & 0xFF));\r
266         send_data((bottom >> 8));\r
267         send_data((bottom & 0xFF));\r
268 \r
269         send_cmd(0x2C);\r
270 \r
271         return 0;\r
272 }\r
273 \r
274 \r
275 static int32_t ili9341_invalidate(struct panel_spec *self)\r
276 {\r
277         LCD_PRINT("ili9341_invalidate\n");\r
278 \r
279         return self->ops->panel_set_window(self, 0, 0,\r
280                         self->width-1, self->height-1);\r
281 }\r
282 \r
283 static int32_t ili9341_invalidate_rect(struct panel_spec *self,\r
284                                 uint16_t left, uint16_t top,\r
285                                 uint16_t right, uint16_t bottom)\r
286 {\r
287 \r
288         LCD_PRINT("ili9341_invalidate_rect : (%d, %d, %d, %d)\n",left, top, right, bottom);\r
289 \r
290 \r
291         return self->ops->panel_set_window(self, left, top,\r
292                         right, bottom);\r
293 }\r
294 \r
295 static int32_t ili9341_set_direction(struct panel_spec *self, uint16_t direction)\r
296 {\r
297 \r
298         LCD_PRINT("ili9341_set_direction\n");\r
299         return 0;\r
300 }\r
301 \r
302 static int32_t ili9341_enter_sleep(struct panel_spec *self, uint8_t is_sleep)\r
303 {\r
304         send_data_t send_cmd = self->info.mcu->ops->send_cmd;\r
305 \r
306         if(is_sleep) {\r
307                 //send_cmd(0x10);\r
308                 LCD_DelayMS(120);\r
309         }\r
310         else {\r
311                 //send_cmd(0x11);\r
312                 LCD_DelayMS(120);\r
313         }\r
314         return 0;\r
315 }\r
316 \r
317 static int32_t ili9341_read_id(struct panel_spec *self)\r
318 {\r
319         int32_t read_value = 0;\r
320         send_data_t send_cmd = self->info.mcu->ops->send_cmd;\r
321         read_data_t read_data = self->info.mcu->ops->read_data;\r
322 \r
323         send_cmd(0x04);\r
324 \r
325         read_data();\r
326         read_value += read_data()<< 16;\r
327         read_value += read_data()<< 8;\r
328         read_value += read_data();\r
329 \r
330         LCD_PRINT("ili9341_read_id=%x\n",read_value);\r
331     read_value = 0x9341;\r
332         return read_value;\r
333 }\r
334 \r
335 static struct panel_operations lcd_ili9341_operations = {\r
336         .panel_init            = ili9341_init,\r
337         .panel_set_window      = ili9341_set_window,\r
338         .panel_invalidate      = ili9341_invalidate,\r
339         //.lcd_invalidate_rect = ili9341_invalidate_rect,\r
340         .panel_set_direction   = ili9341_set_direction,\r
341         .panel_enter_sleep     = ili9341_enter_sleep,\r
342         .panel_readid         = ili9341_read_id,\r
343 };\r
344 \r
345 static struct timing_mcu lcd_ili9341_timing[] = {\r
346         [0] = {\r
347                 .rcss = 25,\r
348                 .rlpw = 45,\r
349                 .rhpw = 90,\r
350                 .wcss = 30,\r
351                 .wlpw = 20,\r
352                 .whpw = 20,\r
353         },\r
354         [1] = {\r
355                 .rcss = 25,\r
356                 .rlpw = 45,\r
357                 .rhpw = 90,\r
358                 .wcss = 30,\r
359                 .wlpw = 20,\r
360                 .whpw = 20,\r
361         }\r
362 };\r
363 \r
364 static struct info_mcu lcd_ili9341_info = {\r
365         .bus_mode = LCD_BUS_8080,\r
366         .bus_width = 16,\r
367         .bpp = 16,\r
368         .timing = &lcd_ili9341_timing,\r
369         .ops = NULL,\r
370 };\r
371 \r
372 struct panel_spec lcd_panel_ili9341 = {\r
373         .width = 240,\r
374         .height = 320,\r
375         .fps  = 60,\r
376         .type = LCD_MODE_MCU,\r
377         .direction = LCD_DIRECT_NORMAL,\r
378         .info = {\r
379                  .mcu = &lcd_ili9341_info\r
380                 },\r
381         .ops = &lcd_ili9341_operations,\r
382 };\r
383 \r