标签:tslib移植 selected device is n 运行ts_calibrate程序出现十字
总结一下这次移植tslib库遇到的问题和解决思路方法.
问题一、selected device is not a touchscreen I understand
解决方法:
查看tslib库的原理,在plugins/input-raw.c里找到这句话所在的地方
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; }可以看出,出现这错误的原因是这些条件中某个条件不足,我们需要知道哪些条件是不满足的,所以就把讲他们打印出来一一查看,看哪些是为0的哪个就不满足
printf("EV_VERSION=%p\n", EV_VERSION); printf("version=%p\n", version); printf("EV_ABS_ERRON=%d\n", EV_ABS_ERRON); printf("XY_ABS_ERRON=%d\n", XY_ABS_ERRON); printf("bit & (1 << EV_ABS)=%d\n", (bit & (1 << EV_ABS))); printf("absbit & (1 << ABS_X)=%d\n", (absbit & (1 << ABS_X))); printf("absbit & (1 << ABS_Y)=%d\n", (absbit & (1 << ABS_Y))); printf("absbit & (1 << ABS_PRESSURE)=%d\n",(absbit & (1 << ABS_PRESSURE))); fprintf(stderr, "selected device is not a touchscreen I understand\n");只需要在这些输出中找到为0的,然后就知道哪个条件不满足了.这里就不深入将哪些条件发生错误的调试了. 这些就需要去看看触摸屏的驱动了
一般是这样设置的,单点触摸的情况下:
__set_bit(EV_ABS, ts->input_dev->evbit); __set_bit(EV_KEY, ts->input_dev->evbit); __set_bit(EV_SYN, ts->input_dev->evbit); __set_bit(BTN_TOUCH, ts->input_dev->keybit); input_set_abs_params(ts->input_dev, ABS_X, 0, ts->abs_x_max, 0, 0); input_set_abs_params(ts->input_dev, ABS_Y, 0, ts->abs_y_max, 0, 0); input_set_abs_params(ts->input_dev, ABS_PRESSURE, 0, 1, 0, 0);可以参考下linux内核下已经移植好的触摸屏驱动.
问题二、触摸屏数据没上报给tslib
现象:
点击触摸屏有数据输出,但是运行ts_calibrate程序出现十字架点击没反应.
问题分析:
这原因就是设备驱动采集到的坐标数据没成功上报给tslib,导致点击没反应
解决方法:
查看自己触摸屏驱动的上报数据函数是否正确.另外,tslib库支持的是单触点的,看看自己的是否是单触点还是多触点
这是单点触摸的上报函数:
input_report_abs(ts->input_dev, ABS_X, x); input_report_abs(ts->input_dev, ABS_Y, y); input_report_abs(ts->input_dev, ABS_PRESSURE, 1); input_sync(ts->input_dev);这是多点触摸的上报函数:
input_report_abs(ts->input_dev, ABS_MT_POSITION_X, x); input_report_abs(ts->input_dev, ABS_MT_POSITION_Y, y); input_report_abs(ts->input_dev, ABS_MT_TOUCH_MAJOR, w); input_report_abs(ts->input_dev, ABS_MT_WIDTH_MAJOR, w); input_report_abs(ts->input_dev, ABS_MT_TRACKING_ID, id); input_mt_sync(ts->input_dev);可以从include/linux/input.h这文件里看到ABS_X等的宏定义,他们的值是不一样的
在看看tslib库里的plugins/input-raw.c里的ts_input_read函数.这里就不列出来了,看了就知道它是ABS_X、ABS_Y...
至于要做修改,该tslib库也可以,该触摸屏驱动也可以,看自己的选择.这里就说分析不做修改了,因为代码都不一样,原理分析就可以.
至此问题解决了.这次调试最大的感受就是要懂得利用printf把该打印出来的值给打印出来,这样我们才能更好的分析问题的所在
只有找到错误的信息,才能解决问题.要是找不到错误信息,又没有经验,真的无从下手.
移植tslib库出现selected device is not a touchscreen I understand
标签:tslib移植 selected device is n 运行ts_calibrate程序出现十字
原文地址:http://blog.csdn.net/demetered/article/details/39082549