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