1 /* drivers/video/sc8810/lcd_ili9486.c
3 * Support for ili9486 LCD device
5 * Copyright (C) 2010 Spreadtrum
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.
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.
19 #include <asm/arch/sc8810_lcd.h>
20 #define mdelay(a) udelay(a * 1000)
25 #define LCD_PRINT printk
27 #define LCD_PRINT(...)
30 static int32_t ili9486_init(struct lcd_spec *self)
32 Send_data send_cmd = self->info.mcu->ops->send_cmd;
33 Send_data send_data = self->info.mcu->ops->send_data;
35 LCD_PRINT("ili9486_init\n");
37 // Hidden register setting
61 //Power setting sequence
74 //Display parameter setting
89 send_data(0x11);//11: 67hz, 12:63.5hz
102 send_data(0x22);//0x42
118 send_data(0xD8);//0xC8
246 send_cmd(0x11); // (SLPOUT)
248 mdelay(120); // 100ms
250 send_cmd(0x29); // (DISPON)
252 mdelay(100); // 100ms
255 if (1) { // for test the lcd
257 send_cmd(0x2C); //Write data
258 for (i = 0; i < 480*320/3; i++)
260 for (i = 0; i < 480*320/3; i++)
262 for (i = 0; i < 480*320/3; i++)
265 send_cmd(0x29); //Display On
267 send_cmd(0x2C); //Write data
268 mdelay(1200); //120ms
270 LCD_PRINT("ili9486_init: end\n");
275 static int32_t ili9486_set_window(struct lcd_spec *self,
276 uint16_t left, uint16_t top, uint16_t right, uint16_t bottom)
278 Send_data send_cmd = self->info.mcu->ops->send_cmd;
279 Send_data send_data = self->info.mcu->ops->send_data;
281 LCD_PRINT("ili9486_set_window\n");
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));
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));
301 static int32_t ili9486_invalidate(struct lcd_spec *self)
303 LCD_PRINT("ili9486_invalidate\n");
305 return self->ops->lcd_set_window(self, 0, 0,
306 self->width-1, self->height-1);
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)
315 LCD_PRINT("ili9486_invalidate_rect : (%d, %d, %d, %d)\n",left, top, right, bottom);
318 return self->ops->lcd_set_window(self, left, top,
322 static int32_t ili9486_set_direction(struct lcd_spec *self, uint16_t direction)
325 LCD_PRINT("ili9486_set_direction\n");
329 static int32_t ili9486_enter_sleep(struct lcd_spec *self, uint8_t is_sleep)
331 Send_data send_cmd = self->info.mcu->ops->send_cmd;
344 static uint32_t ili9486_read_id(struct lcd_spec *self)
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;
353 read_value += read_data()<< 16;
354 read_value += read_data()<< 8;
355 read_value += read_data();
357 LCD_PRINT("ili9486_read_id=%x\n",read_value);
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,
372 static struct timing_mcu lcd_ili9486_timing[] = {
373 [LCD_REGISTER_TIMING] = {
381 [LCD_GRAM_TIMING] = {
391 static struct info_mcu lcd_ili9486_info = {
392 .bus_mode = LCD_BUS_8080,
394 .timing = &lcd_ili9486_timing,
398 struct lcd_spec lcd_panel_ili9486 = {
401 .mode = LCD_MODE_MCU,
402 .direction = LCD_DIRECT_NORMAL,
403 .info = {.mcu = &lcd_ili9486_info},
404 .ops = &lcd_ili9486_operations,