108 lines
3.9 KiB
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);
|
|
}
|