最近在学习中接触到了触摸库tslib,自己试着移植的时候发现网上分为两种方案,一种是使用2440自带AD的方案,另一种是友善的一线总线方案。我的液晶型号是TD35,默认的连接方案是一线总线,所以这里移植的是一线总线方案。
上网搜索的过程中发现网上可用的一线总线tslib并不是1.4版本的,但是编译后使用是没有问题的,抱着试一试的心态决定移植一下1.4版本的tslib到MINI2440,经过实验,成功将tslib的1.4版本移植到了mini2440.
移植主要是将友善提供的one_wire_ts_input.c文件添加到对应位置,修改配置文件就可以了。
下面列出补丁文件
diff -ru tslib/configure.ac tslib1.4_one_wire/configure.ac
--- tslib/configure.ac 2005-03-01 07:44:12.000000000 +0800
+++ tslib1.4_one_wire/configure.ac 2018-01-13 17:56:28.000000000 +0800
@@ -163,6 +163,15 @@
AC_MSG_RESULT($input_module)
AM_CONDITIONAL(ENABLE_INPUT_MODULE, test "$input_module" = "yes")
+AC_MSG_CHECKING([whether one_wire_ts_input module is requested])
+AC_ARG_ENABLE(one_wire_ts_input,
+ AS_HELP_STRING([--enable-one-wire],
+ [Enable building of one-wire-ts-input raw module (Friendly ARM 1-wire) (default=yes)]),
+ [one_wire_ts_input_module=$enableval],
+ [one_wire_ts_input_module=yes])
+AC_MSG_RESULT($one_wire_ts_input_module)
+AM_CONDITIONAL(ENABLE_ONE_WIRE_TS_INPUT_MODULE, test "$one_wire_ts_input_module" = "yes")
+
AC_MSG_CHECKING([where to place modules])
AC_ARG_WITH(plugindir,
AS_HELP_STRING([--with-plugindir=ARG],
diff -ru tslib/plugins/Makefile.am tslib1.4_one_wire/plugins/Makefile.am
--- tslib/plugins/Makefile.am 2005-03-01 07:44:12.000000000 +0800
+++ tslib1.4_one_wire/plugins/Makefile.am 2018-01-13 19:17:18.000000000 +0800
@@ -91,6 +91,12 @@
H2200_LINEAR_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) \
@@ -103,7 +109,8 @@
$(MK712_MODULE) \
$(ARCTIC2_MODULE) \
$(H2200_LINEAR_MODULE) \
- $(INPUT_MODULE)
+ $(INPUT_MODULE) \
+ $(ONE_WIRE_TS_INPUT_MODULE)
variance_la_SOURCES = variance.c
variance_la_LDFLAGS = -module $(LTVSN)
@@ -141,3 +148,6 @@
linear_h2200_la_SOURCES = linear-h2200.c
linear_h2200_la_LDFLAGS = -module $(LTVSN)
+
+one_wire_ts_input_la_SOURCES = one_wire_ts_input-raw.c
+one_wire_ts_input_la_LDFLAGS = -module $(LTVSN)
diff -ru tslib/plugins/one_wire_ts_input-raw.c tslib1.4_one_wire/plugins/one_wire_ts_input-raw.c
--- tslib/plugins/one_wire_ts_input-raw.c 2018-01-13 20:06:19.077456660 +0800
+++ tslib1.4_one_wire/plugins/one_wire_ts_input-raw.c 2018-01-13 19:46:41.000000000 +0800
@@ -0,0 +1,66 @@
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+
+
+#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 *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(mod_init);
+#endif
将上述代码复制后命名为 patch_1wire_tslib1.4
打补丁编译步骤如下:tar xzvf tslib-1.4.tar.gz
patch -p0
cd tslib
./autogen.sh
./configure --host=arm-linux ac_cv_func_malloc_0_nonnull=yes CC=arm-none-linux-gnueabi-gcc CXX=arm-none-linux-gnueabi-g++ -prefix=/work/install_tslib(这里是设置最后的安装位置,可以自定义)
make
make install
执行到这里就可以在上文的安装文件夹中看到编译好的tslib库了。
然后修改该文件夹下 etc 里的 ts.conf 文件,在最开始加上 module_raw one_wire_ts_input
然后修改开发板 /etc/profile 添加环境变量,下面是我的环境变量,对应友善的一线总线驱动
export T_ROOT=/usr/local/tslib
export LD_LIBRARY_PATH=/usr/local/tslib/lib:$LD_LIBRARY_PATH
export TSLIB_CONSOLEDEVICE=none
export TSLIB_FBDEVICE=/dev/fb0
export TSLIB_TSDEVICE=/dev/touchscreen-1wire
export TSLIB_PLUGINDIR=$T_ROOT/lib/ts
export TSLIB_CONFFILE=$T_ROOT/etc/ts.conf
export POINTERCAL_FILE=/etc/pointercal
export TSLIB_CALIBFILE=/etc/pointercal
最后将上述的安装文件夹里的内容整个复制到开发板的 /usr/local/tslib/目录下,进入子目录 bin ,就可以进行触摸屏校准和测试了。
最后感谢网上诸多前辈提供的参考资料,主要参考文章如下:
移植QT5.6到嵌入式开发板(史上最详细的QT移植教程)
mini2440一线触摸屏的tslib移植说明
mini2440 一线触摸配置