1 /* 2 * Copyright (c) 2006-2021, RT-Thread Development Team 3 * 4 * SPDX-License-Identifier: MIT 5 * 6 * Change Logs: 7 * Date Author Notes 8 * 2021-10-18 Meco Man the first version 9 * 2022-05-10 Meco Man improve rt-thread initialization process 10 */ 11 12 #ifdef __RTTHREAD__ 13 14 #include <lvgl.h> 15 #include <rtthread.h> 16 #ifdef PKG_USING_CPU_USAGE 17 #include "cpu_usage.h" 18 #endif /* PKG_USING_CPU_USAGE */ 19 20 #define DBG_TAG "LVGL" 21 #define DBG_LVL DBG_INFO 22 #include <rtdbg.h> 23 24 #ifndef PKG_LVGL_THREAD_STACK_SIZE 25 #define PKG_LVGL_THREAD_STACK_SIZE 4096 26 #endif /* PKG_LVGL_THREAD_STACK_SIZE */ 27 28 #ifndef PKG_LVGL_THREAD_PRIO 29 #define PKG_LVGL_THREAD_PRIO (RT_THREAD_PRIORITY_MAX*2/3) 30 #endif /* PKG_LVGL_THREAD_PRIO */ 31 32 #ifndef PKG_LVGL_DISP_REFR_PERIOD 33 #define PKG_LVGL_DISP_REFR_PERIOD 33 34 #endif /* PKG_LVGL_DISP_REFR_PERIOD */ 35 36 extern void lv_port_disp_init(void); 37 extern void lv_port_indev_init(void); 38 extern void lv_user_gui_init(void); 39 40 static struct rt_thread lvgl_thread; 41 42 #ifdef rt_align rt_align(RT_ALIGN_SIZE)43 rt_align(RT_ALIGN_SIZE) 44 #else 45 ALIGN(RT_ALIGN_SIZE) 46 #endif 47 static rt_uint8_t lvgl_thread_stack[PKG_LVGL_THREAD_STACK_SIZE]; 48 49 #if LV_USE_LOG 50 static void lv_rt_log(lv_log_level_t level, const char * buf) 51 { 52 (void) level; 53 LOG_I(buf); 54 } 55 #endif /* LV_USE_LOG */ 56 57 #ifdef PKG_USING_CPU_USAGE lv_timer_os_get_idle(void)58uint32_t lv_timer_os_get_idle(void) 59 { 60 return (100 - (uint32_t)cpu_load_average()); 61 } 62 #endif /* PKG_USING_CPU_USAGE */ 63 lvgl_thread_entry(void * parameter)64static void lvgl_thread_entry(void *parameter) 65 { 66 #if LV_USE_LOG 67 lv_log_register_print_cb(lv_rt_log); 68 #endif /* LV_USE_LOG */ 69 lv_init(); 70 lv_tick_set_cb(&rt_tick_get_millisecond); 71 lv_port_disp_init(); 72 lv_port_indev_init(); 73 lv_user_gui_init(); 74 75 76 #ifdef PKG_USING_CPU_USAGE 77 cpu_usage_init(); 78 #endif /* PKG_USING_CPU_USAGE */ 79 80 /* handle the tasks of LVGL */ 81 while(1) 82 { 83 lv_timer_handler(); 84 rt_thread_mdelay(PKG_LVGL_DISP_REFR_PERIOD); 85 } 86 } 87 lvgl_thread_init(void)88static int lvgl_thread_init(void) 89 { 90 rt_err_t err; 91 92 err = rt_thread_init(&lvgl_thread, "LVGL", lvgl_thread_entry, RT_NULL, 93 &lvgl_thread_stack[0], sizeof(lvgl_thread_stack), PKG_LVGL_THREAD_PRIO, 10); 94 if(err != RT_EOK) 95 { 96 LOG_E("Failed to create LVGL thread"); 97 return -1; 98 } 99 rt_thread_startup(&lvgl_thread); 100 101 return 0; 102 } 103 INIT_ENV_EXPORT(lvgl_thread_init); 104 105 #endif /*__RTTHREAD__*/ 106