因为购买的屏幕是竖屏,而我需要横屏显示。我使用的是guiguider生成RT1052的基础显示代码
并且添加软件旋转
#if FB_USE_SRAM
static void DEMO_WaitVsync(lv_disp_drv_t *disp_drv)
{
s_framePending = true;
#if defined(SDK_OS_FREE_RTOS)
if (xSemaphoreTake(s_frameSema, portMAX_DELAY) != pdTRUE)
{
PRINTF("Display flush failed\r\n");
assert(0);
}
#else
while (s_framePending)
{
}
#endif
}
static void copy_area(const lv_area_t *area, lv_color_t *color_p, uint8_t *fb, uint32_t fbStrideBytes)
{
uint32_t y;
uint32_t areaWidth = lv_area_get_width(area);
fb += (area->y1 * fbStrideBytes + area->x1 * sizeof(lv_color_t));
for (y = area->y1; y <= area->y2; y++)
{
lv_memcpy(fb, color_p, areaWidth * sizeof(lv_color_t));
fb += fbStrideBytes;
color_p += areaWidth;
}
}
static void DEMO_FlushDisplay(lv_disp_drv_t *disp_drv, const lv_area_t *area, lv_color_t *color_p)
{
/* Wait VSYNC for each small update. */
DEMO_WaitVsync(disp_drv);
/* Copy data from draw buffer to frame buffer. */
copy_area(area, color_p, (uint8_t*) s_frameBuffer, LCD_WIDTH * LCD_FB_BYTE_PER_PIXEL);
SCB_CleanInvalidateDCache();
lv_disp_flush_ready(disp_drv);
}
#else
static void DEMO_FlushDisplay(lv_disp_drv_t *disp_drv, const lv_area_t *area, lv_color_t *color_p)
{
// DCACHE_CleanByRange((uint32_t)color_p, DEMO_FB_SIZE);
DCACHE_CleanInvalidateByRange((uint32_t)color_p, DEMO_FB_SIZE);
ELCDIF_SetNextBufferAddr(LCDIF, (uint32_t)color_p);
s_framePending = true;
#if defined(SDK_OS_FREE_RTOS)
if (xSemaphoreTake(s_frameSema, portMAX_DELAY) == pdTRUE)
{
/* IMPORTANT!!!
* Inform the graphics library that you are ready with the flushing*/
lv_disp_flush_ready(disp_drv);
}
else
{
PRINTF("Display flush failed\r\n");
assert(0);
}
#else
while (s_framePending)
{
}
/* IMPORTANT!!!
* Inform the graphics library that you are ready with the flushing*/
lv_disp_flush_ready(disp_drv);
#endif
}
#endif
Hi @dsd ,
感谢您的问题!
首先,请检查以下LVGL的限制,启用了full_refresh=1时,不支持屏幕旋转。请参考:
Helllo,
在使用 NXP i.MX RT1052 结合 Guiguider (LVGL) 进行屏幕旋转开发时,你遇到的“单缓冲刷新慢、双缓冲黑屏”问题,核心原因在于软件旋转(Software Rotate)与硬件 ELCDIF 控制器、双缓冲切换机制以及内存地址索引没有适配好。
Best Regards