• LVGL V8.2 嵌入式Linux平台使用tslib实现输入接口(以SSD212为例)


    点击上方“嵌入式应用研究院”,选择“置顶/星标公众号

    干货福利,第一时间送达!

    来源 | 嵌入式应用研究院

    整理&排版 | 嵌入式应用研究院

    由于驱动上报的触摸屏坐标没有进行方向翻转,故上报的坐标在屏幕方向是X、Y都反了。但是我不想 改驱动,因此只能在Linux应用上实现坐标转换。tslib对电阻屏的支持是比较好的,而且我的系统里也移植 了tslib相关的库,那么直接拿来用就好了。

    1、tslib在文件系统中的配置

    a303e9baf0fcc8f9590c091b13bfb904.png

    如果想要开机就自动加载tslib环境,则需要在rcS中添加 source /etc/profile ,让环境变量生效,这 样tslib环境在Linux系统启动后,进入文件系统的时候便能够自动将相关的环境变量加载成功。

    415b4828557008b536816d98139219ee.png

    2、实现事件初始化和事件读函数
    1. #include "evdev.h"
    2. #include <stdio.h>
    3. #include <unistd.h>
    4. #include <fcntl.h>
    5. #include <linux/input.h>
    6. #include "tslib.h"
    7. int evdev_root_x;
    8. int evdev_root_y;
    9. int evdev_button;
    10. struct tsdev *ts;
    11. struct ts_sample samp;
    12. //事件初始化
    13. void evdev_init(void)
    14. {
    15.   //以只读 & 非阻塞的形式打开事件节点
    16.   //调用ts_setup的条件是需要在环境变量中声明TSLIB_TSDEVICE变量
    17.   //否则推荐使用ts_open函数来进行初始化
    18.   ts = ts_setup(NULL, O_RDONLY | O_NONBLOCK);
    19.   if (!ts) {
    20.     perror("ts_setup");
    21.     exit(1);
    22.   }
    23.   evdev_root_x = 0;
    24.   evdev_root_y = 0;
    25.   evdev_button = LV_INDEV_STATE_REL;
    26. }
    27. //读取输入事件
    28. void evdev_read(lv_indev_drv_t * drv, lv_indev_data_t * data)
    29. {
    30.   //当获取到触摸时将读取到的点的坐标以及状态赋值给临时变量
    31.   while(ts_read(ts, &samp, 1) > 0)
    32.   {
    33.     evdev_root_x = samp.x ;
    34.     evdev_root_y = samp.y ;
    35.   }
    36.   if(0 == samp.pressure)
    37.     evdev_button = LV_INDEV_STATE_REL ;
    38.   else
    39.     evdev_button = LV_INDEV_STATE_PR ;
    40.   //将变量注册到LVGL输入设备接口的环境中
    41.   data->point.x = evdev_root_x ;
    42.   data->point.y = evdev_root_y ;
    43.   data->state = evdev_button ;
    44.   //坐标限幅
    45.   if(data->point.x < 0)
    46.      data->point.x = 0;
    47.   if(data->point.y < 0)
    48.      data->point.y = 0;
    49.   if(data->point.x >= drv->disp->driver->hor_res)
    50.      data->point.x = drv->disp->driver->hor_res - 1;
    51.   if(data->point.y >= drv->disp->driver->ver_res)
    52.      data->point.y = drv->disp->driver->ver_res - 1;
    53.   return ;
    54. }

    要让LVGL支持输入,我们需要将实现驱动注册,按照文档提示:

    cddb8d83ec009a1a0df6b189cadaaf76.png

    因此在main函数中需要进行如下调用注册输入设备:

    1. evdev_init();
    2. static lv_indev_drv_t indev_drv_1;
    3. lv_indev_drv_init(&indev_drv_1);
    4. indev_drv_1.type = LV_INDEV_TYPE_POINTER; //触摸板或鼠标
    5. indev_drv_1.read_cb = evdev_read;
    6. lv_indev_drv_register(&indev_drv_1);

    这时候LVGL的输入设备接口就可以调用tslib的接口来读取触摸事件了。

    另外,还需要注意的地方是在Makefile中需要添加tslib的路径:

    1. #
    2. # Makefile
    3. #
    4. CC := arm-linux-gnueabihf-gcc
    5. LVGL_DIR_NAME ?= lvgl
    6. LVGL_DIR ?= ${shell pwd}
    7. CFLAGS ?= -O3 -g0 -I$(LVGL_DIR)/ -Wall -Wshadow -Wundef -Wmissing-prototypes -Wno-discarded-qualifiers -Wall -Wextra -Wno-unused-function -Wno-error=strict-prototypes -Wpointer-arith -fno-strict-aliasing -Wno-error=cpp -Wuninitialized -Wmaybe-uninitialized -Wno-unused-parameter -Wno-missing-field-initializers -Wtype-limits -Wsizeof-pointer-memaccess -Wno-format-nonliteral -Wno-cast-qual -Wunreachable-code -Wno-switch-default -Wreturn-type -Wmultichar -Wformat-security -Wno-ignored-qualifiers -Wno-error=pedantic -Wno-sign-compare -Wno-error=missing-prototypes -Wdouble-promotion -Wclobbered -Wdeprecated -Wempty-body -Wtype-limits -Wshift-negative-value -Wstack-usage=2048 -Wno-unused-value -Wno-unused-parameter -Wno-missing-field-initializers -Wuninitialized -Wmaybe-uninitialized -Wall -Wextra -Wno-unused-parameter -Wno-missing-field-initializers -Wtype-limits -Wsizeof-pointer-memaccess -Wno-format-nonliteral -Wpointer-arith -Wno-cast-qual -Wmissing-prototypes -Wunreachable-code -Wno-switch-default -Wreturn-type -Wmultichar -Wno-discarded-qualifiers -Wformat-security -Wno-ignored-qualifiers -Wno-sign-compare -I /home/yw/share/tslib_1.22/include/
    8. LDFLAGS ?= -lm -lts -lpthread -L/home/yangyx/share/tslib_1.22/lib/
    9. BIN = wifi_scan_list
    10. ....省略....
    11. ....

    如上所示,我们需要在LDFLAGS处添加tslib库的路径:

    -L/home/yangyx/share/tslib_1.22/lib/

    这样才能识别我们在程序中调用的tslib接口。由于我们这个程序是在ARM平台上使用,因此需要根据不同的交叉编译工具链修改,这里我用的是SSD212平台,因此配置为:

    CC := arm-linux-gnueabihf-gcc

    修改完毕后重新编译程序,再将可执行文件移植到相应的平台上即可使用。目前应用例程还在修改中,后续将会共享到Github或者Gitee,地址将在评论区给出。

    8aad401f1b35a6862d2c63a0ce957245.png

    往期精彩

    Keil MDK软件包(pack)下载的几种方法

    手把手教你在Keil MDK中使用GCC编译器工具链

    分享一个在Keil开发环境中配置代码格式化工具Astyle(美化代码风格)

    Keil MDK 将升级为 Keil Studio,你想要的黑色主题来了,附手把手使用教程

    Keil MDK的一些推荐功能(编码格式、自动保存、代码提示、动态语法检查、多核编译)

    觉得本次分享的文章对您有帮助,随手点[在看]并转发分享,也是对我的支持。

  • 相关阅读:
    使用wireshark分析tcp握手过程
    Java基础系列(六)——代理机制详解
    React中使用SWR处理数据请求
    一点C知识:数据类型和内存地址。
    CDH大数据平台 25Cloudera Manager Console之sqoop实战测试(markdown新版)
    Java如何安装https证书
    【Redis】高可用:主从复制详解
    Spark面试题——Spark小文件问题及解决方案
    聚焦“教-学-评-测-练-管一体化”,推动新型人才培养
    AVProVideo☀️七、获取视频的进度,与快进和快退
  • 原文地址:https://blog.csdn.net/morixinguan/article/details/125466068