1
1
/*
2
2
* Copyright 2023 Fabian Blatz <[email protected] >
3
+ * Copyright 2025 Abderrahmane JARMOUNI
3
4
*
4
5
* SPDX-License-Identifier: Apache-2.0
5
6
*/
6
7
#include "lvgl_common_input.h"
7
8
8
9
#include <zephyr/device.h>
9
10
#include <zephyr/kernel.h>
10
- #include <zephyr/logging/log.h>
11
11
#include <lvgl_input_device.h>
12
+ #include <lvgl_display.h>
13
+ #include <zephyr/logging/log.h>
12
14
#include "lvgl_pointer_input.h"
13
15
#include "lvgl_button_input.h"
14
16
#include "lvgl_encoder_input.h"
@@ -42,13 +44,42 @@ static void lvgl_input_read_cb(lv_indev_t *indev, lv_indev_data_t *data)
42
44
data -> continue_reading = k_msgq_num_used_get (cfg -> event_msgq ) > 0 ;
43
45
}
44
46
47
+ static lv_display_t * lvgl_input_get_display (const struct device * dev )
48
+ {
49
+ const struct lvgl_common_input_config * cfg = dev -> config ;
50
+ const struct device * disp_dev = cfg -> display_dev ;
51
+ struct lvgl_disp_data * lv_disp_data ;
52
+ lv_display_t * lv_disp = NULL ;
53
+
54
+ if (disp_dev == NULL ) {
55
+ return NULL ;
56
+ }
57
+
58
+ for (int i = 0 ; i < DT_ZEPHYR_DISPLAYS_COUNT ; i ++ ) {
59
+ lv_disp = lv_display_get_next (lv_disp );
60
+ if (lv_disp == NULL ) {
61
+ LOG_ERR ("Could not find LV display objects of all Zephyr displays" );
62
+ break ;
63
+ }
64
+ lv_disp_data = (struct lvgl_disp_data * )lv_display_get_user_data (lv_disp );
65
+ if (disp_dev == lv_disp_data -> display_dev ) {
66
+ return lv_disp ;
67
+ }
68
+ }
69
+
70
+ LOG_ERR ("LV display corresponding to display device %s not found" , disp_dev -> name );
71
+ __ASSERT_NO_MSG (false);
72
+
73
+ return NULL ;
74
+ }
75
+
45
76
int lvgl_input_register_driver (lv_indev_type_t indev_type , const struct device * dev )
46
77
{
47
- /* Currently no indev binding has its dedicated data
48
- * if that ever changes ensure that `lvgl_common_input_data`
49
- * remains the first member
78
+ /* Ensure that `lvgl_common_input_data` remains the first member
79
+ * of indev dedicated data
50
80
*/
51
81
struct lvgl_common_input_data * common_data = dev -> data ;
82
+ lv_display_t * disp ;
52
83
53
84
if (common_data == NULL ) {
54
85
return - EINVAL ;
@@ -64,6 +95,9 @@ int lvgl_input_register_driver(lv_indev_type_t indev_type, const struct device *
64
95
lv_indev_set_read_cb (common_data -> indev , lvgl_input_read_cb );
65
96
lv_indev_set_user_data (common_data -> indev , (void * )dev );
66
97
98
+ disp = lvgl_input_get_display (dev );
99
+ lv_indev_set_display (common_data -> indev , disp );
100
+
67
101
return 0 ;
68
102
}
69
103
0 commit comments