我用的是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
}
}
- 刷屏操作时,将所有区域旋转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方面影响:
- GPU原先用于渲染,跟送屏是独立的并行的,这样做会导致串行
- 使用GPU旋转全屏输出到PSRAM,这个动作本身要耗费不少时间,至少比直接copy是要慢的
