1 /* drivers/video/sc8810/lcd_ili9486.c
3 * Support for ili9486 LCD device
5 * Copyright (C) 2010 Spreadtrum
9 #include <asm/arch/sprd_lcd.h>
15 #define LCD_PRINT printk
17 #define LCD_PRINT(...)
20 static int32_t ili9486_init(struct panel_spec *self)
22 send_data_t send_cmd = self->info.mcu->ops->send_cmd;
23 send_data_t send_data = self->info.mcu->ops->send_data;
25 LCD_PRINT("ili9486_init\n");
27 // Hidden register setting
51 //Power setting sequence
62 LCD_DelayMS(150); // 150ms
64 //Display parameter setting
79 send_data(0x12);//11: 67hz, 12:63.5hz
92 send_data(0x22);//0x42
122 send_data(0xD8);//0xC8
252 send_cmd(0x11); // (SLPOUT)
254 LCD_DelayMS(120); // 100ms
256 send_cmd(0x29); // (DISPON)
258 LCD_DelayMS(100); // 100ms
260 if (1) { // for test the lcd
262 send_cmd(0x2C); //Write data
263 for (i = 0; i < 480*320/3; i++)
265 for (i = 0; i < 480*320/3; i++)
267 for (i = 0; i < 480*320/3; i++)
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
278 LCD_PRINT("ili9486_init: end\n");
283 static int32_t ili9486_set_window(struct panel_spec *self,
284 uint16_t left, uint16_t top, uint16_t right, uint16_t bottom)
286 send_data_t send_cmd = self->info.mcu->ops->send_cmd;
287 send_data_t send_data = self->info.mcu->ops->send_data;
289 LCD_PRINT("ili9486_set_window\n");
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));
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));
309 static int32_t ili9486_invalidate(struct panel_spec *self)
311 LCD_PRINT("ili9486_invalidate\n");
313 return self->ops->panel_set_window(self, 0, 0,
314 self->width-1, self->height-1);
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)
322 LCD_PRINT("ili9486_invalidate_rect : (%d, %d, %d, %d)\n",left, top, right, bottom);
325 return self->ops->panel_set_window(self, left, top,
329 static int32_t ili9486_set_direction(struct panel_spec *self, uint16_t direction)
332 LCD_PRINT("ili9486_set_direction\n");
336 static int32_t ili9486_enter_sleep(struct panel_spec *self, uint8_t is_sleep)
338 send_data_t send_cmd = self->info.mcu->ops->send_cmd;
351 static int32_t ili9486_read_id(struct panel_spec *self)
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;
360 read_value += read_data()<< 16;
361 read_value += read_data()<< 8;
362 read_value += read_data();
364 LCD_PRINT("ili9486_read_id=%x\n",read_value);
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,
379 static struct timing_mcu lcd_ili9486_timing[] = {
398 static struct info_mcu lcd_ili9486_info = {
399 .bus_mode = LCD_BUS_8080,
402 .timing = &lcd_ili9486_timing,
406 struct panel_spec lcd_panel_ili9486 = {
410 .type = LCD_MODE_MCU,
411 .direction = LCD_DIRECT_NORMAL,
413 .mcu = &lcd_ili9486_info
415 .ops = &lcd_ili9486_operations,