1 /* 2 * Copyright (c) 2025 Abderrahmane JARMOUNI 3 * 4 * SPDX-License-Identifier: Apache-2.0 5 */ 6 7 #include <zephyr/kernel.h> 8 #include <zephyr/drivers/display.h> 9 #include <lvgl.h> 10 #include <lvgl_mem.h> 11 #include <lv_demos.h> 12 #include <stdio.h> 13 #include <lvgl_zephyr.h> 14 15 #define LOG_LEVEL CONFIG_LOG_DEFAULT_LEVEL 16 #include <zephyr/logging/log.h> 17 LOG_MODULE_REGISTER(app); 18 19 #if !DT_HAS_COMPAT_STATUS_OKAY(zephyr_displays) 20 #error Could not find "zephyr,displays" compatible node in DT 21 #endif 22 23 #define ENUMERATE_DISPLAY_DEVS(n) display_dev[n] = DEVICE_DT_GET(DT_ZEPHYR_DISPLAY(n)); 24 main(void)25int main(void) 26 { 27 const struct device *display_dev[DT_ZEPHYR_DISPLAYS_COUNT]; 28 lv_display_t *lv_displays[DT_ZEPHYR_DISPLAYS_COUNT]; 29 lv_display_t *d = NULL; 30 31 /* clang-format off */ 32 FOR_EACH(ENUMERATE_DISPLAY_DEVS, (), LV_DISPLAYS_IDX_LIST); 33 /* clang-format on */ 34 35 for (int i = 0; i < DT_ZEPHYR_DISPLAYS_COUNT; i++) { 36 if (!device_is_ready(display_dev[i])) { 37 LOG_ERR("Display device %d is not ready", i); 38 return 0; 39 } 40 } 41 42 for (int i = 0; i < DT_ZEPHYR_DISPLAYS_COUNT; i++) { 43 d = lv_display_get_next(d); 44 if (d == NULL) { 45 LOG_ERR("Invalid LV display %d object", i); 46 return 0; 47 } 48 lv_displays[i] = d; 49 } 50 51 lv_display_set_default(lv_displays[0]); 52 #ifdef CONFIG_LV_Z_DEMO_MUSIC_FIRST_DISP 53 lv_demo_music(); 54 #elif defined(CONFIG_LV_Z_DEMO_BENCHMARK_FIRST_DISP) 55 lv_demo_benchmark(); 56 #elif defined(CONFIG_LV_Z_DEMO_STRESS_FIRST_DISP) 57 lv_demo_stress(); 58 #elif defined(CONFIG_LV_Z_DEMO_WIDGETS_FIRST_DISP) 59 lv_demo_widgets(); 60 #endif 61 62 #if DT_ZEPHYR_DISPLAYS_COUNT > 1 63 for (int i = 1; i < DT_ZEPHYR_DISPLAYS_COUNT; i++) { 64 lv_display_set_default(lv_displays[i]); 65 #ifdef CONFIG_LV_Z_DEMO_MUSIC_OTHER_DISPS 66 lv_demo_music(); 67 #elif defined(CONFIG_LV_Z_DEMO_BENCHMARK_OTHER_DISPS) 68 lv_demo_benchmark(); 69 #elif defined(CONFIG_LV_Z_DEMO_STRESS_OTHER_DISPS) 70 lv_demo_stress(); 71 #elif defined(CONFIG_LV_Z_DEMO_WIDGETS_OTHER_DISPS) 72 lv_demo_widgets(); 73 #endif 74 } 75 #endif 76 77 lv_timer_handler(); 78 for (int i = 0; i < DT_ZEPHYR_DISPLAYS_COUNT; i++) { 79 display_blanking_off(display_dev[i]); 80 } 81 82 #ifdef CONFIG_LV_Z_MEM_POOL_SYS_HEAP 83 lvgl_print_heap_info(false); 84 #else 85 printf("lvgl in malloc mode\n"); 86 #endif 87 while (1) { 88 uint32_t sleep_ms = lv_timer_handler(); 89 90 k_msleep(MIN(sleep_ms, INT32_MAX)); 91 } 92 93 return 0; 94 } 95