Bläddra i källkod

Refresh screen synchronously with semaphore

Rbb666 3 år sedan
förälder
incheckning
4a492d6cf1
1 ändrade filer med 14 tillägg och 8 borttagningar
  1. 14 8
      projects/art_pi_lvgl/applications/lvgl/lv_port_disp.c

+ 14 - 8
projects/art_pi_lvgl/applications/lvgl/lv_port_disp.c

@@ -29,15 +29,13 @@ static lv_disp_draw_buf_t disp_buf;
 #ifdef BSP_USING_LCD_RGB
 static DMA2D_HandleTypeDef hdma2d;
 extern LTDC_HandleTypeDef LtdcHandle;
-volatile uint8_t g_gpu_state = 0;
+static rt_sem_t trans_done_semphr = RT_NULL;
 
 static void mDMA2Dcallvack(DMA2D_HandleTypeDef *hdma2d)
 {
-    if (g_gpu_state == 1)
-    {
-        g_gpu_state = 0;
-        lv_disp_flush_ready((lv_disp_drv_t *)&disp_drv);
-    }
+    lv_disp_flush_ready((lv_disp_drv_t *)&disp_drv);
+
+    rt_sem_release(trans_done_semphr);
 }
 
 static void lvgl_dma2d_config(void)
@@ -74,6 +72,7 @@ void DMA2D_IRQHandler(void)
 
     HAL_DMA2D_IRQHandler(&hdma2d);
 
+    /* exit interrupt */
     rt_interrupt_leave();
 }
 #endif
@@ -85,6 +84,8 @@ static void lcd_fb_flush(lv_disp_drv_t *disp_drv, const lv_area_t *area, lv_colo
     lcd_fill_array(area->x1, area->y1, area->x2, area->y2, color_p);
     lv_disp_flush_ready(disp_drv);
 #else
+    rt_sem_take(trans_done_semphr, RT_WAITING_FOREVER);
+
     uint32_t OffLineSrc = LV_HOR_RES_MAX - (area->x2 - area->x1 + 1);
     uint32_t addr = (uint32_t) LtdcHandle.LayerCfg[0].FBStartAdress + 2 * (LV_HOR_RES_MAX * area->y1 + area->x1);
 
@@ -107,8 +108,6 @@ static void lcd_fb_flush(lv_disp_drv_t *disp_drv, const lv_area_t *area, lv_colo
     DMA2D->CR |= DMA2D_IT_TC | DMA2D_IT_TE | DMA2D_IT_CE;
 
     DMA2D->CR |= DMA2D_CR_START;
-
-    g_gpu_state = 1;
 #endif
 }
 
@@ -142,6 +141,13 @@ void lv_port_disp_init(void)
               info.bits_per_pixel == 24 || info.bits_per_pixel == 32);
 
     lvgl_dma2d_config();
+
+    trans_done_semphr = rt_sem_create("lvgl_sem", 1, RT_IPC_FLAG_PRIO);
+    if (trans_done_semphr == RT_NULL)
+    {
+        rt_kprintf("create transform done semphr failed.\n");
+        return;
+    }
 #endif
 
     /*Initialize `disp_buf` with the buffer(s). With only one buffer use NULL instead buf_2 */