#include "stm32h7xx_hal.h" #include "printf.h" #include "main.h" #include "user_lvgl_impl.h" #include "user_tasks.h" extern LTDC_HandleTypeDef hltdc; extern DMA2D_HandleTypeDef hdma2d; void _user_lvgl_impl_dma2d_cplt_callback(DMA2D_HandleTypeDef *hdma2d) { if(hdma2d->Instance == DMA2D) { osEventFlagsSet(g_user_lvgl_event_handle, USER_LVGL_EVENT_DMA2D_READY); } } void _user_lvgl_impl_dma2d_err_callback(DMA2D_HandleTypeDef *hdma2d) { if(hdma2d->Instance == DMA2D) { osEventFlagsSet(g_user_lvgl_event_handle, USER_LVGL_EVENT_FLAG_READY); printf("DMA2D Error\r\n"); } } void user_lvgl_impl_log_cb(lv_log_level_t level, const char *file, uint32_t line, const char *fn_name, const char *dsc) { if(level == LV_LOG_LEVEL_ERROR) printf("\033[31m[ERROR] "); if(level == LV_LOG_LEVEL_WARN) printf("\033[33m[ WARN] "); if(level == LV_LOG_LEVEL_INFO) printf("\033[34m[ INFO] "); if(level == LV_LOG_LEVEL_TRACE) printf("\033[36m[TRACE] "); printf("%s:%d, %s(): %s", file, line, fn_name, dsc); printf("\033[m\r\n"); } void user_lvgl_impl_flush_cb(lv_disp_drv_t *disp_drv, const lv_area_t *area, lv_color_t *color_p) { if(HAL_LTDC_SetAddress(&hltdc, (uint32_t)color_p, LTDC_LAYER_1) != HAL_OK) { printf("Set LTDC address error.\r\n"); } lv_disp_flush_ready(disp_drv); } void user_lvgl_impl_gpu_blend_cb(lv_disp_drv_t *disp_drv, lv_color_t *dest, const lv_color_t *src, uint32_t length, lv_opa_t opa) { hdma2d.Init.Mode = DMA2D_M2M_BLEND; if(HAL_DMA2D_Init(&hdma2d) != HAL_OK) { Error_Handler(); } hdma2d.LayerCfg[1].InputAlpha = opa; HAL_DMA2D_ConfigLayer(&hdma2d, 1); HAL_DMA2D_RegisterCallback(&hdma2d, HAL_DMA2D_TRANSFERCOMPLETE_CB_ID, _user_lvgl_impl_dma2d_cplt_callback); HAL_DMA2D_RegisterCallback(&hdma2d, HAL_DMA2D_TRANSFERERROR_CB_ID, _user_lvgl_impl_dma2d_err_callback); osEventFlagsClear(g_user_lvgl_event_handle, USER_LVGL_EVENT_DMA2D_READY); HAL_DMA2D_BlendingStart_IT(&hdma2d, (uint32_t)src, (uint32_t)dest, (uint32_t)dest, length, 1); } void user_lvgl_impl_gpu_fill_cb(lv_disp_drv_t *disp_drv, lv_color_t *dest_buf, lv_coord_t dest_width, const lv_area_t *fill_area, lv_color_t color) { hdma2d.Init.Mode = DMA2D_R2M; hdma2d.Init.OutputOffset = dest_width - lv_area_get_width(fill_area); if(HAL_DMA2D_Init(&hdma2d) != HAL_OK) { Error_Handler(); } hdma2d.LayerCfg[1].InputAlpha = 0xFF; HAL_DMA2D_ConfigLayer(&hdma2d, 1); uint32_t dest_start = (uint32_t)(dest_buf + fill_area->y1 * dest_width + fill_area->x1); HAL_DMA2D_RegisterCallback(&hdma2d, HAL_DMA2D_TRANSFERCOMPLETE_CB_ID, _user_lvgl_impl_dma2d_cplt_callback); HAL_DMA2D_RegisterCallback(&hdma2d, HAL_DMA2D_TRANSFERERROR_CB_ID, _user_lvgl_impl_dma2d_err_callback); osEventFlagsClear(g_user_lvgl_event_handle, USER_LVGL_EVENT_DMA2D_READY); HAL_DMA2D_BlendingStart_IT(&hdma2d, lv_color_to32(color), dest_start, dest_start, lv_area_get_width(fill_area), lv_area_get_height(fill_area)); } void user_lvgl_impl_gpu_wait_cb(lv_disp_drv_t *disp_drv) { osEventFlagsWait(g_user_lvgl_event_handle, USER_LVGL_EVENT_DMA2D_READY, osFlagsNoClear, osWaitForever); HAL_DMA2D_UnRegisterCallback(&hdma2d, HAL_DMA2D_TRANSFERCOMPLETE_CB_ID); HAL_DMA2D_UnRegisterCallback(&hdma2d, HAL_DMA2D_TRANSFERERROR_CB_ID); } void user_lvgl_impl_clean_dcache_cb(lv_disp_drv_t *disp_drv) { SCB_CleanInvalidateDCache_by_Addr((uint32_t *)0xD0100000, 0x00400000); }