STM32H750XB_Hello/Core/Src/user_lvgl_impl.c

108 lines
3.9 KiB
C

#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);
}