搜索
bottom↓
回复: 19

[笔记]在嵌入式linux上运行LittlevGL GUI demo 支持tslib

  [复制链接]

出0入8汤圆

发表于 2019-4-2 10:59:13 | 显示全部楼层 |阅读模式

前提,已经准备好交叉编译工具链和tslib,我用的是buildroot制作好的。

一、下载lvgl源码:

  1. git clone <a href="https://github.com/littlevgl/pc_simulator.git" target="_blank">https://github.com/littlevgl/pc_simulator.git</a>
  2. cd pc_simulator
  3. git submodule update --init
复制代码


二、修改Makefile
1. 修改CC为自己的gcc;
2. 修改链接标志,添加tslib支持;
3. 注释掉mouse_cursor_icon.c,用不上;

代码片断:
  1. # 1:修改成自己的工具链

  2. #CC = gcc   
  3. CC = /home/vmzys/work/2019/code/v3s/my_buildroot/buildroot-2017.08.1/output/host/bin/arm-linux-gnueabihf-gcc


  4. # 2: 添加 tslab共享链接库

  5. #LDFLAGS += -lSDL2 -lm
  6. LDFLAGS += -lts

  7. # 3:用不上,注释掉
  8. #CSRCS +=$(LVGL_DIR)/mouse_cursor_icon.c
复制代码


三、修改lvgl配置文件

1. 修改lv_conf.h

按实际屏幕尺寸修改

  1. /* Horizontal and vertical resolution of the library.*/
  2. #define LV_HOR_RES          (800)
  3. #define LV_VER_RES          (480)
复制代码


2. 修改lv_drv_conf.h

主要修改记录如下,其它按需处理:
  1. #  define USE_MONITOR         0
  2. #  define USE_FBDEV           1
  3. #  define USE_MOUSE           0
  4. #  define USE_MOUSEWHEEL      0
  5. #  define USE_EVDEV           1


  6. // 这里按实际修改
  7. #  define EVDEV_NAME   "/dev/input/event1"        /*You can use the "evtest" Linux tool to get the list of devices and test them*/


  8. #  define USE_KEYBOARD        0
复制代码

3. 修改lv_ex_conf.h

  1. /*******************
  2. * GENERAL SETTING
  3. *******************/
  4. #define LV_EX_PRINTF       0       /*Enable printf-ing data*/
  5. #define LV_EX_KEYBOARD     0       /*Add PC keyboard support to some examples (`lv_drivers` repository is required)*/
  6. #define LV_EX_MOUSEWHEEL   0       /*Add 'encoder' (mouse wheel) support to some examples (`lv_drivers` repository is required)*/


  7. #define USE_LV_TUTORIALS   0

  8. #define USE_LV_BENCHMARK   0


  9. /*MCU and memory usage monitoring*/
  10. #define USE_LV_SYSMON      0

  11. /*A terminal to display received characters*/
  12. #define USE_LV_TERMINAL    0

  13. /*Touch pad calibration with 4 points*/
  14. #define USE_LV_TPCAL       0
复制代码


四、整合tslib到输入驱动 pc_simulator/lv_drivers/indev/evdev.c


代码片断:

  1. // 1: 添加头文件包含
  2. #include "tslib.h"


  3. // 2: ts结构体声明
  4. struct tsdev *ts;


  5. // 3: 修改初始化代码

  6. void evdev_init(void)
  7. {
  8. #if 0
  9.     evdev_fd = open(EVDEV_NAME, O_RDWR | O_NOCTTY | O_NDELAY);
  10.     if(evdev_fd == -1) {
  11.         perror("unable open evdev interface:");
  12.         return;
  13.     }

  14.     fcntl(evdev_fd, F_SETFL, O_ASYNC | O_NONBLOCK);
  15. #endif

  16.    
  17.         ts = ts_setup(NULL, 1);
  18.         if (!ts) {
  19.                 perror("ts_setup");
  20.         
  21.         return;
  22.         
  23.                 //exit(1);
  24.         }

  25.     evdev_root_x = 0;
  26.     evdev_root_y = 0;
  27.     evdev_button = LV_INDEV_STATE_REL;
  28. }


  29. // 4:修改读取代码
  30. bool evdev_read(lv_indev_data_t * data)
  31. {
  32. #if 0

  33.     struct input_event in;

  34.     while(read(evdev_fd, &in, sizeof(struct input_event)) > 0) {
  35.         if(in.type == EV_REL) {
  36.             if(in.code == REL_X)
  37.                                 #if EVDEV_SWAP_AXES
  38.                                         evdev_root_y += in.value;
  39.                                 #else
  40.                                         evdev_root_x += in.value;
  41.                                 #endif
  42.             else if(in.code == REL_Y)
  43.                                 #if EVDEV_SWAP_AXES
  44.                                         evdev_root_x += in.value;
  45.                                 #else
  46.                                         evdev_root_y += in.value;
  47.                                 #endif
  48.         } else if(in.type == EV_ABS) {
  49.             if(in.code == ABS_X)
  50.                                 #if EVDEV_SWAP_AXES
  51.                                         evdev_root_y = in.value;
  52.                                 #else
  53.                                         evdev_root_x = in.value;
  54.                                 #endif
  55.             else if(in.code == ABS_Y)
  56.                                 #if EVDEV_SWAP_AXES
  57.                                         evdev_root_x = in.value;
  58.                                 #else
  59.                                         evdev_root_y = in.value;
  60.                                 #endif
  61.         } else if(in.type == EV_KEY) {
  62.             if(in.code == BTN_MOUSE || in.code == BTN_TOUCH) {
  63.                 if(in.value == 0)
  64.                     evdev_button = LV_INDEV_STATE_REL;
  65.                 else if(in.value == 1)
  66.                     evdev_button = LV_INDEV_STATE_PR;
  67.             }
  68.         }
  69.     }

  70. #endif

  71.     // tslib
  72.         struct ts_sample samp;
  73.         int ret;

  74.     /* 修改自tslib ts_print.c */
  75.    
  76.         while (ts_read(ts, &samp, 1) == 1) {

  77.                 printf("%ld.%06ld: %6d %6d %6d\n", samp.tv.tv_sec, samp.tv.tv_usec, samp.x, samp.y, samp.pressure);
  78.         
  79.                
  80.                
  81.                
  82.                 #if EVDEV_SWAP_AXES
  83.                         evdev_root_x = samp.y;
  84.                         evdev_root_y = samp.x;
  85.                 #else
  86.                         evdev_root_x = samp.x;
  87.                         evdev_root_y = samp.y;
  88.                 #endif
  89.                
  90.         
  91.         if(samp.pressure == 0)
  92.             evdev_button = LV_INDEV_STATE_REL;      //抬起
  93.         else if(samp.pressure == 255)
  94.             evdev_button = LV_INDEV_STATE_PR;
  95.         }
  96.         
  97.         

  98.     /*Store the collected data*/

  99. #if EVDEV_SCALE
  100.     data->point.x = map(evdev_root_x, 0, EVDEV_SCALE_HOR_RES, 0, LV_HOR_RES);
  101.     data->point.y = map(evdev_root_y, 0, EVDEV_SCALE_VER_RES, 0, LV_VER_RES);
  102. #else
  103. #if EVDEV_CALIBRATE
  104.         data->point.x = map(evdev_root_x, EVDEV_HOR_MIN, EVDEV_HOR_MAX, 0, LV_HOR_RES);
  105.         data->point.y = map(evdev_root_y, EVDEV_VER_MIN, EVDEV_VER_MAX, 0, LV_VER_RES);
  106. #else
  107.     data->point.x = evdev_root_x;
  108.     data->point.y = evdev_root_y;
  109. #endif
  110. #endif

  111.     data->state = evdev_button;

  112.     if(data->point.x < 0)
  113.       data->point.x = 0;
  114.     if(data->point.y < 0)
  115.       data->point.y = 0;
  116.     if(data->point.x >= LV_HOR_RES)
  117.       data->point.x = LV_HOR_RES - 1;
  118.     if(data->point.y >= LV_VER_RES)
  119.       data->point.y = LV_VER_RES - 1;

  120.     return false;
  121. }
复制代码


五. 修改main.c

main.c里有很多都是模拟器用的,需要删掉。这里直接用linux fb。

整个代码是比较容易看懂的:

  1. #include "lvgl/lvgl.h"
  2. #include "lv_drivers/display/fbdev.h"
  3. #include "lv_drivers/indev/evdev.h"
  4. #include <unistd.h>

  5. #include "lv_examples/lv_apps/demo/demo.h"
  6. #include "lv_examples/lv_tests/lv_test_theme/lv_test_theme_1.h"

  7. int main(void)
  8. {
  9.     /*LittlevGL init*/
  10.     lv_init();

  11.     /*Linux frame buffer device init*/
  12.     fbdev_init();

  13.     /*Add a display the LittlevGL sing the frame buffer driver*/
  14.     lv_disp_drv_t disp_drv;
  15.     lv_disp_drv_init(&disp_drv);
  16.     disp_drv.disp_flush = fbdev_flush;     

  17.     /*It flushes the internalgraphical buffer to the frame buffer*/
  18.     lv_disp_drv_register(&disp_drv);

  19.     /*Create a "Hello world!" label*/
  20. //    lv_obj_t * label = lv_label_create(lv_scr_act(), NULL);
  21. //    lv_label_set_text(label, "Hello world!");
  22. //    lv_obj_align(label, NULL, LV_ALIGN_CENTER, 0, 0);


  23.     lv_indev_drv_t indev_drv;

  24.     lv_indev_drv_init(&indev_drv);/*Basic initialization*/

  25.     evdev_init();

  26.     indev_drv.type=LV_INDEV_TYPE_POINTER;/*See below.*/

  27.     indev_drv.read=evdev_read;/*See below.*/

  28.     lv_indev_drv_register(&indev_drv);/*Register the driver in LittlevGL*/

  29.     //demo_create();

  30.     lv_test_theme_1(lv_theme_night_init(210, NULL));


  31.     /*Handle LitlevGL tasks (tickless mode)*/
  32.     while(1) {
  33.         lv_tick_inc(5);
  34.         lv_task_handler();
  35.         usleep(1000);
  36.     }

  37.     return 0;
  38. }
复制代码


最后编译:


  1. time make
复制代码


运行截图:











上传一个附件用作参考。

整个工程较大,附件只包含需要修改的文件:main.c,evdev.c,Makefile,lv_conf.h,lv_drv_conf.h,lv_ex_conf.h。


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

发表于 2019-4-2 13:53:16 来自手机 | 显示全部楼层
顶你,!!!!

出0入90汤圆

发表于 2019-4-2 15:15:20 | 显示全部楼层
早就在项目里面用上了。

出150入135汤圆

发表于 2019-4-2 16:26:01 来自手机 | 显示全部楼层
为什么要在linux上跑这个?

出0入20汤圆

发表于 2019-4-2 16:45:59 来自手机 | 显示全部楼层
这个很有用啊,如果你跑个qt觉得太大 这个多简单? 对于一个小的项目,或者有在mcu上用过这个的 很方便啊

出0入8汤圆

 楼主| 发表于 2019-4-2 17:11:54 | 显示全部楼层
honami520 发表于 2019-4-2 15:15
早就在项目里面用上了。

元老动作就是快,小弟还是linux新手

出0入8汤圆

 楼主| 发表于 2019-4-2 17:12:28 | 显示全部楼层
neqee 发表于 2019-4-2 16:26
为什么要在linux上跑这个?

因为穷。

出0入0汤圆

发表于 2019-7-8 23:22:22 | 显示全部楼层
学习了,好资料,谢谢!

出0入0汤圆

发表于 2019-7-9 08:42:02 | 显示全部楼层
厉害,学习了,谢谢

出0入0汤圆

发表于 2019-7-9 09:44:23 | 显示全部楼层
clone这个仓库:https://github.com/littlevgl/lv_linux_frame_buffer,这个已经去掉了SDL依赖,改了fb显示,加上你这里的tslib修改就可以了。

出0入8汤圆

 楼主| 发表于 2019-7-9 17:18:27 | 显示全部楼层
octatao 发表于 2019-7-9 09:44
clone这个仓库:https://github.com/littlevgl/lv_linux_frame_buffer,这个已经去掉了SDL依赖,改了fb显示 ...

多谢分享!

出0入0汤圆

发表于 2019-7-14 14:38:13 来自手机 | 显示全部楼层
直接使用fb,如何排除tty0的干扰?tty0输出的东西,也会在fb中显示。

出0入0汤圆

发表于 2019-7-14 15:48:30 | 显示全部楼层
neqee 发表于 2019-4-2 16:26
为什么要在linux上跑这个?

linux资源太丰富了,用STM32搞东西太累了。

出0入0汤圆

发表于 2019-7-14 20:58:29 来自手机 | 显示全部楼层
尝试一下fltk

出0入0汤圆

发表于 2019-9-2 22:35:18 | 显示全部楼层
octatao 发表于 2019-7-9 09:44
clone这个仓库:https://github.com/littlevgl/lv_linux_frame_buffer,这个已经去掉了SDL依赖,改了fb显示 ...

不错不错,正好差个播放器界面。

出0入4汤圆

发表于 2020-7-2 19:35:30 | 显示全部楼层
正在调试lvgl,学习了

出0入0汤圆

发表于 2020-12-14 13:58:05 | 显示全部楼层
想移植好久了。

出100入101汤圆

发表于 2020-12-14 15:12:07 | 显示全部楼层

lz用的什么开发板?linux的开发板要比mcu的一般要贵些

出0入4汤圆

发表于 2021-3-1 09:57:25 | 显示全部楼层
fengyunyu 发表于 2020-12-14 15:12
lz用的什么开发板?linux的开发板要比mcu的一般要贵些

咸鱼上arm9的可能比MCU的都便宜好吗

出0入0汤圆

发表于 2021-4-2 14:46:13 | 显示全部楼层
可以提供完整的文件吗?刚刚学这个 还挺急着用的 我按照你的方法试了一下报了错误  qq邮箱1769640643@qq.com  万分感谢
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-20 21:53

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表