Files
zephyr/modules/lvgl/include/lvgl_zephyr.h
Pieter De Gendt b5883d3a37 modules: lvgl: Provide API mutex (un)locking
Add helper functions that can be used to lock/unlock the LVGL's internal
mutex before calling API funcions.

Signed-off-by: Pieter De Gendt <pieter.degendt@basalte.be>
2025-08-11 12:49:36 +03:00

106 lines
2.5 KiB
C

/*
* Copyright (c) 2024 Fabian Blatz <fabianblatz@gmail.com>
* Copyright (c) 2025 Abderrahmane JARMOUNI
*
* SPDX-License-Identifier: Apache-2.0
*/
#ifndef ZEPHYR_MODULES_LVGL_ZEPHYR_H_
#define ZEPHYR_MODULES_LVGL_ZEPHYR_H_
#include <zephyr/kernel.h>
#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 <osal/lv_os.h>
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_ */