嵌入式设备中触摸屏使用非常广泛,但触摸屏的坐标和屏的坐标是不对称的,需要校准。广泛使用的是开源的tslib。下面是两个稳定版本
tslib-0.1.1.tar.bz2
tslib-1.3.tar.bz2
在此先要感谢广大网友的无私奉献,很多的网友都把自己的经验放在网上分享,让我受益匪浅!
主机操作:
cd ~/tslib-1.3
CC=/usr/local/arm/3.4.1/bin/arm-linux-gcc
./configure --host=arm-linux --prefix=~/tslib
(如果你的触摸屏驱动不支持ioctl操作,就需要加上 --enable-inputapi=no)
make
make install
aclocal: configure.ac: 8: macro `AM_DISABLE_STATIC' not found in librar
这是因为没有安装libtool,安装libtool后即可
libtool:link: only absolute run-paths are allowed
要修改/tslib/plugins/Makefile里面找rpath 将
LDFLAGS :=$(LDFLAGS) -rpath $(PLUGIN_DIR)
修改为:
LDFLAGS :=$(LDFLAGS) -rpath `cd $(PLUGIN_DIR) && pwd`
把tslib目录复制到NFS目录,因为这里面有bin etc lib include share目录
minicom操作:
挂载NFS到/mnt/nfs,这样tslib的路径:/mnt/nfs/tslib/...
接下来设置环境变量:
export QWS_MOUSE_PROTO=TPanel:/dev/input/ts0 触摸屏设备文件
export T_ROOT=/mnt/nfs/tslib 目录
export LD_LIBRARY_PATH=$T_ROOT/lib 库文件目录
export TSLIB_CONSOLEDEVICE=none none的时候就默认是/dev/tty
export TSLIB_FBDEVICE=/dev/fb0 framebuffer设备文件
export TSLIB_TSDEVICE=/dev/input/ts0 同上
export TSLIB_CALIBFILE=/etc/pointercal 指定触摸屏校准文件pintercal的存放位置
export TSLIB_CONFFILE=$T_ROOT/etc/ts.conf tslib模块配置文件
export TSLIB_PLUGINDIR=$T_ROOT/plugins tslib插件库目录
export TSLIB_TSEVENTTYPE=H3600 tslib的触摸屏设备结构体定义
进入BIN运行ts_calibrate,五点校正
ts_test检测一下校正结果,如果touch的时候,十字光标随着你移动,基本成功了。
几点疑问:
1。第一次当我校正好了以后运行ts_test的时候,光标不会随我移动,就修改了ts.conf里的模块加载设置。就可以了。默认的情况是这样的:
#module mousebuts
module variance xlimit=50 ylimit=50 pthreshold=3
module dejitter xdelta=1 ydelta=1 pthreshold=3
module linear
当我注释掉variance和dejitter的时候,光标会移动,但偏差较大,当我只注释variance时,仍然会随我移动,但当我都不注释回复到默 认的情况时,仍然不会随我移动。最后我把moudule mousebuts注释取消掉,光标又会随我移动了,并且效果比前面的都好。纳闷了
既然 module mousebuts会直接影响成功与否,variance,为什么最初会默认注释掉?而且 module mousebuts的作用我也不是很清楚?
答案:启用mousebuts就是启用触摸屏,我是这么认为。
2。运行ts_carlibrate的时候,偶尔会出现ts_open找不到,当我把ts_carlibrate设置成上电自动运行的时候也会出现这样的 情况,显然不是ioctl的问题,这是为什么呢?tslib的源码里有ts_open.c文件,并且ts_carlibrate.c也调用了 tslib.h头文件,而tslib.h里面就有ts_open()的定义,所以种种的很奇怪???
3。我的程序不是用在QT上,校准程序怎么设置,当用户在校准的时候没有校准正确,系统会让它重新校准,但现在的情况是tslib会让你校准,用户乱点5次就校准完了,这显然不能为后面的应用程序校准好触摸屏。还不能很明白这其中的道理,问题呀!
答案:把tslib库里的ts_read接口移植给microwin。
步骤:1。修改Makefile.rules
添加:ifeq ($(HAVE_TSLIB_SUPPORT), Y)
DEFINES += -DHAVE_TSLIB_SUPPORT=1
MW_CORE_LIBS += $(LIBTS)
ifneq ($(INCTS),)
INCLUDEDIRS += -I$(INCTS)
endif
endif
2。修改config
添加:####################################################################
# TSLIB support through libts
####################################################################
HAVE_TSLIB_SUPPORT = Y
INCTS = /usr/include
LIBTS = /usr/lib/libts.so
3。把tslib交叉编译生成的lib和include添加到上面指定的目录
tslib.h-->/usr/include
libts.so-->/usr/lib
4。修改mou_touchscreen.c
#include <stdio.h>
#include <errno.h>
#include <unistd.h>
#include <fcntl.h>
#include <tslib.h>
#include "device.h"
#include "touchscreen_ipaq.h"
#ifndef TS_DEVICE
#error "You didn't define a device for the generic touchscreen driver!"
#endif
static struct tsdev *ts=NULL;
extern SCREENDEVICE scrdev;
static int PD_Open(MOUSEDEVICE *pmd)
{
if(getenv("TSLIB_TSDEVICE")!=NULL)
ts=ts_open(getenv("TSLIB_TSDEVICE"),0);
else
ts=ts_open(TS_DEVICE_FILE,0);
if(ts==NULL) {
EPRINTF("Error %d opening tslib/n",errno);
return -1;
}
if(ts_config(ts)) {
EPRINTF("Error %d config tslib/n",errno);
return -1;
}
//GdHideCursor(&scrdev);
return ts_fd(ts);
}
static void PD_Close(void)
{
/* Close the touch panel device. */
if(ts == NULL) return;
ts_close(ts);
ts = NULL;
}
static int PD_GetButtonInfo(void)
{
/* get "mouse" buttons supported */
return MWBUTTON_L;
}
static void PD_GetDefaultAccel(int *pscale,int *pthresh)
{
*pscale = 3;
*pthresh = 5;
}
static int PD_Read(MWCOORD *px, MWCOORD *py, MWCOORD *pz, int *pb, int mode)
{
struct ts_sample event;
int bytes_read;
/* read a data point */
bytes_read = ts_read(ts, &event, 1);
if (bytes_read < 0) {
EPRINTF("[%s] Error %d reading from tslib/n", TS_DEVICE, errno);
return -1;
}
*px = event.x;
*py = event.y;
*pb = (event.pressure) ? MWBUTTON_L : 0;
*pz = event.pressure;
if(!*pb)
return 3;
return 2;
}
MOUSEDEVICE mousedev = {
PD_Open,
PD_Close,
PD_GetButtonInfo,
PD_GetDefaultAccel,
PD_Read,
NULL,
MOUSE_TRANSFORM /* Input filter flags */
};
4。修改touchscreen_ipaq.h
#ifndef TS_DEVICE
#define TS_DEVICE "H3600"
#define TS_DEVICE_FILE "/dev/input/ts0"
struct ts_event {
int x;
int y;
unsigned int pressure;
struct timeval stamp;
};
#endi
tslib触摸屏校准实践若干
最新推荐文章于 2023-09-07 10:42:09 发布
tslib触摸屏校准实践若干
2008/08/28 18:39