tslib移植-selected device is not a touchscreen I understand 错误解决

来源:互联网 发布:vb调用matlab工具箱 编辑:程序博客网 时间:2024/06/05 17:08


这篇文章必须要写,因为昨天移植了触摸屏的驱动后又移植了tslib,拷到开发板上运行后出现了这个错误,更恐怖的是花了一个晚上的时间,早上来实验室才弄好,网上找了好多这个错误的解决方法,很多都不是蛮详细的,都比较不适合我们新手去看。 

不过千辛万苦的是找到了这个博客,最后帮助我解决了,大家可以参考一下  

http://blog.csdn.net/zhaocj/article/details/37522115

我写这个博客是为了让更多的跟我一样的新手来解决这个问题,有载图的话估计比较清晰一点。


首先我们的思路应该是先判断是内核错误还是tslib移植的错误。


首先进入内核触摸屏驱动的源代码

vim drivers/input/touchscreen/s3c2410_ts.c


当我们每按一下屏幕 用printk将坐标信息打印出来


出现了坐标信息,说明我们内核里面移植的触摸屏驱动没有问题


这样我们就可以确定应该是我们的tslib的问题

首先是环境变量和配置的问题,这些问题在我这篇文章中写道了,这里的这个问题显现不是环境和配置的问题  (http://blog.csdn.net/liuzijiang1123/article/details/45670049)




看到这个错误的提示,我们应该想到tslib源码里面肯定有这个错误提示的条件,这样就让我们有了思路,我们可以去找到这个文件看看他错误判断的条件是啥?


[lzj@localhost plugins]$ pwd
/home/lzj/fl2440/3rdparty/tslib/plugins
[lzj@localhost plugins]$ vim input-raw.c




首先tslib通过EVIOCGVERSION来获取驱动的版本号,然后再通过EVIOCGBIT来判断设备是否为触摸屏,最后获取触摸屏的X轴(ABS_X),Y轴(ABS_Y),以及压力(ABS_PRESSURE)。其中只要有一项内容不正确,tslib都会认为该设备不是触摸屏,而打印出“selecteddevice is not a touchscreen I understand”错误。

****************************************************************************************************************************************************************************************

使用 EVIOCGBIT ioctl可以获取设备的能力和特性。

EVIOCGBIT ioctl处理 4个参数 ( ioctl(fd, EVIOCGBIT(ev_type, max_bytes), bitfield)) ev_type是返回的 type feature 0是个特殊 case,表示返回设备支持的所有的type features)。 max_bytes表示返回的最大字节数。 bitfield域是指向保存结果的内存指针。 return value表示保存结果的实际字节数,如果调用失败,则返回负值。

这里用bit和EV_ABS相与来判断是不是EV_ABS事件,判断是这个事件后再判断这个事件是否又X,Y轴和压力值。



*****************************************************************************************************************************************************************************************

首先检查一下自己编译器的版本号

vim /opt/buildroot-2012.08/arm920t/usr/arm-unknown-linux-uclibcgnueabi/sysroot/usr/include/linux/input.h

然后检查一下内核中的版本号

[lzj@localhost linux]$ pwd
/home/lzj/linux-3.0.1/include/linux
[lzj@localhost linux]$ vim input.h

版本号都没问题都没错误


再来看触摸屏的绝对值事件,这个在驱动移植的时候肯定是正确,不然测试程序肯定是不正确。

最后看触摸屏的X轴(ABS_X),Y轴(ABS_Y),以及压力(ABS_PRESSURE)。通过查看linux-3.0中的触摸屏驱动文件s3c2410_ts.c,发现系统没有给出ABS_PRESSURE,因此为了与tslib一致,linux-3.0要加上ABS_PRESSURE内容。

touch_timer_fire函数中的第一input_sync(ts.input);前添加下面函数:

input_report_abs(ts.input,  ABS_PRESSURE,  1);(内核将压力值上报给tslib)



在该函数中的第二input_sync(ts.input);前添加:

input_report_abs(ts.input,  ABS_PRESSURE,  0);


s3c2410ts_probe函数内的ts.input->name = "S3C24XX TouchScreen";语句前添加:

input_set_abs_params(ts.input,  ABS_PRESSURE,  0,  1,  0,  0);



通过上面的修改,就可以使tslib能够正确识别出开发板的触摸屏,执行ts_calibratets_test命令毫无问题。




测试成功了!


如果你改了上面的还没成功的话,这个问题我也遇到过

是因为内核里面有2个event事件,一个是按键的一个是触摸屏的,结果我用了event0的按键事件,所以肯定找不到触摸屏设备!真是悲催,花了好久的时间原来是因为这个原因。


你只需要改一下配置文件

 vim /etc/profile


希望对遇到我一样问题的人有帮助,少走弯路。


1 21