video/rk_eink: fix screen display stripes after WF_TYPE_RESET update.

Signed-off-by: Wenping Zhang <wenping.zhang@rock-chips.com>
Change-Id: Id406c1103a0deea3e3ab9abcb8664e1ccc098520
This commit is contained in:
Wenping Zhang 2020-12-16 06:42:55 +00:00
parent c3a1ac4926
commit e79e208579
1 changed files with 10 additions and 14 deletions

View File

@ -174,6 +174,7 @@ static u32 aligned_image_size_4k(struct udevice *dev)
* Every image logo size must be aligned in 4K, make sure * Every image logo size must be aligned in 4K, make sure
* kernel can use it rightly, the buffer of LOGO image is * kernel can use it rightly, the buffer of LOGO image is
* put in order of below map: * put in order of below map:
* |---reset logo ---|
* |---uboot logo ---| * |---uboot logo ---|
* |---kernel logo ---| * |---kernel logo ---|
* |---charge_0 logo ---| * |---charge_0 logo ---|
@ -193,7 +194,7 @@ static int get_addr_by_type(struct udevice *dev, u32 logo_type)
printf("invalid display buffer, please check dts\n"); printf("invalid display buffer, please check dts\n");
return -EINVAL; return -EINVAL;
} }
indx = ffs(logo_type) - 1; indx = ffs(logo_type);
img_size = aligned_image_size_4k(dev); img_size = aligned_image_size_4k(dev);
offset = img_size * indx; offset = img_size * indx;
if (offset + img_size > plat->disp_pbuf_size) { if (offset + img_size > plat->disp_pbuf_size) {
@ -202,6 +203,7 @@ static int get_addr_by_type(struct udevice *dev, u32 logo_type)
} }
switch (logo_type) { switch (logo_type) {
case EINK_LOGO_RESET:
case EINK_LOGO_UBOOT: case EINK_LOGO_UBOOT:
case EINK_LOGO_KERNEL: case EINK_LOGO_KERNEL:
case EINK_LOGO_CHARGING_0: case EINK_LOGO_CHARGING_0:
@ -467,7 +469,6 @@ static int rockchip_eink_show_logo(int cur_logo_type, int update_mode)
u32 logo_addr; u32 logo_addr;
u32 last_logo_addr; u32 last_logo_addr;
struct ebc_panel *plat; struct ebc_panel *plat;
void *reset_disp_addr = NULL;
struct udevice *dev; struct udevice *dev;
if (!eink_dev) { if (!eink_dev) {
@ -493,17 +494,17 @@ static int rockchip_eink_show_logo(int cur_logo_type, int update_mode)
return -1; return -1;
} }
/* /*
* The last_logo_type is 0 means it's first displaying * The last_logo_type is -1 means it's first displaying
*/ */
if (last_logo_type == -1) { if (last_logo_type == -1) {
int size = (plat->width * plat->height) >> 1; int size = (plat->width * plat->height) >> 1;
reset_disp_addr = memalign(ARCH_DMA_MINALIGN, size); logo_addr = get_addr_by_type(dev, EINK_LOGO_RESET);
memset(reset_disp_addr, 0xff, size); memset((u32 *)(u64)logo_addr, 0xff, size);
last_logo_addr = (u32)(u64)reset_disp_addr; eink_display(dev, logo_addr, logo_addr,
eink_display(dev, last_logo_addr, last_logo_addr,
WF_TYPE_RESET, 0); WF_TYPE_RESET, 0);
last_logo_type = 0; last_logo_type = 0;
last_logo_addr = logo_addr;
} else { } else {
last_logo_addr = get_addr_by_type(dev, last_logo_type); last_logo_addr = get_addr_by_type(dev, last_logo_type);
if (last_logo_addr < 0) { if (last_logo_addr < 0) {
@ -511,12 +512,9 @@ static int rockchip_eink_show_logo(int cur_logo_type, int update_mode)
goto out; goto out;
} }
if (cur_logo_type == EINK_LOGO_RESET) { if (cur_logo_type == EINK_LOGO_RESET) {
int size = (plat->width * plat->height) >> 1; logo_addr = get_addr_by_type(dev, EINK_LOGO_RESET);
reset_disp_addr = memalign(ARCH_DMA_MINALIGN, size);
memset(reset_disp_addr, 0xff, size);
eink_display(dev, last_logo_addr, eink_display(dev, last_logo_addr,
(u32)(u64)reset_disp_addr, logo_addr,
WF_TYPE_GC16, update_mode); WF_TYPE_GC16, update_mode);
last_logo_type = -1; last_logo_type = -1;
goto out; goto out;
@ -570,8 +568,6 @@ static int rockchip_eink_show_logo(int cur_logo_type, int update_mode)
} }
out: out:
if (reset_disp_addr)
free(reset_disp_addr);
ret = ebc_power_set(dev, EBC_PWR_DOWN); ret = ebc_power_set(dev, EBC_PWR_DOWN);
if (ret) if (ret)
printf("Eink power down failed\n"); printf("Eink power down failed\n");