Add the scaffolding to create input lvgl pseudo devices which route zephyr input_event to their lvgl `indev` equivalent. As a first cut also add a `zephyr,lvgl-pointer-input compatible which can be a drop-in replacement for the existing kscan solution. Signed-off-by: Fabian Blatz <fabianblatz@gmail.com>
51 lines
1.6 KiB
C
51 lines
1.6 KiB
C
/*
|
|
* Copyright 2023 Fabian Blatz <fabianblatz@gmail.com>
|
|
*
|
|
* SPDX-License-Identifier: Apache-2.0
|
|
*/
|
|
|
|
#ifndef ZEPHYR_MODULES_LVGL_LVGL_COMMON_INPUT_H_
|
|
#define ZEPHYR_MODULES_LVGL_LVGL_COMMON_INPUT_H_
|
|
|
|
#include <lvgl.h>
|
|
#include <zephyr/device.h>
|
|
#include <zephyr/input/input.h>
|
|
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
|
|
struct lvgl_common_input_config {
|
|
struct k_msgq *event_msgq;
|
|
};
|
|
|
|
struct lvgl_common_input_data {
|
|
lv_indev_drv_t indev_drv;
|
|
lv_indev_t *indev;
|
|
lv_indev_data_t pending_event;
|
|
};
|
|
|
|
int lvgl_input_register_driver(lv_indev_type_t indev_type, const struct device *dev);
|
|
|
|
#define LVGL_INPUT_EVENT_MSGQ(inst, type) lvgl_input_msgq_##type##_##inst
|
|
#define LVGL_INPUT_DEVICE(inst) DEVICE_DT_GET_OR_NULL(DT_INST_PHANDLE(inst, input))
|
|
|
|
#define LVGL_COORD_VALID(coord) IN_RANGE(coord, LV_COORD_MIN, LV_COORD_MAX)
|
|
#define LVGL_KEY_VALID(key) IN_RANGE(key, 0, UINT8_MAX)
|
|
|
|
#define LVGL_INPUT_DEFINE(inst, type, msgq_size, process_evt_cb) \
|
|
static void lvgl_input_cb_##_##inst(struct input_event *evt) \
|
|
{ \
|
|
process_evt_cb(DEVICE_DT_INST_GET(inst), evt); \
|
|
} \
|
|
INPUT_CALLBACK_DEFINE(LVGL_INPUT_DEVICE(inst), lvgl_input_cb_##_##inst); \
|
|
K_MSGQ_DEFINE(lvgl_input_msgq_##type##_##inst, sizeof(lv_indev_data_t), msgq_size, 4)
|
|
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|
|
|
|
/** @} */
|
|
|
|
#endif /* ZEPHYR_MODULES_LVGL_LVGL_COMMON_INPUT_H_ */
|