上次移植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.cgetxy函数中修改一些代码。如下
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);
..................................................................
..................................................................
}
我发现tslibminigui中对于压力参数的规定刚好相反,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全部移植完了,中间还会有些问题,但应该没大问题了,

 posted on 2009-05-12 17:55  清水湾  阅读(1950)  评论(0编辑  收藏  举报