织梦CMS - 轻松建站从此开始!

罗索

当前位置: 主页>嵌入式开发>Android>

移植 tslib 到Android 的注意事项

落鹤生 发布于 2012-04-26 22:54 点击:次 
前段时间非常的郁闷…因为在运行生成校准程序 ts_calibrate 时总是出现一个错误:ts_open:Inappropriate ioctol for device后来无数折腾后经过 nanfansky 指点才知道是自己板子的触摸屏驱动不支持 ioctl 操作,狂汗…
TAG:

工作笔记——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
(xiaochangfu)
本站文章除注明转载外,均为本站原创或编译欢迎任何形式的转载,但请务必注明出处,尊重他人劳动,同学习共成长。转载请注明:文章转载自:罗索实验室 [http://www.rosoo.net/a/201204/15963.html]
本文出处:CSDN博客 作者:xiaochangfu 原文
顶一下
(1)
33.3%
踩一下
(2)
66.7%
------分隔线----------------------------
相关文章
发表评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
评价:
表情:
用户名: 验证码:点击我更换图片
栏目列表
将本文分享到微信
织梦二维码生成器
推荐内容