TSLIB调试记录

主芯片:TI-DM8168
Linux版本:2.6.37

笔记是在wiznote做的,图片无法复制过来,可以在这个网址看到我的笔记

最近2周基本上都在调试触摸屏和WG225模块,抽时间做一个总结。
Tslib是一个开源的程序,能够为触摸屏驱动获得的采样提供诸如滤波、去抖、校准等功能,通常作为触摸屏驱动的适配层,为上层的应用提供了一个统一的接口,因为这个原因,我这边的电容触摸屏是采用tslib提供的程序进行校准

首先在官网下载源码压缩包
https://github.com/libts/tslib/releases
一开始选择的版本是最新版本1.20,后来没有调试成功,改用老版本tslib-1.4.tar.gz
压缩包要在linux系统下进行解压
解压后,可以使用chmod 777 -R 改变整个递归目录的权限,否则可能出现Permission denied的报错,所以每次运行指令要加sudo
运行脚本autogen.sh
如果报错,可能是因为某些软件没有安装,根据报错提示百度即可,也可以先装以下三个软件尝试以下

sudo apt-get install autoconf 
sudo apt-get install automake 
sudo apt-get install libtool

运行配置脚本,host指定在ARM核上运行,而不是电脑的x86,prefix指定安装路径(通过NFS很方便的挂载到板子上)

./configure --host=arm-linux --prefix=/rootfs/tslib

进行编译和安装

make

首次编译报错如下

input-raw.c: In function 'ts_input_read_mt':
input-raw.c:520:11: error: 'ABS_MT_TOOL_X' undeclared (first use in this function)
input-raw.c:520:11: note: each undeclared identifier is reported only once for each function it appears in
input-raw.c:525:11: error: 'ABS_MT_TOOL_Y' undeclared (first use in this function)
make[2]: *** [input-raw.lo] 错误 1
make[2]:正在离开目录 `/home/work/ayu/tslib/tslib-1.4/plugins'
make[1]: *** [all-recursive] 错误 1
make[1]:正在离开目录 `/home/work/ayu/tslib/tslib-1.4'
make: *** [all] 错误 2

个人猜测是因为内核版本比较老,相关的定义在内核中头文件中没有
不过问题不大,在tslib库中的头文件自己声明一下就行了(src/tslib.h)
在/src/tslib.h的如下位置加如下的宏

#define SYN_MT_REPORT           2
#define ABS_MT_SLOT             0x2f    /* MT slot being modified */
#define ABS_MT_TOUCH_MAJOR      0x30    /* Major axis of touching ellipse */
#define ABS_MT_TOUCH_MINOR      0x31    /* Minor axis (omit if circular) */
#define ABS_MT_WIDTH_MAJOR      0x32    /* Major axis of approaching ellipse */
#define ABS_MT_WIDTH_MINOR      0x33    /* Minor axis (omit if circular) */
#define ABS_MT_ORIENTATION      0x34    /* Ellipse orientation */
#define ABS_MT_POSITION_X       0x35    /* Center X touch position */
#define ABS_MT_POSITION_Y       0x36    /* Center Y touch position */
#define ABS_MT_TOOL_TYPE        0x37    /* Type of touching device */
#define ABS_MT_BLOB_ID          0x38    /* Group a set of packets as a blob */
#define ABS_MT_TRACKING_ID      0x39    /* Unique ID of initiated contact */
#define ABS_MT_PRESSURE         0x3a    /* Pressure on contact area */
#define ABS_MT_DISTANCE         0x3b    /* Contact hover distance */
#define ABS_MT_TOOL_X           0x3c    /* Center X tool position */
#define ABS_MT_TOOL_Y           0x3d    /* Center Y tool position */

修改之后,编译通过

将编译好的文件安装到指定的目录下,就是刚刚用prefix指定的目录
执行make install
可以看到编译后的内容已经复制到这里

在Bin目录下有一些测试用的二进制文件,在执行这些文件前,需要进行一些配置
配置1:修改/etc/profile

export TSLIB_ROOT=/zigsun/tslib                     #设置一个根目录,方便更改
export TSLIB_TSDEVICE=/dev/input/event1             #根据实际情况更改,接入触摸屏后,生成的event设备节点
export TSLIB_CONFFILE=$TSLIB_ROOT/etc/ts.conf       #tslib的配置文件,一般情况下不需要更改
export TSLIB_PLUGINDIR=$TSLIB_ROOT/lib/ts           #插件的目录
export TSLIB_CALIBFILE=$TSLIB_ROOT/etc/pointercal   #校准后生成的校验文件
export TSLIB_CONSOLEDEVICE=none                     #终端控制台不需要
export TSLIB_FBDEVICE=/dev/fb1                      #根据LCD屏幕对应的设备节点设置
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$TSLIB_ROOT/lib #添加共享库的目录
export QWS_MOUSE_PROTO=tslib:/dev/input/event1      #QT输入设备的环境变量(不设置此项,校准后光标是准的,鼠标不准)

配置2:修改/usr/sbin/svr_timer.sh
这是公司内部产品相关的脚本文件,需要向qt提供一些关于tslib的环境变量,仅供参考

export TSLIB_ROOT=/home/root/tslib
export TSLIB_TSDEVICE=/dev/input/event1
export TSLIB_CONFFILE=$TSLIB_ROOT/etc/ts.conf
export TSLIB_PLUGINDIR=$TSLIB_ROOT/lib/ts
export TSLIB_CALIBFILE=$TSLIB_ROOT/etc/pointercal
export TSLIB_CONSOLEDEVICE=none
export TSLIB_FBDEVICE=/dev/fb1
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$TSLIB_ROOT/lib
export QWS_MOUSE_PROTO=tslib:/dev/input/event1

设置这些之后,使用source命令使设置的环境变量生效,或者重启
在ARM板子上运行以下程序进行校准和测试

校准程序:    ./ts_calibrate    
测试程序:    ./ts_test

我调试的屏型号是ST-2511-001,分辨率2K
因为获取到的键值有问题,始终无法进行校准和测试
正常情况下,触摸屏幕会发出类型为EV_KEY的键值,按下发1,抬起发0,而且一次触摸事件,只发送一次0和1
我这边的实际情况是,只要按下不松手,就不停的发0和1
对于这种特殊情况,我仔细阅读了tslib的源码后,针对键值的特点,对源码进行了相应的修改

只需要修改tslib-1.4\plugins\input-raw.c 这个文件中的ts_input_read函数
分析了键值后,发现每次触摸过程,最后4个键值一定是EV_SYN、EV_ABS、EV_ABS、EV_SYN
并且此处的EV_ABS并不是ABS_X或者ABS_Y,而是ABS_MT_TOUCH_MAJOR等,因此忽略掉此型号后,即可认为最后收到两个连续的EV_SYN,当检测到两个连续的EV_SYN时,认为是触摸的抬起动作

具体代码的更改如下
增加了static int lastType = -1;用于记录上一次检测到的键值类型

函数末尾对上一次的键值进行记录

 if(ev.type == EV_KEY)
 {
  lastType = ev.type;
 }
 else if(ev.type == EV_SYN)
 { 
  lastType = ev.type;
 }
 else if(ev.type == EV_ABS)
 {
  if((ev.code == ABS_X) || (ev.code == ABS_Y))
  {
   lastType = ev.type;
  }
 }

最后更改了退出的条件
在SYN的检测中屏蔽了之前的条件,加入了新的退出条件

最后,将编译后的/rootfs/tslib目录拷贝到板子上,方便以后的校准

猜你喜欢

转载自blog.csdn.net/whitefish520/article/details/101021445