6.mtk 带升压ic的insell屏点亮
原理:insell屏因需要至少+-5v的电压输入才能正常显示,所以在硬件上加了正负压ic,在r1342出贴0R电阻,只需操作VP_EN即可,L1303处电感调试是发现贴小了,也会影响正负5v出不来,如下为lcm源码,可供参考,dws的部分也需配置
#ifdef BUILD_LK
#include "platform/mt_gpio.h"
#else
#include <linux/string.h>
#if defined(BUILD_UBOOT)
#include <asm/arch/mt_gpio.h>
#else
//#include <mach/mt_gpio.h>
#endif
#endif
#ifndef BUILD_LK //#ifdef CONFIG_OF
#include <linux/of.h>
#include <linux/of_irq.h>
#include <linux/of_platform.h>
#endif
#include "lcm_drv.h"
// ---------------------------------------------------------------------------
// Local Constants
// ---------------------------------------------------------------------------
#define FRAME_WIDTH (720)
#define FRAME_HEIGHT (1440)
#define LCM_SCL0_GPIO (GPIO50 | 0x80000000)
#define LCM_SDA0_GPIO (GPIO49 | 0x80000000)
#define LCM_TP_INT_GPIO (GPIO62 | 0x80000000)
#ifndef TRUE
#define TRUE 1
#endif
#ifndef FALSE
#define FALSE 0
#endif
// ---------------------------------------------------------------------------
// Local Variables
// ---------------------------------------------------------------------------
#define REGFLAG_DELAY (0XFFFE)
#define REGFLAG_END_OF_TABLE (0xFff0)
#define LCM_FT8006M_ID (0x38)
static LCM_UTIL_FUNCS lcm_util = {0};
#define SET_RESET_PIN(v) (lcm_util.set_reset_pin((v)))
#define UDELAY(n) (lcm_util.udelay(n))
#define MDELAY(n) (lcm_util.mdelay(n))
#ifndef BUILD_LK
extern int sysfile_gesture_enable;
int esd_test = 0;
#endif
// ---------------------------------------------------------------------------
// Local Functions
// ---------------------------------------------------------------------------
#define dsi_set_cmdq_V2(cmd, count, ppara, force_update) lcm_util.dsi_set_cmdq_V2(cmd, count, ppara, force_update)
#define dsi_set_cmdq(pdata, queue_size, force_update) lcm_util.dsi_set_cmdq(pdata, queue_size, force_update)
#define wrtie_cmd(cmd) lcm_util.dsi_write_cmd(cmd)
#define write_regs(addr, pdata, byte_nums) lcm_util.dsi_write_regs(addr, pdata, byte_nums)
#define read_reg(cmd) lcm_util.dsi_dcs_read_lcm_reg(cmd)
#define read_reg_v2(cmd, buffer, buffer_size) lcm_util.dsi_dcs_read_lcm_reg_v2(cmd, buffer, buffer_size)
struct LCM_setting_table {
unsigned cmd;
unsigned char count;
unsigned char para_list[64];
};
#define LCM_DSI_CMD_MODE 0
static struct LCM_setting_table lcm_initialization_setting[] = {
////AU5.99 FT8006
{REGFLAG_DELAY, 40, {}},
{0x11,1,{0x00}},
{REGFLAG_DELAY, 150, {}},
////auo5.46/2.3+rm68200
//Stop reload
{0x50,1,{0x5A}},
//INT CANCEL
{0x54,1,{0x03}},
//VCOM
{0x50,2,{0x5A,0x03}},
{0x80,1,{0xD2}},//c7 Ca C3 D0-ok
//Blank 8
{0x50,2,{0x5A,0x08}},
{0x80,2,{0xAF,0x00}},
//Blank 9
{0x50,2,{0x5A,0x09}},
{0x80,16,{0x5A,0x51,0xB5,0x2A,0x6C,0xC5,0x4A,0x01,0x40,0xE1,0x0E,0x82,0x20,0x08,0x30,0x4B}},
{0x90,16,{0x00,0x00,0x42,0x0A,0xE3,0x55,0x9B,0xF0,0xAE,0xC3,0x66,0x20,0x19,0xA1,0x26,0x00}},
{0xA0,6,{0xA1,0x80,0x08,0x20,0x06,0x00}},
//Blank 10
{0x50,2,{0x5A,0x0A}},
{0x80,16,{0x73,0xE7,0x02,0x17,0x35,0x40,0x50,0x64,0x73,0x73,0xA1,0x8E,0xC0,0x7E,0x4D,0x84}},
{0x90,16,{0x58,0x51,0x46,0x35,0x1A,0x10,0x23,0x0D,0x35,0x40,0x50,0x64,0x73,0x73,0xA1,0x8E}},
{0xA0,12,{0xC0,0x7E,0x4D,0x84,0x58,0x51,0x46,0x35,0x1A,0x10,0x07,0x00}},
//Blank 11
{0x50,2,{0x5A,0x0B}},
{0x80,16,{0x00,0x00,0x20,0x44,0x08,0x00,0x60,0x47,0x00,0x00,0x10,0x22,0x04,0x00,0xB0,0x23}},
{0x90,2,{0x15,0x00}},
//Blank 12
{0x50,2,{0x5A,0x0C}},
{0x80,16,{0xFA,0x68,0x68,0x01,0x2D,0x6E,0x10,0x04,0x00,0x60,0x15,0x00,0x50,0x15,0x56,0x51}},
{0x90,16,{0x15,0x55,0x61,0x15,0x00,0x60,0x15,0x00,0x50,0x15,0x56,0x51,0x15,0x55,0x61,0x95}},
{0xA0,16,{0xAB,0x18,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x4C,0x29,0x84,0x52,0x01,0x09,0x00}},
//Blank 13
{0x50,2,{0x5A,0x0D}},
{0x80,14,{0xF0,0xB1,0x71,0x6F,0x48,0xC0,0x80,0x1A,0x00,0x00,0x00,0x00,0x00,0x00}},
//Blank 14
{0x50,2,{0x5A,0x0E}},
{0x80,12,{0xFF,0x81,0x68,0xEC,0xB6,0x6D,0x1B,0x00,0x00,0x00,0x00,0x00}},
//Blank 15
{0x50,2,{0x5A,0x0F}},
{0x80,16,{0x49,0x0D,0x44,0x20,0x1C,0x58,0x64,0x10,0x51,0x21,0xC8,0x50,0x01,0x32,0x8C,0x8C}},
{0x90,7,{0xFC,0xFF,0xFF,0xFF,0xFF,0x7F,0x14}},
//Blank 16
{0x50,2,{0x5A,0x10}},
{0x80,16,{0x00,0xE0,0x03,0xC7,0x1F,0x17,0x20,0x48,0x00,0x52,0xCD,0x18,0x69,0x90,0x12,0xC4}},
{0x90,15,{0x54,0x8B,0xAB,0xC5,0x9A,0x7B,0x50,0x55,0x55,0x55,0x55,0x55,0x35,0x10,0x00}},
//Blank 17
{0x50,2,{0x5A,0x11}},
{0x80,16,{0x48,0x77,0x03,0x40,0xCA,0xF3,0xFF,0xE3,0x00,0x08,0xC4,0x06,0xA1,0xD8,0x24,0x18}},
{0x90,16,{0x30,0xC6,0x66,0xC1,0x80,0x71,0x15,0xCB,0xE5,0xD2,0x68,0x6C,0x36,0x1D,0x04,0xC8}},
{0xA0,16,{0xB0,0xD9,0x88,0x60,0xB0,0x81,0x40,0x1A,0x1B,0x48,0x63,0x03,0xB9,0x00,0x24,0x80}},
{0xB0,16,{0x50,0x30,0x00,0xE0,0xE1,0x01,0x00,0x28,0x0E,0x06,0xC3,0x5D,0xD5,0xDD,0xDD,0xDD}},
{0xC0,16,{0x9D,0x88,0x88,0x88,0x88,0x88,0xC8,0x08,0x84,0xC6,0xE3,0x81,0x00,0x20,0x00,0x21}},
{0xD0,16,{0x42,0x88,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x29,0x04,0x41,0x06,0x00,0x00,0x00}},
{0xE0,16,{0x00,0x92,0x24,0x49,0x92,0x04,0x00,0x00,0x00,0x00,0x92,0x04,0x00,0x85,0x11,0x0C}},
{0xF0,9,{0x00,0x00,0x40,0x00,0x00,0x00,0x00,0x5E,0x00}},
//Blank 18
{0x50,2,{0x5A,0x12}},
{0x80,16,{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}},
{0x90,9,{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}},
//Blank 19
{0x50,2,{0x5A,0x13}},
{0x80,16,{0x01,0x00,0x00,0x0C,0x00,0x00,0x00,0x00,0x01,0x14,0x01,0x1C,0x44,0x0C,0xCE,0xE7}},
{0x90,3,{0x62,0x0E,0x00}},
//Blank 20
{0x50,2,{0x5A,0x14}},
{0x80,16,{0x51,0x01,0x00,0xB8,0xE8,0xEF,0xF7,0xFB,0xFD,0x7E,0x01,0x00,0x00,0x68,0xC5,0x84}},
{0x90,16,{0x07,0x2F,0x20,0x16,0x3C,0x78,0x01,0x33,0xE0,0xC1,0x0B,0x98,0x02,0x0F,0x5E,0xC0}},
{0xA0,16,{0x0D,0xFC,0x7E,0x11,0x2E,0xE0,0xF7,0x1B,0x00,0x18,0x01,0x00,0x00,0x00,0x00,0x00}},
{0xB0,16,{0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x04,0x2D,0xD0,0x2A,0x00,0x40,0xA1}},
{0xC0,16,{0x50,0x78,0x03,0x86,0xBF,0x80,0x31,0x00,0xAF,0xC0,0xF0,0x17,0x30,0x06,0xE0,0x35}},
{0xD0,16,{0x18,0xFE,0x02,0xC6,0x00,0xBC,0x0A,0xC3,0x5F,0xC0,0x18,0x80,0x77,0xE1,0xB6,0x10}},
{0xE0,16,{0x00,0x00,0xF8,0x1E,0xDC,0x16,0x02,0x00,0x00,0xDF,0x81,0xDB,0x42,0x00,0x00,0xE0}},
{0xF0,16,{0x0B,0x70,0x5B,0x08,0x00,0x00,0x1C,0x00,0xBF,0x5F,0x18,0x00,0x00,0x00,0x00,0x00}},
//Blank 21
{0x50,2,{0x5A,0x15}},
{0x80,16,{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0xC0,0xE0,0xF7}},
{0x90,16,{0x23,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}},
{0xA0,16,{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}},
{0xB0,16,{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x13,0x00,0xF0,0x00,0x14,0x8E,0xA3,0x2C}},
{0xC0,16,{0x84,0x51,0x1C,0x00,0x20,0x08,0x41,0x30,0x0C,0x48,0xE2,0x38,0x8E,0xE3,0xB8,0x29}},
{0xD0,16,{0x5A,0x9E,0xA4,0x39,0x8E,0x61,0x28,0x8A,0x20,0xB8,0x2A,0x8E,0xE3,0x38,0x8E,0xAB}},
{0xE0,16,{0xAE,0xA4,0x59,0x9E,0x20,0x28,0x8A,0x61,0x38,0x8E,0x68,0xE2,0x38,0x8E,0xE3,0x38}},
{0xF0,16,{0x09,0x52,0x1C,0x84,0x31,0x0C,0x41,0x20,0x08,0x00,0xB0,0x28,0x8E,0xE3,0x38,0x42}},
//Blank 22
{0x50,2,{0x5A,0x16}},
{0x80,16,{0x41,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}},
{0x90,6,{0x00,0x00,0x00,0x00,0xD0,0x40}},
//Blank 24
{0x50,2,{0x5A,0x18}},
{0x80,16,{0xEF,0xBD,0xF7,0xDE,0x7B,0xEF,0xBD,0x07,0x08,0x08,0x0A,0x0C,0x0C,0x0C,0x0C,0x0C}},
{0x90,16,{0x0C,0x0C,0x0C,0x5C,0x09,0xA8,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0x5A}},
{0xA0,16,{0x59,0x59,0x59,0x59,0x59,0x59,0x59,0x59,0x59,0x59,0x59,0x09,0x04,0xFF,0x05,0x80}},
{0xB0,14,{0x80,0x00,0x04,0x20,0x00,0x01,0x08,0x40,0x00,0x02,0x10,0x80,0x00,0x04,0x0F}},
//Blank 25
{0x50,2,{0x5A,0x19}},
{0x80,16,{0xF0,0xD9,0xC8,0xBA,0xAF,0xA6,0x9E,0x98,0x92,0x8D,0x88,0x84,0x00,0xF0,0x6F,0xF6}},
{0x90,16,{0xCF,0xFC,0x6F,0xF6,0xFE,0xFC,0x0A,0xFF,0xAF,0xB5,0x71,0x0E,0x6C,0x4A,0x69,0x08}},
{0xA0,7,{0x00,0x00,0x00,0x00,0x00,0x00,0x00}},
//Blank 26
{0x50,2,{0x5A,0x1A}},
{0x80,16,{0x00,0x04,0x08,0x0C,0x00,0x10,0x14,0x18,0x1C,0x00,0x20,0x28,0x30,0x38,0x00,0x40}},
{0x90,16,{0x48,0x50,0x58,0x00,0x60,0x68,0x70,0x78,0x00,0x80,0x88,0x90,0x98,0x00,0xA0,0xA8}},
{0xA0,16,{0xB0,0xB8,0x00,0xC0,0xC8,0xD0,0xD8,0x00,0xE0,0xE8,0xF0,0xF8,0x00,0xFC,0xFE,0xFF}},
{0xB0,16,{0x00,0x00,0x04,0x08,0x0C,0x00,0x10,0x14,0x18,0x1C,0x00,0x20,0x28,0x30,0x38,0x00}},
{0xC0,16,{0x40,0x48,0x50,0x58,0x00,0x60,0x68,0x70,0x78,0x00,0x80,0x88,0x90,0x98,0x00,0xA0}},
{0xD0,16,{0xA8,0xB0,0xB8,0x00,0xC0,0xC8,0xD0,0xD8,0x00,0xE0,0xE8,0xF0,0xF8,0x00,0xFC,0xFE}},
{0xE0,16,{0xFF,0x00,0x00,0x04,0x08,0x0C,0x00,0x10,0x14,0x18,0x1C,0x00,0x20,0x28,0x30,0x38}},
{0xF0,16,{0x00,0x40,0x48,0x50,0x58,0x00,0x60,0x68,0x70,0x78,0x00,0x80,0x88,0x90,0x98,0x00}},
//Blank 27
{0x50,2,{0x5A,0x1B}},
{0x80,16,{0xA0,0xA8,0xB0,0xB8,0x00,0xC0,0xC8,0xD0,0xD8,0x00,0xE0,0xE8,0xF0,0xF8,0x00,0xFC}},
{0x90,4,{0xFE,0xFF,0x00,0x00}},
//Blank 32
{0x50,2,{0x5A,0x20}},
{0x80,7,{0x8B,0x00,0x00,0x00,0x00,0x00,0x00}},
//Blank 34
{0x50,2,{0x5A,0x22}},
{0x80,13,{0x2D,0xD3,0x00,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x1F,0x00}},
//Blank 35
{0x50,2,{0x5A,0x23}},
{0x80,16,{0x01,0x05,0x00,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}},
{0x90,9,{0xFF,0x0F,0x00,0x00,0x24,0x00,0x00,0x00,0x00}},
//Blank 36
{0x50,2,{0x5A,0x24}},
{0x80,16,{0x00,0x03,0x00,0x9D,0xBF,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x78,0x86}},
//SPI not FINISH
{0x90,1,{0x5A}},
//SPI FINISH
{0x90,1,{0xA5}},
//Blank select 2F
{0x50,2,{0x5A,0x2F}},
{0x09,1,{0x00}},
//{0x02,1,{0x5a}},
{0x29,1,{0x00}},
{REGFLAG_DELAY, 50, {}},
{REGFLAG_END_OF_TABLE, 0x00, {}}
};
#ifndef BUILD_LK //#ifdef CONFIG_OF
struct platform_device *lcm_ldo_dev;
struct pinctrl *lcm_ldo_pinctrl;
struct device_node *lcm_ldo_node;
struct pinctrl_state *pinctrl_lcm_1_8v_en_low;
struct pinctrl_state *pinctrl_lcm_1_8v_en_high;
struct pinctrl_state *pinctrl_lcm_2_5v_en_low;
struct pinctrl_state *pinctrl_lcm_2_5v_en_high;
struct pinctrl_state *pinctrl_lcm_3_3v_en_low;
struct pinctrl_state *pinctrl_lcm_3_3v_en_high;
void nlcm_ldo_get_gpio_pinctrl(void)
{
int ret = 0;
lcm_ldo_node = of_find_compatible_node(NULL, NULL, "mediatek,mtkfb1");
if (lcm_ldo_node == NULL) {
pr_err("LCM_LDO- get LCM_LDO node failed\n");
}
lcm_ldo_dev = of_find_device_by_node(lcm_ldo_node);
if(lcm_ldo_dev == NULL)
return ;
lcm_ldo_pinctrl = devm_pinctrl_get(&lcm_ldo_dev->dev);
if (IS_ERR(lcm_ldo_pinctrl)) {
dev_err(&lcm_ldo_dev->dev, "Cannot find usb lcm_ldo_pinctrl!\n");
}
pr_debug("****%s:%d nlcm_ldo_get_gpio_pinctrl !!!!!\n", __func__, __LINE__);
pinctrl_lcm_1_8v_en_low = pinctrl_lookup_state(lcm_ldo_pinctrl, "lcm_1_8v_en_out0_gpio");
if (IS_ERR(pinctrl_lcm_1_8v_en_low)) {
ret = PTR_ERR(pinctrl_lcm_1_8v_en_low);
printk("Cannot find lcm_1_8v_en_out0_gpio\n");
}
pinctrl_lcm_1_8v_en_high = pinctrl_lookup_state(lcm_ldo_pinctrl, "lcm_1_8v_en_out1_gpio");
if (IS_ERR(pinctrl_lcm_1_8v_en_high)) {
ret = PTR_ERR(pinctrl_lcm_1_8v_en_high);
printk("Cannot find lcm_1_8v_en_out1_gpio\n");
}
pinctrl_lcm_2_5v_en_low = pinctrl_lookup_state(lcm_ldo_pinctrl, "lcm_2_5v_en_out0_gpio");
if (IS_ERR(pinctrl_lcm_2_5v_en_low)) {
ret = PTR_ERR(pinctrl_lcm_2_5v_en_low);
printk("Cannot find lcm_2_5v_en_out0_gpio\n");
}
pinctrl_lcm_2_5v_en_high = pinctrl_lookup_state(lcm_ldo_pinctrl, "lcm_2_5v_en_out1_gpio");
if (IS_ERR(pinctrl_lcm_2_5v_en_high)) {
ret = PTR_ERR(pinctrl_lcm_2_5v_en_high);
printk("Cannot find lcm_2_5v_en_out1_gpio\n");
}
pinctrl_lcm_3_3v_en_low = pinctrl_lookup_state(lcm_ldo_pinctrl, "lcm_3_3v_en_out0_gpio");
if (IS_ERR(pinctrl_lcm_3_3v_en_low)) {
ret = PTR_ERR(pinctrl_lcm_3_3v_en_low);
printk("Cannot find lcm_3_3v_en_out0_gpio\n");
}
pinctrl_lcm_3_3v_en_high = pinctrl_lookup_state(lcm_ldo_pinctrl, "lcm_3_3v_en_out1_gpio");
if (IS_ERR(pinctrl_lcm_3_3v_en_high)) {
ret = PTR_ERR(pinctrl_lcm_3_3v_en_high);
printk("Cannot find lcm_3_3v_en_out1_gpio\n");
}
pr_debug("****%s:%d end Init Drive NLEDS KS!!!!!\n", __func__, __LINE__);
}
int mt_lcm_ldo_set_gpio( unsigned int level)
{
nlcm_ldo_get_gpio_pinctrl();
if (level == 0)
{
pinctrl_select_state(lcm_ldo_pinctrl, pinctrl_lcm_1_8v_en_low);
}
else
{
pinctrl_select_state(lcm_ldo_pinctrl, pinctrl_lcm_1_8v_en_high);
}
return 0;
}
#endif
static void lcd_power_en(unsigned char enabled)
{
if (enabled)
{
#ifdef BUILD_LK
MDELAY(10);
mt_set_gpio_mode(GPIO_LCM_BL_EN, GPIO_MODE_00);
mt_set_gpio_dir(GPIO_LCM_BL_EN, GPIO_DIR_OUT);
mt_set_gpio_out(GPIO_LCM_BL_EN, GPIO_OUT_ONE);
#else
mt_lcm_ldo_set_gpio(1);
#endif
}
else
{
#ifdef BUILD_LK
mt_set_gpio_mode(GPIO_LCM_BL_EN, GPIO_MODE_00);
mt_set_gpio_dir(GPIO_LCM_BL_EN, GPIO_DIR_OUT);
mt_set_gpio_out(GPIO_LCM_BL_EN, GPIO_OUT_ZERO);
#else
mt_lcm_ldo_set_gpio(0);
#endif
}
}
// ---------------------------------------------------------------------------
// LCM Driver Implementations
// ---------------------------------------------------------------------------
static void lcm_set_util_funcs(const LCM_UTIL_FUNCS *util)
{
memcpy(&lcm_util, util, sizeof(LCM_UTIL_FUNCS));
}
static void lcm_get_params(LCM_PARAMS *params)
{
memset(params, 0, sizeof(LCM_PARAMS));
params->type = LCM_TYPE_DSI;
params->width = FRAME_WIDTH;
params->height = FRAME_HEIGHT;
// enable tearing-free
params->dbi.te_mode = LCM_DBI_TE_MODE_VSYNC_ONLY;
params->dbi.te_edge_polarity = LCM_POLARITY_RISING;
#if (LCM_DSI_CMD_MODE)
params->dsi.mode = CMD_MODE;
params->dsi.switch_mode = SYNC_PULSE_VDO_MODE;
#else
params->dsi.mode = SYNC_PULSE_VDO_MODE;//SYNC_EVENT_VDO_MODE;//BURST_VDO_MODE;////
#endif
// DSI
/* Command mode setting */
//1 Three lane or Four lane
params->dsi.LANE_NUM = LCM_FOUR_LANE;
//The following defined the fomat for data coming from LCD engine.
params->dsi.data_format.color_order = LCM_COLOR_ORDER_RGB;
params->dsi.data_format.trans_seq = LCM_DSI_TRANS_SEQ_MSB_FIRST;
params->dsi.data_format.padding = LCM_DSI_PADDING_ON_LSB;
params->dsi.data_format.format = LCM_DSI_FORMAT_RGB888;
params->dsi.PS=LCM_PACKED_PS_24BIT_RGB888;
#if (LCM_DSI_CMD_MODE)
params->dsi.intermediat_buffer_num = 0;//because DSI/DPI HW design change, this parameters should be 0 when video mode in MT658X; or memory leakage
params->dsi.word_count=FRAME_WIDTH*3; //DSI CMD mode need set these two bellow params, different to 6577
#else
params->dsi.intermediat_buffer_num = 0; //because DSI/DPI HW design change, this parameters should be 0 when video mode in MT658X; or memory leakage
#endif
// Video mode setting
params->dsi.packet_size=256;
params->dsi.vertical_sync_active = 8;
params->dsi.vertical_backporch = 37;//16 25 30 35 12 8
params->dsi.vertical_frontporch = 190;
params->dsi.vertical_active_line = FRAME_HEIGHT;
params->dsi.horizontal_sync_active = 14;
params->dsi.horizontal_backporch = 36;//32
params->dsi.horizontal_frontporch = 45;//78
params->dsi.horizontal_active_pixel = FRAME_WIDTH;
/* params->dsi.ssc_disable = 1; */
params->dsi.PLL_CLOCK = 265;
params->dsi.cont_clock = 1;
params->dsi.clk_lp_per_line_enable = 1;
params->dsi.ssc_disable = 1;
/*params->dsi.esd_check_enable = 1;
params->dsi.customization_esd_check_enable = 1;
params->dsi.lcm_esd_check_table[0].cmd = 0x0a;
params->dsi.lcm_esd_check_table[0].count = 1;
params->dsi.lcm_esd_check_table[0].para_list[0] = 0x9c;*/
}
static void push_table(struct LCM_setting_table *table, unsigned int count, unsigned char force_update)
{
unsigned int i;
for(i = 0; i < count; i++) {
unsigned cmd;
cmd = table[i].cmd;
switch (cmd) {
case REGFLAG_DELAY :
MDELAY(table[i].count);
break;
default:
dsi_set_cmdq_V2(cmd, table[i].count, table[i].para_list, force_update);
}
}
}
static void lcm_init(void)
{
#if 1
lcd_power_en(1);
MDELAY(100);
SET_RESET_PIN(1);
MDELAY(10);
SET_RESET_PIN(0);
MDELAY(10);
SET_RESET_PIN(1);
MDELAY(200);
#endif
push_table(lcm_initialization_setting, sizeof(lcm_initialization_setting) / sizeof(struct LCM_setting_table), 1);
}
static void lcm_suspend(void)
{
unsigned int array[5];
array[0] = 0x00280500;
dsi_set_cmdq(array, 1, 1);
MDELAY(100);
array[0] = 0x00100500;// read id return two byte,version and id
dsi_set_cmdq(array, 1, 1);
MDELAY(120);
array[0] = (0x00022902);
array[1] = (0x00005A04);
dsi_set_cmdq(array, 2, 1);
MDELAY(10);
array[0] = (0x00022902);
array[1] = (0x00005A05);
dsi_set_cmdq(array, 2, 1);
MDELAY(10);
lcd_power_en(0);
}
static void lcm_resume(void)
{
lcm_init();
}
static unsigned int lcm_compare_id(void)
{
unsigned int array[4];
char buffer[5];
char id_high=0;
int id2=0;
lcd_power_en(1);
SET_RESET_PIN(1);
MDELAY(5);
SET_RESET_PIN(0);
MDELAY(20);
SET_RESET_PIN(1);
MDELAY(120);
array[0] = 0x00013700;
dsi_set_cmdq(array, 1, 1);
read_reg_v2(0x04, buffer, 1);
id_high = buffer[0];
/*
read_reg_v2(0xdf, buffer, 1);
id_low = buffer[0];
id1 = (id_high<<8) | id_low;
*/
#if defined(BUILD_LK)
printf("ft8006m %s id_high = 0x%04x, id2 = 0x%04x\n", __func__, id_high,id2);
#else
printk("ft8006m %s id_high = 0x%04x, id2 = 0x%04x\n", __func__, id_high,id2);
#endif
return (LCM_FT8006M_ID == id_high)?1:0;
}
#if 0
static unsigned int lcm_esd_check(void)
{
#ifndef BUILD_LK
char buffer[3];
int array[4];
array[0]=0x00DE0500;
dsi_set_cmdq(array, 1, 1);
array[0]=0x32B41500;
dsi_set_cmdq(array, 1, 1);
array[0]=0x00DF0500;
dsi_set_cmdq(array, 1, 1);
array[0] = 0x00013700;// read id return two byte,version and id
dsi_set_cmdq(array, 1, 1);
read_reg_v2(0x0a, buffer, 1);
esd_test++;
if(buffer[0]==0x9c)
{ printk("%s, buffer[0] = 0x%08x\n", __func__, buffer[0]);
if((esd_test%15) == 0) return TRUE; //every 30S ESD fail a time
return FALSE;
}
else
{ printk("%s, buffer[0] = 0x%08x\n", __func__, buffer[0]);
return TRUE;
}
#endif
}
static unsigned int lcm_esd_recover(void)
{
lcd_power_en(0);
MDELAY(2000);
lcm_init();
return TRUE;
}
#endif
LCM_DRIVER ft8006m_dsi_vdo_common_lcm_drv =
{
.name = "ft8006m_dsi_vdo_common",
.set_util_funcs = lcm_set_util_funcs,
.get_params = lcm_get_params,
.init = lcm_init,
.suspend = lcm_suspend,
.resume = lcm_resume,
.compare_id = lcm_compare_id,
//.esd_check = lcm_esd_check,
//.esd_recover = lcm_esd_recover,
#if (LCM_DSI_CMD_MODE)
//.update = lcm_update,
#endif
};