tslib是一个触摸屏的库,它提供诸如滤波、去抖、校准之类的功能,为不同的触摸屏提供了一个统一的接口。
我是用qte3.3.6是支持tslib的,你只要按网上的帖子去做可以了,还有你一定要看它自带的文件,我一开始也搞了很久,好像是少了一个什么参数,后来看了说明才知道
1、如何获得最新的tslib源代码?
export CVSROOT=:pserver:anoncvs@cvs.handhelds.org:/cvs
cvs login
(password:anoncvs)
cvs co apps/tslib
这样获得的tslib源代码是最新的,目前是稳定版本。
2.[root@linux tslib]# ./autogen.sh --host=arm-linux
(第一次是:./autogen.sh)
这面这句表示将编译适合arm架构CPU的库,其实找开autogen.sh这个文件,我们将发现这是一个批处理的shell文件,其中—host=arm-linux是./configure的参数
一切OK!
现在来做真正的配置:
[root@localhost tslib]# export PATH=/WirelessCard/arm-cross-3.4.1/usr/local/arm/3.4.1/bin/:$PATH
[root@localhost tslib]./configure --host=arm-linux --prefix=/apps/tslib/build
[root@localhost tslib]# make
make时,出现下列错误:
ts_test.o(.text 0x218): In function `main':
: undefined reference to `rpl_malloc'
在当前目录查找了rpl_malloc,发现configure里有#define malloc rpl_malloc一行。分析configure 脚本相关的代码,原来是ac_cv_func_malloc_0_nonnull引起的,OK我们不让它检查了,产生一个cache文件arm-linux.cache,欺骗configure:
[root@localhost tslib]#echo "ac_cv_func_malloc_0_nonnull=yes" >$ARCH-linux.cache
[root@localhost tslib]# ./configure --prefix=/apps/tslib/build --host=arm-linux --cache-file=$ARCH-linux.cache
[root@localhost tslib]#make && make install
成功
在/apps/tslib/tslib目录下生成了build目录。
3.编辑ts.conf
module_raw input
module pthres
module variance delta=30
module dejitter delta=100
module linear
修下这几项,其余全删...
4.把/apps/tslib/tslib目录下生成了build目录打包成build.tar,在开发板中用ftp的形式从主机上下载build.tar.主机需事先安装好Serv-u并配置好.
在开发板中将build.tar解压到相应目录.
修改/etc/profile文件,在其中加入以下环境变量的设置。其解释类上,不同于TSLIB1.3的是,TLIB1.4通过配置文件ts.conf中module_raw h3600语句来加载对应的设备结构体定义。已废除了TSLIB_TSEVENTTYPE宏。
+
export V_ROOT=/xxx/xxx/build
+
export TSLIB_TSDEVICE=/dev/touchscreen/0raw
+ export TSLIB_CALIBFILE=/etc/pointercal
+
export TSLIB_CONFFILE=$V_ROOT/etc/ts.conf
+
export TSLIB_PLUGINDIR=$V_ROOT/lib/ts
+
export TSLIB_CONSOLEDEVICE=none
+
export TSLIB_FBDEVICE=/dev/fb0
o
一个值得注意的问题是:TSLIB1.4在ts_config函数中通过while((p=fgets(buf,BUFF_SIZE,f))!=NULL)来加载ts.conf中的语句,而buf只有512byte。所以对于ts.conf没有用的定义语句,请将其删除,以防止误发生段错误。
在开发板中进行如下测试:
[root@/usr/build/bin]#./ts_test
./ts_test: error while loading shared libraries: libts-0.0.so.0: cannot open shared object file: No such file or directory
参考了下面的做法,主要是在/etc/profile中增加了:
export LD_LIBRARY_PATH=$T_ROOT/lib //指定tslib库文件路径
运行ts_test,触摸屏出现图象.但有一行提示:[root@/usr/build/bin]#./ts_test
selected device is not a touchscreen I understand
我把/etc/profile中选择触摸屏设备的语句改成:
export TSLIB_TSDEVICE=/dev/input/event0
重新运行./ts_calibrate,成功
./ts_calibrate //板子上陆续出现5个光标,点击完毕后会生成校准文件pintercal存放在/etc/下面
********************************************
ts_calibrate是一个应用程序,在屏幕上画几个按钮,将用户点击后从ts驱动获得的数据和
屏上的坐标位置通过一套算法来获得校准数据写到一个校准文件里。
******************************************
运行./ts_test,成功.
1.编译
前段时间非常的郁闷…因为在运行生成校准程序ts_calibrate时总是出现一个错误:ts_open:Inappropriate ioctol for device
后来无数折腾后经过nanfansky指点才知道是自己板子的触摸屏驱动不支持ioctl操作,狂汗…
重新编译tslib
cd tslib-1.3
export CC=/usr/local/arm/2.95.3/bin/arm-linux-gcc //指定交叉编译器
./autogen.sh //生成config文件
export PATH=/usr/local/arm/2.95.3/bin:$PATH
echo "ac_cv_func_malloc_0_nonnull=yes" >arm-linux.cache
./configure --host=arm-linux --cache-file=arm-linux.cache --enable-inputapi=no
vi src/ts_read_raw.c //修改内容如下
make
****************************************************
在make之前,为了支持触摸屏,打开src/ts_read_raw.c文件,查看触摸屏驱动程序数据结构,看与ts_read_raw.c结构中的哪个一样,就将代码中的 char *defaulttseventtype="UCB1x00"; 修改为 自己板子上对应的驱动结构。
因为我的驱动对应的是h3600_ts_event结构
typedef struct {
unsigned short pressure;
unsigned short x;
unsigned short y;
unsigned short pad;
} TS_RET;
所以修改为:
char *defaulttseventtype="H3600";
************************************
如果不修改源代码,也可以在后面的测试中重新指定环境变量
export TSLIB_TSEVENTTYPE=H3600 //通过这个对tslib中的设备结构体定义
*****************************************************
如果你触摸屏驱动程序支持ioctl操作,上面的configure操作中的--enable-inputapi=no]你可以删除。
然后就可以make了
*************************************************
2.测试:
2.1 我在/root/share下新建了一个tslib目录,只copy了一些需要的文件
mkdir /root/share/tslib
mkdir /root/share/tslib/tests
mkdir /root/share/tslib/plugins
mkdir /root/share/tslib/lib
mkdir /root/share/tslib/etc
cp /root/2410s/tslib-1.3/tests/.libs/ts_* /root/share/tslib/tests/ //几个所需的测试文件,比如生成的校准文件,测试文件等等
cp /root/2410s/tslib-1.3/src/.libs/libts-0.0.so.0* /root/share/tslib/lib/ //几个所需的库文件
cp /root/2410s/tslib-1.3/src/.libs/libts.so /root/share/tslib/lib/ //几个所需的库文件
cp /root/2410s/tslib-1.3/plugins/*.so /root/share/tslib/plugins/ //触摸屏插件模块库
cp /root/2410s/tslib-1.3/etc/ts.conf /root/share/tslib/etc/ //配置文件
2.2 连接板子
执行minicom
mount –t nfs –o nolock 192.168.0.155:/root/share /mnt/nfs使板子mount上PC,共享路径/root/share
2.3 做链接
ln -s /dev/fb/0 /dev/fb0
//帧缓冲设备板子上为/dev/fb/0,但程序默认为/dev/fb0,所以做了一个链接/dev/fb0到/dev/fb/0
ln -sf /dev/touchscreen/0raw /dev/ts
//qtopia要打开/dev/ts,你没有这个文件, 所以 dev下边应该有触摸平的节点,
相当于, qtopia启动要找 /dev/ts, 但是你只有/dev/touchscreen/0raw,
所以你把ts链接到你的触摸屏的文件就可以了!
我得触摸屏设备节点文件为/dev/touchscreen/0raw
所以,建立链接 /dev/ts 到/dev/touchscreen/0raw
(这里要自己针对自己板子具体的文件进行设置,要不然也会报错)
2.4 指定环境变量
export QWS_MOUSE_PROTO=TPanel:/dev/touchscreen/0raw
export T_ROOT=/mnt/nfs/tslib
export LD_LIBRARY_PATH=$T_ROOT/lib //指定tslib库文件路径
export TSLIB_CONSOLEDEVICE=none //tslib运行需要的控制台,这里就是LCD屏幕 ,设定控制台设备为none,否则默认为/dev/tty,
export TSLIB_FBDEVICE=/dev/fb0 //指定帧缓冲设备
export TSLIB_TSDEVICE=/dev/touchscreen/0raw //指定触摸屏设备节点文件
export TSLIB_CALIBFILE=$T_ROOT/etc/pointercal //指定触摸屏校准文件pintercal的存放位置
********************************************************************
注:qte的/src/kernel/qwsmouse_qws.cpp里面校准文件默认打开是在/etc下面为/etc/pointercal,
可是我得板子的根文件系统为只读,所以我放在/mnt/nfs/tslib/etc下面了,
所以在交叉编译qte的时候需要修改qwsmouse_qws.cpp
**************************************************
export TSLIB_CONFFILE=$T_ROOT/etc/ts.conf //指定TSLIB配置文件的位置
export TSLIB_PLUGINDIR=$T_ROOT/plugins //指定触摸屏插件所在路径
2.5 校准
运行校准程序校准屏幕(5点校准)
cd $T_ROOT/tests
./ts_calibrate //板子上陆续出现5个光标,点击完毕后会生成校准文件pintercal存放在$T_ROOT/etc/下面
********************************************
ts_calibrate是一个应用程序,在屏幕上画几个按钮,将用户点击后从ts驱动获得的数据和
屏上的坐标位置通过一套算法来获得校准数据写到一个校准文件里。
******************************************
3. 可能遇到的错误分析:
在测试的时候,运行./ts_calibrate又出现了令人十分之郁闷的错误:
ts_config: Success
追查后应该是在打开ts_config中出现了错误(居然报Success,无欲至极)
在网上发现多是这个错误(这是1.4版本的错):
Couldnt load module input
No raw modules loaded
tsconfig: Success
我没有上面那两行的错误,不过应该是一样的错误原因
那么错误就定位在 ts_config 里。并且可以进一步确定是在加载插件模块时出的错
查询了ts_load_module.c这个文件发现网上和自己的不太一样(网上公布的源码是1.4或者是0.1.1的吧)我的是1.3的
我下载了tslib-0.1.1的后重新实验 就发现错误的是这样子的(第一个错误是由ts.conf所决定的)
Couldnt load module pthres
No raw modules loaded
tsconfig: Success
阅读了tslib 的原代码,知道了cstdlib 库里的一个函数: getenv
是用来得到指定系统环境变量的值。是为了测试 tslib 是否得到正确的环境变量。
其环境变量默认的值在readme中有注明。
加载插件模块时出出错分析:
ts_calibrate会打开ts_config
ts_config函数里首先会读取 tslib 配置文件(ts.conf,由 TSLIB_CONFFILE环境变量指定,在tslib/etc下面),
然后根据这个文件逐个加载插件库
1.3版本的ts.conf内容为
module mousebuts
moudle variance xlimit=50 ylimit=50 pthreshold=3
moudle dejitter xdelta=1 ydelta=1 pthreshold=3 moudle linear
ts_config又会调用ts_load_module加载库。从这个函数里,程序先是得到配置文件中指定加载的模块名,
然后根据模块名构造了一个 so 文件文件名,然后调用了系统函数 dlopen 加载库!
Linux 下的加载dlopen 类似于 Windows 下动态链接库的函数:dlopen
错误就应该出在构造的库文件名是错误的---其指定的文件不存在
---从而导致 dlopen无法加载。所以才提示找不到文件或目录!
那么这样就是应该把需要的mousebuts.so variance.so dejitter.so linear.so应该复制到/tslib/plugins中
(上面修正后作了这一步,就可以拉,就不会出现错误拉)
**************************************
这里来谈一谈tslib-1.4,和1.3有一点点不一样,主要是配置文件的差别
一般来说,tsllib-1.4种一个完整的ts.conf配置文件如下所示:
module_raw input
module pthres
module variance delta=30
module dejitter delta=100
module linear
出现这个错误
Couldnt load module input
No raw modules loaded
tsconfig: Success
第一行告诉tslib从linux的输入设备读取数据,需要用到input这个模块,也就是plugin目录下的input.so文件,
所以你的TSLIB_PLUGINDIR一定要配置正确,让tslib能够找到模块文件。
其他参数分别控制触摸点的连续下压、变化宽度、轨迹变化和线性校准。
也是要把其对应的需要的几个库文件复制到/tslib/plugins中
第二行导致"No raw modules loaded."的原因有两个:
注意:一是你的ts.conf中没有指定module_raw,自带的ts.conf的所有module_raw都被注释掉了,
# Uncomment if you wish to use the linux input layer event interface
# module_raw input
# Uncomment if you're using a Sharp Zaurus SL-5500/SL-5000d
# module_raw collie
# Uncomment if you're using a Sharp Zaurus SL-C700/C750/C760/C860
# module_raw corgi
# Uncomment if you're using a device with a UCB1200/1300/1400 TS interface
# module_raw ucb1x00
# Uncomment if you're using an HP iPaq h3600 or similar
#module_raw h3600
# Uncomment if you're using a Hitachi Webpad
# module_raw mk712
# Uncomment if you're using an IBM Arctic II
# module_raw arctic2
你应该打开至少一个module_raw选项,有人就选择了input,去掉了它的注释
得到module_raw input
另一个原因就是你没有正确配置TSLIB_PLUGINDIR,tslib从你指定的目录中没有找到plugin需要的模块文件,
请检查你的路径和文件。
________________________________________________
问题:
小弟最近搞触摸屏多时,一直不能解决。现在触摸屏有点反应,但还没校准,我想用tslib来校准,但碰到很多困难,望大侠指教,小弟万分感激!!!
我用arm-linux-gcc编译了tslib,然后把make install生成的lib拷贝到nfs的lib中,接着在控制台运行:
export TSLIB_TSDEVICE=/dev/input/ts0
export TSLIB_CONSOLEDEVICE=/dev/tty
export TSLIB_FBDEVICE=/dev/fb/0
export TSLIB_CONFFILE=/etc/ts.conf
设置好后运行:
ts_test
出现错误,是不是与TSLIB_CALIBFILE和TSLIB_PLUGINDIR两个没设置有关,请问TSLIB_CALIBFILE和TSLIB_PLUGINDIR应该如何设置?
除把make install生成的lib库放到nfs的lib中外,还需要其它的吗?
请大侠在百忙中抽点时间帮我解答下,特别是TSLIB_CALIBFILE和TSLIB_PLUGINDIR变量啊,小弟万分感激!!!
回复:
1、/dev/input/ts0 是什么设备?正常的应该是/dev/input/eventX,内核Event interface选择了么?
3、用TSLIB_PLUGINDIR指定到plugins文件存放的目录。
4、TSLIB_CALIBFILE默认是/etc/pointercal,可以不指定。
./configure -host=arm-linux -enable-debug -prefix=/usr/local/arm/3.4.1/arm-linux
原文地址:http://read.pudn.com/downloads78/sourcecode/embed/296243/%E7%94%A8tslib%E6%A0%A1%E5%87%86%E8%A7%A6%E6%91%B8%E5%B1%8F%EF%BC%88%E6%88%90%E5%8A%9F%EF%BC%89.rtf__.htm
5-/etc/ts.conf配置
module_raw input
module pthres pmin=1
module variance delta=30
module dejitter delta=100
module linear
6-在你的开发板的/etc/profile文件里添加运行tslib的环境变量(一定要放到/etc/profile,我放到/etc/init.d/rcS里就没有作用,愿因是export只能在当前shell和它的子shell有用,不能影响登录的shell)
# /etc/profile
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/arm/X11R6/bin
export PATH
export TSLIB_ROOT=/usr/local
export TSLIB_TSDEVICE=/dev/event0(你的开发板dev下的触摸屏设备节点文件)
export TSLIB_CALIBFILE=/etc/pointercal
export TSLIB_CONFFILE=$TSLIB_ROOT/etc/ts.conf
export TSLIB_PLUGINDIR=$TSLIB_ROOT/lib/ts
export TSLIB_CONSOLEDEVICE=none
export TSLIB_FBDEVICE=/dev/fb0
#export
LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$TSLIB_ROOT/lib(这句我注释掉的原因是:有一种说法是使用
LD_LIBRARY_PATH这样设置不安全,我的做法是把路径添加到/etc/ld.so.conf文件中,然后执行ldconfig命令,这样就可
以了。ldconfig在你的交叉编译工具里就有)
这样大概就差不多了,运行./ts_calibrate如果还提示ts_open: No such file or directory,用env命令看一下,当前系统是否有你设置的tslib环境变量,
没有的话会提示这个错误的,我在第一次设置/etc/profile文件就没有好使,修改了一下,重启系统就好用了。
运行./ts_calibrate进行触摸屏校准,再运行./ts_test测试效果