/* * Copyright (c) 2024 Fabian Blatz * Copyright (c) 2025 Abderrahmane JARMOUNI * * SPDX-License-Identifier: Apache-2.0 */ #ifndef ZEPHYR_MODULES_LVGL_ZEPHYR_H_ #define ZEPHYR_MODULES_LVGL_ZEPHYR_H_ #include #if DT_ZEPHYR_DISPLAYS_COUNT == 0 #error Could not find "zephyr,display" chosen property, or "zephyr,displays" compatible node in DT #endif /* DT_ZEPHYR_DISPLAYS_COUNT == 0 */ #define LV_DISPLAY_IDX_MACRO(i, _) _##i #define LV_DISPLAYS_IDX_LIST LISTIFY(DT_ZEPHYR_DISPLAYS_COUNT, LV_DISPLAY_IDX_MACRO, (,)) #ifdef __cplusplus extern "C" { #endif /** * @brief Initialize the LittlevGL library * * This function initializes the LittlevGL library and setups the display and input devices. * If `LV_Z_AUTO_INIT` is disabled it must be called before any other LittlevGL function. * * @return 0 on success, negative errno code on failure */ int lvgl_init(void); #if defined(CONFIG_LV_Z_RUN_LVGL_ON_WORKQUEUE) || defined(__DOXYGEN__) /** * @brief Gets the instance of LVGL's workqueue * * This function returns the workqueue instance used * by LVGL core, allowing user to submit their own * work items to it. * * @return pointer to LVGL's workqueue instance */ struct k_work_q *lvgl_get_workqueue(void); #endif /* CONFIG_LV_Z_RUN_LVGL_ON_WORKQUEUE */ #if (defined(CONFIG_LV_Z_LVGL_MUTEX) && !defined(CONFIG_LV_Z_USE_OSAL)) || defined(__DOXYGEN__) /** * @brief Lock internal mutex before accessing LVGL API. * * @details LVGL API is not thread-safe. Therefore, before accessing any * API function, you need to lock the internal mutex, to prevent the * LVGL thread from pre-empting the API call. */ void lvgl_lock(void); /** * @brief Try to lock internal mutex before accessing LVGL API. * * @details This function behaves like lvgl_lock(), provided that * the internal mutex is unlocked. Otherwise, it returns false without * waiting. */ bool lvgl_trylock(void); /** * @brief Unlock internal mutex after accessing LVGL API. */ void lvgl_unlock(void); #elif defined(CONFIG_LV_Z_LVGL_MUTEX) && defined(CONFIG_LV_Z_USE_OSAL) #include static inline void lvgl_lock(void) { lv_lock(); } static inline bool lvgl_trylock(void) { return lv_lock_isr() == LV_RESULT_OK; } static inline void lvgl_unlock(void) { lv_unlock(); } #else /* CONFIG_LV_Z_LVGL_MUTEX */ #define lvgl_lock(...) (void)0 #define lvgl_trylock(...) true #define lvgl_unlock(...) (void)0 #endif /* CONFIG_LV_Z_LVGL_MUTEX */ #ifdef __cplusplus } #endif #endif /* ZEPHYR_MODULES_LVGL_ZEPHYR_H_ */