首页 > 代码库 > 移植tslib库出现selected device is not a touchscreen I understand

移植tslib库出现selected device is not a touchscreen I understand

总结一下这次移植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