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

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

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

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

640.png

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

640.png

2、实现事件初始化和事件读函数
#include "evdev.h"
#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
#include <linux/input.h>
#include "tslib.h"
int evdev_root_x;
int evdev_root_y;
int evdev_button;
struct tsdev *ts;
struct ts_sample samp;
//事件初始化
void evdev_init(void)
{
  //以只读 & 非阻塞的形式打开事件节点
  //调用ts_setup的条件是需要在环境变量中声明TSLIB_TSDEVICE变量
  //否则推荐使用ts_open函数来进行初始化
  ts = ts_setup(NULL, O_RDONLY | O_NONBLOCK);
  if (!ts) {
    perror("ts_setup");
    exit(1);
  }
  evdev_root_x = 0;
  evdev_root_y = 0;
  evdev_button = LV_INDEV_STATE_REL;
}
//读取输入事件
void evdev_read(lv_indev_drv_t * drv, lv_indev_data_t * data)
{
  //当获取到触摸时将读取到的点的坐标以及状态赋值给临时变量
  while(ts_read(ts, &samp, 1) > 0)
  {
    evdev_root_x = samp.x ;
    evdev_root_y = samp.y ;
  }
  if(0 == samp.pressure)
    evdev_button = LV_INDEV_STATE_REL ;
  else
    evdev_button = LV_INDEV_STATE_PR ;
  //将变量注册到LVGL输入设备接口的环境中
  data->point.x = evdev_root_x ;
  data->point.y = evdev_root_y ;
  data->state = evdev_button ;
  //坐标限幅
  if(data->point.x < 0)
     data->point.x = 0;
  if(data->point.y < 0)
     data->point.y = 0;
  if(data->point.x >= drv->disp->driver->hor_res)
     data->point.x = drv->disp->driver->hor_res - 1;
  if(data->point.y >= drv->disp->driver->ver_res)
     data->point.y = drv->disp->driver->ver_res - 1;
  return ;
}

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

640.png

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

evdev_init();
static lv_indev_drv_t indev_drv_1;
lv_indev_drv_init(&indev_drv_1);
indev_drv_1.type = LV_INDEV_TYPE_POINTER; //触摸板或鼠标
indev_drv_1.read_cb = evdev_read;
lv_indev_drv_register(&indev_drv_1);

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


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

#
# Makefile
#
CC := arm-linux-gnueabihf-gcc
LVGL_DIR_NAME ?= lvgl
LVGL_DIR ?= ${shell pwd}
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/
LDFLAGS ?= -lm -lts -lpthread -L/home/yangyx/share/tslib_1.22/lib/
BIN = wifi_scan_list
....省略....
....

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

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

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

CC := arm-linux-gnueabihf-gcc

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

640.png

往期精彩

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


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


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


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


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

目录
相关文章
|
6天前
|
监控 Oracle 关系型数据库
Linux平台Oracle开机自启动设置
【11月更文挑战第8天】在 Linux 平台设置 Oracle 开机自启动有多种方法,本文以 CentOS 为例,介绍了两种常见方法:使用 `rc.local` 文件(较简单但不推荐用于生产环境)和使用 `systemd` 服务(推荐)。具体步骤包括编写启动脚本、赋予执行权限、配置 `rc.local` 或创建 `systemd` 服务单元文件,并设置开机自启动。通过 `systemd` 方式可以更好地与系统启动过程集成,更规范和可靠。
|
7天前
|
Oracle Ubuntu 关系型数据库
Linux平台Oracle开机自启动设置
【11月更文挑战第7天】本文介绍了 Linux 系统中服务管理机制,并详细说明了如何在使用 systemd 和 System V 的系统上设置 Oracle 数据库的开机自启动。包括创建服务单元文件、编辑启动脚本、设置开机自启动和启动服务的具体步骤。最后建议重启系统验证设置是否成功。
|
1月前
|
NoSQL Ubuntu Linux
Linux平台安装MongoDB
10月更文挑战第11天
31 5
|
29天前
|
Linux API 开发工具
FFmpeg开发笔记(五十九)Linux编译ijkplayer的Android平台so库
ijkplayer是由B站研发的移动端播放器,基于FFmpeg 3.4,支持Android和iOS。其源码托管于GitHub,截至2024年9月15日,获得了3.24万星标和0.81万分支,尽管已停止更新6年。本文档介绍了如何在Linux环境下编译ijkplayer的so库,以便在较新的开发环境中使用。首先需安装编译工具并调整/tmp分区大小,接着下载并安装Android SDK和NDK,最后下载ijkplayer源码并编译。详细步骤包括环境准备、工具安装及库编译等。更多FFmpeg开发知识可参考相关书籍。
81 0
FFmpeg开发笔记(五十九)Linux编译ijkplayer的Android平台so库
|
2月前
|
Linux 程序员 编译器
Linux内核驱动程序接口 【ChatGPT】
Linux内核驱动程序接口 【ChatGPT】
|
2月前
|
编解码 Linux 开发工具
Linux平台x86_64|aarch64架构RTMP推送|轻量级RTSP服务模块集成说明
支持x64_64架构、aarch64架构(需要glibc-2.21及以上版本的Linux系统, 需要libX11.so.6, 需要GLib–2.0, 需安装 libstdc++.so.6.0.21、GLIBCXX_3.4.21、 CXXABI_1.3.9)。
|
3月前
|
NoSQL Linux C语言
嵌入式GDB调试Linux C程序或交叉编译(开发板)
【8月更文挑战第24天】本文档介绍了如何在嵌入式环境下使用GDB调试Linux C程序及进行交叉编译。调试步骤包括:编译程序时加入`-g`选项以生成调试信息;启动GDB并加载程序;设置断点;运行程序至断点;单步执行代码;查看变量值;继续执行或退出GDB。对于交叉编译,需安装对应架构的交叉编译工具链,配置编译环境,使用工具链编译程序,并将程序传输到开发板进行调试。过程中可能遇到工具链不匹配等问题,需针对性解决。
|
3月前
|
监控 Linux
在Linux中,如何查看网络接口的状态?
在Linux中,如何查看网络接口的状态?
|
2月前
|
域名解析 负载均衡 网络协议
Linux网络接口配置不当所带来的影响
总而言之,Linux网络接口的恰当配置是保证网络稳定性、性能和安全性的基础。通过遵循最佳实践和定期维护,可以最大程度地减少配置错误带来的负面影响。
143 0
|
2月前
|
Linux 测试技术 API
Linux PWM接口概述 【ChatGPT】
Linux PWM接口概述 【ChatGPT】