工作笔记——Tslib的编译和触摸屏测试
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
需要的模块文件,
请检查你的路径和文件。