Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1243017
  • 博文数量: 298
  • 博客积分: 10050
  • 博客等级: 上将
  • 技术积分: 3277
  • 用 户 组: 普通用户
  • 注册时间: 2007-03-14 13:36
文章分类
文章存档

2015年(7)

2012年(1)

2010年(5)

2009年(55)

2008年(73)

2007年(160)

我的朋友

分类: LINUX

2007-04-20 13:14:04

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使板子mountPC,共享路径/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

 

第一行告诉tsliblinux的输入设备读取数据,需要用到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_PLUGINDIRtslib从你指定的目录中没有找到plugin需要的模块文件,

请检查你的路径和文件。

 
tslib下载:
tslib-1.3
文件: tslib-1.3.tar.bz2
大小: 32KB
下载: 下载
 
tslib-0.1.1
文件: tslib-0.1.1.tar.bz2
大小: 46KB
下载: 下载
 
阅读(22409) | 评论(37) | 转发(0) |
给主人留下些什么吧!~~

chinaunix网友2008-11-14 18:36:06

请问:我编译出ts_test 等程序,下载到目标板上运行,怎么会出现 ./ts_calibrate: cd: 1: can't cd to /home/zrg/atmel_arm9/ts_test/tslib-1.3/tests ./ts_calibrate: eval: 1: /home/zrg/atmel_arm9/arm-2007q1/bin/arm-none-linux-gnue abi-gcc: not found 怎么回去找我的这些目录啊??

kjpioo2008-10-26 22:13:18

解决方法是先建立相应的设备文件

kjpioo2008-10-26 22:12:04

上面“本站网友”的留言: ---------------- 看了以后受益很多呀!但是我自己编译的时候总是出现 ts_open no such file or diredtory !我configure 的时候加上了 --enable-inputapi=no 为什么会出现这样的情况呢? ---------------- ts_open no such file or diredtory 这个我认为是 在ts_calibrate 中打开设备的时候,不存在相应设备导致。 这个设备可以是你的TSLIB_TSDEVICE所指的设备。从代码ts_calibrate.c里面可以看出。

woailaoxiang2008-10-01 13:55:47

用户名: 密码: 免费注册 昵称: 验证码:  匿名 楼主你好: 我的错误信息: # ./ts_calibrate xres = 480, yres = 272 Took 2 samples... Top left : X = -12436180 Y = -12310713 Took 2 samples... Top right: X = -12436180 Y = -12310713 Took 2 samples... Bot right: X = -12436180 Y = -12310713 Took 2 samples... Bot left : X = -12436180 Y = -12310713 Took 2 samples... Middle: X = -12436180 Y = -12310713 31.863007 -0.009098 0.009174 -2.757997 -0.006065 0.006116 Calibration constants: 2088174 -596 601 -180748 -397 4

chinaunix网友2008-08-05 16:13:20

我把qt2.11移植到了2410的板子上, /dev/input 下面有:event0 mouse0 ts0 tsraw0 event1 mouse1 ts1 tsraw1 mice 1. 设置好了环境变量: export HOME=/tmp export QTDIR=/tmp export QPEDIR=/tmp export PATH=$QPEDIR/bin:$PATH export QWS_MOUSE_PROTO=TPanel:/dev/input/tsraw0 export LD_LIBRARY_PATH=/tmp/lib export TSLIB_TSDEVICE=/dev/input/tsraw0 export TSLIB_CONSOLEDEVICE=none export TSLIB_FBDEVICE=/dev/fb0 export TSLIB_CALIBFILE=/tmp/pointercal