一线触摸tslib移植

xiaoxiao2021-02-28  25

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根目录,然后补丁上:

cp tslib-one-wire.patch tslib/  cd tslib/  patch -p1 <tslib-one-wire.patch 

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

#  # This patch adds support for one wire input raw module (Linux /dev/touchscreen-1wire support).  #  # Signed-off-by: Richard Nee <richard.nee.cn@gmail.com>  #      --- tslib.orig/configure.ac 2012-05-07 22:28:42.000000000 +0800  +++ tslib/configure.ac  2012-05-07 23:53:18.849542215 +0800  @@ -68,6 +68,7 @@   TSLIB_CHECK_MODULE([dmc], [yes], [Enable building of dmc raw module (HP iPaq DMC support)])   TSLIB_CHECK_MODULE([input], [yes], [Enable building of generic input raw module (Linux /dev/input/eventN support)])   TSLIB_CHECK_MODULE([touchkit], [yes], [Enable building of serial TouchKit raw module (Linux /dev/ttySX support)])  +TSLIB_CHECK_MODULE([one-wire-ts-input], [yes], [Enable building of one wire input raw module (Linux /dev/touchscreen-1wire support)])      AC_MSG_CHECKING([where to place modules])   AC_ARG_WITH(plugindir,  --- tslib.orig/plugins/Makefile.am  2012-05-07 22:28:42.000000000 +0800  +++ tslib/plugins/Makefile.am   2012-05-08 00:08:59.229542649 +0800  @@ -114,6 +114,12 @@   CY8MRLN_PALMPRE_MODULE =   endif     +if ENABLE_ONE_WIRE_TS_INPUT_MODULE  +ONE_WIRE_TS_INPUT_MODULE = one_wire_ts_input.la  +else  +ONE_WIRE_TS_INPUT_MODULE =  +endif  +   pluginexec_LTLIBRARIES = \      $(LINEAR_MODULE) \      $(DEJITTER_MODULE) \  @@ -130,7 +136,8 @@      $(H2200_LINEAR_MODULE) \      $(INPUT_MODULE) \      $(TOUCHKIT_MODULE) \  -   $(CY8MRLN_PALMPRE_MODULE)  +   $(CY8MRLN_PALMPRE_MODULE) \  +   $(ONE_WIRE_TS_INPUT_MODULE)        variance_la_SOURCES    = variance.c   variance_la_LDFLAGS    = -module $(LTVSN)  @@ -185,3 +192,6 @@      cy8mrln_palmpre_la_SOURCES = cy8mrln-palmpre.c   cy8mrln_palmpre_la_LDFLAGS = -module $(LTVSN)  +  +one_wire_ts_input_la_SOURCES = one-wire-ts-input.c  +one_wire_ts_input_la_LDFLAGS = -module $(LTVSN)  --- tslib.orig/plugins/plugins.h    2012-05-07 22:28:42.000000000 +0800  +++ tslib/plugins/plugins.h 2012-05-07 23:57:38.369542335 +0800  @@ -16,3 +16,4 @@   TSLIB_DECLARE_MODULE(tatung);   TSLIB_DECLARE_MODULE(input);   TSLIB_DECLARE_MODULE(cy8mrln_palmpre);  +TSLIB_DECLARE_MODULE(one_wire_ts_input);  --- /dev/null   2012-05-08 11:52:49.481035009 +0800  +++ tslib/plugins/one-wire-ts-input.c   2012-05-08 12:04:38.749035337 +0800  @@ -0,0 +1,66 @@  +#include <termios.h>  +#include <stdio.h>  +#include <unistd.h>  +#include <stdlib.h>  +#include <sys/types.h>  +#include <sys/stat.h>  +#include <sys/ioctl.h>  +#include <fcntl.h>  +#include <linux/fs.h>  +#include <errno.h>  +#include <string.h>  +#include <sys/utsname.h>  +#include <time.h>  +  +#include "config.h"  +#include "tslib-private.h"  +  +static int misc_read(struct tslib_module_info *inf, struct ts_sample *samp, int nr)  +{  +   struct tsdev *ts = inf->dev;  +  +   int ret;  +   unsigned ts_status;  +   ret = read(ts->fd, &ts_status, sizeof ts_status);  +   if (ret < 0) {  +       return 0;  +   }  +   if (ret == 0) {  +       return 0;  +   }  +  +   samp->x = ((ts_status) >> 16) & 0x7FFF;  +   samp->y = ts_status & 0x7FFF;  +   samp->pressure = ts_status >> 31;  +   gettimeofday(&samp->tv,NULL);  +   nr = nr;  +  +   return 1;  +}  +static int ts_fini(struct tslib_module_info *inf)  +{  +        free(inf);  +        return 0;  +}  +  +static const struct tslib_ops misc_ops =  +{  +   .read   = misc_read,  +        .fini   = ts_fini,  +};  +  +TSAPI struct tslib_module_info *one_wire_ts_mod_init(struct tsdev *dev, const char *params)  +{  +   struct tslib_module_info *m;  +  +   m = malloc(sizeof(struct tslib_module_info));  +   if (m == NULL)  +       return NULL;  +  +   m->ops = &misc_ops;  +   return m;  +}  +  +#ifndef TSLIB_STATIC_FRIENDLYARM_TS_MODULE  +TSLIB_MODULE_INIT(one_wire_ts_mod_init);  +#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/

---------------------------------------------------------------------------------------------------------------

交叉编译 host,build target的含义:build就是你正在使用的机器,host就是你编译好的程序可以运行的平台,target就是你编译的程序可以处理的平台.这个 build和host比较好理解,但是target就不好办了,到底什么意思呢?一般来说,我们平时所说的交差编译用不到他target的,比如. /configure --build=i386-linux,--host=arm-linux就可以了,在386的平台上编译可以运行在arm板的程序.

配置文件ts.conf内容如下:

module_raw input     (去掉前面的# 和空格,其他的保持不变)module pthres pmin=1module variance delta=30module dejitter delta=100module linearmodule_raw有许多种,这里只使用input(即Linux的input子系统,设备文件名称为/dev/event1)/dev/event0为触模屏的设备节点

vi /etc/profile 中添加如下命令

export TSLIB_TSDEVICE=/dev/event0         指定触屏设备export TSLIB_CALIBFILE=/etc/pointercal    指定触摸屏校准文件 pintercal 的存放位置 export TSLIB_CONFFILE=/etc/ts.conf         指定 TSLIB 配置文件的位置export TSLIB_PLUGINDIR=/lib/ts/               指定触摸屏插件所在路径export TSLIB_CONSOLEDEVICE=/dev/tty1 设定控制台设备为 none ,否则默认为 /dev/tty ,这样可以避免出现open consoledevice: No such file or directory KDSETMODE: Bad file descriptor  的错误 export TSLIB_FBDEVICE=/dev/fb0             指定帧缓冲设备 
转载请注明原文地址: https://www.6miu.com/read-2625259.html

最新回复(0)