本文来自网络:http://blog.csdn.net/xishuang_gongzi/article/details/49422879

环境:
host:Ubuntu12.04
target:freescale imx6
交叉编译链:4.6.2
tslib源代码:在https://github.com/kergoth/tslib下载到较新版本
tslib安装目标路径:/imx_disk/xx/qt/tslib

安装步骤:

1.准备工作
确保以下软件已安装

# apt-get install autoconf(或autoconf2.13)
# apt-get install automake
# apt-get install libtool

2.下载
https://github.com/kergoth/tslib下载新版本

3.配置
解压源代码tslib-master.zip,并进入源代码文件夹

# unzip tslib-master
# cd tslib-master

配置

# ./autogen.sh
# echo "ac_cv_func_malloc_0_nonnull=yes" > arm-none-Linux-gnueabi.cache

# ./configure CC=/opt/freescale/usr/local/gcc-4.6.2-glibc-2.13-linaro-multilib-2011.12/fsl-linaro-toolchain/bin/arm-fsl-linux-gnueabi-gcc --host=arm-none-linux-gnueabi  --cache-file=arm-none-linux-gnueabi.cache --prefix=/imx_disk/xx/qt/tslib/tslib

注意,prefix选项更换为你的安装路径。

4 修改源码:

①由于触摸屏驱动没有提供ioctl接口,需要屏蔽tslib中ioctl相关代码。否则运行有错误。

vi ./plugins/input-raw.c

屏蔽掉static int check_fd(struct tslib_input *i)中所有ioctl相关代码,只保留一句i->using_syn = 1;。最终代码如下:

  1. static int check_fd(struct tslib_input *i)
  2. {
  3. /*  struct tsdev *ts = i->module.dev;
  4. int version;
  5. long evbit[BITS_TO_LONGS(EV_CNT)];
  6. long absbit[BITS_TO_LONGS(ABS_CNT)];
  7. long keybit[BITS_TO_LONGS(KEY_CNT)];
  8. if (ioctl(ts->fd, EVIOCGVERSION, &version) < 0) {
  9. fprintf(stderr, "tslib: Selected device is not a Linux input event device\n");
  10. return -1;
  11. }
  12. if (version < EV_VERSION) {
  13. fprintf(stderr, "tslib: Selected device uses a different version of the event protocol than tslib was compiled for\n");
  14. return -1;
  15. }
  16. if ( (ioctl(ts->fd, EVIOCGBIT(0, sizeof(evbit)), evbit) < 0) ||
  17. !(evbit[BIT_WORD(EV_ABS)] & BIT_MASK(EV_ABS)) ||
  18. !(evbit[BIT_WORD(EV_KEY)] & BIT_MASK(EV_KEY)) ) {
  19. fprintf(stderr, "tslib: Selected device is not a touchscreen (must support ABS and KEY event types)\n");
  20. return -1;
  21. }
  22. if ((ioctl(ts->fd, EVIOCGBIT(EV_ABS, sizeof(absbit)), absbit)) < 0 ||
  23. !(absbit[BIT_WORD(ABS_X)] & BIT_MASK(ABS_X)) ||
  24. !(absbit[BIT_WORD(ABS_Y)] & BIT_MASK(ABS_Y))) {
  25. fprintf(stderr, "tslib: Selected device is not a touchscreen (must support ABS_X and ABS_Y events)\n");
  26. return -1;
  27. }*/
  28. /* Since some touchscreens (eg. infrared) physically can't measure pressure,
  29. the input system doesn't report it on those. Tslib relies on pressure, thus
  30. we set it to constant 255. It's still controlled by BTN_TOUCH/BTN_LEFT -
  31. when not touched, the pressure is forced to 0. */
  32. /* Since some touchscreens (eg. infrared) physically can't measure pressure,
  33. the input system doesn't report it on those. Tslib relies on pressure, thus
  34. we set it to constant 255. It's still controlled by BTN_TOUCH/BTN_LEFT -
  35. when not touched, the pressure is forced to 0. */
  36. /*  if (!(absbit[BIT_WORD(ABS_PRESSURE)] & BIT_MASK(ABS_PRESSURE))) {
  37. i->current_p = 255;
  38. if ((ioctl(ts->fd, EVIOCGBIT(EV_KEY, sizeof(keybit)), keybit) < 0) ||
  39. !(keybit[BIT_WORD(BTN_TOUCH)] & BIT_MASK(BTN_TOUCH) ||
  40. keybit[BIT_WORD(BTN_LEFT)] & BIT_MASK(BTN_LEFT))) {
  41. fprintf(stderr, "tslib: Selected device is not a touchscreen (must support BTN_TOUCH or BTN_LEFT events)\n");
  42. return -1;
  43. }
  44. }
  45. if (evbit[BIT_WORD(EV_SYN)] & BIT_MASK(EV_SYN))
  46. i->using_syn = 1;
  47. if (i->grab_events == GRAB_EVENTS_WANTED) {
  48. if (ioctl(ts->fd, EVIOCGRAB, (void *)1)) {
  49. fprintf(stderr, "tslib: Unable to grab selected input device\n");
  50. return -1;
  51. }
  52. i->grab_events = GRAB_EVENTS_ACTIVE;
  53. }*/
  54. i->using_syn = 1;
  55. return 0;
  56. }

②若ts_calibrate 测试,无反应,可能是触摸屏驱动中没有report 压力值。一般电容屏驱动不上传压力值,我们使用ft5x06触摸芯片,驱动中probe函数中设置set_bit(ABS_PRESSURE, input_dev->absbit);,然后随报点上传压力值input_report_abs(data->input_dev, ABS_PRESSURE, 1); 触摸点为0时说明触摸结束,input_report_abs(data->input_dev, ABS_PRESSURE, 0);

5.编译

# make

6.安装

# make install

7.移植至开发板
将安装路径下的整个tslib文件夹,下载至开发板的上,我存放的路径为/usr/local

8. 修改ts.conf内容
    打开安装路径下的/etc/ts.conf文件,修改其内容。

# vi /usr/local/tslib/etc/ts.conf

下面是ts.conf文件的第一行与第二行

# Uncomment if you wish to use the linux input layer event interface
# module_raw input

去掉# module_raw input前面的注释,一定要注意中间的空格也去掉,module顶格。

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

module_raw input

module pthres pmin=1

module variance delta=30

module dejitter delta=100

module linear

module_raw有许多种,这里只使用input(即Linux的input子系统)后面的几个module还没有深入了解,它们使用的库就在tslib/lib/ts中,最后三个模块的字面意思是“方差(滤波)”、“去抖动(去噪)”、“线性(坐标变换)”

9. 设置开发板环境变量
通过超级终端, 打开环境变量文件/etc/profile

# vi /etc/profile

添加如下内容:

export TSLIB_CONSOLEDEVICE=none
export TSLIB_FBDEVICE=/dev/fb0

export TSLIB_ROOT=/usr/local/tslib
export TSLIB_TSDEVICE=/dev/input/event2

#export QWS_MOUSE_PROTO=tslib:/dev/input/event2
export TSLIB_CALIBFILE=/etc/pointercal  
export TSLIB_CONFFILE=$TSLIB_ROOT/etc/ts.conf   
export TSLIB_PLUGINDIR=$TSLIB_ROOT/lib/ts 
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$TSLIB_ROOT/lib

其中,TSLIB_ROOT更换为自己实际存放的路径;
另外,TSLIB_TSDEVICE 和QWS_MOUSE_PROTO这两项需要查看自己的板子的触摸屏设备对应/dev/input/下那个文件。

说明: 
                TSLIB_TSDEVICE        //触摸屏设备文件名。 
                TSLIB_CALIBFILE        //校准的数据文件,由ts_calibrate校准程序生成。 
                SLIB_CONFFILE        //配置文件名。 
                TSLIB_PLUGINDIR         //插件目录 
                TSLIB_CONSOLEDEVICE        //控制台设备文件名 
                TSLIB_FBDEVICE        //设备名

以上环境变量在实际开发中的实际配置可以根据实际情况决定。而这些指定的设备节点一定要和你的开发板上的/dev目录下的设备节点相对应。

10 触摸屏设备检查

①检查系统中是否包含触摸屏设备和鼠标设备

使用cat /proc/bus/input/devices查看

I: Bus=0000 Vendor=0000 Product=0000 Version=0000
N: Name="ft5x0x_ts"
P: Phys=
S: Sysfs=/devices/virtual/input/input15
U: Uniq=
H: Handlers=event2 
B: PROP=0
B: EV=b
B: KEY=0
B: ABS=2650000 1000000

②检查是否包含触摸屏设备和鼠标设备的文件,不存在则建立即可

ls   /dev/     查看是否包含上述的文件名event2

如果不包含,可以用cat命令查看上面的S: Sysfs后跟的设备名,即可找到设备的主设备号和次设备好。就可以创建设备了。如:

cat /sys/devices/virtual/input/input15/event2/uevent

MAJOR=13
MINOR=66
DEVNAME=input/event2

③就可以在/dev/input下建立设备event2了。
#mknod   /dev/input/event1  c   13 66

④检测触摸屏驱动是否正常

首先初步检测驱动:

#cat /dev/input/event2 
轻按触摸屏。。。终端输出乱码,表明触摸屏正常!
再编写简单应用层代码测试:

  1. #include<stdio.h>
  2. #include<sys/types.h>
  3. #include<sys/stat.h>
  4. #include<fcntl.h>
  5. #include<unistd.h>
  6. #include <linux/input.h>
  7. int main(int argc, char *argv[])
  8. {
  9. struct input_event event;
  10. char *device = argv[1];
  11. int ret = 0;
  12. int fd = open(device, O_RDWR);
  13. if(fd < 0){
  14. fprintf(stderr, "open %s failed!",device);
  15. return -1;
  16. }
  17. ret = read(fd, &event, sizeof(event));
  18. if(ret < (int)sizeof(event)){
  19. fprintf(stderr, "could not get event");
  20. return -1;
  21. }
  22. printf("%04x %04x %08x", event.type, event.code, event.value);
  23. return 0;
  24. }

11 运行

运行校准程序:

/usr/local/tslib/bin/ts_calibrate 
xres = 1280, yres = 800
Took 3 samples...
Top left : X =   28 Y =   45
Took 6 samples...
Top right : X = 1221 Y =   47
Took 54 samples...
Bot right : X = 1215 Y =  754
Took 26 samples...
Bot left : X =   40 Y =  769
Took 4 samples...
Center : X =  635 Y =  403
16.143372 0.996495 -0.004317
1.869019 0.005320 0.978174
Calibration constants: 1057972 65306 -282 122488 348 64105 65536

生成的校准文件名为pointercal,位于/etc目录下。

运行测试程序:

./ts_test

即可。

屏幕最上方会出现三个按钮,分别为“Drag”、“Draw”和“Quit”,默认是第一个,因此,用触摸笔点击任何一处,十字光标便会到那里。

下面是点击“Draw”按钮并用触摸笔写字的提示信息的一小部分:

1302603922.770286:     98    302      1

1302603922.800295:    107    300      1

1302603922.815277:    118    297      1

1302603922.830291:    130    294      1

1302603922.845288:    143    290      1

1302603922.845288:    151    288      1

1302603922.875166:    168    284      0

第一列为timeval结构体的两个成员:tv_sec和tv_usec,中间两列分别是X和Y的坐标,最后为pressure,这里可以理解成“触摸事件”,为1表示触摸笔点击了(接触)屏幕,为0表示触摸笔离开了屏幕

12 错误处理

①./autogen.sh执行失败是因为缺少工具,通过sudo apt-get install autoconf automake libtool安装相应工具。


Couldnt open tslib config file: No such file or directory
ts_config: No such file or directory
原因:一般为环境变量 TSLIB_PLUGINDIR 设置问题。可以查看ts_config.c代码,打印出具体路径查看错误原因

③打不开module input

Couldnt load module input
No raw modules loaded.

tsconfig: Success
原因分析:
查看ts.conf中module_raw的配置
编译选项需要增加 --enable_input=yes 否则没有input.so文件

ts open
tslib: Selected device is not a Linux input event device
原因分析:input-raw.c 函数需要根据底层驱动做适当修改。
触摸屏驱动没有提供ioctl接口,要删除代码中与ioctl有关的所有函数。

⑤Segmentation fault

解决:一般是因为配置文件ts.conf格式错误。参数前面不能有空格。

#ts_calibrate 
ts_open: No such file or directory

可能是触摸屏驱动没有加载,找不到设备节点

【转载】tslib移植_freescale imx6的更多相关文章

  1. tslib移植笔记(1)【转】

    本文转载自:https://blog.csdn.net/zijie_xiao/article/details/50740950 tslib移植笔记(1)2016-04-25 tslib背景[摘自百度] ...

  2. Tslib移植与分析【转】

    转自:http://blog.csdn.net/water_cow/article/details/7215308 目标平台:LOONGSON-1B开发板(mips32指令集)编译平台:x86PC-- ...

  3. tslib移植中环境变量编辑

    (1)将/usr/local/tslib下的所有文件复制到移植系统文件中/usr/local(2)编辑移植系统中/etc/profile添加触摸屏支持内容:在/etc/profile文件中设置tsli ...

  4. tslib移植arm及使用

    测试平台 宿主机平台:Ubuntu 12.04.4 LTS 目标机:Easy-ARM IMX283 目标机内核:Linux 2.6.35.3 tslib 1.4 下载  https://gitlab. ...

  5. qt5.5.0成功移植到IMX6中

    前阵子移植qt4.8.5到板子上成功后,总想着qt4有点旧,于是就想着玩qt5,之前都是在Windows7上写qt,写了个游戏,感觉还不错,但毕竟不能只能在PC机上跑,现在由于项目需要,要将qt搞到I ...

  6. 最新QT4.8+kernel_3.2.5+uboot_2010.06+tslib移植成功-问题小结

    2012-02-19 21:34:13 都是从源码下载然后自己修改,使用与TQ2440,之前uboot其实已经完成了.但是yaffs2没带起来.现在回头看来是很简单的了.bootargs参数中我设置成 ...

  7. tslib 移植问题与解决方法

    问题一.执行脚本.提示出错,错误有"cann't exec aclocal" ,错误提示最多的是关于aclocal的问题,查资料显示这个文件是automake必备一个文件,好吧,那 ...

  8. Qt5.5.1移植到freescale imx6

    一.环境 HOST:ubuntu12.04-LTS Embedded:freescale imx6 linux-3.0.35 CROSS_COMPILE:freescale提供的gcc-4.6.2-g ...

  9. 调试lcd时候给linux单板移植tslib

    作者:良知犹存 转载授权以及围观:欢迎添加微信公众号:Conscience_Remains 总述  tslib背景: 在采用触摸屏的移动终端中,触摸屏性能的调试是个重要问题之一,因为电磁噪声的缘故,触 ...

随机推荐

  1. Codeforces Round #284 (Div. 1) B. Name That Tune(概率DP)(难)

    B. Name That Tune time limit per test 1 second memory limit per test 256 megabytes input standard in ...

  2. 在SAE上使用Ueditor的图片上传功能

    SAE上是没有文件夹读写权限的,所以要在SAE使用Ueditor的图片上传功能须要借助SAE的Storage服务. 一.开通Storage服务 在SAE控制台开通Storage服务,并新增一个doma ...

  3. UVA - 1471 Defense Lines 树状数组/二分

                                  Defense Lines After the last war devastated your country, you - as the ...

  4. windows命令行方式下打印和设置PATH变量

    点击开始菜单,运行=>cmd打印当前变量:echo %PATH%结果:C:\WINDOWS\system32;C:\WINDOWS;C:\WINDOWS\System32\Wbem;d:\PRO ...

  5. [jzoj 6092] [GDOI2019模拟2019.3.30] 附耳而至 解题报告 (平面图转对偶图+最小割)

    题目链接: https://jzoj.net/senior/#main/show/6092 题目: 知识点--平面图转对偶图 在求最小割的时候,我们可以把平面图转为对偶图,用最短路来求最小割,这样会比 ...

  6. 11.MATLAB基本编程

    概述: 1 脚本M文件 clear all; %设置精度 format long; %定义变量 n= s= %循环 :n s=s+/^i; end s format short; 2 函数M文件 fu ...

  7. 33.Qt模型与视图

    #include "mainwindow.h" #include <QApplication> #include <QAbstractItemModel> ...

  8. Android 多个APK共享数据

    Android给每个APK进程分配一个单独的用户空间,其manifest中的userid就是对应一个Linux用户(Android 系统是基于Linux)的.所以不同APK(用户)间互相访问数据默认是 ...

  9. Neo4j沙盒实验申请过程步骤(图文详解)

    不多说,直接上干货! 参考博客 http://blog.csdn.net/u012318074/article/details/72793632    (对此表示感谢) 前期博客 我暂时是将Neo4j ...

  10. JQuery (总结)

    延迟触发事件 Ajax异步请求数据 Jquery事件: Focus获得焦点 blur失去焦点 Change内容在变化的时候 Click点击事件 ---------------------------- ...