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,
};
BRS
Nat