导航

    全志在线开发者论坛

    • 注册
    • 登录
    • 搜索
    • 版块
    • 话题
    • 在线文档
    • 社区主页

    V821驱动8080 8bit接口TFT屏,画面割裂。

    V Series
    2
    2
    42
    正在加载更多帖子
    • 从旧到新
    • 从新到旧
    • 最多赞同
    回复
    • 在新帖中回复
    登录后回复
    此主题已被删除。只有拥有主题管理权限的用户可以查看。
    • czlz_fun
      粗制乱造 LV 3 最后由 编辑


      屏为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>;
      };
      

      不知道应当如何调试解决这个问题。

      1 条回复 最后回复 回复 引用 分享 0
      • A
        awwwwa LV 8 最后由 编辑

        试一下加上刷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);
        
        1 条回复 最后回复 回复 引用 分享 0
        • 1 / 1
        • First post
          Last post

        Copyright © 2024 深圳全志在线有限公司 粤ICP备2021084185号 粤公网安备44030502007680号

        行为准则 | 用户协议 | 隐私权政策