This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

About SN65DSI86 schematic

Other Parts Discussed in Thread: SN65DSI86

Dear Sirs

The schematic is shown as attachment.

The power and I2C are OK.

I follow the datasheet page 72 of sn65dsi86. But my eDP panel does not work.

Initial code code is shown as "myMIPI_dsi_cmd.c lcm_init()".

Could you give me some suggestion? TKS

#ifndef BUILD_LK
#include <linux/string.h>
#else
#include <string.h>
#endif 

#ifdef BUILD_LK
#include <platform/mt_gpio.h>
#include <platform/mt_i2c.h>
#include <platform/mt_pmic.h>
#elif (defined BUILD_UBOOT)
#include <asm/arch/mt6577_gpio.h>
#else
#include <mach/mt_gpio.h>
#include <mach/mt_pm_ldo.h>
#endif

#include "lcm_drv.h"

// ---------------------------------------------------------------------------
//  Local Constants
// ---------------------------------------------------------------------------
#define FRAME_WIDTH  (1920)
#define FRAME_HEIGHT (1080)

// ---------------------------------------------------------------------------
//  Local Variables
// ---------------------------------------------------------------------------
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))

#ifdef GPIO_LCM_PWR
#define GPIO_LCD_PWR_EN      GPIO_LCM_PWR
#else
#define GPIO_LCD_PWR_EN      0xFFFFFFFF
#endif


#ifdef GPIO_LCM_RST
#define GPIO_LCD_RST      GPIO_LCM_RST
#else
#define GPIO_LCD_RST      0xFFFFFFFF
#endif

#define REGFLAG_DELAY                                       0xFE
#define REGFLAG_END_OF_TABLE                                0xFF
// ---------------------------------------------------------------------------
//  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)   

#define   LCM_DSI_CMD_MODE	0

/*
 * 
 */

#if 1
static kal_uint32 my_i2c_write_byte(kal_uint8 dev_addr, kal_uint8 *data, int data_len)
{
  	kal_uint32 ret_code = I2C_OK;
  	kal_uint8 write_data[I2C_FIFO_SIZE];
	struct mt_i2c_t i2c;
	int i;

	i2c.id = I2C2;
	i2c.addr =  dev_addr;
	i2c.mode = ST_MODE;
	i2c.speed = 100;

	if (data_len>0)
	for (i=0; i<data_len; i++) {
		write_data[i] = data[i];
		printf("write_data=0x%x ** betta\n", write_data[i]);
	}
	ret_code = i2c_write(&i2c, write_data, data_len);
	printf("ret_code=%d ** betta\n", ret_code);
	return ret_code;
}

static kal_uint32 my_i2c_read_byte(kal_uint8 dev_addr,kal_uint8 addr, kal_uint8 *dataBuffer)
{
  	kal_uint32 ret_code = I2C_OK;
	kal_uint8 len;
	struct mt_i2c_t i2c;
	
	*dataBuffer = addr;

	i2c.id = I2C2;
	i2c.addr = dev_addr;
	i2c.mode = ST_MODE;
	i2c.speed = 100;
	len = 1;
/// i2c_write_read(mt_i2c *i2c,U8 *buffer, U32 write_len, U32 read_len)
	ret_code = i2c_write_read(&i2c, dataBuffer, len, len);
printf("ret_code=%d, dataBuffer =%d for my_i2c_read_byte** betta\n", ret_code, (int)dataBuffer[0]);
	MDELAY(10);
	
  	return ret_code;
}
#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;

#if (LCM_DSI_CMD_MODE)
	params->dsi.mode = CMD_MODE;
#else
	params->dsi.mode = SYNC_PULSE_VDO_MODE;
#endif
	//params->dsi.mode = BURST_VDO_MODE; //BURST_VDO_MODE;//SYNC_PULSE_VDO_MODE;


	/* DSI */
	/* Command mode setting */
	/* Three lane or Four lane */
	params->dsi.LANE_NUM = LCM_FOUR_LANE;

	/* The following defined the format 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;

	/* Highly depends on LCD driver capability. */
	params->dsi.packet_size = 256;
	params->dsi.word_count=1920*3;

	/* Video mode setting */
	params->dsi.intermediat_buffer_num = 2;
	params->dsi.PS = LCM_PACKED_PS_24BIT_RGB888;
	params->dsi.vertical_sync_active = 2;//5;//2;
	params->dsi.vertical_backporch = 4;//36;//4;
	params->dsi.vertical_frontporch = 2;//4;//2;
	params->dsi.vertical_active_line = FRAME_HEIGHT;

	params->dsi.horizontal_sync_active = 18;//44;//18;
	params->dsi.horizontal_backporch = 50;//148;//50;
	params->dsi.horizontal_frontporch = 50;//88;//50;
	params->dsi.horizontal_active_pixel = FRAME_WIDTH;

	params->dsi.PLL_CLOCK = 411;//445;//420;
	params->dsi.ssc_disable = 1;
	params->dsi.cont_clock = 1;
	params->dsi.edp_panel = 1;
}
/*
 MT8163_PIN_29_EINT7__FUNC_GPIO29 => EN(RST)
MT8163_PIN_48_EINT16__FUNC_GPIO48 => LCD_ON
MT8163_PIN_88_MSDC2_DAT1__FUNC_GPIO88 =>
 */
#define GPIO_eDP_EN         (GPIO29 | 0x80000000)
#define GPIO_eDP_LCD_ON         (GPIO48 | 0x80000000)
#define GPIO_eDP_POWER_EN         (GPIO88 | 0x80000000) 
static void lcm_set_gpio_output(unsigned int GPIO, unsigned int output)
{
   mt_set_gpio_mode(GPIO, GPIO_MODE_00);
   mt_set_gpio_dir(GPIO, GPIO_DIR_OUT);
   mt_set_gpio_out(GPIO, (output>0)? GPIO_OUT_ONE: GPIO_OUT_ZERO);
}


static void lcm_init_power(void)
{
#ifdef BUILD_LK 
	printf("[LK/LCM] lcm_init_power() enter\n");
	
#else
	printk("[Kernel/LCM] lcm_init_power() enter\n");
	
#endif

}

static void lcm_suspend_power(void)
{
#ifdef BUILD_LK 
	printf("[LK/LCM] lcm_suspend_power() enter\n");

#else
	printk("[Kernel/LCM] lcm_suspend_power() enter\n");
#endif

}

static void lcm_resume_power(void)
{
#ifdef BUILD_LK 
	printf("[LK/LCM] lcm_resume_power() enter\n");

#else
	printk("[Kernel/LCM] lcm_resume_power() enter\n");

#endif

}

#define SLAVE_ADDR 0x2c
static void lcm_init(void)
{	
#ifdef BUILD_LK 
	printf("[LK/LCM] lcm_init() enter\n");
	kal_uint8 write_data[I2C_FIFO_SIZE];
#if 0	
	lcm_set_gpio_output(GPIO_LCD_PWR_EN, GPIO_OUT_ONE);
	MDELAY(20);
	//VDD power on ->VGP3_PMU 1.8V
	upmu_set_rg_vgp3_vosel(3);
	upmu_set_rg_vgp3_en(0x1);

	lcm_set_gpio_output(GPIO_LCD_RST,GPIO_OUT_ZERO);
	MDELAY(20);	
	lcm_set_gpio_output(GPIO_LCD_RST, GPIO_OUT_ONE);
	MDELAY(20);
#endif
	upmu_set_rg_vibr_vosel(3);
	upmu_set_rg_vibr_en(0x1);

	lcm_set_gpio_output(GPIO_eDP_POWER_EN, GPIO_OUT_ONE);
	lcm_set_gpio_output(GPIO_eDP_LCD_ON, GPIO_OUT_ONE);

	/* SN65DSIX6 initail code */

	write_data[0] = 0x0A; write_data[1] = 0x04; // REFCLK_FREQ=26MHz
	my_i2c_write_byte (SLAVE_ADDR, write_data, 2);
	MDELAY(10);

	write_data[0] = 0x10; write_data[1] = 0x26;
	my_i2c_write_byte (SLAVE_ADDR, write_data, 2);
	MDELAY(10);

	write_data[0] = 0x12; write_data[1] = 0x52; // PLL
	my_i2c_write_byte (SLAVE_ADDR, write_data, 2);
	MDELAY(10);

	write_data[0] = 0x5A; write_data[1] = 0x05;
	my_i2c_write_byte (SLAVE_ADDR, write_data, 2);
	MDELAY(10);

	write_data[0] = 0x93; write_data[1] = 0x20;
	my_i2c_write_byte (SLAVE_ADDR, write_data, 2);
	MDELAY(10);
	
	write_data[0] = 0x94; write_data[1] = 0x80;
	my_i2c_write_byte (SLAVE_ADDR, write_data, 2);
	MDELAY(10);

	write_data[0] = 0x0D; write_data[1] = 0x01;
	my_i2c_write_byte (SLAVE_ADDR, write_data, 2);
	MDELAY(10);

	write_data[0] = 0x0A;
	my_i2c_write_byte (SLAVE_ADDR, write_data, 1);
	MDELAY(20);
	my_i2c_read_byte(SLAVE_ADDR, 0x00, write_data);

	write_data[0] = 0x95; write_data[1] = 0x00;
	my_i2c_write_byte (SLAVE_ADDR, write_data, 2);
	MDELAY(10);	
// ===================
	write_data[0] = 0x64; write_data[1] = 0x01;
	my_i2c_write_byte (SLAVE_ADDR, write_data, 2);
	MDELAY(10);	

	write_data[0] = 0x74; write_data[1] = 0x00;
	my_i2c_write_byte (SLAVE_ADDR, write_data, 2);
	MDELAY(10);

	write_data[0] = 0x75; write_data[1] = 0x01;
	my_i2c_write_byte (SLAVE_ADDR, write_data, 2);
	MDELAY(10);

	write_data[0] = 0x76; write_data[1] = 0x0A;
	my_i2c_write_byte (SLAVE_ADDR, write_data, 2);
	MDELAY(10);

	write_data[0] = 0x77; write_data[1] = 0x01;
	my_i2c_write_byte (SLAVE_ADDR, write_data, 2);
	MDELAY(10);

	write_data[0] = 0x78; write_data[1] = 0x81;
	my_i2c_write_byte (SLAVE_ADDR, write_data, 2);
	MDELAY(10);
// ================
	write_data[0] = 0x96; write_data[1] = 0x0A;
	my_i2c_write_byte (SLAVE_ADDR, write_data, 2);
	MDELAY(20);

	write_data[0] = 0x96;
	my_i2c_write_byte (SLAVE_ADDR, write_data, 1);
	MDELAY(10);

	my_i2c_read_byte(SLAVE_ADDR, 0x00, write_data);
	MDELAY(10);

	write_data[0] = 0x20; write_data[1] = 0x80; write_data[1] = 0x07; // 1920
	my_i2c_write_byte (SLAVE_ADDR, write_data, 3);
	MDELAY(10);

	write_data[0] = 0x24; write_data[1] = 0x38; write_data[1] = 0x04; // 1080
	my_i2c_write_byte (SLAVE_ADDR, write_data, 3);
	MDELAY(10);

	write_data[0] = 0x2C; write_data[1] = 0x12; write_data[1] = 0x00; // hsync
	my_i2c_write_byte (SLAVE_ADDR, write_data, 3);
	MDELAY(10);
	
	write_data[0] = 0x30; write_data[1] = 0x02; write_data[1] = 0x00; // vsync
	my_i2c_write_byte (SLAVE_ADDR, write_data, 3);
	MDELAY(10);

	write_data[0] = 0x34; write_data[1] = 0x32; // hbp
	my_i2c_write_byte (SLAVE_ADDR, write_data, 2);
	MDELAY(10);

	write_data[0] = 0x36; write_data[1] = 0x04; // vbp
	my_i2c_write_byte (SLAVE_ADDR, write_data, 2);
	MDELAY(10);

	write_data[0] = 0x38; write_data[1] = 0x32; // hfp
	my_i2c_write_byte (SLAVE_ADDR, write_data, 2);
	MDELAY(10);

	write_data[0] = 0x3A; write_data[1] = 0x02; // vfp
	my_i2c_write_byte (SLAVE_ADDR, write_data, 2);
	MDELAY(10);
// ====
	write_data[0] = 0x5B; write_data[1] = 0x00;
	my_i2c_write_byte (SLAVE_ADDR, write_data, 2);
	MDELAY(10);

	write_data[0] = 0x3C; write_data[1] = 0x00;
	my_i2c_write_byte (SLAVE_ADDR, write_data, 2);
	MDELAY(10);

	write_data[0] = 0x5A; write_data[1] = 0x0D;
	my_i2c_write_byte (SLAVE_ADDR, write_data, 2);
	MDELAY(10);
		
#else
	printk("[Kernel/LCM] lcm_init() enter\n");
#endif
}

static void lcm_suspend(void)
{
#ifdef BUILD_LK
	printf("[LK/LCM] lcm_suspend() enter\n");
	lcm_set_gpio_output(GPIO_LCD_PWR_EN,GPIO_OUT_ZERO);
	MDELAY(20);		
	//VDD power off ->VGP3_PMU 1.8V
	upmu_set_rg_vgp3_vosel(0);
	upmu_set_rg_vgp3_en(0);	
	MDELAY(20);
	lcm_set_gpio_output(GPIO_LCD_RST,GPIO_OUT_ZERO);
	MDELAY(20);
#else
	printk("[Kernel/LCM] lcm_suspend() enter\n");
	lcm_set_gpio_output(GPIO_LCD_PWR_EN,GPIO_OUT_ZERO);
	MDELAY(20);
	//VDD power off ->VGP3_PMU 1.8V
	hwPowerOn(MT6323_POWER_LDO_VGP3 , VOL_1800 ,"LCM");
	MDELAY(20);	

	lcm_set_gpio_output(GPIO_LCD_RST,GPIO_OUT_ZERO);
	MDELAY(20);
	
#endif
}

static void lcm_resume(void)
{
#ifdef BUILD_LK 
	printf("[LK/LCM] lcm_resume() enter\n");
	lcm_set_gpio_output(GPIO_LCD_PWR_EN, GPIO_OUT_ONE);
	MDELAY(20);	
	//VGP3_PMU 1.8V
	upmu_set_rg_vgp3_vosel(3);
	upmu_set_rg_vgp3_en(0x1);
	MDELAY(20);

	lcm_set_gpio_output(GPIO_LCD_RST, GPIO_OUT_ONE);
	MDELAY(20);
	
#else
	printk("[Kernel/LCM] lcm_resume() enter\n");
	lcm_set_gpio_output(GPIO_LCD_PWR_EN, GPIO_OUT_ONE);
	MDELAY(20);	
	hwPowerOn(MT6323_POWER_LDO_VGP3 , VOL_1800 ,"LCM");
	MDELAY(20);
	lcm_set_gpio_output(GPIO_LCD_RST, GPIO_OUT_ONE);
	MDELAY(20);
	
#endif
}


LCM_DRIVER myMIPI_dsi_cmd_lcm_drv = 
{
  .name						= "myMIPI_dsi_cmd",
	.set_util_funcs = lcm_set_util_funcs,
	.get_params     = lcm_get_params,
	.init           = lcm_init,
	.suspend        = lcm_suspend,
	.resume         = lcm_resume,
	.init_power		= lcm_init_power,
	.resume_power   = lcm_resume_power,
	.suspend_power  = lcm_suspend_power,
};
5241.SCHEMATIC1 _ 17_eDP.PDF

BRS

Nat

  • Dear Sirs

    Do you have any update?

    BRS

    Nat
  • Hello Nat,

    Read the DSI86 status registers. See if there are any error bits set.

    Regards

  • #ifndef BUILD_LK
    #include <linux/string.h>
    #else
    #include <string.h>
    #endif 
    
    #ifdef BUILD_LK
    #include <platform/mt_gpio.h>
    #include <platform/mt_i2c.h>
    #include <platform/mt_pmic.h>
    #elif (defined BUILD_UBOOT)
    #include <asm/arch/mt6577_gpio.h>
    #else
    #include <mach/mt_gpio.h>
    #include <mach/mt_pm_ldo.h>
    #endif
    
    #include "lcm_drv.h"
    
    // ---------------------------------------------------------------------------
    //  Local Constants
    // ---------------------------------------------------------------------------
    #define FRAME_WIDTH  (1920)
    #define FRAME_HEIGHT (1080)
    
    // ---------------------------------------------------------------------------
    //  Local Variables
    // ---------------------------------------------------------------------------
    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))
    
    #ifdef GPIO_LCM_PWR
    #define GPIO_LCD_PWR_EN      GPIO_LCM_PWR
    #else
    #define GPIO_LCD_PWR_EN      0xFFFFFFFF
    #endif
    
    
    #ifdef GPIO_LCM_RST
    #define GPIO_LCD_RST      GPIO_LCM_RST
    #else
    #define GPIO_LCD_RST      0xFFFFFFFF
    #endif
    
    #define REGFLAG_DELAY                                       0xFE
    #define REGFLAG_END_OF_TABLE                                0xFF
    // ---------------------------------------------------------------------------
    //  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)   
    
    #define   LCM_DSI_CMD_MODE	0
    
    /*
     * 
     */
    
    #if 1
    static kal_uint32 my_i2c_write_byte(kal_uint8 dev_addr, kal_uint8 *data, int data_len)
    {
      	kal_uint32 ret_code = I2C_OK;
      	kal_uint8 write_data[I2C_FIFO_SIZE];
    	struct mt_i2c_t i2c;
    	int i;
    
    	i2c.id = I2C2;
    	i2c.addr =  dev_addr;
    	i2c.mode = ST_MODE;
    	i2c.speed = 100;
    
    	if (data_len>0)
    	for (i=0; i<data_len; i++) {
    		write_data[i] = data[i];
    		printf("write_data=0x%x ** betta\n", write_data[i]);
    	}
    	ret_code = i2c_write(&i2c, write_data, data_len);
    	printf("ret_code=%d ** betta\n", ret_code);
    	return ret_code;
    }
    
    static kal_uint32 my_i2c_read_byte(kal_uint8 dev_addr,kal_uint8 addr, kal_uint8 *dataBuffer)
    {
      	kal_uint32 ret_code = I2C_OK;
    	kal_uint8 len;
    	struct mt_i2c_t i2c;
    	
    	*dataBuffer = addr;
    
    	i2c.id = I2C2;
    	i2c.addr = dev_addr;
    	i2c.mode = ST_MODE;
    	i2c.speed = 100;
    	len = 1;
    /// i2c_write_read(mt_i2c *i2c,U8 *buffer, U32 write_len, U32 read_len)
    	ret_code = i2c_write_read(&i2c, dataBuffer, len, len);
    printf("ret_code=%d, dataBuffer =%d for my_i2c_read_byte** betta\n", ret_code, (int)dataBuffer[0]);
    	MDELAY(10);
    	
      	return ret_code;
    }
    #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;
    
    #if (LCM_DSI_CMD_MODE)
    	params->dsi.mode = CMD_MODE;
    #else
    	params->dsi.mode = SYNC_PULSE_VDO_MODE;
    #endif
    	//params->dsi.mode = BURST_VDO_MODE; //BURST_VDO_MODE;//SYNC_PULSE_VDO_MODE;
    
    
    	/* DSI */
    	/* Command mode setting */
    	/* Three lane or Four lane */
    	params->dsi.LANE_NUM = LCM_FOUR_LANE;
    
    	/* The following defined the format 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;
    
    	/* Highly depends on LCD driver capability. */
    	params->dsi.packet_size = 256;
    	params->dsi.word_count=1920*3;
    
    	/* Video mode setting */
    	params->dsi.intermediat_buffer_num = 2;
    	params->dsi.PS = LCM_PACKED_PS_24BIT_RGB888;
    	params->dsi.vertical_sync_active = 2;//5;//2;
    	params->dsi.vertical_backporch = 4;//36;//4;
    	params->dsi.vertical_frontporch = 2;//4;//2;
    	params->dsi.vertical_active_line = FRAME_HEIGHT;
    
    	params->dsi.horizontal_sync_active = 18;//44;//18;
    	params->dsi.horizontal_backporch = 50;//148;//50;
    	params->dsi.horizontal_frontporch = 50;//88;//50;
    	params->dsi.horizontal_active_pixel = FRAME_WIDTH;
    
    	params->dsi.PLL_CLOCK = 411;//445;//420;
    	params->dsi.ssc_disable = 1;
    	params->dsi.cont_clock = 1;
    	params->dsi.edp_panel = 1;
    }
    /*
     MT8163_PIN_29_EINT7__FUNC_GPIO29 => EN(RST)
    MT8163_PIN_48_EINT16__FUNC_GPIO48 => LCD_ON
    MT8163_PIN_88_MSDC2_DAT1__FUNC_GPIO88 =>
     */
    #define GPIO_eDP_EN         (GPIO29 | 0x80000000)
    #define GPIO_eDP_LCD_ON         (GPIO48 | 0x80000000)
    #define GPIO_eDP_POWER_EN         (GPIO88 | 0x80000000) 
    static void lcm_set_gpio_output(unsigned int GPIO, unsigned int output)
    {
       mt_set_gpio_mode(GPIO, GPIO_MODE_00);
       mt_set_gpio_dir(GPIO, GPIO_DIR_OUT);
       mt_set_gpio_out(GPIO, (output>0)? GPIO_OUT_ONE: GPIO_OUT_ZERO);
    }
    
    
    static void lcm_init_power(void)
    {
    #ifdef BUILD_LK 
    	printf("[LK/LCM] lcm_init_power() enter\n");
    	
    #else
    	printk("[Kernel/LCM] lcm_init_power() enter\n");
    	
    #endif
    
    }
    
    static void lcm_suspend_power(void)
    {
    #ifdef BUILD_LK 
    	printf("[LK/LCM] lcm_suspend_power() enter\n");
    
    #else
    	printk("[Kernel/LCM] lcm_suspend_power() enter\n");
    #endif
    
    }
    
    static void lcm_resume_power(void)
    {
    #ifdef BUILD_LK 
    	printf("[LK/LCM] lcm_resume_power() enter\n");
    
    #else
    	printk("[Kernel/LCM] lcm_resume_power() enter\n");
    
    #endif
    
    }
    
    #define SLAVE_ADDR 0x2c
    static void lcm_init(void)
    {	
    #ifdef BUILD_LK 
    	printf("[LK/LCM] lcm_init() enter\n");
    	kal_uint8 write_data[I2C_FIFO_SIZE];
    #if 0	
    	lcm_set_gpio_output(GPIO_LCD_PWR_EN, GPIO_OUT_ONE);
    	MDELAY(20);
    	//VDD power on ->VGP3_PMU 1.8V
    	upmu_set_rg_vgp3_vosel(3);
    	upmu_set_rg_vgp3_en(0x1);
    
    	lcm_set_gpio_output(GPIO_LCD_RST,GPIO_OUT_ZERO);
    	MDELAY(20);	
    	lcm_set_gpio_output(GPIO_LCD_RST, GPIO_OUT_ONE);
    	MDELAY(20);
    #endif
    	upmu_set_rg_vibr_vosel(3);
    	upmu_set_rg_vibr_en(0x1);
    
    	lcm_set_gpio_output(GPIO_eDP_POWER_EN, GPIO_OUT_ONE);
    	lcm_set_gpio_output(GPIO_eDP_LCD_ON, GPIO_OUT_ONE);
    
    	/* SN65DSIX6 initail code */
    
    	write_data[0] = 0x0A; write_data[1] = 0x04; // REFCLK_FREQ=26MHz
    	my_i2c_write_byte (SLAVE_ADDR, write_data, 2);
    	MDELAY(10);
    
    	write_data[0] = 0x10; write_data[1] = 0x26;
    	my_i2c_write_byte (SLAVE_ADDR, write_data, 2);
    	MDELAY(10);
    
    	write_data[0] = 0x12; write_data[1] = 0x52; // PLL
    	my_i2c_write_byte (SLAVE_ADDR, write_data, 2);
    	MDELAY(10);
    
    	write_data[0] = 0x5A; write_data[1] = 0x05;
    	my_i2c_write_byte (SLAVE_ADDR, write_data, 2);
    	MDELAY(10);
    
    	write_data[0] = 0x93; write_data[1] = 0x20;
    	my_i2c_write_byte (SLAVE_ADDR, write_data, 2);
    	MDELAY(10);
    	
    	write_data[0] = 0x94; write_data[1] = 0x80;
    	my_i2c_write_byte (SLAVE_ADDR, write_data, 2);
    	MDELAY(10);
    
    	write_data[0] = 0x0D; write_data[1] = 0x01;
    	my_i2c_write_byte (SLAVE_ADDR, write_data, 2);
    	MDELAY(10);
    
    	write_data[0] = 0x0A;
    	my_i2c_write_byte (SLAVE_ADDR, write_data, 1);
    	MDELAY(20);
    	my_i2c_read_byte(SLAVE_ADDR, 0x00, write_data);
    
    	write_data[0] = 0x95; write_data[1] = 0x00;
    	my_i2c_write_byte (SLAVE_ADDR, write_data, 2);
    	MDELAY(10);	
    // ===================
    	write_data[0] = 0x64; write_data[1] = 0x01;
    	my_i2c_write_byte (SLAVE_ADDR, write_data, 2);
    	MDELAY(10);	
    
    	write_data[0] = 0x74; write_data[1] = 0x00;
    	my_i2c_write_byte (SLAVE_ADDR, write_data, 2);
    	MDELAY(10);
    
    	write_data[0] = 0x75; write_data[1] = 0x01;
    	my_i2c_write_byte (SLAVE_ADDR, write_data, 2);
    	MDELAY(10);
    
    	write_data[0] = 0x76; write_data[1] = 0x0A;
    	my_i2c_write_byte (SLAVE_ADDR, write_data, 2);
    	MDELAY(10);
    
    	write_data[0] = 0x77; write_data[1] = 0x01;
    	my_i2c_write_byte (SLAVE_ADDR, write_data, 2);
    	MDELAY(10);
    
    	write_data[0] = 0x78; write_data[1] = 0x81;
    	my_i2c_write_byte (SLAVE_ADDR, write_data, 2);
    	MDELAY(10);
    // ================
    	write_data[0] = 0x96; write_data[1] = 0x0A;
    	my_i2c_write_byte (SLAVE_ADDR, write_data, 2);
    	MDELAY(20);
    
    	write_data[0] = 0x96;
    	my_i2c_write_byte (SLAVE_ADDR, write_data, 1);
    	MDELAY(10);
    
    	my_i2c_read_byte(SLAVE_ADDR, 0x00, write_data);
    	MDELAY(10);
    
    	write_data[0] = 0x20; write_data[1] = 0x80; write_data[1] = 0x07; // 1920
    	my_i2c_write_byte (SLAVE_ADDR, write_data, 3);
    	MDELAY(10);
    
    	write_data[0] = 0x24; write_data[1] = 0x38; write_data[1] = 0x04; // 1080
    	my_i2c_write_byte (SLAVE_ADDR, write_data, 3);
    	MDELAY(10);
    
    	write_data[0] = 0x2C; write_data[1] = 0x12; write_data[1] = 0x00; // hsync
    	my_i2c_write_byte (SLAVE_ADDR, write_data, 3);
    	MDELAY(10);
    	
    	write_data[0] = 0x30; write_data[1] = 0x02; write_data[1] = 0x00; // vsync
    	my_i2c_write_byte (SLAVE_ADDR, write_data, 3);
    	MDELAY(10);
    
    	write_data[0] = 0x34; write_data[1] = 0x32; // hbp
    	my_i2c_write_byte (SLAVE_ADDR, write_data, 2);
    	MDELAY(10);
    
    	write_data[0] = 0x36; write_data[1] = 0x04; // vbp
    	my_i2c_write_byte (SLAVE_ADDR, write_data, 2);
    	MDELAY(10);
    
    	write_data[0] = 0x38; write_data[1] = 0x32; // hfp
    	my_i2c_write_byte (SLAVE_ADDR, write_data, 2);
    	MDELAY(10);
    
    	write_data[0] = 0x3A; write_data[1] = 0x02; // vfp
    	my_i2c_write_byte (SLAVE_ADDR, write_data, 2);
    	MDELAY(10);
    // ====
    	write_data[0] = 0x5B; write_data[1] = 0x00;
    	my_i2c_write_byte (SLAVE_ADDR, write_data, 2);
    	MDELAY(10);
    
    	write_data[0] = 0x3C; write_data[1] = 0x00;
    	my_i2c_write_byte (SLAVE_ADDR, write_data, 2);
    	MDELAY(10);
    
    	write_data[0] = 0x5A; write_data[1] = 0x0D;
    	my_i2c_write_byte (SLAVE_ADDR, write_data, 2);
    	MDELAY(10);
    		
    #else
    	printk("[Kernel/LCM] lcm_init() enter\n");
    #endif
    }
    
    static void lcm_suspend(void)
    {
    #ifdef BUILD_LK
    	printf("[LK/LCM] lcm_suspend() enter\n");
    	lcm_set_gpio_output(GPIO_LCD_PWR_EN,GPIO_OUT_ZERO);
    	MDELAY(20);		
    	//VDD power off ->VGP3_PMU 1.8V
    	upmu_set_rg_vgp3_vosel(0);
    	upmu_set_rg_vgp3_en(0);	
    	MDELAY(20);
    	lcm_set_gpio_output(GPIO_LCD_RST,GPIO_OUT_ZERO);
    	MDELAY(20);
    #else
    	printk("[Kernel/LCM] lcm_suspend() enter\n");
    	lcm_set_gpio_output(GPIO_LCD_PWR_EN,GPIO_OUT_ZERO);
    	MDELAY(20);
    	//VDD power off ->VGP3_PMU 1.8V
    	hwPowerOn(MT6323_POWER_LDO_VGP3 , VOL_1800 ,"LCM");
    	MDELAY(20);	
    
    	lcm_set_gpio_output(GPIO_LCD_RST,GPIO_OUT_ZERO);
    	MDELAY(20);
    	
    #endif
    }
    
    static void lcm_resume(void)
    {
    #ifdef BUILD_LK 
    	printf("[LK/LCM] lcm_resume() enter\n");
    	lcm_set_gpio_output(GPIO_LCD_PWR_EN, GPIO_OUT_ONE);
    	MDELAY(20);	
    	//VGP3_PMU 1.8V
    	upmu_set_rg_vgp3_vosel(3);
    	upmu_set_rg_vgp3_en(0x1);
    	MDELAY(20);
    
    	lcm_set_gpio_output(GPIO_LCD_RST, GPIO_OUT_ONE);
    	MDELAY(20);
    	
    #else
    	printk("[Kernel/LCM] lcm_resume() enter\n");
    	lcm_set_gpio_output(GPIO_LCD_PWR_EN, GPIO_OUT_ONE);
    	MDELAY(20);	
    	hwPowerOn(MT6323_POWER_LDO_VGP3 , VOL_1800 ,"LCM");
    	MDELAY(20);
    	lcm_set_gpio_output(GPIO_LCD_RST, GPIO_OUT_ONE);
    	MDELAY(20);
    	
    #endif
    }
    
    
    LCM_DRIVER myMIPI_dsi_cmd_lcm_drv = 
    {
      .name						= "myMIPI_dsi_cmd",
    	.set_util_funcs = lcm_set_util_funcs,
    	.get_params     = lcm_get_params,
    	.init           = lcm_init,
    	.suspend        = lcm_suspend,
    	.resume         = lcm_resume,
    	.init_power		= lcm_init_power,
    	.resume_power   = lcm_resume_power,
    	.suspend_power  = lcm_suspend_power,
    };
    
    Dear Sirs

    The bit 1 of status register 0xF8, which describes “LT_FAIL. This field is set whenever the Semi-Auto link training fails to train the DisplayPort Link,”

    was set to be 1 for our case.

    Please ensure you sent our initial code myMIPI_dsi_cmd.c.

    BRS

    Nat