#include "mipi_5_720x1280.h" static void lcd_power_on(u32 sel); static void lcd_power_off(u32 sel); static void lcd_bl_open(u32 sel); static void lcd_bl_close(u32 sel); static void lcd_panel_init1(u32 sel); static void lcd_panel_exit(u32 sel); #define panel_reset(sel, val) sunxi_lcd_gpio_set_value(sel, 0, val) static void lcd_cfg_panel_info(panel_extend_para *info) { u32 i = 0, j = 0; u32 items; u8 lcd_gamma_tbl[][2] = { {0, 0}, {15, 15}, {30, 30}, {45, 45}, {60, 60}, {75, 75}, {90, 90}, {105, 105}, {120, 120}, {135, 135}, {150, 150}, {165, 165}, {180, 180}, {195, 195}, {210, 210}, {225, 225}, {240, 240}, {255, 255}, }; u32 lcd_cmap_tbl[2][3][4] = { { {LCD_CMAP_G0, LCD_CMAP_B1, LCD_CMAP_G2, LCD_CMAP_B3}, {LCD_CMAP_B0, LCD_CMAP_R1, LCD_CMAP_B2, LCD_CMAP_R3}, {LCD_CMAP_R0, LCD_CMAP_G1, LCD_CMAP_R2, LCD_CMAP_G3}, }, { {LCD_CMAP_B3, LCD_CMAP_G2, LCD_CMAP_B1, LCD_CMAP_G0}, {LCD_CMAP_R3, LCD_CMAP_B2, LCD_CMAP_R1, LCD_CMAP_B0}, {LCD_CMAP_G3, LCD_CMAP_R2, LCD_CMAP_G1, LCD_CMAP_R0}, }, }; items = sizeof(lcd_gamma_tbl) / 2; for (i = 0; i < items - 1; i++) { u32 num = lcd_gamma_tbl[i+1][0] - lcd_gamma_tbl[i][0]; for (j = 0; j < num; j++) { u32 value = 0; value = lcd_gamma_tbl[i][1] + ((lcd_gamma_tbl[i+1][1] - lcd_gamma_tbl[i][1]) * j) / num; info->lcd_gamma_tbl[lcd_gamma_tbl[i][0] + j] = (value<<16) + (value<<8) + value; } } info->lcd_gamma_tbl[255] = (lcd_gamma_tbl[items-1][1]<<16) + (lcd_gamma_tbl[items-1][1]<<8) + lcd_gamma_tbl[items-1][1]; memcpy(info->lcd_cmap_tbl, lcd_cmap_tbl, sizeof(lcd_cmap_tbl)); } static s32 lcd_open_flow(u32 sel) { LCD_OPEN_FUNC(sel, lcd_power_on, 50); LCD_OPEN_FUNC(sel, lcd_panel_init1, 20); LCD_OPEN_FUNC(sel, sunxi_lcd_tcon_enable, 20); lcd_bl_open(sel); return 0; } static s32 lcd_close_flow(u32 sel) { LCD_CLOSE_FUNC(sel, lcd_bl_close, 0); LCD_CLOSE_FUNC(sel, lcd_panel_exit, 1); LCD_CLOSE_FUNC(sel, sunxi_lcd_tcon_disable, 10); LCD_CLOSE_FUNC(sel, lcd_power_off, 0); return 0; } static void lcd_power_on(u32 sel) { sunxi_lcd_pin_cfg(sel, 1); panel_reset(sel, 0); sunxi_lcd_power_enable(sel, 0); sunxi_lcd_power_enable(sel, 1); sunxi_lcd_delay_ms(50); panel_reset(sel, 1); sunxi_lcd_delay_ms(10); panel_reset(sel, 0); sunxi_lcd_delay_ms(20); panel_reset(sel, 1); sunxi_lcd_delay_ms(120); } static void lcd_power_off(u32 sel) { panel_reset(sel, 0); sunxi_lcd_delay_ms(1); sunxi_lcd_power_disable(sel, 1); sunxi_lcd_delay_ms(1); sunxi_lcd_power_disable(sel, 0); sunxi_lcd_pin_cfg(sel, 0); } static void lcd_bl_open(u32 sel) { sunxi_lcd_pwm_enable(sel); sunxi_lcd_backlight_enable(sel); } static void lcd_bl_close(u32 sel) { sunxi_lcd_backlight_disable(sel); sunxi_lcd_pwm_disable(sel); } #define ROWS 171 #define COLS 44 u8 data[ROWS][COLS] = { // CMD2 ENABLE {0x15, 0x00, 0x02, 0x00, 0x00}, {0x39, 0x00, 0x04, 0xFF, 0x87, 0x56, 0x01}, {0x15, 0x00, 0x02, 0x00, 0x80}, {0x39, 0x00, 0x03, 0xFF, 0x87, 0x56}, // Panel Resolution 720x1280 {0x15, 0x00, 0x02, 0x00, 0xA1}, {0x39, 0x00, 0x07, 0xB3, 0x02, 0xD0, 0x05, 0x00, 0x20, 0xFC}, // TCON {0x15, 0x00, 0x02, 0x00, 0x80}, {0x39, 0x00, 0x07, 0xC0, 0x00, 0xF6, 0x00, 0x10, 0x00, 0x24}, {0x15, 0x00, 0x02, 0x00, 0x90}, {0x39, 0x00, 0x07, 0xC0, 0x00, 0xF6, 0x00, 0x10, 0x00, 0x24}, {0x15, 0x00, 0x02, 0x00, 0xA0}, {0x39, 0x00, 0x07, 0xC0, 0x02, 0x14, 0x00, 0x10, 0x00, 0x24}, {0x15, 0x00, 0x02, 0x00, 0xB0}, {0x39, 0x00, 0x07, 0xC0, 0x00, 0xF6, 0x00, 0x10, 0x00, 0x24}, {0x15, 0x00, 0x02, 0x00, 0xC1}, {0x39, 0x00, 0x09, 0xC0, 0x01, 0x27, 0x00, 0xEA, 0x00, 0xC5, 0x01, 0x5F}, {0x15, 0x00, 0x02, 0x00, 0xD7}, {0x39, 0x00, 0x07, 0xC0, 0x00, 0xC5, 0x00, 0x10, 0x00, 0x24}, {0x15, 0x00, 0x02, 0x00, 0xA3}, {0x39, 0x00, 0x07, 0xC1, 0x00, 0x20, 0x00, 0x20, 0x00, 0x02}, {0x15, 0x00, 0x02, 0x00, 0x80}, {0x39, 0x00, 0x11, 0xCE, 0x01, 0x81, 0x09, 0x13, 0x00, 0x78, 0x00, 0x78, 0x00, 0x50, 0x00, 0x50, 0x00, 0x78, 0x00, 0x78}, {0x15, 0x00, 0x02, 0x00, 0x90}, {0x39, 0x00, 0x10, 0xCE, 0x00, 0x8E, 0x0E, 0xB6, 0x00, 0x8E, 0x80, 0x09, 0x13, 0x00, 0x04, 0x00, 0x1C, 0x1F, 0x16}, {0x15, 0x00, 0x02, 0x00, 0xA0}, {0x39, 0x00, 0x04, 0xCE, 0x20, 0x00, 0x00}, {0x15, 0x00, 0x02, 0x00, 0xB0}, {0x39, 0x00, 0x04, 0xCE, 0x22, 0x00, 0x00}, {0x15, 0x00, 0x02, 0x00, 0xD1}, {0x39, 0x00, 0x08, 0xCE, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00}, {0x15, 0x00, 0x02, 0x00, 0xE1}, {0x39, 0x00, 0x0C, 0xCE, 0x08, 0x02, 0x4D, 0x02, 0x4D, 0x02, 0x4D, 0x00, 0x00, 0x00, 0x00}, {0x15, 0x00, 0x02, 0x00, 0xF1}, {0x39, 0x00, 0x0A, 0xCE, 0x0C, 0x06, 0x0A, 0x00, 0xE9, 0x00, 0xE9, 0x00, 0xF8}, {0x15, 0x00, 0x02, 0x00, 0xB0}, {0x39, 0x00, 0x05, 0xCF, 0x00, 0x00, 0x6E, 0x72}, {0x15, 0x00, 0x02, 0x00, 0xB5}, {0x39, 0x00, 0x05, 0xCF, 0x02, 0x02, 0x94, 0x98}, {0x15, 0x00, 0x02, 0x00, 0xC0}, {0x39, 0x00, 0x05, 0xCF, 0x04, 0x04, 0xD8, 0xDC}, {0x15, 0x00, 0x02, 0x00, 0xC5}, {0x39, 0x00, 0x05, 0xCF, 0x00, 0x00, 0x08, 0x0C}, // Scan Mode {0x15, 0x00, 0x02, 0x00, 0xE8}, {0x15, 0x00, 0x02, 0xC0, 0x40}, // VST1&VST2 {0x15, 0x00, 0x02, 0x00, 0x80}, {0x39, 0x00, 0x09, 0xC2, 0x84, 0x00, 0x05, 0x89, 0x83, 0x00, 0x05, 0x89}, // CKV1-3 {0x15, 0x00, 0x02, 0x00, 0xA0}, {0x39, 0x00, 0x10, 0xC2, 0x82, 0x04, 0x00, 0x05, 0x89, 0x81, 0x04, 0x00, 0x05, 0x89, 0x00, 0x04, 0x00, 0x05, 0x89}, // CKV4-6 {0x15, 0x00, 0x02, 0x00, 0xB0}, {0x39, 0x00, 0x10, 0xC2, 0x01, 0x04, 0x00, 0x05, 0x89, 0x02, 0x04, 0x00, 0x05, 0x89, 0x03, 0x04, 0x00, 0x05, 0x89}, // CKV7-8 {0x15, 0x00, 0x02, 0x00, 0xC0}, {0x39, 0x00, 0x0B, 0xC2, 0x04, 0x04, 0x00, 0x05, 0x89, 0x05, 0x04, 0x00, 0x05, 0x89}, {0x15, 0x00, 0x02, 0x00, 0xE0}, {0x39, 0x00, 0x05, 0xC2, 0x77, 0x77, 0x77, 0x77}, {0x15, 0x00, 0x02, 0x00, 0xC0}, {0x39, 0x00, 0x05, 0xC3, 0x99, 0x99, 0x99, 0x99}, {0x15, 0x00, 0x02, 0x00, 0x80}, {0x39, 0x00, 0x11, 0xCB, 0x00, 0xC5, 0x00, 0x00, 0x05, 0x05, 0x00, 0x05, 0x0A, 0x05, 0xC5, 0x00, 0x05, 0x05, 0x00, 0xC0}, {0x15, 0x00, 0x02, 0x00, 0x90}, {0x39, 0x00, 0x11, 0xCB, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, {0x15, 0x00, 0x02, 0x00, 0xA0}, {0x39, 0x00, 0x05, 0xCB, 0x00, 0x00, 0x00, 0x00}, {0x15, 0x00, 0x02, 0x00, 0xB0}, {0x39, 0x00, 0x05, 0xCB, 0x10, 0x51, 0x94, 0x50}, {0x15, 0x00, 0x02, 0x00, 0xC0}, {0x39, 0x00, 0x05, 0xCB, 0x10, 0x51, 0x94, 0x50}, {0x15, 0x00, 0x02, 0x00, 0x80}, {0x39, 0x00, 0x11, 0xCC, 0x2D, 0x2D, 0x2D, 0x2D, 0x07, 0x09, 0x0B, 0x0D, 0x25, 0x25, 0x03, 0x2D, 0x22, 0x2D, 0x24, 0x2D}, {0x15, 0x00, 0x02, 0x00, 0x90}, {0x39, 0x00, 0x09, 0xCC, 0x29, 0x16, 0x17, 0x18, 0x19, 0x1A, 0x1B, 0x26}, {0x15, 0x00, 0x02, 0x00, 0x80}, {0x39, 0x00, 0x11, 0xCD, 0x2D, 0x2D, 0x2D, 0x2D, 0x06, 0x08, 0x0A, 0x0C, 0x25, 0x00, 0x02, 0x2D, 0x22, 0x2D, 0x24, 0x2D}, {0x15, 0x00, 0x02, 0x00, 0x90}, {0x39, 0x00, 0x09, 0xCD, 0x29, 0x16, 0x17, 0x18, 0x19, 0x1A, 0x1B, 0x26}, {0x15, 0x00, 0x02, 0x00, 0xA0}, {0x39, 0x00, 0x11, 0xCC, 0x2D, 0x2D, 0x2D, 0x2D, 0x08, 0x06, 0x0C, 0x0A, 0x25, 0x25, 0x02, 0x2D, 0x24, 0x2D, 0x23, 0x2D}, {0x15, 0x00, 0x02, 0x00, 0xB0}, {0x39, 0x00, 0x09, 0xCC, 0x29, 0x16, 0x17, 0x18, 0x19, 0x1A, 0x1B, 0x26}, {0x15, 0x00, 0x02, 0x00, 0xA0}, {0x39, 0x00, 0x11, 0xCD, 0x2D, 0x2D, 0x2D, 0x2D, 0x09, 0x07, 0x0D, 0x0B, 0x25, 0x00, 0x03, 0x2D, 0x24, 0x2D, 0x23, 0x2D}, {0x15, 0x00, 0x02, 0x00, 0xB0}, {0x39, 0x00, 0x09, 0xCD, 0x29, 0x16, 0x17, 0x18, 0x19, 0x1A, 0x1B, 0x26}, {0x15, 0x00, 0x02, 0x00, 0x80}, {0x15, 0x00, 0x02, 0xA7, 0x13}, {0x15, 0x00, 0x02, 0x00, 0x82}, {0x39, 0x00, 0x03, 0xA7, 0x22, 0x02}, {0x15, 0x00, 0x02, 0x00, 0x85}, {0x15, 0x00, 0x02, 0xC4, 0x1C}, {0x15, 0x00, 0x02, 0x00, 0xA0}, {0x39, 0x00, 0x04, 0xC4, 0x8D, 0xD8, 0x8D}, {0x15, 0x00, 0x02, 0x00, 0x93}, {0x15, 0x00, 0x02, 0xC5, 0x37}, {0x15, 0x00, 0x02, 0x00, 0x97}, {0x15, 0x00, 0x02, 0xC5, 0x37}, {0x15, 0x00, 0x02, 0x00, 0xB6}, {0x39, 0x00, 0x03, 0xC5, 0x2D, 0x2D}, {0x15, 0x00, 0x02, 0x00, 0x9A}, {0x15, 0x00, 0x02, 0xC5, 0x19}, {0x15, 0x00, 0x02, 0x00, 0x9C}, {0x15, 0x00, 0x02, 0xC5, 0x19}, {0x15, 0x00, 0x02, 0x00, 0x97}, {0x15, 0x00, 0x02, 0xC4, 0x01}, {0x15, 0x00, 0x02, 0x00, 0x9B}, {0x15, 0x00, 0x02, 0xF5, 0x4B}, {0x15, 0x00, 0x02, 0x00, 0x93}, {0x39, 0x00, 0x03, 0xF5, 0x00, 0x00}, {0x15, 0x00, 0x02, 0x00, 0x9D}, {0x15, 0x00, 0x02, 0xF5, 0x49}, {0x15, 0x00, 0x02, 0x00, 0x82}, {0x39, 0x00, 0x03, 0xF5, 0x00, 0x00}, {0x15, 0x00, 0x02, 0x00, 0x8C}, {0x39, 0x00, 0x04, 0xC3, 0x00, 0x00, 0x00}, {0x15, 0x00, 0x02, 0x00, 0x84}, {0x39, 0x00, 0x03, 0xC5, 0x28, 0x28}, {0x15, 0x00, 0x02, 0x00, 0xA4}, {0x15, 0x00, 0x02, 0xD7, 0x00}, {0x15, 0x00, 0x02, 0x00, 0x80}, {0x39, 0x00, 0x03, 0xF5, 0x59, 0x59}, {0x15, 0x00, 0x02, 0x00, 0x84}, {0x39, 0x00, 0x04, 0xF5, 0x59, 0x59, 0x59}, {0x15, 0x00, 0x02, 0x00, 0x96}, {0x15, 0x00, 0x02, 0xF5, 0x59}, {0x15, 0x00, 0x02, 0x00, 0xA6}, {0x15, 0x00, 0x02, 0xF5, 0x59}, {0x15, 0x00, 0x02, 0x00, 0xCA}, {0x15, 0x00, 0x02, 0xC0, 0x80}, {0x15, 0x00, 0x02, 0x00, 0xB1}, {0x15, 0x00, 0x02, 0xF5, 0x1F}, {0x15, 0x00, 0x02, 0x00, 0x00}, {0x39, 0x00, 0x03, 0xD8, 0x29, 0x2D}, {0x15, 0x00, 0x02, 0x00, 0x86}, {0x39, 0x00, 0x07, 0xC0, 0x01, 0x04, 0x01, 0x01, 0x22, 0x03}, {0x15, 0x00, 0x02, 0x00, 0x96}, {0x39, 0x00, 0x07, 0xC0, 0x01, 0x04, 0x01, 0x01, 0x1B, 0x03}, {0x15, 0x00, 0x02, 0x00, 0xA6}, {0x39, 0x00, 0x07, 0xC0, 0x01, 0x04, 0x01, 0x01, 0x3E, 0x03}, {0x15, 0x00, 0x02, 0x00, 0xE9}, {0x39, 0x00, 0x07, 0xC0, 0x01, 0x04, 0x01, 0x01, 0x1B, 0x03}, {0x15, 0x00, 0x02, 0x00, 0xA3}, {0x39, 0x00, 0x07, 0xCE, 0x01, 0x04, 0x01, 0x01, 0x1B, 0x03}, {0x15, 0x00, 0x02, 0x00, 0xB3}, {0x39, 0x00, 0x07, 0xCE, 0x01, 0x04, 0x01, 0x01, 0x1B, 0x03}, // gamma2.2 {0x15, 0x00, 0x02, 0x00, 0x00}, {0x39, 0x00, 0x29, 0xE1, 0x05, 0x06, 0x09, 0x10, 0x69, 0x1A, 0x22, 0x28, 0x33, 0x98, 0x3A, 0x41, 0x47, 0x4C, 0xE5, 0x51, 0x59, 0x60, 0x67, 0x05, 0x6E, 0x75, 0x7C, 0x85, 0x08, 0x8F, 0x94, 0x9B, 0xA2, 0x22, 0xAB, 0xB6, 0xC4, 0xCE, 0x9E, 0xDA, 0xEA, 0xF7, 0xFF, 0x7B}, {0x15, 0x00, 0x02, 0x00, 0x00}, {0x39, 0x00, 0x29, 0xE2, 0x05, 0x06, 0x09, 0x10, 0x69, 0x1A, 0x22, 0x28, 0x33, 0x98, 0x3A, 0x41, 0x47, 0x4C, 0xE5, 0x51, 0x59, 0x60, 0x67, 0x05, 0x6E, 0x75, 0x7C, 0x85, 0x08, 0x8F, 0x94, 0x9B, 0xA2, 0x22, 0xAB, 0xB6, 0xC4, 0xCE, 0x9E, 0xDA, 0xEA, 0xF7, 0xFF, 0x7B}, {0x15, 0x00, 0x02, 0x00, 0x00}, {0x39, 0x00, 0x29, 0xE3, 0x05, 0x06, 0x09, 0x10, 0x69, 0x1A, 0x22, 0x28, 0x33, 0x98, 0x3A, 0x41, 0x47, 0x4C, 0xE5, 0x51, 0x59, 0x60, 0x67, 0x05, 0x6E, 0x75, 0x7C, 0x85, 0x08, 0x8F, 0x94, 0x9B, 0xA2, 0x22, 0xAB, 0xB6, 0xC4, 0xCE, 0x9E, 0xDA, 0xEA, 0xF7, 0xFF, 0x7B}, {0x15, 0x00, 0x02, 0x00, 0x00}, {0x39, 0x00, 0x29, 0xE4, 0x05, 0x06, 0x09, 0x10, 0x69, 0x1A, 0x22, 0x28, 0x33, 0x98, 0x3A, 0x41, 0x47, 0x4C, 0xE5, 0x51, 0x59, 0x60, 0x67, 0x05, 0x6E, 0x75, 0x7C, 0x85, 0x08, 0x8F, 0x94, 0x9B, 0xA2, 0x22, 0xAB, 0xB6, 0xC4, 0xCE, 0x9E, 0xDA, 0xEA, 0xF7, 0xFF, 0x7B}, {0x15, 0x00, 0x02, 0x00, 0x00}, {0x39, 0x00, 0x29, 0xE5, 0x05, 0x06, 0x09, 0x10, 0x69, 0x1A, 0x22, 0x28, 0x33, 0x98, 0x3A, 0x41, 0x47, 0x4C, 0xE5, 0x51, 0x59, 0x60, 0x67, 0x05, 0x6E, 0x75, 0x7C, 0x85, 0x08, 0x8F, 0x94, 0x9B, 0xA2, 0x22, 0xAB, 0xB6, 0xC4, 0xCE, 0x9E, 0xDA, 0xEA, 0xF7, 0xFF, 0x7B}, {0x15, 0x00, 0x02, 0x00, 0x00}, {0x39, 0x00, 0x29, 0xE6, 0x05, 0x06, 0x09, 0x10, 0x69, 0x1A, 0x22, 0x28, 0x33, 0x98, 0x3A, 0x41, 0x47, 0x4C, 0xE5, 0x51, 0x59, 0x60, 0x67, 0x05, 0x6E, 0x75, 0x7C, 0x85, 0x08, 0x8F, 0x94, 0x9B, 0xA2, 0x22, 0xAB, 0xB6, 0xC4, 0xCE, 0x9E, 0xDA, 0xEA, 0xF7, 0xFF, 0x7B}, // EN GND 4 frame {0x15, 0x00, 0x02, 0x00, 0xCC}, {0x15, 0x00, 0x02, 0xC0, 0x13}, // LVD detect Voltage {0x15, 0x00, 0x02, 0x00, 0x82}, {0x15, 0x00, 0x02, 0xC5, 0x35}, {0x15, 0x00, 0x02, 0x00, 0x94}, {0x39, 0x00, 0x04, 0xC5, 0x02, 0x01, 0x01}, {0x15, 0x00, 0x02, 0x00, 0x98}, {0x39, 0x00, 0x03, 0xC5, 0x25, 0x01}, {0x15, 0x00, 0x02, 0x00, 0x9B}, {0x15, 0x00, 0x02, 0xC5, 0x21}, {0x15, 0x00, 0x02, 0x00, 0x9D}, {0x15, 0x00, 0x02, 0xC5, 0x25}, // Write ID {0x15, 0x00, 0x02, 0x00, 0xD0}, {0x15, 0x00, 0x02, 0xD0, 0x56}, //LCD initial code End {0x05, 0x78, 0x01, 0x11}, {0x05, 0x00, 0x01, 0x29}, {0x15, 0x00, 0x02, 0x35, 0x00} }; static void lcd_panel_init1(u32 sel) { int i; u8 command; u8 *para; u32 para_num; u8 *tmp; printk(KERN_ERR"------uboot----> mipi_5_720x1280 init\n"); sunxi_lcd_dsi_clk_enable(sel); sunxi_lcd_delay_ms(5); for(i = 0; i < ROWS; i++) { tmp = data[i]; if (tmp[0] == 0x05) { sunxi_lcd_dsi_dcs_write_0para(sel, tmp[3]); } else { command = tmp[3]; para_num = tmp[2] - 1; para = tmp + 4; sunxi_lcd_dsi_dcs_write(sel, command, para, para_num); } if (tmp[1] != 0x0) sunxi_lcd_delay_ms(tmp[1]); } } static void lcd_panel_exit(u32 sel) { sunxi_lcd_dsi_dcs_write_0para(sel, 0x28); sunxi_lcd_delay_ms(1); sunxi_lcd_dsi_dcs_write_0para(sel, 0x10); sunxi_lcd_delay_ms(1); } /*sel: 0:lcd0; 1:lcd1*/ static s32 lcd_user_defined_func(u32 sel, u32 para1, u32 para2, u32 para3) { return 0; } __lcd_panel_t mipi_5_720x1280_panel = { /* panel driver name, must mach the name of * lcd_drv_name in sys_config.fex */ .name = "mipi_5_720x1280", .func = { .cfg_panel_info = lcd_cfg_panel_info, .cfg_open_flow = lcd_open_flow, .cfg_close_flow = lcd_close_flow, .lcd_user_defined_func = lcd_user_defined_func, }, };