V821驱动8080 8bit接口TFT屏,画面割裂。
-
屏为ST7789的8080 8位并口屏。分辨率为:240*320。不带TE。参考驱动配置https://docs.aw-ol.com/docs/soc/v821/disp/disp2/disp_driver_lcd_i8080/&disp { disp_init_enable = <1>; disp_mode = <0>; screen0_output_type = <1>; screen0_output_mode = <4>; screen0_to_lcd_index = <0>; screen1_output_type = <3>; screen1_output_mode = <10>; screen1_to_lcd_index = <2>; screen1_output_format = <0>; screen1_output_bits = <0>; screen1_output_eotf = <4>; screen1_output_cs = <257>; screen1_output_dvi_hdmi = <2>; screen1_output_range = <2>; screen1_output_scan = <0>; screen1_output_aspect_ratio = <8>; fb_format = <0>; fb_num = <1>; fb_debug = <0>; /*<disp channel layer zorder>*/ fb0_map = <0 0 0 16>; fb0_width = <240>; fb0_height = <320>; /*<disp channel layer zorder>*/ fb1_map = <0 2 0 16>; fb1_width = <300>; fb1_height = <300>; /*<disp channel layer zorder>*/ fb2_map = <1 0 0 16>; fb2_width = <1280>; fb2_height = <720>; /*<disp channel layer zorder>*/ fb3_map = <1 1 0 16>; fb3_width = <300>; fb3_height = <300>; chn_cfg_mode = <1>; disp_para_zone = <1>; }; &lcd0 { lcd_used = <1>; lcd_driver_name = "st7789v_cpu"; lcd_if = <1>; lcd_x = <240>; lcd_y = <320>; lcd_width = <43>; lcd_height = <63>; lcd_dclk_freq = <20>; lcd_hbp = <20>; lcd_ht = <298>; lcd_hspw = <10>; lcd_vbp = <8>; lcd_vt = <336>; lcd_vspw = <2>; lcd_backlight = <50>; lcd_pwm_used = <1>; lcd_pwm_ch = <4>; lcd_pwm_freq = <50000>; lcd_pwm_pol = <1>; lcd_pwm_max_limit = <255>; lcd_bright_curve_en = <1>; lcd_frm = <2>; lcd_gamma_en = <0>; lcd_bright_curve_en = <0>; lcd_cmap_en = <0>; lcdgamma4iep = <22>; lcd_cpu_mode = <1>; lcd_cpu_te = <2>; lcd_cpu_if = <14>; /* rst */ lcd_gpio_0 = <&pio PD 19 GPIO_ACTIVE_LOW>; /* cs */ lcd_gpio_1 = <&pio PD 14 GPIO_ACTIVE_LOW>; pinctrl-0 = <&rgb8_pins_a>, <&rgb8_pins_ctl_a>; pinctrl-1 = <&rgb8_pins_b>, <&rgb8_pins_ctl_b>; };
不知道应当如何调试解决这个问题。
-
试一下加上刷cache的接口
diff --git a/drivers/video/sunxi/disp2/disp/dev_disp.c b/drivers/video/sunxi/disp2/disp/dev_disp.c index 8ddbd28..c084de0 100644 --- a/drivers/video/sunxi/disp2/disp/dev_disp.c +++ b/drivers/video/sunxi/disp2/disp/dev_disp.c @@ -3158,6 +3158,11 @@ static int disp_mem_request(int sel, u32 size) #endif } +void disp_flush_cache(dma_addr_t addr, u32 len) +{ + dma_sync_single_for_device(g_disp_drv.dev, addr, len, DMA_TO_DEVICE); +} + static int disp_mem_release(int sel) { if (sel >= DISP_MEM_NUM || sel < 0) { diff --git a/drivers/video/sunxi/disp2/disp/dev_disp.h b/drivers/video/sunxi/disp2/disp/dev_disp.h index 6478db3..cdd250f 100644 --- a/drivers/video/sunxi/disp2/disp/dev_disp.h +++ b/drivers/video/sunxi/disp2/disp/dev_disp.h @@ -327,6 +327,7 @@ int disp_resume(struct device *dev); s32 disp_create_heap(u32 pHeapHead, u32 pHeapHeadPhy, u32 nHeapSize); void *disp_malloc(u32 num_bytes, void *phy_addr); void disp_free(void *virt_addr, void *phys_addr, u32 num_bytes); +void disp_flush_cache(dma_addr_t addr, u32 len); extern s32 disp_register_sync_proc(void (*proc) (u32)); extern s32 disp_unregister_sync_proc(void (*proc) (u32)); diff --git a/drivers/video/sunxi/disp2/disp/fb_platform.c b/drivers/video/sunxi/disp2/disp/fb_platform.c index 7e95e74..c935ecc 100644 --- a/drivers/video/sunxi/disp2/disp/fb_platform.c +++ b/drivers/video/sunxi/disp2/disp/fb_platform.c @@ -341,6 +341,8 @@ int platform_update_fb_output(void *hw_info, const struct fb_var_screeninfo *var struct disp_manager *mgr; mutex_lock(&info->lock); info->config.info.fb.crop.y = ((long long)var->yoffset) << 32; + + disp_flush_cache(info->dma_mem.device_addr,info->size); #if IS_ENABLED(CONFIG_AW_DISP2_FB_HW_ROTATION_SUPPORT) if (info->fb_rot) fb_g2d_rot_apply(info->fb_rot, &info->config, var->yoffset);
Copyright © 2024 深圳全志在线有限公司 粤ICP备2021084185号 粤公网安备44030502007680号