现在的位置: 首页 > 综合 > 正文

移植 tslib 到Android 的注意事项

2013年08月16日 ⁄ 综合 ⁄ 共 5346字 ⁄ 字号 评论关闭

工作笔记——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

需要的模块文件,

请检查你的路径和文件。

tslib下载:
tslib-1.3

抱歉!评论已关闭.