一线触摸tslib移植详解

来源:互联网 发布:韩国网络女主播 编辑:程序博客网 时间:2024/05/21 22:54

以下内容参考

http://blog.csdn.net/newthinker_wei/article/details/39560109

http://blog.csdn.net/newthinker_wei/article/details/8639276

http://blog.csdn.net/dongqing27/article/details/51501619

http://blog.csdn.net/xishuang_gongzi/article/details/49422879

http://www.arm9home.net/read.php?tid-20248.html

http://blog.csdn.net/bobbat/article/details/51484975

http://www.bubuko.com/infodetail-556461.html

http://blog.csdn.net/zerokkqq/article/details/53045989


1 首先安装必要的工具

sudo apt-get install libtool autoconf automake git 


2 使用git获取tslib源代码

git clone https://github.com/kergoth/tslib


3 支持友善之臂一线触摸的tslib补丁tslib-one-wire.patch

友善已经提供开源tslib(源码见:http://www.arm9home.Net/read.php?tid-16105.html)。

但是另外再编译它有点罗嗦,所以我直接制作一个补丁tslib-one-wire.patch来支持友善之臂一线触摸。

操作如下,把tslib-one-wire.patch拷贝到tslib根目录,然后补丁上:

  1. cp tslib-one-wire.patch tslib/  
  2. cd tslib/  
  3. patch -p1 <tslib-one-wire.patch 

tslib-one-wire.patch源码见下,copy下来然后命名成tslib-one-wire.patch就ok了,然后用上面操作。

  1. #  
  2. # This patch adds support for one wire input raw module (Linux /dev/touchscreen-1wire support).  
  3. #  
  4. # Signed-off-by: Richard Nee <richard.nee.cn@gmail.com>  
  5. #  
  6.   
  7.   
  8. --- tslib.orig/configure.ac 2012-05-07 22:28:42.000000000 +0800  
  9. +++ tslib/configure.ac  2012-05-07 23:53:18.849542215 +0800  
  10. @@ -68,6 +68,7 @@  
  11.  TSLIB_CHECK_MODULE([dmc], [yes], [Enable building of dmc raw module (HP iPaq DMC support)])  
  12.  TSLIB_CHECK_MODULE([input], [yes], [Enable building of generic input raw module (Linux /dev/input/eventN support)])  
  13.  TSLIB_CHECK_MODULE([touchkit], [yes], [Enable building of serial TouchKit raw module (Linux /dev/ttySX support)])  
  14. +TSLIB_CHECK_MODULE([one-wire-ts-input], [yes], [Enable building of one wire input raw module (Linux /dev/touchscreen-1wire support)])  
  15.    
  16.  AC_MSG_CHECKING([where to place modules])  
  17.  AC_ARG_WITH(plugindir,  
  18. --- tslib.orig/plugins/Makefile.am  2012-05-07 22:28:42.000000000 +0800  
  19. +++ tslib/plugins/Makefile.am   2012-05-08 00:08:59.229542649 +0800  
  20. @@ -114,6 +114,12 @@  
  21.  CY8MRLN_PALMPRE_MODULE =  
  22.  endif  
  23.    
  24. +if ENABLE_ONE_WIRE_TS_INPUT_MODULE  
  25. +ONE_WIRE_TS_INPUT_MODULE = one_wire_ts_input.la  
  26. +else  
  27. +ONE_WIRE_TS_INPUT_MODULE =  
  28. +endif  
  29. +  
  30.  pluginexec_LTLIBRARIES = \  
  31.     $(LINEAR_MODULE) \  
  32.     $(DEJITTER_MODULE) \  
  33. @@ -130,7 +136,8 @@  
  34.     $(H2200_LINEAR_MODULE) \  
  35.     $(INPUT_MODULE) \  
  36.     $(TOUCHKIT_MODULE) \  
  37. -   $(CY8MRLN_PALMPRE_MODULE)  
  38. +   $(CY8MRLN_PALMPRE_MODULE) \  
  39. +   $(ONE_WIRE_TS_INPUT_MODULE)  
  40.      
  41.  variance_la_SOURCES    = variance.c  
  42.  variance_la_LDFLAGS    = -module $(LTVSN)  
  43. @@ -185,3 +192,6 @@  
  44.    
  45.  cy8mrln_palmpre_la_SOURCES = cy8mrln-palmpre.c  
  46.  cy8mrln_palmpre_la_LDFLAGS = -module $(LTVSN)  
  47. +  
  48. +one_wire_ts_input_la_SOURCES = one-wire-ts-input.c  
  49. +one_wire_ts_input_la_LDFLAGS = -module $(LTVSN)  
  50. --- tslib.orig/plugins/plugins.h    2012-05-07 22:28:42.000000000 +0800  
  51. +++ tslib/plugins/plugins.h 2012-05-07 23:57:38.369542335 +0800  
  52. @@ -16,3 +16,4 @@  
  53.  TSLIB_DECLARE_MODULE(tatung);  
  54.  TSLIB_DECLARE_MODULE(input);  
  55.  TSLIB_DECLARE_MODULE(cy8mrln_palmpre);  
  56. +TSLIB_DECLARE_MODULE(one_wire_ts_input);  
  57. --- /dev/null   2012-05-08 11:52:49.481035009 +0800  
  58. +++ tslib/plugins/one-wire-ts-input.c   2012-05-08 12:04:38.749035337 +0800  
  59. @@ -0,0 +1,66 @@  
  60. +#include <termios.h>  
  61. +#include <stdio.h>  
  62. +#include <unistd.h>  
  63. +#include <stdlib.h>  
  64. +#include <sys/types.h>  
  65. +#include <sys/stat.h>  
  66. +#include <sys/ioctl.h>  
  67. +#include <fcntl.h>  
  68. +#include <linux/fs.h>  
  69. +#include <errno.h>  
  70. +#include <string.h>  
  71. +#include <sys/utsname.h>  
  72. +#include <time.h>  
  73. +  
  74. +#include "config.h"  
  75. +#include "tslib-private.h"  
  76. +  
  77. +static int misc_read(struct tslib_module_info *inf, struct ts_sample *samp, int nr)  
  78. +{  
  79. +   struct tsdev *ts = inf->dev;  
  80. +  
  81. +   int ret;  
  82. +   unsigned ts_status;  
  83. +   ret = read(ts->fd, &ts_status, sizeof ts_status);  
  84. +   if (ret < 0) {  
  85. +       return 0;  
  86. +   }  
  87. +   if (ret == 0) {  
  88. +       return 0;  
  89. +   }  
  90. +  
  91. +   samp->x = ((ts_status) >> 16) & 0x7FFF;  
  92. +   samp->y = ts_status & 0x7FFF;  
  93. +   samp->pressure = ts_status >> 31;  
  94. +   gettimeofday(&samp->tv,NULL);  
  95. +   nr = nr;  
  96. +  
  97. +   return 1;  
  98. +}  
  99. +static int ts_fini(struct tslib_module_info *inf)  
  100. +{  
  101. +        free(inf);  
  102. +        return 0;  
  103. +}  
  104. +  
  105. +static const struct tslib_ops misc_ops =  
  106. +{  
  107. +   .read   = misc_read,  
  108. +        .fini   = ts_fini,  
  109. +};  
  110. +  
  111. +TSAPI struct tslib_module_info *one_wire_ts_mod_init(struct tsdev *dev, const char *params)  
  112. +{  
  113. +   struct tslib_module_info *m;  
  114. +  
  115. +   m = malloc(sizeof(struct tslib_module_info));  
  116. +   if (m == NULL)  
  117. +       return NULL;  
  118. +  
  119. +   m->ops = &misc_ops;  
  120. +   return m;  
  121. +}  
  122. +  
  123. +#ifndef TSLIB_STATIC_FRIENDLYARM_TS_MODULE  
  124. +TSLIB_MODULE_INIT(one_wire_ts_mod_init);  
  125. +#endif  

4 下面是配置编译tslib

./autogen.sh

echo "ac_cv_func_malloc_0_nonnull=yes">arm-none-linux-gnueabi.cache

./configure --host=arm-none-linux-gnueabi  --cache-file=arm-none-linux-gnueabi.cache --prefix=/opt/tslib_new3

make && make install


5:编译one-wire-ts-input.so

step1: 解压源代码包,执行make
   #tar xvzf  one-wire-ts-input-src-20111026.tar.gz(下载地址:http://download.csdn.net/download/bobbat/9528962)
   #make
  得到" one-wire-ts-input.so ",把它放入板子中,目录为:/opt/tslib_new3/lib/ts/


第五步:修改tslib下面的etc/ts.conf

作如下配置:


[objc] view plain copy 在CODE上查看代码片派生到我的代码片
# 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 one-wire-ts-input.so
module pthres pmin=1  
module variance delta=30  
module dejitter delta=100  
module linear  



第六步:

配置开发板etc/profile文件:

配置如下:

export TSLIB_ROOT=/opt/tslib_new3         
export TSLIB_TSDEVICE=/dev/touchscreen-1wire
export TSLIB_CONFFILE=$TSLIB_ROOT/etc/ts.conf
export TSLIB_PLUGINDIR=$TSLIB_ROOT/lib/ts    
export TSLIB_CALIBFILE=/etc/pointeral        
export TSLIB_FBDEVICE=/dev/fb0               
export QT_QWS_FONTDIR=$QTDIR/lib/fonts                 
export LD_LIBRARY_PATH=$TSLIB_ROOT/lib:$LD_LIBRARY_PATH

第七步:修改 ts.conf文件

#module_raw顶头写,前面不能有空格

module_raw one-wire-ts-input

到此为止 tslib 就基本能用了,首次使用时应先运行 ts_calibrate 进行触摸屏校准。


第八步:生成libqtslibplugin.so

有了tslib后,进入Qt源码目录中的 "qtbase/src/plugins/generic/tslib/",运行 qmake-arm 生成 Makefile,

并在Makefile中将tslib的头文件和库文件路径添加到编译链接选项中(-I/opt/tslib_new3/include  -L/opt/tslib_new3/lib);

然后运行 make 和 make install即可。这时,Qt5安装目录的 "plugins/generic/"目录下就出现"libqtslibplugin.so"这个库文件了。


第9步:运行Qt程序

需要说明的是,Qt5.0开始,Qt自身不再单独实现窗口系统,QWS不复存在,取而代之的新机制是QPA(Qt平台抽象),QPA使得Qt对不同平台的支持变得更加灵活,当需要支持一个新平台时,只需为该平台编写一个QPA插件。

With the release of Qt 5.0, Qt no longer contains its own window system implementation: QWS is no longer a supported platform. For single-process use cases, theQt Platform Abstraction is a superior solution......参考 http://qt-project.org/doc/qt-5/embedded-linux.html

编译完Qt后,只需将生成的lib和plugins文件夹拷贝到开发板,另外,当在嵌入式Linux平台上运行应用程序前,应根据自己平台的实际情况提前设置好下面几个环境变量:

[html] view plain copy
  1. export QT_QPA_PLATFORM_PLUGIN_PATH=/opt/arm/qt/5.3.2/plugins/platforms  
  2. export QT_QPA_PLATFORM=linuxfb:tty=/dev/fb0  
  3. export QT_QPA_FONTDIR=/opt/arm/qt/5.3.2/lib/fonts  
  4. export QT_QPA_GENERIC_PLUGINS=tslib:/dev/touchscreen-1wire  #使用tslib插件  

然后就可以运行Qt程序了

以前Qt4的程序在嵌入式Linux平台运行时,需要在命令行输入-qws选项以启动Qt窗口系统服务,如" ./HelloWorld -qws";而使用Qt5后,不再需要-qws,而需要通过-platform来指定要使用的QPA插件,如" ./HelloWorld -platform linuxfb",如果不指定,则用默认的QPA插件,默认的QPA插件通过上面的QT_QPA_PLATFORM变量指定。




0 0
原创粉丝点击