From 1e1eabd8890ffd6b5dd1a01dbe6acbd890501867 Mon Sep 17 00:00:00 2001 From: August Date: Mon, 30 Jul 2018 16:53:22 +0800 Subject: [PATCH] Fix LCD white screen Signed-off-by: August --- .../video/sunxi/disp2/disp/de/disp_lcd.c | 30 +++++++++++++------ .../sunxi/disp2/disp/lcd/S070WV20_MIPI_RGB.c | 2 -- .../fbdev/sunxi/disp2/disp/de/disp_lcd.c | 9 ++++-- .../configs/m64/sys_config_linux-4.9.fex | 2 +- 4 files changed, 29 insertions(+), 14 deletions(-) diff --git a/lichee/brandy/u-boot-2014.07/drivers/video/sunxi/disp2/disp/de/disp_lcd.c b/lichee/brandy/u-boot-2014.07/drivers/video/sunxi/disp2/disp/de/disp_lcd.c index 0017795a93..02a90e8fab 100755 --- a/lichee/brandy/u-boot-2014.07/drivers/video/sunxi/disp2/disp/de/disp_lcd.c +++ b/lichee/brandy/u-boot-2014.07/drivers/video/sunxi/disp2/disp/de/disp_lcd.c @@ -660,6 +660,8 @@ static void lcd_get_sys_config(u32 disp, disp_lcd_cfg *lcd_cfg) ret = disp_sys_script_get_item(primary_key,"lcd_bl_en", (int *)gpio_info, 3); if (ret == 3) { + gpio_info->data = 0; + gpio_info->mul_sel = 1; lcd_cfg->lcd_bl_hdl = disp_sys_gpio_request(gpio_info, 1); lcd_cfg->lcd_bl_en_used = 1; } @@ -1041,16 +1043,20 @@ static s32 disp_lcd_tcon_disable(struct disp_device *lcd) static s32 disp_lcd_pin_cfg(struct disp_device *lcd, u32 bon) { - int i; + //int i; struct disp_lcd_private_data *lcdp = disp_lcd_get_priv(lcd); - char dev_name[25]; + //char dev_name[25]; + + printf("disp_lcd_pin_cfg\n"); if ((NULL == lcd) || (NULL == lcdp)) { DE_WRN("NULL hdl!\n"); return DIS_FAIL; } - DE_INF("lcd %d pin config, state %s, %d\n", lcd->disp, (bon)? "on":"off", bon); + printf("lcd %d pin config, state %s, %d\n", lcd->disp, (bon)? "on":"off", bon); +/* lcd_pin_power already on in sw_enable, comment here to fix white screen before logo display */ +#if 0 //io-pad if (bon == 1) { for (i=0; ilcd_cfg.lcd_pin_power[i]); } } - +#else + disp_al_lcd_io_cfg(lcd->hwdev_index, bon, &lcdp->panel_info); +#endif return DIS_SUCCESS; } @@ -1130,9 +1138,13 @@ static s32 disp_lcd_backlight_enable(struct disp_device *lcd) if (!((!strcmp(lcdp->lcd_cfg.lcd_bl_en_power, "")) || (!strcmp(lcdp->lcd_cfg.lcd_bl_en_power, "none")))) disp_sys_power_enable(lcdp->lcd_cfg.lcd_bl_en_power); - memcpy(gpio_info, &(lcdp->lcd_cfg.lcd_bl_en), sizeof(disp_gpio_set_t)); - - disp_sys_gpio_request_simple(gpio_info, 1); + if(!lcdp->lcd_cfg.lcd_bl_hdl) { + memcpy(gpio_info, &(lcdp->lcd_cfg.lcd_bl_en), sizeof(disp_gpio_set_t)); + disp_sys_gpio_request_simple(gpio_info, 1); + } + else { + disp_sys_gpio_set_value(lcdp->lcd_cfg.lcd_bl_hdl, 1, "lcd_bl_en"); + } } bl = disp_lcd_get_bright(lcd); disp_lcd_set_bright(lcd, bl); @@ -1274,6 +1286,8 @@ s32 disp_lcd_set_bright(struct disp_device *lcd, u32 bright) struct disp_manager *mgr = NULL; struct disp_smbl *smbl = NULL; + return 0; + if ((NULL == lcd) || (NULL == lcdp)) { DE_WRN("NULL hdl!\n"); return DIS_FAIL; @@ -1523,8 +1537,6 @@ static s32 disp_lcd_post_enable(struct disp_device* lcd) bl = disp_lcd_get_bright(lcd); disp_lcd_set_bright(lcd, bl); - disp_sys_gpio_set_value(lcdp->lcd_cfg.lcd_bl_hdl, 1, "lcd_bl_en"); - return ret; } diff --git a/lichee/brandy/u-boot-2014.07/drivers/video/sunxi/disp2/disp/lcd/S070WV20_MIPI_RGB.c b/lichee/brandy/u-boot-2014.07/drivers/video/sunxi/disp2/disp/lcd/S070WV20_MIPI_RGB.c index 8845670b81..11f320f72f 100755 --- a/lichee/brandy/u-boot-2014.07/drivers/video/sunxi/disp2/disp/lcd/S070WV20_MIPI_RGB.c +++ b/lichee/brandy/u-boot-2014.07/drivers/video/sunxi/disp2/disp/lcd/S070WV20_MIPI_RGB.c @@ -112,8 +112,6 @@ static void LCD_power_on(u32 sel) sunxi_lcd_delay_ms(30); panel_reset(1); sunxi_lcd_delay_ms(10); - - } static void LCD_power_off(u32 sel) diff --git a/lichee/linux-4.9/drivers/video/fbdev/sunxi/disp2/disp/de/disp_lcd.c b/lichee/linux-4.9/drivers/video/fbdev/sunxi/disp2/disp/de/disp_lcd.c index c56909bd54..3debe38bb7 100644 --- a/lichee/linux-4.9/drivers/video/fbdev/sunxi/disp2/disp/de/disp_lcd.c +++ b/lichee/linux-4.9/drivers/video/fbdev/sunxi/disp2/disp/de/disp_lcd.c @@ -1704,6 +1704,8 @@ static s32 disp_lcd_enable(struct disp_device *lcd) unsigned bl; int ret; + pr_info("%s\n", __func__); + if ((lcd == NULL) || (lcdp == NULL)) { DE_WRN("NULL hdl!\n"); return DIS_FAIL; @@ -1807,6 +1809,8 @@ static s32 disp_lcd_disable(struct disp_device *lcd) struct disp_manager *mgr = NULL; int i; + pr_info("%s\n", __func__); + if ((lcd == NULL) || (lcdp == NULL)) { DE_WRN("NULL hdl!\n"); return DIS_FAIL; @@ -1948,6 +1952,7 @@ static s32 disp_lcd_sw_enable(struct disp_device *lcd) || (!strcmp(lcdp->lcd_cfg.lcd_pin_power[i], "none")))) disp_sys_power_enable(lcdp->lcd_cfg.lcd_pin_power[i]); } +#endif /* init bl */ if (lcdp->lcd_cfg.lcd_bl_en_used) { @@ -1956,10 +1961,10 @@ static s32 disp_lcd_sw_enable(struct disp_device *lcd) ((!strcmp(lcdp->lcd_cfg.lcd_bl_en_power, "")) || (!strcmp(lcdp->lcd_cfg.lcd_bl_en_power, "none")))) disp_sys_power_enable(lcdp->lcd_cfg.lcd_bl_en_power); + lcdp->lcd_cfg.lcd_bl_gpio_hdl = disp_sys_gpio_request(&lcdp->lcd_cfg.lcd_bl_en, 1); } -#endif spin_lock_irqsave(&lcd_data_lock, flags); lcdp->enabled = 1; @@ -2484,7 +2489,7 @@ static s32 disp_lcd_init(struct disp_device *lcd) DE_WRN("NULL hdl!\n"); return DIS_FAIL; } - DE_INF("lcd %d\n", lcd->disp); + pr_info("%s: lcd %d\n", __func__, lcd->disp); lcd_get_sys_config(lcd->disp, &lcdp->lcd_cfg); if (disp_lcd_is_used(lcd)) { diff --git a/lichee/tools/pack/chips/sun50iw1p1/configs/m64/sys_config_linux-4.9.fex b/lichee/tools/pack/chips/sun50iw1p1/configs/m64/sys_config_linux-4.9.fex index 3b7c775867..a081983a0e 100755 --- a/lichee/tools/pack/chips/sun50iw1p1/configs/m64/sys_config_linux-4.9.fex +++ b/lichee/tools/pack/chips/sun50iw1p1/configs/m64/sys_config_linux-4.9.fex @@ -581,7 +581,7 @@ lcd_gpio_0 = port:PD6<1><0><0> ;power enable lcd_gpio_1 = port:PD7<1><0><0> -lcd_bl_en = port:PD5<1><0><0> +lcd_bl_en = port:PD5<1><0><1> lcd_power = "vcc-dsi-33" ;lcd_power1 = "vcc-lcd"