主题 : 一线触摸tslib移植完全说明 复制链接 | 浏览器收藏 | 打印
级别: 骑士
UID: 61140
精华: 1
发帖: 214
金钱: 1125 两
威望: 225 点
贡献值: 1 点
综合积分: 448 分
注册时间: 2011-12-23
最后登录: 2016-11-20
楼主  发表于: 2012-05-08 17:09

 一线触摸tslib移植完全说明

管理提醒: 本帖被 xoom 执行加亮操作(2012-05-08)
更加清晰明了请见:http://blog.csdn.net/niyufeng/article/details/7546796
如果想直接使用,不用自己加补丁,这有已经完善好的源代码,已经加入对一线触摸的支持:
请到http://code.google.com/p/openwrt-for-embedded/,点击Download页面,下载tslib-one-wire.tar.bz2。
但是建议你把下面的内容看完,以便使用这个已经加入对一线触摸支持的tslib。

一开始接触时,感觉友善的触摸屏好奇怪啊,和一般普通的很不一样(之前我不是使用友善的产品),都不知道该怎么移植tslib了~

一般普通的tslib-1.4之类的和这个友善提供开源tslib(源码见:http://www.arm9home.net/read.php?tid-16105.html)什么关系?首先要搞懂这个才可以继续。

        答:友善之臂提供的这个tslib实际上是标准tslib的一个模块,用来向标准的tslib提供访问一线触摸屏驱动的接口的(因为这个驱动和一般的input event based input设备不同)。你需要在板子上先加载标准的tslib, 然后再通过修改tslib的配置文件加载这个模块。

ok,下面开始移植!

1 首先安装必要的工具

sudo apt-get install libtool autoconf automake git

2 使用git获取tslib源代码

或者到下载我已经加入补丁的支持友善之臂一线触摸的tslib:
请到http://code.google.com/p/openwrt-for-embedded/,点击Download页面,下载tslib-one-wire.tar.bz2。

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" > cache-file.cache
./configure --host=arm-linux \
--cache-file=cache-file.cache \
--prefix=$PWD/install-tslib

make
make install

安装在tslib/install-tslib/中

5 通过修改tslib的配置文件加载一线触摸模块

echo "module_raw one_wire_ts_input" > ts.conf.bck
cat $PWD/install-tslib/etc/ts.conf >>ts.conf.bck
mv ts.conf.bck $PWD/install-tslib/etc/ts.conf

到目前位置tslib已经移植成功,下面就是要把install-tslib/拷贝到开发板合适的位置,然后运行测试tslib了~

6 测试

设置环境变量tslib-env.sh

#! /bin/sh

#export TSLIB_ROOT=/opt/tslib
export TSLIB_CALIBFILE=/etc/pointercal
export TSLIB_CONFFILE=/etc/ts.conf
export TSLIB_PLUGINDIR=/usr/lib/ts
export TSLIB_CONSOLEDEVICE=none
export TSLIB_FBDEVICE=/dev/fb0
export TSLIB_TSDEVICE=/dev/touchscreen-1wire
#export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$TSLIB_ROOT/lib
#export PATH=$PATH:$TSLIB_ROOT/bin


运行测试,进行5点校验

ts_calibrate

ok,good luck : )
[ 此帖被neechard在2012-05-24 11:01重新编辑 ]
自由,自强,共享,共创。
级别: 论坛版主
UID: 12573
精华: 27
发帖: 8881
金钱: 46490 两
威望: 9298 点
贡献值: 27 点
综合积分: 18302 分
注册时间: 2010-01-09
最后登录: 2016-03-18
1楼  发表于: 2012-05-08 17:19
仔细看看,才觉得其实比较简单吧,同时又学到一手

感谢你的分享,为其他用户驱迷解惑
新手如何向我们反馈有效的信息,以便解决问题,见此贴:
http://www.arm9home.net/read.php?tid-14431.html

[注]: 此处签名链接仅为指引方向,而非解答问题本身.
畅游在知识的海洋...
级别: 论坛版主
UID: 33629
精华: 4
发帖: 556
金钱: 3075 两
威望: 615 点
贡献值: 5 点
综合积分: 1192 分
注册时间: 2010-12-03
最后登录: 2015-09-22
2楼  发表于: 2012-05-09 07:02
地板……
好好学习,天天鲁管
级别: 骑士
UID: 61140
精华: 1
发帖: 214
金钱: 1125 两
威望: 225 点
贡献值: 1 点
综合积分: 448 分
注册时间: 2011-12-23
最后登录: 2016-11-20
3楼  发表于: 2012-05-09 07:34

 回 1楼(mindee) 的帖子

是非常简单的~呵呵
级别: 风云使者
UID: 36096
精华: 3
发帖: 2536
金钱: 14075 两
威望: 2815 点
贡献值: 3 点
综合积分: 5132 分
注册时间: 2011-01-11
最后登录: 2015-11-15
4楼  发表于: 2012-05-09 19:36
neechard哥厉害啊,膜拜膜拜。。。。。。
极度缺钱,求捐赠……支付宝兼邮箱:huming2207@qq.com
级别: 新手上路
UID: 68696
精华: 0
发帖: 9
金钱: 45 两
威望: 9 点
贡献值: 0 点
综合积分: 18 分
注册时间: 2012-04-25
最后登录: 2017-09-13
5楼  发表于: 2012-05-10 13:08
谢谢!
级别: 新手上路
UID: 35436
精华: 0
发帖: 15
金钱: 80 两
威望: 16 点
贡献值: 0 点
综合积分: 30 分
注册时间: 2010-12-31
最后登录: 2012-05-21
6楼  发表于: 2012-05-19 17:23
我照你这么做
但是将安装路径改为/usr/local/tslib
移植到板子上 运行/usr/local/tslib/bin/ts_calibrate提示
Couldnt load module one_wire_ts_input                                          
No raw modules loaded.                                                          
ts_config: Success
(我在qtopia2下点击关机,进入终端服务的)
这是环境设置
#! /bin/sh

export TSLIB_ROOT=/usr/local/tslib
export TSLIB_CALIBFILE=/etc/pointercal
export TSLIB_CONFFILE=/usr/local/tslib/etc/ts.conf
export TSLIB_PLUGINDIR=/usr/tslib/lib/ts
export TSLIB_CONSOLEDEVICE=none
export TSLIB_FBDEVICE=/dev/fb0
export TSLIB_TSDEVICE=/dev/touchscreen-1wire
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$TSLIB_ROOT/lib
#export PATH=$PATH:$TSLIB_ROOT/bin
请问下怎么回事?如何解决??谢谢!!
爱好者
级别: 新手上路
UID: 70589
精华: 0
发帖: 2
金钱: 10 两
威望: 2 点
贡献值: 0 点
综合积分: 4 分
注册时间: 2012-05-22
最后登录: 2012-05-24
7楼  发表于: 2012-05-24 09:32
谢谢楼主的分享,真是好贴,好详细啊!
ARM培训http://www.lirenedu.org/
赶紧学好linux!
级别: 侠客
UID: 53998
精华: 0
发帖: 73
金钱: 365 两
威望: 73 点
贡献值: 0 点
综合积分: 146 分
注册时间: 2011-08-21
最后登录: 2014-02-22
8楼  发表于: 2012-05-30 17:07
大家学才是真的学
喜欢linux
级别: 骑士
UID: 5844
精华: 9
发帖: 62
金钱: 760 两
威望: 152 点
贡献值: 9 点
综合积分: 304 分
注册时间: 2009-05-11
最后登录: 2018-02-08
9楼  发表于: 2012-11-06 23:49
首先谢谢你的分享。

我的开发板是 tiny210v2 ,是S70屏幕,支持多点触摸的电容屏。

好像也是一线触摸的,但是使用这个方法,在进入calibration画面的时候,触摸不起作用。

怀疑是 /dev/touchscreen-1wire 给  /usr/lib/ts/one_wire_ts_input.so 的信息已经不是这个代码对应的样子了,但还未确认。

想问一下,这个代码能对应 tiny210v2 的 电容触摸屏吗?