tizen 2.4 release
[kernel/u-boot-tm1.git] / drivers / video / sprdfb / lcd / lcd_ili9486_rgb_spi.c
1 /* drivers/video/sc8810/lcd_ili9486_rgb_spi.c
2  *
3  *
4  *
5  *
6  * Copyright (C) 2010 Spreadtrum
7  *
8  * This software is licensed under the terms of the GNU General Public
9  * License version 2, as published by the Free Software Foundation, and
10  * may be copied, distributed, and modified under those terms.
11  *
12  * This program is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15  * GNU General Public License for more details.
16  */
17
18 #include <asm/arch/sprd_lcd.h>
19
20 #define printk printf
21
22 #define  LCD_DEBUG
23 #ifdef LCD_DEBUG
24 #define LCD_PRINT printk
25 #else
26 #define LCD_PRINT(...)
27 #endif
28
29 #define ili9486_SpiWriteCmd(cmd) \
30 { \
31         spi_send_cmd((cmd & 0xFF));\
32 }
33
34 #define  ili9486_SpiWriteData(data)\
35 { \
36         spi_send_data((data & 0xFF));\
37 }
38
39 static int32_t ili9486_init(struct panel_spec *self)
40 {
41     uint32_t test_data[8] = {0};
42     uint32_t left = 0;
43     uint32_t top = 0;
44     uint32_t right = 480;
45     uint32_t bottom = 854;
46     uint32_t data = 0;
47     spi_send_cmd_t spi_send_cmd = self->info.rgb->bus_info.spi->ops->spi_send_cmd;
48     spi_send_data_t spi_send_data = self->info.rgb->bus_info.spi->ops->spi_send_data;
49     spi_read_t spi_read = self->info.rgb->bus_info.spi->ops->spi_read;
50
51     LCD_PRINT("ili9486_init\n");
52
53     ili9486_SpiWriteCmd(0xC0);
54     ili9486_SpiWriteData(0x15);
55     ili9486_SpiWriteData(0x15);
56
57     ili9486_SpiWriteCmd(0xC1);
58     ili9486_SpiWriteData(0x42);
59
60     ili9486_SpiWriteCmd(0xC2);
61     ili9486_SpiWriteData(0x22);
62
63     ili9486_SpiWriteCmd(0xC5);
64     ili9486_SpiWriteData(0x00);
65     ili9486_SpiWriteData(0x3A);
66
67     //Display parameter setting
68     ili9486_SpiWriteCmd(0x2A);
69     ili9486_SpiWriteData(0x00);
70     ili9486_SpiWriteData(0x00);
71     ili9486_SpiWriteData(0x01);
72     ili9486_SpiWriteData(0x3F);
73
74     ili9486_SpiWriteCmd(0x2B);
75     ili9486_SpiWriteData(0x00);
76     ili9486_SpiWriteData(0x00);
77     ili9486_SpiWriteData(0x01);
78     ili9486_SpiWriteData(0xDF);
79
80     ili9486_SpiWriteCmd(0x36);
81     ili9486_SpiWriteData(0x08);
82
83     ili9486_SpiWriteCmd(0x35);
84     ili9486_SpiWriteData(0x00);
85
86     ili9486_SpiWriteCmd(0x3A);
87     ili9486_SpiWriteData(0x66);
88
89     ili9486_SpiWriteCmd(0xB0);
90     ili9486_SpiWriteData(0x80);
91
92     ili9486_SpiWriteCmd(0xB4);
93     ili9486_SpiWriteData(0x02);
94
95     ili9486_SpiWriteCmd(0xB5);
96     ili9486_SpiWriteData(0x0C);
97     ili9486_SpiWriteData(0x08);
98     ili9486_SpiWriteData(0x2C);
99     ili9486_SpiWriteData(0x26);
100
101     ili9486_SpiWriteCmd(0xB6);
102     ili9486_SpiWriteData(0x20);//(0x32)//123,(0x20);
103     ili9486_SpiWriteData(0x42);//0x42
104     ili9486_SpiWriteData(0x3B);
105
106     ili9486_SpiWriteCmd(0xB7);
107     ili9486_SpiWriteData(0x07);
108
109     ili9486_SpiWriteCmd(0xF9);
110     ili9486_SpiWriteData(0x00);
111     ili9486_SpiWriteData(0x08);
112
113     //Gamma setting
114     ili9486_SpiWriteCmd(0xE0);
115     ili9486_SpiWriteData(0x1E);
116     ili9486_SpiWriteData(0x21);
117     ili9486_SpiWriteData(0x1F);
118     ili9486_SpiWriteData(0x0C);
119     ili9486_SpiWriteData(0x0B);
120     ili9486_SpiWriteData(0x0C);
121     ili9486_SpiWriteData(0x4E);
122     ili9486_SpiWriteData(0xB9);
123     ili9486_SpiWriteData(0x40);
124     ili9486_SpiWriteData(0x07);
125     ili9486_SpiWriteData(0x16);
126     ili9486_SpiWriteData(0x06);
127     ili9486_SpiWriteData(0x12);
128     ili9486_SpiWriteData(0x12);
129     ili9486_SpiWriteData(0x00);
130
131     ili9486_SpiWriteCmd(0xE1);
132     ili9486_SpiWriteData(0x1F);
133     ili9486_SpiWriteData(0x2A);
134     ili9486_SpiWriteData(0x25);
135     ili9486_SpiWriteData(0x0C);
136     ili9486_SpiWriteData(0x11);
137     ili9486_SpiWriteData(0x09);
138     ili9486_SpiWriteData(0x4C);
139     ili9486_SpiWriteData(0x42);
140     ili9486_SpiWriteData(0x35);
141     ili9486_SpiWriteData(0x08);
142     ili9486_SpiWriteData(0x09);
143     ili9486_SpiWriteData(0x02);
144     ili9486_SpiWriteData(0x26);
145     ili9486_SpiWriteData(0x23);
146     ili9486_SpiWriteData(0x00);
147
148     ili9486_SpiWriteCmd(0xF8);
149     ili9486_SpiWriteData(0x21);
150     ili9486_SpiWriteData(0x07);
151     ili9486_SpiWriteData(0x02);
152
153     ili9486_SpiWriteCmd(0xE2);
154     ili9486_SpiWriteData(0x00);
155     ili9486_SpiWriteData(0x09);
156     ili9486_SpiWriteData(0x09);
157     ili9486_SpiWriteData(0x09);
158     ili9486_SpiWriteData(0x09);
159     ili9486_SpiWriteData(0x09);
160     ili9486_SpiWriteData(0x09);
161     ili9486_SpiWriteData(0x09);
162     ili9486_SpiWriteData(0x09);
163     ili9486_SpiWriteData(0x09);
164     ili9486_SpiWriteData(0x09);
165     ili9486_SpiWriteData(0x09);
166     ili9486_SpiWriteData(0x09);
167     ili9486_SpiWriteData(0x09);
168     ili9486_SpiWriteData(0x09);
169     ili9486_SpiWriteData(0x00);
170
171     ili9486_SpiWriteCmd(0xE3);
172     ili9486_SpiWriteData(0x00);
173     ili9486_SpiWriteData(0x00);
174     ili9486_SpiWriteData(0x00);
175
176     ili9486_SpiWriteData(0x00);
177     ili9486_SpiWriteData(0x04);
178     ili9486_SpiWriteData(0x04);
179     ili9486_SpiWriteData(0x04);
180     ili9486_SpiWriteData(0x04);
181     ili9486_SpiWriteData(0x04);
182     ili9486_SpiWriteData(0x04);
183     ili9486_SpiWriteData(0x04);
184     ili9486_SpiWriteData(0x04);
185     ili9486_SpiWriteData(0x04);
186     ili9486_SpiWriteData(0x04);
187     ili9486_SpiWriteData(0x04);
188     ili9486_SpiWriteData(0x04);
189     ili9486_SpiWriteData(0x04);
190     ili9486_SpiWriteData(0x04);
191     ili9486_SpiWriteData(0x04);
192     ili9486_SpiWriteData(0x04);
193     ili9486_SpiWriteData(0x04);
194     ili9486_SpiWriteData(0x04);
195     ili9486_SpiWriteData(0x04);
196     ili9486_SpiWriteData(0x04);
197     ili9486_SpiWriteData(0x04);
198     ili9486_SpiWriteData(0x04);
199     ili9486_SpiWriteData(0x04);
200     ili9486_SpiWriteData(0x04);
201     ili9486_SpiWriteData(0x04);
202     ili9486_SpiWriteData(0x04);
203     ili9486_SpiWriteData(0x04);
204     ili9486_SpiWriteData(0x04);
205     ili9486_SpiWriteData(0x04);
206     ili9486_SpiWriteData(0x04);
207     ili9486_SpiWriteData(0x04);
208     ili9486_SpiWriteData(0x04);
209     ili9486_SpiWriteData(0x04);
210     ili9486_SpiWriteData(0x04);
211     ili9486_SpiWriteData(0x04);
212     ili9486_SpiWriteData(0x04);
213     ili9486_SpiWriteData(0x04);
214     ili9486_SpiWriteData(0x04);
215     ili9486_SpiWriteData(0x04);
216     ili9486_SpiWriteData(0x04);
217     ili9486_SpiWriteData(0x04);
218     ili9486_SpiWriteData(0x04);
219     ili9486_SpiWriteData(0x04);
220     ili9486_SpiWriteData(0x04);
221     ili9486_SpiWriteData(0x04);
222     ili9486_SpiWriteData(0x04);
223     ili9486_SpiWriteData(0x04);
224     ili9486_SpiWriteData(0x04);
225     ili9486_SpiWriteData(0x04);
226     ili9486_SpiWriteData(0x04);
227     ili9486_SpiWriteData(0x04);
228     ili9486_SpiWriteData(0x04);
229     ili9486_SpiWriteData(0x04);
230     ili9486_SpiWriteData(0x04);
231     ili9486_SpiWriteData(0x04);
232     ili9486_SpiWriteData(0x04);
233     ili9486_SpiWriteData(0x04);
234     ili9486_SpiWriteData(0x04);
235     ili9486_SpiWriteData(0x04);
236     ili9486_SpiWriteData(0x00);
237
238     ili9486_SpiWriteCmd(0xF4);
239     ili9486_SpiWriteData(0x00);
240     ili9486_SpiWriteData(0x00);
241     ili9486_SpiWriteData(0x08);
242     ili9486_SpiWriteData(0x91);
243     ili9486_SpiWriteData(0x04);
244
245     ili9486_SpiWriteCmd(0xF2);
246     ili9486_SpiWriteData(0x18);
247     ili9486_SpiWriteData(0xA3);
248     ili9486_SpiWriteData(0x12);
249     ili9486_SpiWriteData(0x02);
250     ili9486_SpiWriteData(0x82);
251     ili9486_SpiWriteData(0x32);
252     ili9486_SpiWriteData(0xFF);
253     ili9486_SpiWriteData(0x10);
254     ili9486_SpiWriteData(0x00);
255
256     ili9486_SpiWriteCmd(0xFC);
257     ili9486_SpiWriteData(0x00);
258     ili9486_SpiWriteData(0x00);
259     ili9486_SpiWriteData(0x83);
260 #if 1
261     //Display on
262     ili9486_SpiWriteCmd(0x11); // (SLPOUT)
263
264     LCD_DelayMS(120); // 100ms
265
266     ili9486_SpiWriteCmd(0x29); // (DISPON)
267
268     LCD_DelayMS(100); // 100ms
269 #else
270         if (1) { //  for test the lcd
271                 int i;
272                 ili9486_SpiWriteCmd(0x2C); //Write data
273                 for (i = 0; i < 480*320/3; i++)
274                         ili9486_SpiWriteData(0xff);
275                 for (i = 0; i < 480*320/3; i++)
276                         ili9486_SpiWriteData(0xff00);
277                 for (i = 0; i < 480*320/3; i++)
278                         ili9486_SpiWriteData(0xff0000);
279         }
280         ili9486_SpiWriteCmd(0x29); //Display On
281         LCD_DelayMS(120); //120ms
282         ili9486_SpiWriteCmd(0x2C); //Write data
283         LCD_DelayMS(1200); //120ms
284 #endif
285         LCD_PRINT("ili9486_init: end\n");
286
287         return 0;
288 }
289
290 static int32_t ili9486_enter_sleep(struct panel_spec *self, uint8_t is_sleep)
291 {
292         spi_send_cmd_t spi_send_cmd = self->info.rgb->bus_info.spi->ops->spi_send_cmd;
293         spi_send_data_t spi_send_data = self->info.rgb->bus_info.spi->ops->spi_send_data;
294
295         if(is_sleep==1){
296                 //Sleep In
297                 ili9486_SpiWriteCmd(0x28);
298                 udelay(120000);
299                 ili9486_SpiWriteCmd(0x10);
300                 udelay(10000);
301         }else{
302                 //Sleep Out
303                 ili9486_SpiWriteCmd(0x11);
304                 udelay(120000);
305                 ili9486_SpiWriteCmd(0x29);
306                 udelay(10000);
307         }
308
309         return 0;
310 }
311
312 static int32_t ili9486_set_window(struct panel_spec *self,
313                 uint16_t left, uint16_t top, uint16_t right, uint16_t bottom)
314 {
315         uint32_t *test_data[4] = {0};
316         spi_send_cmd_t spi_send_cmd = self->info.rgb->bus_info.spi->ops->spi_send_cmd;
317         spi_send_data_t spi_send_data = self->info.rgb->bus_info.spi->ops->spi_send_data;
318         spi_read_t spi_read = self->info.rgb->bus_info.spi->ops->spi_read;
319         LCD_PRINT("zxdbg add -ili9486_read read: %x, %x, %x, %x\n",test_data[0], test_data[1], test_data[2], test_data[3]);
320
321         return 0;
322 }
323 static int32_t ili9486_invalidate(struct panel_spec *self)
324 {
325         LCD_PRINT("ili9486_invalidate\n");
326
327         return self->ops->panel_set_window(self, 0, 0,
328                 self->width - 1, self->height - 1);
329 }
330
331
332
333 static int32_t ili9486_invalidate_rect(struct panel_spec *self,
334                                 uint16_t left, uint16_t top,
335                                 uint16_t right, uint16_t bottom)
336 {
337         LCD_PRINT("ili9486_invalidate_rect \n");
338
339         return self->ops->panel_set_window(self, left, top,
340                         right, bottom);
341 }
342
343 static int32_t ili9486_read_id(struct panel_spec *self)
344 {
345 #if 0
346         int32_t id  = 0x62;
347         spi_send_cmd_t spi_send_cmd = self->info.rgb->bus_info.spi->ops->spi_send_cmd;
348         spi_send_data_t spi_send_data = self->info.rgb->bus_info.spi->ops->spi_send_data;
349         spi_read_t spi_read = self->info.rgb->bus_info.spi->ops->spi_read;
350
351         ili9486_SpiWriteCmd(0xDA); // SET password
352
353         spi_read(&id);
354         id &= 0xff;
355 #endif
356         //LCD_PRINT(" ili9486_read_id u-boot id = %x\n",id);
357 #ifndef CONFIG_SPX15
358         //return id;
359 #else
360         return 0x9486;
361 #endif
362 }
363
364 static struct panel_operations lcd_ili9486_rgb_spi_operations = {
365         .panel_init = ili9486_init,
366         .panel_set_window = ili9486_set_window,
367         .panel_invalidate_rect= ili9486_invalidate_rect,
368         .panel_invalidate = ili9486_invalidate,
369         .panel_enter_sleep = ili9486_enter_sleep,
370         .panel_readid          = ili9486_read_id
371 };
372
373 static struct timing_rgb lcd_ili9486_rgb_timing = {
374         .hfp = 30,//10,  /* unit: pixel */
375         .hbp = 26, //6,
376         .hsync = 4, //8,
377         .vfp = 12, // 3, /*unit: line*/
378         .vbp = 8, // 3,
379         .vsync = 2, // 4,
380 };
381
382 static struct spi_info lcd_ili9486_rgb_spi_info = {
383         .ops = NULL,
384 };
385
386 static struct info_rgb lcd_ili9486_rgb_info = {
387         .cmd_bus_mode  = SPRDFB_RGB_BUS_TYPE_SPI,
388         .video_bus_width = 18, /*18,16*/
389         .h_sync_pol = SPRDFB_POLARITY_NEG,
390         .v_sync_pol = SPRDFB_POLARITY_NEG,
391         .de_pol = SPRDFB_POLARITY_POS,
392         .timing = &lcd_ili9486_rgb_timing,
393         .bus_info = {
394                 .spi = &lcd_ili9486_rgb_spi_info,
395         }
396 };
397
398 struct panel_spec lcd_panel_ili9486_rgb_spi = {
399         .width = 320,
400         .height = 480,
401         .fps = 61,
402         .type = LCD_MODE_RGB,
403         .direction = LCD_DIRECT_NORMAL,
404         .info = {
405                 .rgb = &lcd_ili9486_rgb_info
406         },
407         .ops = &lcd_ili9486_rgb_spi_operations,
408 };
409