diff --git a/env_support/cmake/dependencies/drm.cmake b/env_support/cmake/dependencies/drm.cmake index 991c777fb4..e83f37f63f 100644 --- a/env_support/cmake/dependencies/drm.cmake +++ b/env_support/cmake/dependencies/drm.cmake @@ -7,8 +7,7 @@ if(LV_USE_FIND_PACKAGE_LIBDRM) find_package(libdrm QUIET) if(libdrm_FOUND) message(STATUS "lvgl: libdrm: found via find_package") - # Link libdrm publicly since lvgl headers expose drm types - target_link_libraries(lvgl PUBLIC libdrm::libdrm) + target_link_libraries(lvgl PRIVATE libdrm::libdrm) return() endif() endif() @@ -18,7 +17,7 @@ if(LV_USE_PKG_CONFIG_LIBDRM AND PkgConfig_FOUND) if(LIBDRM_FOUND) message(STATUS "lvgl: libdrm: found via pkg-config") # Link libdrm publicly since lvgl headers expose drm types - target_link_libraries(lvgl PUBLIC PkgConfig::LIBDRM) + target_link_libraries(lvgl PRIVATE PkgConfig::LIBDRM) return() endif() endif() diff --git a/include/lvgl/drivers/display/lv_linux_drm.h b/include/lvgl/drivers/display/lv_linux_drm.h index c55c2acd28..a08c47507b 100644 --- a/include/lvgl/drivers/display/lv_linux_drm.h +++ b/include/lvgl/drivers/display/lv_linux_drm.h @@ -17,7 +17,6 @@ extern "C" { #include "../../display/lv_display.h" #if LV_USE_LINUX_DRM -#include /********************* * DEFINES @@ -27,7 +26,11 @@ extern "C" { * TYPEDEFS **********************/ -typedef drmModeModeInfo lv_linux_drm_mode_t; +/** + * DRM display mode information. + * Contains the essential display parameters for mode selection. + */ +typedef struct _lv_linux_drm_mode_t lv_linux_drm_mode_t; /** * Callback function type for selecting a DRM display mode @@ -118,6 +121,14 @@ int32_t lv_linux_drm_mode_get_refresh_rate(const lv_linux_drm_mode_t * mode); */ bool lv_linux_drm_mode_is_preferred(const lv_linux_drm_mode_t * mode); +/** + * Get the underlying DRM mode object. + * @param mode pointer to the DRM mode object + * @return pointer to the underlying drmModeModeInfo, or NULL if mode is invalid. + * Requires including to dereference. + */ +void * lv_linux_drm_mode_get_raw(const lv_linux_drm_mode_t * mode); + /********************** * MACROS **********************/ diff --git a/src/drivers/display/drm/lv_linux_drm_common.c b/src/drivers/display/drm/lv_linux_drm_common.c index 25436d8e3e..0135b611c6 100644 --- a/src/drivers/display/drm/lv_linux_drm_common.c +++ b/src/drivers/display/drm/lv_linux_drm_common.c @@ -13,6 +13,7 @@ #include #include +#include "lv_linux_drm_private.h" /********************* * DEFINES @@ -95,7 +96,7 @@ int32_t lv_linux_drm_mode_get_horizontal_resolution(const lv_linux_drm_mode_t * if(!mode) { return 0; } - return mode->hdisplay; + return mode->mode_info->hdisplay; } int32_t lv_linux_drm_mode_get_vertical_resolution(const lv_linux_drm_mode_t * mode) @@ -103,7 +104,7 @@ int32_t lv_linux_drm_mode_get_vertical_resolution(const lv_linux_drm_mode_t * mo if(!mode) { return 0; } - return mode->vdisplay; + return mode->mode_info->vdisplay; } int32_t lv_linux_drm_mode_get_refresh_rate(const lv_linux_drm_mode_t * mode) @@ -111,7 +112,7 @@ int32_t lv_linux_drm_mode_get_refresh_rate(const lv_linux_drm_mode_t * mode) if(!mode) { return 0; } - return mode->vrefresh; + return mode->mode_info->vrefresh; } bool lv_linux_drm_mode_is_preferred(const lv_linux_drm_mode_t * mode) @@ -119,7 +120,15 @@ bool lv_linux_drm_mode_is_preferred(const lv_linux_drm_mode_t * mode) if(!mode) { return false; } - return (mode->type & DRM_MODE_TYPE_PREFERRED) != 0; + return (mode->mode_info->type & DRM_MODE_TYPE_PREFERRED) != 0; +} + +void * lv_linux_drm_mode_get_raw(const lv_linux_drm_mode_t * mode) +{ + if(!mode) { + return NULL; + } + return mode->mode_info; } #endif /*LV_USE_LINUX_DRM*/ diff --git a/src/drivers/display/drm/lv_linux_drm_egl.c b/src/drivers/display/drm/lv_linux_drm_egl.c index de599171c0..d14da9ab75 100644 --- a/src/drivers/display/drm/lv_linux_drm_egl.c +++ b/src/drivers/display/drm/lv_linux_drm_egl.c @@ -640,8 +640,17 @@ static drmModeModeInfo * drm_get_mode(lv_drm_ctx_t * ctx) { LV_ASSERT_NULL(ctx->drm_connector); if(ctx->mode_select_cb) { - size_t mode_index = ctx->mode_select_cb(ctx->display, (lv_linux_drm_mode_t *)ctx->drm_connector->modes, - (size_t)ctx->drm_connector->count_modes); + lv_linux_drm_mode_t * modes = lv_malloc(sizeof(lv_linux_drm_mode_t) * ctx->drm_connector->count_modes); + if(!modes) { + LV_LOG_WARN("Failed to allocate memory for drm modes"); + return NULL; + } + for(int i = 0; i < ctx->drm_connector->count_modes; i++) { + modes[i].mode_info = &ctx->drm_connector->modes[i]; + } + size_t mode_index = ctx->mode_select_cb(ctx->display, modes, (size_t)ctx->drm_connector->count_modes); + lv_free(modes); + if(mode_index >= (size_t)ctx->drm_connector->count_modes) { LV_LOG_ERROR("Failed to select drm mode. User select callback return an invalid mode index"); return NULL; diff --git a/src/drivers/display/drm/lv_linux_drm_egl_private.h b/src/drivers/display/drm/lv_linux_drm_egl_private.h index 2d56abb0d5..47559444d3 100644 --- a/src/drivers/display/drm/lv_linux_drm_egl_private.h +++ b/src/drivers/display/drm/lv_linux_drm_egl_private.h @@ -20,6 +20,7 @@ extern "C" { #if LV_USE_LINUX_DRM && LV_LINUX_DRM_USE_EGL #include +#include "lv_linux_drm_private.h" #include "../../opengles/lv_opengles_texture_private.h" #include "../../opengles/lv_opengles_egl.h" #include "../../opengles/lv_opengles_egl_private.h" diff --git a/src/drivers/display/drm/lv_linux_drm_private.h b/src/drivers/display/drm/lv_linux_drm_private.h new file mode 100644 index 0000000000..cbdb8a3c53 --- /dev/null +++ b/src/drivers/display/drm/lv_linux_drm_private.h @@ -0,0 +1,49 @@ +/** + * @file lv_linux_drm_private.h + * + */ + +#ifndef LV_LINUX_DRM_PRIVATE_H +#define LV_LINUX_DRM_PRIVATE_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ + +#include "../../../lvgl_public.h" + +#if LV_USE_LINUX_DRM + +#include + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +struct _lv_linux_drm_mode_t { + drmModeModeInfo * mode_info; +}; + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/********************** + * MACROS + **********************/ + +#endif /*LV_USE_LINUX_DRM*/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_LINUX_DRM_PRIVATE_H*/ diff --git a/src/lvgl_private.h b/src/lvgl_private.h index 0619df812c..7b6acd797b 100644 --- a/src/lvgl_private.h +++ b/src/lvgl_private.h @@ -104,6 +104,7 @@ extern "C" { #include "draw/vg_lite/lv_vg_lite_pending.h" #include "draw/vg_lite/lv_vg_lite_stroke.h" #include "draw/vg_lite/lv_vg_lite_utils.h" +#include "drivers/display/drm/lv_linux_drm_private.h" #include "drivers/display/drm/lv_linux_drm_egl_private.h" #include "drivers/display/ft81x/lv_ft81x_defines.h" #include "drivers/evdev/lv_evdev_private.h"