这篇文章必须要写,因为昨天移植了触摸屏的驱动后又移植了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_calibrate和ts_test命令毫无问题。
测试成功了!
如果你改了上面的还没成功的话,这个问题我也遇到过
是因为内核里面有2个event事件,一个是按键的一个是触摸屏的,结果我用了event0的按键事件,所以肯定找不到触摸屏设备!真是悲催,花了好久的时间原来是因为这个原因。
你只需要改一下配置文件
vim /etc/profile
希望对遇到我一样问题的人有帮助,少走弯路。