mini2440一线总线移植tslib1.4

最近在学习中接触到了触摸库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 一线触摸配置

你可能感兴趣的:(嵌入式linux)