1 /* drivers/video/sc8810/lcd_ili9341.c
\r
3 * Support for ili9341 LCD device
\r
7 #include <asm/arch/sprd_lcd.h>
\r
9 #define printk printf
\r
13 #define LCD_PRINT printk
\r
15 #define LCD_PRINT(...)
\r
18 static int32_t ili9341_init(struct panel_spec *self)
\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
23 LCD_PRINT("ili9341_init\n");
\r
64 //Initializing Sequence
\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
226 if (1) { // for test the lcd
\r
228 send_cmd(0x2C); //Write data
\r
229 for (i = 0; i < 240*320/3; i++)
\r
231 for (i = 0; i < 240*320/3; i++)
\r
233 for (i = 0; i < 240*320/3; i++)
\r
234 send_data(0xff0000);
\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
244 LCD_PRINT("ili9341_init: end\n");
\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
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
255 LCD_PRINT("ili9341_set_window\n");
\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
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
275 static int32_t ili9341_invalidate(struct panel_spec *self)
\r
277 LCD_PRINT("ili9341_invalidate\n");
\r
279 return self->ops->panel_set_window(self, 0, 0,
\r
280 self->width-1, self->height-1);
\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
288 LCD_PRINT("ili9341_invalidate_rect : (%d, %d, %d, %d)\n",left, top, right, bottom);
\r
291 return self->ops->panel_set_window(self, left, top,
\r
295 static int32_t ili9341_set_direction(struct panel_spec *self, uint16_t direction)
\r
298 LCD_PRINT("ili9341_set_direction\n");
\r
302 static int32_t ili9341_enter_sleep(struct panel_spec *self, uint8_t is_sleep)
\r
304 send_data_t send_cmd = self->info.mcu->ops->send_cmd;
\r
317 static int32_t ili9341_read_id(struct panel_spec *self)
\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
326 read_value += read_data()<< 16;
\r
327 read_value += read_data()<< 8;
\r
328 read_value += read_data();
\r
330 LCD_PRINT("ili9341_read_id=%x\n",read_value);
\r
331 read_value = 0x9341;
\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
345 static struct timing_mcu lcd_ili9341_timing[] = {
\r
364 static struct info_mcu lcd_ili9341_info = {
\r
365 .bus_mode = LCD_BUS_8080,
\r
368 .timing = &lcd_ili9341_timing,
\r
372 struct panel_spec lcd_panel_ili9341 = {
\r
376 .type = LCD_MODE_MCU,
\r
377 .direction = LCD_DIRECT_NORMAL,
\r
379 .mcu = &lcd_ili9341_info
\r
381 .ops = &lcd_ili9341_operations,
\r