官方QQ群收藏本站

百问linux嵌入式论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 6385|回复: 7

tslib库selected device is not a touchscreen I understand解决方法

[复制链接]

9

主题

14

帖子

37

积分

新手上路

Rank: 1

积分
37
发表于 2012-5-25 17:05:00 | 显示全部楼层 |阅读模式
在移植tslib库的过程中,出现selected device is not a touchscreen I understand了吗
其实出现这个问题的原因和很简单,就是tslib中的输入系统和内核input系统版本不匹配,当然也有其他原因,这是最常见的情况,先分析一下tslib的代码,看看这句话在什么情况下被打印就知道了
将tslib库中c和H文件加入Source Insight
在 input-raw.c文件中有这么一段代码
static int check_fd(struct tslib_input *i)
{
struct tsdev *ts = i->module.dev;
int version;
u_int32_t bit;
u_int64_t absbit;

if (! ((ioctl(ts->fd, EVIOCGVERSION, &version) >= 0) &&
  (version == EV_VERSION) &&
  (ioctl(ts->fd, EVIOCGBIT(0, sizeof(bit) * 8), &bit) >= 0) &&
  (bit & (1 << EV_ABS)) &&
  (ioctl(ts->fd, EVIOCGBIT(EV_ABS, sizeof(absbit) * 8), &absbit) >= 0) &&
  (absbit & (1 << ABS_X)) &&
  (absbit & (1 << ABS_Y)) && (absbit & (1 << ABS_PRESSURE)))) {
  fprintf(stderr, "selected device is not a touchscreen I understand\n");
  return -1;
}

if (bit & (1 << EV_SYN))
  i->using_syn = 1;

return 0;
}
其中关键的就是version == EV_VERSION这个判断语句,如果这俩不等,那么就会打印出selected device is not a touchscreen I understand


tslib中的input版本号是在交叉编译的时候指定的,赋值给version,而EV_VERSION是内核中的定义的,我做tslib时,用的2.6.39内核,这个EV_VERSION定义在include/linux/input.h中,为0x010001,而tslib中的是和交叉编译器相同,于是查看编译器,在/usr/include/linux/input.h中,指定为0x010000,这俩明显不相等,当然不会满足version == EV_VERSION了,由此可见问题就出现在内核的输入子系统的版本号不匹配的问题

所以,一下提供两种解决方法

1.将内核源代码里的include/linux/input.h中的
    #define EV_VERSION        0x010001
    改为:
    #define EV_VERSION        0x010000
2.将arm交叉编译工具中的头文件库中的
    linux/input.h中的
    #define EV_VERSION        0x010000
    改为
    #define EV_VERSION        0x010001
    再编译tslib库

一般第一种就可以解决问题了,因此,出现上面情况时,先不要急于换版本,如果二者版本不等,那么改一个就可以
回复

使用道具 举报

0

主题

3

帖子

3

积分

新手上路

Rank: 1

积分
3
发表于 2012-5-25 18:55:00 | 显示全部楼层
我使用过楼主说的方法,EV_VERSION在两个地方都是0x010001,但执行ts_calibrate之后还是显示selected device is not a touchscreen I understand,我怀疑是tslib-1.4版本的问题了
回复 支持 反对

使用道具 举报

9

主题

14

帖子

37

积分

新手上路

Rank: 1

积分
37
 楼主| 发表于 2012-5-25 19:18:00 | 显示全部楼层
回复 2楼uwyyk28的帖子

你改成0x010000试试,我刚改的时候都改成了0x010001,结果也有问题
回复 支持 反对

使用道具 举报

0

主题

3

帖子

3

积分

新手上路

Rank: 1

积分
3
发表于 2012-5-25 20:27:00 | 显示全部楼层
没错,使用0x010000就可以了,谢谢。但为什么0x010001不行,呵呵
回复 支持 反对

使用道具 举报

9

主题

14

帖子

37

积分

新手上路

Rank: 1

积分
37
 楼主| 发表于 2012-5-25 21:23:00 | 显示全部楼层
回复 4楼uwyyk28的帖子

这个我暂时没找到答案,我想tslib对于版本的定义肯定是0x010000,否则不可能成功,改编译器那种方法可能不对,没有改到核心,使得tslib的版本仍然是0x010000,你觉得呢,你要知道答案记得回帖啊
回复 支持 反对

使用道具 举报

56

主题

5186

帖子

7811

积分

超级版主

Rank: 8Rank: 8

积分
7811
QQ
发表于 2012-5-25 23:50:00 | 显示全部楼层
同学们,继续彻底地找原因啊,呵
回复 支持 反对

使用道具 举报

0

主题

3

帖子

3

积分

新手上路

Rank: 1

积分
3
发表于 2012-5-26 00:09:00 | 显示全部楼层
看一下TSLIB配置:TSLIB_TSEVENTTYPE,这个是什么类型?我的板是TSLIB_TSEVENTTYPE=H3600,
还有ts.conf里,如下设置:

module_raw input
#module pthres pmin=1
module variance delta=30
module dejitter delta=100
module linear

ts.conf里主要是第一行,后边也有用,但是是别的用途。
回复 支持 反对

使用道具 举报

49

主题

285

帖子

1362

积分

超级版主

Rank: 8Rank: 8

积分
1362
发表于 2018-1-23 16:07:15 | 显示全部楼层
这篇文章里指出的/usr/include/linux/input.h这个头文件,是编译PC机应用程序时使用的! 不是编译2440程序用的。 tslib使用的应该是"交叉编译工具链(也就是编译2440程序)"的头文件,是在 /usr/local/arm/4.3.2/arm-none-linux-gnueabi/libc/usr/include/linux/input.h 中!(修改这个头文件的时候,权限只是readOnly,要+w权限)
我是百问网www.100ask.org站长,有关站务问题请与我联系。
韦东山视频开发板购买店铺:https://100ask.taobao.com/
微信公众号:baiwenkeji,长期发布技术文章,欢迎关注。
回复 支持 反对

使用道具 举报

技术支持
在线咨询
咨询热线
0755-86200561
微信扫一扫
获取更多资讯!

Archiver|小黑屋|百问linux嵌入式论坛     

GMT+8, 2018-10-19 00:40 , Processed in 0.332984 second(s), 18 queries , File On.

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc. Template By 【未来科技】【 www.wekei.cn 】

快速回复 返回顶部 返回列表