📄 用tslib校准触摸屏(成功).rtf
字号:
linuxforum论坛中的hawkhjg就是胡军国
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
修下这几项,其余全删...
3.把/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
(这里要自己针对自己板子具体的文件进行设置,要不然也会报错)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -