可以的,就是速度会慢。目前适配的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度
...
}
