1 /* drivers/video/sc8810/lcd_sc7798_rgb_spi.c
6 * Copyright (C) 2010 Spreadtrum
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.
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.
18 #include <asm/arch/sprd_lcd.h>
24 #define LCD_PRINT printk
26 #define LCD_PRINT(...)
29 #define sc7798_SpiWriteCmd(cmd) \
31 spi_send_cmd((cmd & 0xFF));\
34 #define sc7798_SpiWriteData(data)\
36 spi_send_data((data & 0xFF));\
39 static int32_t sc7798_init(struct panel_spec *self)
41 uint32_t test_data[8] = {0};
45 uint32_t bottom = 854;
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;
51 LCD_PRINT("sc7798_init\n");
53 sc7798_SpiWriteCmd(0xB9);
54 sc7798_SpiWriteData(0xF1);
55 sc7798_SpiWriteData(0x08);
56 sc7798_SpiWriteData(0x00);
58 sc7798_SpiWriteCmd(0xBC);
59 sc7798_SpiWriteData(0x67);
61 sc7798_SpiWriteCmd(0x3A);
62 sc7798_SpiWriteData(0x70);
64 sc7798_SpiWriteCmd(0xB2);
65 sc7798_SpiWriteData(0x23);
67 sc7798_SpiWriteCmd(0xB4);
68 sc7798_SpiWriteData(0x00);
70 sc7798_SpiWriteCmd(0xB1);
71 sc7798_SpiWriteData(0x22);
72 sc7798_SpiWriteData(0x1B);
73 sc7798_SpiWriteData(0x1B);
74 sc7798_SpiWriteData(0xB7);
75 sc7798_SpiWriteData(0x22);
76 sc7798_SpiWriteData(0x02);
77 sc7798_SpiWriteData(0xA8);
79 sc7798_SpiWriteCmd(0xC6);
80 sc7798_SpiWriteData(0x00);
81 sc7798_SpiWriteData(0x00);
82 sc7798_SpiWriteData(0xFF);
84 sc7798_SpiWriteCmd(0xCC);
85 sc7798_SpiWriteData(0x0C);
87 sc7798_SpiWriteCmd(0xE3);
88 sc7798_SpiWriteData(0x02);
89 sc7798_SpiWriteData(0x02);
90 sc7798_SpiWriteData(0x02);
91 sc7798_SpiWriteData(0x02);
94 sc7798_SpiWriteCmd(0xB8);
95 sc7798_SpiWriteData(0x07);
96 sc7798_SpiWriteData(0x22);
98 sc7798_SpiWriteCmd(0xB5);
99 sc7798_SpiWriteData(0x09);
100 sc7798_SpiWriteData(0x09);
102 sc7798_SpiWriteCmd(0xC0);
103 sc7798_SpiWriteData(0x73);
104 sc7798_SpiWriteData(0x50);
105 sc7798_SpiWriteData(0x00);
106 sc7798_SpiWriteData(0x08);
107 sc7798_SpiWriteData(0x70);
109 sc7798_SpiWriteCmd(0xB3);
110 sc7798_SpiWriteData(0x01);
111 sc7798_SpiWriteData(0x00);
112 sc7798_SpiWriteData(0x06);
113 sc7798_SpiWriteData(0x06);
114 sc7798_SpiWriteData(0x10);
115 sc7798_SpiWriteData(0x0A);
116 sc7798_SpiWriteData(0x45);
117 sc7798_SpiWriteData(0x40);
119 sc7798_SpiWriteCmd(0xB9);
120 sc7798_SpiWriteData(0xF1);
121 sc7798_SpiWriteData(0x08);
122 sc7798_SpiWriteData(0x00);
124 sc7798_SpiWriteCmd(0xE9);
125 sc7798_SpiWriteData(0x00);
126 sc7798_SpiWriteData(0x00);
127 sc7798_SpiWriteData(0x08);
128 sc7798_SpiWriteData(0x03);
129 sc7798_SpiWriteData(0x2F);
130 sc7798_SpiWriteData(0x89);
131 sc7798_SpiWriteData(0x6A);
132 sc7798_SpiWriteData(0x12);
133 sc7798_SpiWriteData(0x31);
134 sc7798_SpiWriteData(0x23);
135 sc7798_SpiWriteData(0x48);
136 sc7798_SpiWriteData(0x0C);
137 sc7798_SpiWriteData(0x89);
138 sc7798_SpiWriteData(0x6A);
139 sc7798_SpiWriteData(0x47);
140 sc7798_SpiWriteData(0x02);
141 sc7798_SpiWriteData(0x04);
142 sc7798_SpiWriteData(0x00);
143 sc7798_SpiWriteData(0x00);
144 sc7798_SpiWriteData(0x00);
145 sc7798_SpiWriteData(0x00);
146 sc7798_SpiWriteData(0x20);
147 sc7798_SpiWriteData(0x88);
148 sc7798_SpiWriteData(0x88);
149 sc7798_SpiWriteData(0x40);
150 sc7798_SpiWriteData(0x28);
151 sc7798_SpiWriteData(0x69);
152 sc7798_SpiWriteData(0x48);
153 sc7798_SpiWriteData(0x88);
154 sc7798_SpiWriteData(0x88);
155 sc7798_SpiWriteData(0x80);
156 sc7798_SpiWriteData(0x88);
157 sc7798_SpiWriteData(0x88);
158 sc7798_SpiWriteData(0x51);
159 sc7798_SpiWriteData(0x38);
160 sc7798_SpiWriteData(0x79);
161 sc7798_SpiWriteData(0x58);
162 sc7798_SpiWriteData(0x88);
163 sc7798_SpiWriteData(0x88);
164 sc7798_SpiWriteData(0x81);
165 sc7798_SpiWriteData(0x00);
166 sc7798_SpiWriteData(0x00);
167 sc7798_SpiWriteData(0x00);
168 sc7798_SpiWriteData(0x00);
169 sc7798_SpiWriteData(0x00);
170 sc7798_SpiWriteData(0x00);
171 sc7798_SpiWriteData(0x00);
172 sc7798_SpiWriteData(0x00);
173 sc7798_SpiWriteData(0x00);
174 sc7798_SpiWriteData(0x00);
175 sc7798_SpiWriteData(0x00);
177 sc7798_SpiWriteCmd(0xEA);
178 sc7798_SpiWriteData(0x88);
179 sc7798_SpiWriteData(0x88);
180 sc7798_SpiWriteData(0x37);
181 sc7798_SpiWriteData(0x59);
182 sc7798_SpiWriteData(0x18);
183 sc7798_SpiWriteData(0x18);
184 sc7798_SpiWriteData(0x88);
185 sc7798_SpiWriteData(0x88);
186 sc7798_SpiWriteData(0x85);
187 sc7798_SpiWriteData(0x88);
188 sc7798_SpiWriteData(0x88);
189 sc7798_SpiWriteData(0x26);
190 sc7798_SpiWriteData(0x49);
191 sc7798_SpiWriteData(0x08);
192 sc7798_SpiWriteData(0x08);
193 sc7798_SpiWriteData(0x88);
194 sc7798_SpiWriteData(0x88);
195 sc7798_SpiWriteData(0x84);
196 sc7798_SpiWriteData(0x30);
197 sc7798_SpiWriteData(0x00);
198 sc7798_SpiWriteData(0x00);
199 sc7798_SpiWriteData(0xFF);
200 sc7798_SpiWriteData(0x00);
201 sc7798_SpiWriteData(0x50);
202 sc7798_SpiWriteData(0x00);
203 sc7798_SpiWriteData(0x00);
204 sc7798_SpiWriteData(0x00);
205 sc7798_SpiWriteData(0x00);
206 sc7798_SpiWriteData(0x00);
207 sc7798_SpiWriteData(0x00);
208 sc7798_SpiWriteData(0x00);
209 sc7798_SpiWriteData(0x00);
210 sc7798_SpiWriteData(0x00);
211 sc7798_SpiWriteData(0x00);
212 sc7798_SpiWriteData(0x00);
213 sc7798_SpiWriteData(0x00);
215 sc7798_SpiWriteCmd(0xE0);
216 sc7798_SpiWriteData(0x00);
217 sc7798_SpiWriteData(0x00);
218 sc7798_SpiWriteData(0x00);
219 sc7798_SpiWriteData(0x04);
220 sc7798_SpiWriteData(0x04);
221 sc7798_SpiWriteData(0x0A);
222 sc7798_SpiWriteData(0x18);
223 sc7798_SpiWriteData(0x2B);
224 sc7798_SpiWriteData(0x05);
225 sc7798_SpiWriteData(0x0C);
226 sc7798_SpiWriteData(0x11);
227 sc7798_SpiWriteData(0x16);
228 sc7798_SpiWriteData(0x18);
229 sc7798_SpiWriteData(0x16);
230 sc7798_SpiWriteData(0x16);
231 sc7798_SpiWriteData(0x15);
232 sc7798_SpiWriteData(0x19);
233 sc7798_SpiWriteData(0x00);
234 sc7798_SpiWriteData(0x00);
235 sc7798_SpiWriteData(0x00);
236 sc7798_SpiWriteData(0x04);
237 sc7798_SpiWriteData(0x04);
238 sc7798_SpiWriteData(0x0A);
239 sc7798_SpiWriteData(0x18);
240 sc7798_SpiWriteData(0x2C);
241 sc7798_SpiWriteData(0x05);
242 sc7798_SpiWriteData(0x0C);
243 sc7798_SpiWriteData(0x12);
244 sc7798_SpiWriteData(0x16);
245 sc7798_SpiWriteData(0x18);
246 sc7798_SpiWriteData(0x16);
247 sc7798_SpiWriteData(0x17);
248 sc7798_SpiWriteData(0x16);
249 sc7798_SpiWriteData(0x19);
252 sc7798_SpiWriteCmd(0xC1);
253 sc7798_SpiWriteData(0x01);
254 sc7798_SpiWriteData(0x00);
255 sc7798_SpiWriteData(0x03);
256 sc7798_SpiWriteData(0x0B);
257 sc7798_SpiWriteData(0x17);
258 sc7798_SpiWriteData(0x20);
259 sc7798_SpiWriteData(0x26);
260 sc7798_SpiWriteData(0x30);
261 sc7798_SpiWriteData(0x36);
262 sc7798_SpiWriteData(0x3F);
263 sc7798_SpiWriteData(0x48);
264 sc7798_SpiWriteData(0x50);
265 sc7798_SpiWriteData(0x58);
266 sc7798_SpiWriteData(0x5F);
267 sc7798_SpiWriteData(0x68);
268 sc7798_SpiWriteData(0x71);
269 sc7798_SpiWriteData(0x79);
270 sc7798_SpiWriteData(0x82);
271 sc7798_SpiWriteData(0x89);
272 sc7798_SpiWriteData(0x91);
273 sc7798_SpiWriteData(0x99);
274 sc7798_SpiWriteData(0xA1);
275 sc7798_SpiWriteData(0xA9);
276 sc7798_SpiWriteData(0xB0);
277 sc7798_SpiWriteData(0xB8);
278 sc7798_SpiWriteData(0xC0);
279 sc7798_SpiWriteData(0xC8);
280 sc7798_SpiWriteData(0xD0);
281 sc7798_SpiWriteData(0xD6);
282 sc7798_SpiWriteData(0xDC);
283 sc7798_SpiWriteData(0xE4);
284 sc7798_SpiWriteData(0xED);
285 sc7798_SpiWriteData(0xF7);
286 sc7798_SpiWriteData(0xFF);
287 sc7798_SpiWriteData(0x00);
288 sc7798_SpiWriteData(0x00);
289 sc7798_SpiWriteData(0x00);
290 sc7798_SpiWriteData(0xC0);
291 sc7798_SpiWriteData(0x0A);
292 sc7798_SpiWriteData(0x80);
293 sc7798_SpiWriteData(0x30);
294 sc7798_SpiWriteData(0xE8);
295 sc7798_SpiWriteData(0x00);
296 sc7798_SpiWriteData(0x00);
297 sc7798_SpiWriteData(0x03);
298 sc7798_SpiWriteData(0x0B);
299 sc7798_SpiWriteData(0x17);
300 sc7798_SpiWriteData(0x20);
301 sc7798_SpiWriteData(0x27);
302 sc7798_SpiWriteData(0x30);
303 sc7798_SpiWriteData(0x37);
304 sc7798_SpiWriteData(0x40);
305 sc7798_SpiWriteData(0x48);
306 sc7798_SpiWriteData(0x50);
307 sc7798_SpiWriteData(0x58);
308 sc7798_SpiWriteData(0x5F);
309 sc7798_SpiWriteData(0x67);
310 sc7798_SpiWriteData(0x70);
311 sc7798_SpiWriteData(0x78);
312 sc7798_SpiWriteData(0x80);
313 sc7798_SpiWriteData(0x88);
314 sc7798_SpiWriteData(0x90);
315 sc7798_SpiWriteData(0x98);
316 sc7798_SpiWriteData(0xA0);
317 sc7798_SpiWriteData(0xA8);
318 sc7798_SpiWriteData(0xAF);
319 sc7798_SpiWriteData(0xB7);
320 sc7798_SpiWriteData(0xBF);
321 sc7798_SpiWriteData(0xC7);
322 sc7798_SpiWriteData(0xCF);
323 sc7798_SpiWriteData(0xD5);
324 sc7798_SpiWriteData(0xDC);
325 sc7798_SpiWriteData(0xE4);
326 sc7798_SpiWriteData(0xED);
327 sc7798_SpiWriteData(0xF7);
328 sc7798_SpiWriteData(0xFF);
329 sc7798_SpiWriteData(0x00);
330 sc7798_SpiWriteData(0x00);
331 sc7798_SpiWriteData(0x00);
332 sc7798_SpiWriteData(0xC0);
333 sc7798_SpiWriteData(0x0A);
334 sc7798_SpiWriteData(0x80);
335 sc7798_SpiWriteData(0x30);
336 sc7798_SpiWriteData(0xE8);
337 sc7798_SpiWriteData(0x00);
338 sc7798_SpiWriteData(0x00);
339 sc7798_SpiWriteData(0x03);
340 sc7798_SpiWriteData(0x0D);
341 sc7798_SpiWriteData(0x19);
342 sc7798_SpiWriteData(0x23);
343 sc7798_SpiWriteData(0x29);
344 sc7798_SpiWriteData(0x31);
345 sc7798_SpiWriteData(0x38);
346 sc7798_SpiWriteData(0x41);
347 sc7798_SpiWriteData(0x48);
348 sc7798_SpiWriteData(0x4F);
349 sc7798_SpiWriteData(0x57);
350 sc7798_SpiWriteData(0x5D);
351 sc7798_SpiWriteData(0x65);
352 sc7798_SpiWriteData(0x6C);
353 sc7798_SpiWriteData(0x74);
354 sc7798_SpiWriteData(0x7B);
355 sc7798_SpiWriteData(0x84);
356 sc7798_SpiWriteData(0x8B);
357 sc7798_SpiWriteData(0x94);
358 sc7798_SpiWriteData(0x9B);
359 sc7798_SpiWriteData(0xA4);
360 sc7798_SpiWriteData(0xAA);
361 sc7798_SpiWriteData(0xB4);
362 sc7798_SpiWriteData(0xB9);
363 sc7798_SpiWriteData(0xC3);
364 sc7798_SpiWriteData(0xCC);
365 sc7798_SpiWriteData(0xD6);
366 sc7798_SpiWriteData(0xDC);
367 sc7798_SpiWriteData(0xE4);
368 sc7798_SpiWriteData(0xED);
369 sc7798_SpiWriteData(0xF7);
370 sc7798_SpiWriteData(0xFF);
371 sc7798_SpiWriteData(0x00);
372 sc7798_SpiWriteData(0x00);
373 sc7798_SpiWriteData(0x00);
374 sc7798_SpiWriteData(0xC0);
375 sc7798_SpiWriteData(0x0A);
376 sc7798_SpiWriteData(0x80);
377 sc7798_SpiWriteData(0x30);
378 sc7798_SpiWriteData(0xE8);
379 sc7798_SpiWriteData(0x00);
383 sc7798_SpiWriteCmd(0x11); // (SLPOUT)
385 LCD_DelayMS(120); // 100ms
387 sc7798_SpiWriteCmd(0x29); // (DISPON)
389 LCD_DelayMS(100); // 100ms
391 if (1) { // for test the lcd
393 sc7798_SpiWriteCmd(0x2C); //Write data
394 for (i = 0; i < 480*320/3; i++)
395 sc7798_SpiWriteData(0xff);
396 for (i = 0; i < 480*320/3; i++)
397 sc7798_SpiWriteData(0xff00);
398 for (i = 0; i < 480*320/3; i++)
399 sc7798_SpiWriteData(0xff0000);
401 sc7798_SpiWriteCmd(0x29); //Display On
402 LCD_DelayMS(120); //120ms
403 sc7798_SpiWriteCmd(0x2C); //Write data
404 LCD_DelayMS(1200); //120ms
406 LCD_PRINT("sc7798_init: end\n");
411 static int32_t sc7798_enter_sleep(struct panel_spec *self, uint8_t is_sleep)
413 spi_send_cmd_t spi_send_cmd = self->info.rgb->bus_info.spi->ops->spi_send_cmd;
414 spi_send_data_t spi_send_data = self->info.rgb->bus_info.spi->ops->spi_send_data;
418 sc7798_SpiWriteCmd(0x28);
420 sc7798_SpiWriteCmd(0x10);
424 sc7798_SpiWriteCmd(0x11);
426 sc7798_SpiWriteCmd(0x29);
433 static int32_t sc7798_set_window(struct panel_spec *self,
434 uint16_t left, uint16_t top, uint16_t right, uint16_t bottom)
436 uint32_t *test_data[4] = {0};
437 spi_send_cmd_t spi_send_cmd = self->info.rgb->bus_info.spi->ops->spi_send_cmd;
438 spi_send_data_t spi_send_data = self->info.rgb->bus_info.spi->ops->spi_send_data;
439 spi_read_t spi_read = self->info.rgb->bus_info.spi->ops->spi_read;
440 LCD_PRINT("zxdbg add -sc7798_read read: %x, %x, %x, %x\n",test_data[0], test_data[1], test_data[2], test_data[3]);
444 static int32_t sc7798_invalidate(struct panel_spec *self)
446 LCD_PRINT("sc7798_invalidate\n");
448 return self->ops->panel_set_window(self, 0, 0,
449 self->width - 1, self->height - 1);
454 static int32_t sc7798_invalidate_rect(struct panel_spec *self,
455 uint16_t left, uint16_t top,
456 uint16_t right, uint16_t bottom)
458 LCD_PRINT("sc7798_invalidate_rect \n");
460 return self->ops->panel_set_window(self, left, top,
464 static int32_t sc7798_read_id(struct panel_spec *self)
468 spi_send_cmd_t spi_send_cmd = self->info.rgb->bus_info.spi->ops->spi_send_cmd;
469 spi_send_data_t spi_send_data = self->info.rgb->bus_info.spi->ops->spi_send_data;
470 spi_read_t spi_read = self->info.rgb->bus_info.spi->ops->spi_read;
472 sc7798_SpiWriteCmd(0xDA); // SET password
477 //LCD_PRINT(" sc7798_read_id u-boot id = %x\n",id);
483 static struct panel_operations lcd_sc7798_rgb_spi_operations = {
484 .panel_init = sc7798_init,
485 .panel_set_window = sc7798_set_window,
486 .panel_invalidate_rect= sc7798_invalidate_rect,
487 .panel_invalidate = sc7798_invalidate,
488 .panel_enter_sleep = sc7798_enter_sleep,
489 .panel_readid = sc7798_read_id
492 static struct timing_rgb lcd_sc7798_rgb_timing = {
502 static struct spi_info lcd_sc7798_rgb_spi_info = {
506 static struct info_rgb lcd_sc7798_rgb_info = {
507 .cmd_bus_mode = SPRDFB_RGB_BUS_TYPE_SPI,
508 .video_bus_width = 24, /*18,16*/
509 .h_sync_pol = SPRDFB_POLARITY_NEG,
510 .v_sync_pol = SPRDFB_POLARITY_NEG,
511 .de_pol = SPRDFB_POLARITY_POS,
512 .timing = &lcd_sc7798_rgb_timing,
514 .spi = &lcd_sc7798_rgb_spi_info,
518 struct panel_spec lcd_panel_sc7798_rgb_spi = {
522 .type = LCD_MODE_RGB,
523 .direction = LCD_DIRECT_NORMAL,
525 .rgb = &lcd_sc7798_rgb_info
527 .ops = &lcd_sc7798_rgb_spi_operations,