上次移植minigui,这次继续上次的移植,往4020上移植tslib 。大概方法是通过 tslib 来构建 MiniGUI 的输入引擎。tslib 是 一个用于触摸屏设备的函数库。通过这样一个函数库,可以将编程者从繁琐的数据处理中解脱出来。为什么会出现这样的情况呢?因为触摸屏的坐标和液晶显示屏之 间的坐标并不是一一对应的,所以,要让从触摸屏上得到的坐标正确转换为液晶显示屏上的坐标,需要经过一个转换过程。除此之外,tslib 还以插件的形式提供了一些附加的功能,比如去除点击触摸屏时的抖动等。
(1)第一步:下载source code并解压
我用的是tslib-1.3.tar.bz2。
下载地址:http://download.csdn.net/source/673898
(2)第二步:针对底层驱动修改配置信息
./autogen.sh (这步会生产configure文件)
./configure CC=arm-linux-gcc --build=i686-pc-linux --target=arm-linux --host=arm-linux --prefix=/usr/local/arm/3.4.1/arm-linux --enable-inputapi=no
其中最后一项--enable-inputapi=no 是由于驱动不支持ioctl操作,如果不改最后会有如下现象:
我在板子上运行./ts_test的时候,总是提示我:ts_open: No such file or directory?
这个问题曾经也折腾了我好久
(3)第三步:修改源码
1、修改/tslib/plugins/Makefile里面找rpath
将LDFLAGS :=$(LDFLAGS) -rpath $(PLUGIN_DIR)
修改为:
LDFLAGS :=$(LDFLAGS) -rpath `cd $(PLUGIN_DIR) && pwd`(这个可是顿号)
否则make时报如下错:
make的时候libtool:link: only absolute run-paths are allowed
2、修改src/ts_read_raw.c中的 char *defaulttseventtype="UCB1x00";改为char *defaulttseventtype="H3600",因为我的触摸屏驱动对应此结构。
3、修改tslib源码的tests/ts_calibrate.c的getxy函数中修改一些代码。如下
static int getxy(struct tsdev *ts, int *x, int *y)
{
..................................................................
..................................................................
修改的代码
/* Read until we get a touch. */
do {
if (ts_read_raw(ts, &samp[0], 1) < 0) {
perror("ts_read");
close_framebuffer();
exit(1);
}
} while (samp[0].pressure > 0);
do {
if (ts_read_raw(ts, &samp[0], 1) < 0) {
perror("ts_read");
close_framebuffer();
exit(1);
}
} while (samp[0].pressure == 0);
printf("Took %d samples..."n",index);
..................................................................
..................................................................
}
我发现tslib与minigui中对于压力参数的规定刚好相反,tslib规定samp[0].pressure> 0是按下,samp[0].pressure == 0是手松开而事实是相反的
如果不改就会出现在运行./ts_calibrate程序时不能有效校准,这个一定得注意!!!!!!!!!!!!!!!
4、修改在tslib/plugins/mousebuts.c 的mousebuts_read函数中一段代码
//if(t>60)
//{
//dest->pressure=1000;
//buts->fLeftBut=0;
//}
//else
//{
dest->pressure=0;
buts->fLeftBut=2;
//}
要将红色的部分注释掉,否则以后运行minigui时对按钮的操作时,如果对一个按钮进行点击时,并把光标停在按钮的上面
它就会不断的触发按钮的点击事件,这当然不是我们想要得到的结果
(4)编译与安装
make
make install
经过安装步骤后,进入/usr/local/arm/3.4.1/arm-linux 目录下可以看到如下的文件:
[root@localhost tslib-1.3]# cd /usr/local/arm/3.4.1/arm-linux
● # ls bin/
ts_calibrate ts_print ts_test ts_print_raw
● # ls etc/
ts.conf
这里建议配置为:
module mousebuts
#module variance xlimit=20 ylimit=20 pthreshold=3
#module dejitter xdelta=20 ydelta=20 pthreshold=3
module linear
若实际运行时发现抖动比较厉害,可以采用下面的配置:
module mousebuts
#module variance xlimit=20 ylimit=20 pthreshold=3
module dejitter xdelta=20 ydelta=20 pthreshold=3
module linear
● # ls lib/
libts-0.0.so.0 libts-0.0.so.0.1.0 libts.la libts.so
● # ls share/ts/
plugins/
5.修改ts_read_raw.c
在if(ret > 0) {之前添加代码:et = sizeof(*hevt);
成一下形式:
ret = sizeof(*hevt);
if(ret > 0) {
(5)第五步:tslib移植到嵌入式文件系统上
几个必须的文件是:ts.conf,应该把它复制到目标板环境变量TSLIB_CONFFILE指定的目录下;libts-0.0.so.0、libts -0.0.so.0.1.0、libts.so,这三个文件应该被复制到目标板的LD_LIBRARY_PATH环境变量指定目录下。
如果需要对触摸屏进行校准,那么还需要把 ts_calibrate 也拷贝到目标板上,具体位置可以任选,拷贝到目标板上之后将文件属性改为可执行即可。ts_print 和 ts_test 可以用来对生成的 tslib 进行测试,读者可以根据自己的需要决定是否将其拷贝到目标板上。
由于我使用的nfs网络文件系统,根目录是pc机上/nfs/目录,拷贝过程如下:
cp /usr/local/arm/3.4.1/arm-linux/bin/ts* /nfs/test
cp /usr/local/arm/3.4.1/arm-linux/etc/ts.conf /nfs/etc
cp /usr/local/arm/3.4.1/arm-linux/lib/* /nfs/lib //其实不需要 .a 和.la 的文件
安装的时候你可能没有看到plugins目录,要在/usr/local/arm/3.4.1/arm-linux/share/ts/下找
cp -r /usr/local/arm/3.4.1/arm-linux/plugins/ /nfs/
经过这四次拷贝就将tslib的相应库都拷全了,下面要配置文件系统的环境变量,这样程序才能到指定目录下去找库
export T_ROOT=/
export LD_LIBRARY_PATH=/lib
export TSLIB_CONSOLEDEVICE=none
export TSLIB_TSDEVICE=/dev/tp
export TSLIB_CALIBFILE=/etc/pointercal
export TSLIB_CONFFILE=/etc/ts.conf
export TSLIB_PLUGINDIR=/plugins
(6)第六步:生成校准文件pointercal
运行校准程序校准屏幕(5点校准)
cd $T_ROOT/tests
./ts_calibrate //板子上陆续出现5个光标,点击完毕后会生成校准文件pintercal存放在$T_ROOT/etc/下面
********************************************
ts_calibrate是一个应用程序,在屏幕上画几个按钮,将用户点击后从tp驱动获得的数据和
屏上的坐标位置通过一套算法来获得校准数据写到一个校准文件里。pointercal文件中包含了触摸屏的校准数据(calibration)
,正是由于该文件的存在,tslib 才能正确地在触摸屏坐标和液晶屏幕的坐标之间进行转换。
到此tslib-1.3.3全部移植完了,中间还会有些问题,但应该没大问题了,