现有的LVGL框架如何旋转屏幕?

我用的是CO5300的AMOLED屏幕,这块屏幕不支持修改寄存器获得90度旋转,我应该怎么做才能软件旋转90度屏幕

LVGL有接口可以旋转画面

有具体的使用方法吗?我看软件旋转要在flush_cb中进行,但是我连flush_cb在哪都找不到

0x36这个寄存器可以翻转

CO5300这个屏幕不是正方形的,旋转90度,是不是整个图形库的分辨率要跟着变化?
如果那样的话,所有控件的排版也要跟着变化了

是的,可以把整个buffer旋转90度吗

可以的,就是速度会慢。目前适配的LVGL一般先渲染到一个多行的SRAM buffer, 然后再通过DMA copy到一个全屏的PSRAM buffer,全部渲染完成后,再进行刷屏。

修改主要在drv_lcd_fb.c(只适合图形库初始化时是正常的,然后通过开关动态切换到90度):
1.在这个copy的动作换成旋转90度的:

static rt_err_t write_fb_async(LCD_AreaDef *clip_area, LCD_AreaDef *src_area, const uint8_t *src, dma_write_cbk cb)
{

    if (0)
    {
    }
#ifdef ENABLE_GP_DMA_COPY
    else if (use_gp_dma)
    {
        //不支持旋转,不能走这里
    }
#endif /* ENABLE_GP_DMA_COPY */
    else if (use_extdma)
    {
        //不支持旋转,不能走这里
    }
#ifdef ENABLE_AES_COPY
    else if (use_aes)
    {
        //不支持旋转,不能走这里
    }
#endif /* ENABLE_AES_COPY */
    else if (use_epic)
    {
        err = drv_epic_copy(src, p_fb->fb.p_data,
                            &epic_src_area, &epic_dst_area,
                            &epic_copy_area, epic_cf, epic_cf,
                            (drv_epic_cplt_cbk)cb);

       //原本的EPIC copy接口,需要改成drv_epic_blend接口,用于旋转90度
    }
    else //Software copy
    {
        //软件copy
    }
}
  1. 刷屏操作时,将所有区域旋转90度,同时关闭行中断功能:
static rt_err_t fb_flush_start(void)
{
...
      //Setup line interrupt handler variables
    Enable_LineCpltCbk = 1; //旋转90度时需要设置为0
...
    //Setup flush info
    flush_info.cmpr_rate = p_fb->fb.cmpr_rate;
    flush_info.pixel      = p_fb->fb.p_data;
    flush_info.color_format    = p_fb->fb.format;
    lcd_area_copy(&flush_info.window, &p_fb->fb_clip);  //需要对区域旋转90度
    lcd_area_copy(&flush_info.pixel_area, &p_fb->fb.area); //需要对区域旋转90度

    //Prepare an clean 'fb_clip' for new frame.
    lcd_area_copy(&p_fb->fb_clip, &invalid_area); //需要对区域旋转90度

...

}

居然还可以通过这种方法调用gpu旋转,那么这样做会损失多少性能呢

不好说,会从2方面影响:

  1. GPU原先用于渲染,跟送屏是独立的并行的,这样做会导致串行
  2. 使用GPU旋转全屏输出到PSRAM,这个动作本身要耗费不少时间,至少比直接copy是要慢的